@gitlab/ui 127.1.1 → 128.1.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 (59) hide show
  1. package/dist/components/base/form/form_checkbox/form_checkbox.js +0 -3
  2. package/dist/components/base/form/form_checkbox/form_checkbox_group.js +132 -3
  3. package/dist/components/base/form/form_group/form_group.js +3 -0
  4. package/dist/components/base/new_dropdowns/base_dropdown/base_dropdown.js +95 -20
  5. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown.js +1 -1
  6. package/dist/components/base/new_dropdowns/listbox/listbox.js +47 -10
  7. package/dist/index.css +1 -1
  8. package/dist/index.css.map +1 -1
  9. package/dist/tailwind.css +1 -1
  10. package/dist/tailwind.css.map +1 -1
  11. package/dist/tokens/build/js/tokens.dark.js +127 -127
  12. package/dist/tokens/build/js/tokens.js +110 -110
  13. package/dist/vendor/bootstrap-vue/src/constants/components.js +1 -3
  14. package/dist/vendor/bootstrap-vue/src/mixins/form-radio-check-group.js +1 -2
  15. package/package.json +1 -1
  16. package/src/components/base/form/form_checkbox/form_checkbox.vue +0 -3
  17. package/src/components/base/form/form_checkbox/form_checkbox_group.vue +148 -21
  18. package/src/components/base/form/form_group/form_group.vue +3 -0
  19. package/src/components/base/new_dropdowns/base_dropdown/base_dropdown.vue +101 -22
  20. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.vue +3 -2
  21. package/src/components/base/new_dropdowns/listbox/listbox.vue +52 -9
  22. package/src/scss/bootstrap_vue.scss +0 -1
  23. package/src/tokens/build/css/tokens.css +24 -24
  24. package/src/tokens/build/css/tokens.dark.css +26 -26
  25. package/src/tokens/build/docs/tokens-tailwind-docs.dark.json +82 -82
  26. package/src/tokens/build/docs/tokens-tailwind-docs.json +81 -81
  27. package/src/tokens/build/figma/constants.tokens.json +2245 -226
  28. package/src/tokens/build/figma/contextual.tokens.json +753 -77
  29. package/src/tokens/build/figma/deprecated.tokens.json +4151 -420
  30. package/src/tokens/build/figma/semantic.tokens.json +171 -19
  31. package/src/tokens/build/js/tokens.dark.js +130 -127
  32. package/src/tokens/build/js/tokens.js +113 -110
  33. package/src/tokens/build/json/tokens.dark.json +161 -161
  34. package/src/tokens/build/json/tokens.json +142 -142
  35. package/src/tokens/build/scss/_tokens.dark.scss +26 -26
  36. package/src/tokens/build/scss/_tokens.scss +24 -24
  37. package/src/tokens/constant/color.alpha.tokens.json +135 -15
  38. package/src/tokens/constant/color.tokens.json +2110 -211
  39. package/src/tokens/contextual/avatar.tokens.json +54 -6
  40. package/src/tokens/contextual/button.tokens.json +90 -10
  41. package/src/tokens/contextual/chart.tokens.json +9 -1
  42. package/src/tokens/contextual/illustration.tokens.json +600 -60
  43. package/src/tokens/deprecated/deprecated.color.data_viz.tokens.json +1100 -110
  44. package/src/tokens/deprecated/deprecated.color.theme.tokens.json +1440 -144
  45. package/src/tokens/deprecated/deprecated.color.tokens.json +1490 -149
  46. package/src/tokens/deprecated/deprecated.color.transparency.tokens.json +147 -43
  47. package/src/tokens/semantic/action.tokens.json +162 -18
  48. package/src/tokens/semantic/background.tokens.json +9 -1
  49. package/src/vendor/bootstrap-vue/src/constants/components.js +0 -2
  50. package/src/vendor/bootstrap-vue/src/mixins/form-radio-check-group.js +1 -2
  51. package/dist/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox-group.js +0 -37
  52. package/dist/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox.js +0 -134
  53. package/dist/vendor/bootstrap-vue/src/components/form-checkbox/index.js +0 -2
  54. package/src/vendor/bootstrap-vue/src/components/form-checkbox/_form-checkbox-group.scss +0 -1
  55. package/src/vendor/bootstrap-vue/src/components/form-checkbox/_form-checkbox.scss +0 -125
  56. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox-group.js +0 -42
  57. package/src/vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox.js +0 -132
  58. package/src/vendor/bootstrap-vue/src/components/form-checkbox/index.js +0 -4
  59. package/src/vendor/bootstrap-vue/src/components/form-checkbox/index.scss +0 -2
@@ -8,9 +8,6 @@ var script = {
8
8
  name: 'GlFormCheckbox',
9
9
  inject: {
10
10
  getGroup: {
11
- // When we remove BFormCheckboxGroup from GlFormCheckboxGroup, we can rename
12
- // the `getBvCheckGroup` provide to `getCheckGroup`.
13
- from: 'getBvCheckGroup',
14
11
  default: () => () => null
15
12
  }
16
13
  },
@@ -1,23 +1,152 @@
1
+ import uniqueId from 'lodash/uniqueId';
2
+ import isBoolean from 'lodash/isBoolean';
3
+ import omit from 'lodash/omit';
4
+ import pick from 'lodash/pick';
5
+ import { looseEqual } from '../../../../vendor/bootstrap-vue/src/utils/loose-equal';
1
6
  import { formOptionsMixin } from '../../../../vendor/bootstrap-vue/src/mixins/form-options';
2
- import { BFormCheckboxGroup } from '../../../../vendor/bootstrap-vue/src/components/form-checkbox/form-checkbox-group';
3
7
  import { SafeHtmlDirective } from '../../../../directives/safe_html/safe_html';
4
8
  import GlFormCheckbox from './form_checkbox';
5
9
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
6
10
 
11
+ // Attributes to pass down to checks/radios instead of applying them to the group
12
+ const PASS_DOWN_ATTRS = ['aria-describedby', 'aria-labelledby'];
7
13
  var script = {
8
14
  name: 'GlFormCheckboxGroup',
9
15
  components: {
10
- BFormCheckboxGroup,
11
16
  GlFormCheckbox
12
17
  },
13
18
  directives: {
14
19
  SafeHtml: SafeHtmlDirective
15
20
  },
16
21
  mixins: [formOptionsMixin],
22
+ provide() {
23
+ return {
24
+ getGroup: () => this
25
+ };
26
+ },
17
27
  inheritAttrs: false,
18
28
  model: {
19
29
  prop: 'checked',
20
30
  event: 'input'
31
+ },
32
+ props: {
33
+ /**
34
+ * Used to set the `id` attribute on the rendered content, and used as the base to generate any additional element IDs as needed.
35
+ */
36
+ id: {
37
+ type: String,
38
+ required: false,
39
+ default: undefined
40
+ },
41
+ /**
42
+ * The current value of the checkbox.
43
+ */
44
+ checked: {
45
+ type: Array,
46
+ required: false,
47
+ default: () => []
48
+ },
49
+ /**
50
+ * Array of items to render in the component
51
+ */
52
+ options: {
53
+ type: Array,
54
+ required: false,
55
+ default: () => []
56
+ },
57
+ /**
58
+ * When set to `true`, disables the component's functionality and places it in a disabled state.
59
+ */
60
+ disabled: {
61
+ type: Boolean,
62
+ required: false,
63
+ default: false
64
+ },
65
+ /**
66
+ * Sets the value of the `name` attribute on the form control.
67
+ */
68
+ name: {
69
+ type: String,
70
+ required: false,
71
+ default: undefined
72
+ },
73
+ /**
74
+ * Adds the `required` attribute to the form control.
75
+ */
76
+ required: {
77
+ type: Boolean,
78
+ required: false,
79
+ default: false
80
+ },
81
+ /**
82
+ * Controls the validation state appearance of the component. `true` for valid, `false` for invalid, or `null` for no validation state.
83
+ */
84
+ state: {
85
+ type: Boolean,
86
+ required: false,
87
+ default: null
88
+ },
89
+ /**
90
+ * Optional value to set for the 'aria-invalid' attribute. Supported values are 'true' and 'false'. If not set, the 'state' prop will dictate the value
91
+ */
92
+ ariaInvalid: {
93
+ type: [Boolean, String],
94
+ required: false,
95
+ default: false
96
+ }
97
+ },
98
+ data() {
99
+ return {
100
+ internalId: this.id ? this.id : uniqueId('gitlab_ui_checkbox_group_'),
101
+ localChecked: this.checked
102
+ };
103
+ },
104
+ computed: {
105
+ computedState() {
106
+ return isBoolean(this.state) ? this.state : null;
107
+ },
108
+ stateClass() {
109
+ if (this.computedState === true) return 'is-valid';
110
+ if (this.computedState === false) return 'is-invalid';
111
+ return null;
112
+ },
113
+ computedAriaInvalid() {
114
+ const {
115
+ ariaInvalid
116
+ } = this;
117
+ if (ariaInvalid === true || ariaInvalid === 'true' || ariaInvalid === '') {
118
+ return 'true';
119
+ }
120
+ return this.computedState === false ? 'true' : ariaInvalid;
121
+ },
122
+ computedAttrs() {
123
+ return {
124
+ ...omit(this.$attrs, PASS_DOWN_ATTRS),
125
+ id: this.internalId,
126
+ 'aria-invalid': this.computedAriaInvalid,
127
+ 'aria-required': this.required || null
128
+ };
129
+ },
130
+ passDownAttrs() {
131
+ return pick(this.$attrs, PASS_DOWN_ATTRS);
132
+ },
133
+ groupName() {
134
+ // Checks/Radios tied to the same model must have the same name,
135
+ // especially for ARIA accessibility
136
+ return this.name || this.internalId;
137
+ }
138
+ },
139
+ watch: {
140
+ checked(newValue) {
141
+ if (!looseEqual(newValue, this.localChecked)) {
142
+ this.localChecked = newValue;
143
+ }
144
+ },
145
+ localChecked(newValue, oldValue) {
146
+ if (!looseEqual(newValue, oldValue)) {
147
+ this.$emit('input', newValue);
148
+ }
149
+ }
21
150
  }
22
151
  };
23
152
 
@@ -25,7 +154,7 @@ var script = {
25
154
  const __vue_script__ = script;
26
155
 
27
156
  /* template */
28
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('b-form-checkbox-group',_vm._b({staticClass:"gl-form-checkbox-group",attrs:{"stacked":""},on:{"change":function($event){return _vm.$emit('change', $event)},"input":function($event){return _vm.$emit('input', $event)}}},'b-form-checkbox-group',_vm.$attrs,false),[_vm._t("first"),_vm._v(" "),_vm._l((_vm.formOptions),function(option,idx){return _c('gl-form-checkbox',{key:idx,attrs:{"value":option.value,"disabled":option.disabled}},[(option.html)?_c('span',{directives:[{name:"safe-html",rawName:"v-safe-html",value:(option.html),expression:"option.html"}]}):_c('span',[_vm._v(_vm._s(option.text))])])}),_vm._v(" "),_vm._t("default")],2)],1)};
157
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',_vm._b({staticClass:"gl-form-checkbox-group gl-outline-none",attrs:{"role":"group","tabindex":"-1"}},'div',_vm.computedAttrs,false),[_vm._t("first"),_vm._v(" "),_vm._l((_vm.formOptions),function(option,idx){return _c('gl-form-checkbox',_vm._b({key:idx,attrs:{"value":option.value,"disabled":option.disabled}},'gl-form-checkbox',_vm.passDownAttrs,false),[(option.html)?_c('span',{directives:[{name:"safe-html",rawName:"v-safe-html",value:(option.html),expression:"option.html"}]}):_c('span',[_vm._v(_vm._s(option.text))])])}),_vm._v(" "),_vm._t("default")],2)};
29
158
  var __vue_staticRenderFns__ = [];
30
159
 
31
160
  /* style */
@@ -8,6 +8,9 @@ var script = {
8
8
  components: {
9
9
  BFormGroup
10
10
  },
11
+ provide: {
12
+ isInFormGroup: true
13
+ },
11
14
  inheritAttrs: false,
12
15
  props: {
13
16
  /**
@@ -106,6 +106,26 @@ var script = {
106
106
  return ['menu', 'listbox', 'tree', 'grid', 'dialog', true, false].includes(value);
107
107
  }
108
108
  },
109
+ activeItemId: {
110
+ type: String,
111
+ required: false,
112
+ default: undefined
113
+ },
114
+ hasExternalLabel: {
115
+ type: Boolean,
116
+ required: false,
117
+ default: false
118
+ },
119
+ hasSearchableListbox: {
120
+ type: Boolean,
121
+ required: false,
122
+ default: false
123
+ },
124
+ isDisclosure: {
125
+ type: Boolean,
126
+ required: false,
127
+ default: false
128
+ },
109
129
  /**
110
130
  * Id that will be referenced by `aria-labelledby` attribute of the dropdown content`
111
131
  */
@@ -113,6 +133,15 @@ var script = {
113
133
  type: String,
114
134
  required: true
115
135
  },
136
+ /**
137
+ * Span Id that will be referenced by listbox `aria-labelledby` if there's an external label.
138
+ * This prop will only be defined by `GlCollapsibleListbox` when `isInFormGroup` injected is true.
139
+ */
140
+ listboxId: {
141
+ type: String,
142
+ required: false,
143
+ default: undefined
144
+ },
116
145
  /**
117
146
  * The `aria-labelledby` attribute value for the toggle `button`
118
147
  */
@@ -157,6 +186,10 @@ var script = {
157
186
  };
158
187
  },
159
188
  computed: {
189
+ ariaActiveDescendant() {
190
+ if (!this.isDisclosure && this.visible) return this.activeItemId;
191
+ return undefined;
192
+ },
160
193
  hasNoVisibleToggleText() {
161
194
  var _this$toggleText;
162
195
  return !((_this$toggleText = this.toggleText) !== null && _this$toggleText !== void 0 && _this$toggleText.length) || this.textSrOnly;
@@ -170,12 +203,47 @@ var script = {
170
203
  isCaretOnly() {
171
204
  return !this.noCaret && !this.icon && this.hasNoVisibleToggleText;
172
205
  },
173
- ariaAttributes() {
206
+ isDefaultToggle() {
207
+ return !this.$scopedSlots.toggle;
208
+ },
209
+ isToggleCombobox() {
210
+ if (this.hasSearchableListbox || this.isDisclosure) {
211
+ return false;
212
+ }
213
+ return true;
214
+ },
215
+ isToggleLabelledExternally() {
216
+ if (this.hasExternalLabel && this.toggleId) return true;
217
+ return false;
218
+ },
219
+ computedToggleId() {
220
+ if (this.isDisclosure) {
221
+ return this.isDefaultToggle ? this.toggleId : undefined;
222
+ }
223
+ if (this.isToggleLabelledExternally) {
224
+ return this.isDefaultToggle ? this.toggleId : undefined;
225
+ }
226
+ if (this.hasSearchableListbox) {
227
+ return this.toggleId;
228
+ }
229
+ return undefined;
230
+ },
231
+ computedToggleInnerId() {
232
+ if (this.isToggleCombobox && !this.isToggleLabelledExternally) {
233
+ return this.toggleId;
234
+ }
235
+ if (this.isToggleCombobox && this.isToggleLabelledExternally) {
236
+ return this.listboxId;
237
+ }
238
+ return undefined;
239
+ },
240
+ toggleAriaAttributes() {
174
241
  return {
175
- 'aria-haspopup': this.ariaHaspopup,
176
- 'aria-expanded': String(this.visible),
177
242
  'aria-controls': this.baseDropdownId,
178
- 'aria-labelledby': this.toggleLabelledBy
243
+ 'aria-expanded': String(this.visible),
244
+ 'aria-haspopup': this.ariaHaspopup,
245
+ 'aria-labelledby': this.toggleLabelledBy,
246
+ 'aria-activedescendant': this.ariaActiveDescendant
179
247
  };
180
248
  },
181
249
  toggleButtonClasses() {
@@ -191,10 +259,28 @@ var script = {
191
259
  return this.block ? 'gl-w-full' : '';
192
260
  },
193
261
  toggleLabelledBy() {
262
+ if (this.isToggleCombobox) {
263
+ if (this.ariaLabelledby) {
264
+ return `${this.ariaLabelledby} ${this.toggleId}`;
265
+ }
266
+ return this.toggleId;
267
+ }
268
+
269
+ // For non-combobox toggles, combine IDs or use the button's own text
194
270
  return this.ariaLabelledby ? `${this.ariaLabelledby} ${this.toggleId}` : undefined;
195
271
  },
196
- isDefaultToggle() {
197
- return !this.$scopedSlots.toggle;
272
+ toggleRole() {
273
+ if (this.isToggleCombobox) {
274
+ return 'combobox';
275
+ }
276
+ return undefined;
277
+ },
278
+ toggleAccessibilityAttributes() {
279
+ return {
280
+ ...this.toggleAriaAttributes,
281
+ id: this.toggleId,
282
+ role: this.toggleRole
283
+ };
198
284
  },
199
285
  toggleOptions() {
200
286
  if (this.isDefaultToggle) {
@@ -209,7 +295,8 @@ var script = {
209
295
  disabled: this.disabled,
210
296
  loading: this.loading,
211
297
  class: this.toggleButtonClasses,
212
- ...this.ariaAttributes,
298
+ role: this.toggleRole,
299
+ ...this.toggleAriaAttributes,
213
300
  listeners: {
214
301
  keydown: event => this.onKeydown(event),
215
302
  click: event => this.toggle(event)
@@ -287,18 +374,6 @@ var script = {
287
374
  };
288
375
  }
289
376
  },
290
- watch: {
291
- ariaAttributes: {
292
- deep: true,
293
- handler(ariaAttributes) {
294
- if (this.$scopedSlots.toggle) {
295
- Object.keys(ariaAttributes).forEach(key => {
296
- this.toggleElement.setAttribute(key, ariaAttributes[key]);
297
- });
298
- }
299
- }
300
- }
301
- },
302
377
  mounted() {
303
378
  this.checkToggleFocusable();
304
379
  },
@@ -538,7 +613,7 @@ var script = {
538
613
  const __vue_script__ = script;
539
614
 
540
615
  /* template */
541
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:[_vm.$options.BASE_DROPDOWN_CLASS, { '!gl-block': _vm.block }]},[_c(_vm.toggleComponent,_vm._g(_vm._b({ref:"toggle",tag:"component",attrs:{"id":_vm.toggleId,"data-testid":"base-dropdown-toggle"}},'component',_vm.toggleAttributes,false),_vm.toggleListeners),[_vm._t("toggle",function(){return [_c('span',{staticClass:"gl-new-dropdown-button-text",class:{ 'gl-sr-only': _vm.textSrOnly }},[_vm._v("\n "+_vm._s(_vm.toggleText)+"\n ")]),_vm._v(" "),(!_vm.noCaret)?_c('gl-icon',{staticClass:"gl-button-icon gl-new-dropdown-chevron",attrs:{"name":"chevron-down"}}):_vm._e()]})],2),_vm._v(" "),_c('dropdown-container',{attrs:{"positioning-strategy":_vm.positioningStrategy}},[_c('div',{directives:[{name:"outside",rawName:"v-outside.click.focusin",value:(_vm.handleClickOutside),expression:"handleClickOutside",modifiers:{"click":true,"focusin":true}}],ref:"dropdownContainer",class:_vm.$options.DROPDOWN_CONTAINER_CLASS},[_c('div',{ref:"content",staticClass:"gl-new-dropdown-panel",class:_vm.panelClasses,attrs:{"id":_vm.baseDropdownId,"data-testid":"base-dropdown-menu"},on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"esc",27,$event.key,["Esc","Escape"])){ return null; }$event.stopPropagation();$event.preventDefault();return _vm.closeAndFocus.apply(null, arguments)}}},[_c('div',{ref:"dropdownArrow",staticClass:"gl-new-dropdown-arrow"}),_vm._v(" "),_c('div',{staticClass:"gl-new-dropdown-inner"},[_vm._t("default",null,{"visible":_vm.visible})],2)])])])],1)};
616
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:[_vm.$options.BASE_DROPDOWN_CLASS, { '!gl-block': _vm.block }]},[_c(_vm.toggleComponent,_vm._g(_vm._b({ref:"toggle",tag:"component",attrs:{"id":_vm.computedToggleId,"data-testid":"base-dropdown-toggle"}},'component',_vm.toggleAttributes,false),_vm.toggleListeners),[_vm._t("toggle",function(){return [_c('span',{staticClass:"gl-new-dropdown-button-text",class:{ 'gl-sr-only': _vm.textSrOnly },attrs:{"id":_vm.computedToggleInnerId,"data-testid":"base-dropdown-span"}},[_vm._v("\n "+_vm._s(_vm.toggleText)+"\n ")]),_vm._v(" "),(!_vm.noCaret)?_c('gl-icon',{staticClass:"gl-button-icon gl-new-dropdown-chevron",attrs:{"name":"chevron-down"}}):_vm._e()]},{"accessibilityAttributes":_vm.toggleAccessibilityAttributes})],2),_vm._v(" "),_c('dropdown-container',{attrs:{"positioning-strategy":_vm.positioningStrategy}},[_c('div',{directives:[{name:"outside",rawName:"v-outside.click.focusin",value:(_vm.handleClickOutside),expression:"handleClickOutside",modifiers:{"click":true,"focusin":true}}],ref:"dropdownContainer",class:_vm.$options.DROPDOWN_CONTAINER_CLASS},[_c('div',{ref:"content",staticClass:"gl-new-dropdown-panel",class:_vm.panelClasses,attrs:{"id":_vm.baseDropdownId,"data-testid":"base-dropdown-menu"},on:{"keydown":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"esc",27,$event.key,["Esc","Escape"])){ return null; }$event.stopPropagation();$event.preventDefault();return _vm.closeAndFocus.apply(null, arguments)}}},[_c('div',{ref:"dropdownArrow",staticClass:"gl-new-dropdown-arrow"}),_vm._v(" "),_c('div',{staticClass:"gl-new-dropdown-inner"},[_vm._t("default",null,{"visible":_vm.visible})],2)])])])],1)};
542
617
  var __vue_staticRenderFns__ = [];
543
618
 
544
619
  /* style */
@@ -346,7 +346,7 @@ var script = {
346
346
  const __vue_script__ = script;
347
347
 
348
348
  /* template */
349
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-base-dropdown',{ref:"baseDropdown",staticClass:"gl-disclosure-dropdown",attrs:{"aria-labelledby":_vm.toggleAriaLabelledBy,"arrow-element":_vm.$refs.disclosureArrow,"toggle-id":_vm.toggleId,"toggle-text":_vm.toggleText,"toggle-class":_vm.toggleClass,"text-sr-only":_vm.textSrOnly,"category":_vm.category,"variant":_vm.variant,"size":_vm.size,"icon":_vm.icon,"disabled":_vm.disabled,"loading":_vm.loading,"no-caret":_vm.noCaret,"placement":_vm.placement,"block":_vm.block,"offset":_vm.dropdownOffset,"fluid-width":_vm.fluidWidth,"positioning-strategy":_vm.positioningStrategy},on:_vm._d({},[_vm.$options.events.GL_DROPDOWN_SHOWN,_vm.onShow,_vm.$options.events.GL_DROPDOWN_HIDDEN,_vm.onHide,_vm.$options.events.GL_DROPDOWN_BEFORE_CLOSE,_vm.onBeforeClose,_vm.$options.events.GL_DROPDOWN_FOCUS_CONTENT,_vm.onKeydown]),scopedSlots:_vm._u([(_vm.hasCustomToggle)?{key:"toggle",fn:function(){return [_vm._t("toggle")]},proxy:true}:null],null,true)},[_vm._v(" "),_vm._t("header"),_vm._v(" "),_c(_vm.disclosureTag,{ref:"content",tag:"component",class:_vm.$options.GL_DROPDOWN_CONTENTS_CLASS,attrs:{"id":_vm.disclosureId,"aria-labelledby":_vm.listAriaLabelledBy || _vm.toggleId,"data-testid":"disclosure-content","tabindex":"-1"},on:{"keydown":_vm.onKeydown,"click":_vm.handleAutoClose}},[_vm._t("default",function(){return [_vm._l((_vm.items),function(item,index){return [(_vm.isItem(item))?[_c('gl-disclosure-dropdown-item',{key:_vm.uniqueItemId(),attrs:{"item":item},on:{"action":_vm.handleAction},scopedSlots:_vm._u([('list-item' in _vm.$scopedSlots)?{key:"list-item",fn:function(){return [_vm._t("list-item",null,{"item":item})]},proxy:true}:null],null,true)})]:[_c('gl-disclosure-dropdown-group',{key:item.name,attrs:{"bordered":index !== 0,"group":item},on:{"action":_vm.handleAction},scopedSlots:_vm._u([(_vm.$scopedSlots['group-label'])?{key:"group-label",fn:function(){return [_vm._t("group-label",null,{"group":item})]},proxy:true}:null,(_vm.$scopedSlots['list-item'])?{key:"default",fn:function(){return _vm._l((item.items),function(groupItem){return _c('gl-disclosure-dropdown-item',{key:_vm.uniqueItemId(),attrs:{"item":groupItem},on:{"action":_vm.handleAction},scopedSlots:_vm._u([{key:"list-item",fn:function(){return [_vm._t("list-item",null,{"item":groupItem})]},proxy:true}],null,true)})})},proxy:true}:null],null,true)})]]})]})],2),_vm._v(" "),_vm._t("footer")],2)};
349
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-base-dropdown',{ref:"baseDropdown",staticClass:"gl-disclosure-dropdown",attrs:{"aria-labelledby":_vm.toggleAriaLabelledBy,"arrow-element":_vm.$refs.disclosureArrow,"toggle-id":_vm.toggleId,"toggle-text":_vm.toggleText,"toggle-class":_vm.toggleClass,"text-sr-only":_vm.textSrOnly,"category":_vm.category,"variant":_vm.variant,"size":_vm.size,"icon":_vm.icon,"disabled":_vm.disabled,"loading":_vm.loading,"no-caret":_vm.noCaret,"placement":_vm.placement,"block":_vm.block,"offset":_vm.dropdownOffset,"fluid-width":_vm.fluidWidth,"positioning-strategy":_vm.positioningStrategy,"is-disclosure":""},on:_vm._d({},[_vm.$options.events.GL_DROPDOWN_SHOWN,_vm.onShow,_vm.$options.events.GL_DROPDOWN_HIDDEN,_vm.onHide,_vm.$options.events.GL_DROPDOWN_BEFORE_CLOSE,_vm.onBeforeClose,_vm.$options.events.GL_DROPDOWN_FOCUS_CONTENT,_vm.onKeydown]),scopedSlots:_vm._u([(_vm.hasCustomToggle)?{key:"toggle",fn:function(slotProps){return [_vm._t("toggle",null,null,slotProps)]}}:null],null,true)},[_vm._v(" "),_vm._t("header"),_vm._v(" "),_c(_vm.disclosureTag,{ref:"content",tag:"component",class:_vm.$options.GL_DROPDOWN_CONTENTS_CLASS,attrs:{"id":_vm.disclosureId,"aria-labelledby":_vm.listAriaLabelledBy || _vm.toggleId,"data-testid":"disclosure-content","tabindex":"-1"},on:{"keydown":_vm.onKeydown,"click":_vm.handleAutoClose}},[_vm._t("default",function(){return [_vm._l((_vm.items),function(item,index){return [(_vm.isItem(item))?[_c('gl-disclosure-dropdown-item',{key:_vm.uniqueItemId(),attrs:{"item":item},on:{"action":_vm.handleAction},scopedSlots:_vm._u([('list-item' in _vm.$scopedSlots)?{key:"list-item",fn:function(){return [_vm._t("list-item",null,{"item":item})]},proxy:true}:null],null,true)})]:[_c('gl-disclosure-dropdown-group',{key:item.name,attrs:{"bordered":index !== 0,"group":item},on:{"action":_vm.handleAction},scopedSlots:_vm._u([(_vm.$scopedSlots['group-label'])?{key:"group-label",fn:function(){return [_vm._t("group-label",null,{"group":item})]},proxy:true}:null,(_vm.$scopedSlots['list-item'])?{key:"default",fn:function(){return _vm._l((item.items),function(groupItem){return _c('gl-disclosure-dropdown-item',{key:_vm.uniqueItemId(),attrs:{"item":groupItem},on:{"action":_vm.handleAction},scopedSlots:_vm._u([{key:"list-item",fn:function(){return [_vm._t("list-item",null,{"item":groupItem})]},proxy:true}],null,true)})})},proxy:true}:null],null,true)})]]})]})],2),_vm._v(" "),_vm._t("footer")],2)};
350
350
  var __vue_staticRenderFns__ = [];
351
351
 
352
352
  /* style */
@@ -1,7 +1,7 @@
1
1
  import clamp from 'lodash/clamp';
2
2
  import uniqueId from 'lodash/uniqueId';
3
3
  import { logWarning, stopEvent } from '../../../../utils/utils';
4
- import { GL_DROPDOWN_SHOWN, GL_DROPDOWN_HIDDEN, POSITION_ABSOLUTE, POSITION_FIXED, GL_DROPDOWN_CONTENTS_CLASS, ARROW_UP, ENTER, ARROW_DOWN, END, HOME } from '../constants';
4
+ import { GL_DROPDOWN_SHOWN, GL_DROPDOWN_HIDDEN, GL_DROPDOWN_FOCUS_CONTENT, POSITION_ABSOLUTE, POSITION_FIXED, GL_DROPDOWN_CONTENTS_CLASS, ARROW_UP, ENTER, ARROW_DOWN, END, HOME } from '../constants';
5
5
  import { buttonCategoryOptions, dropdownVariantOptions, buttonSizeOptions, dropdownPlacements } from '../../../../utils/constants';
6
6
  import GlButton from '../../button/button';
7
7
  import GlLoadingIcon from '../../loading_icon/loading_icon';
@@ -25,7 +25,8 @@ var script = {
25
25
  HEADER_ITEMS_BORDER_CLASSES,
26
26
  events: {
27
27
  GL_DROPDOWN_SHOWN,
28
- GL_DROPDOWN_HIDDEN
28
+ GL_DROPDOWN_HIDDEN,
29
+ GL_DROPDOWN_FOCUS_CONTENT
29
30
  },
30
31
  components: {
31
32
  GlBaseDropdown,
@@ -37,6 +38,11 @@ var script = {
37
38
  GlLoadingIcon,
38
39
  GlIntersectionObserver
39
40
  },
41
+ inject: {
42
+ isInFormGroup: {
43
+ default: false
44
+ }
45
+ },
40
46
  model: {
41
47
  prop: 'selected',
42
48
  event: 'select'
@@ -184,7 +190,7 @@ var script = {
184
190
  },
185
191
  /**
186
192
  * The `aria-labelledby` attribute value for the toggle button
187
- * Provide the string of ids seperated by space
193
+ * Provide the string of IDs seperated by space
188
194
  */
189
195
  toggleAriaLabelledBy: {
190
196
  type: String,
@@ -193,7 +199,7 @@ var script = {
193
199
  },
194
200
  /**
195
201
  * The `aria-labelledby` attribute value for the list of options
196
- * Provide the string of ids seperated by space
202
+ * Provide the string of IDs seperated by space
197
203
  */
198
204
  listAriaLabelledBy: {
199
205
  type: String,
@@ -351,15 +357,42 @@ var script = {
351
357
  };
352
358
  },
353
359
  computed: {
354
- ariaLabelledByID() {
355
- if (this.searchable) {
356
- return this.searchInputId;
357
- }
360
+ /**
361
+ * Determines the `aria-labelledby` attribute value for the listbox by
362
+ * evaluating a series of conditions in priority order. The returned ID
363
+ * references the element that best describes the listbox content, with
364
+ * preference given to headers in searchable lists, followed by search
365
+ * input, form labels, and finally fallback options.
366
+ */
367
+ listboxAriaLabelledByID() {
368
+ // Listbox is labelled by closest heading, creating a meaningful relationship
369
+ if (this.headerId && this.searchable) return `${this.headerId}`;
370
+
371
+ // Listbox is labelled by the search input with role="combobox"
372
+ if (this.searchable) return this.searchInputId;
373
+
374
+ // Listbox is labelledy by the text inside an externally labelled button
375
+ if (this.isInFormGroup) return this.listboxIdComputed;
376
+
377
+ // Fallback. Return a header ID or the toggle button ID.
358
378
  return this.listAriaLabelledBy || this.headerId || this.toggleIdComputed;
359
379
  },
360
380
  toggleIdComputed() {
361
381
  return this.toggleId || uniqueId('dropdown-toggle-btn-');
362
382
  },
383
+ // Generate a custom listbox ID when inside GlFormGroup
384
+ listboxIdComputed() {
385
+ if (this.isInFormGroup) {
386
+ if (this.listAriaLabelledBy) {
387
+ return this.listAriaLabelledBy;
388
+ }
389
+ if (this.toggleId) {
390
+ return `${this.toggleId}-span`;
391
+ }
392
+ return uniqueId('dropdown-toggle-span-');
393
+ }
394
+ return undefined;
395
+ },
363
396
  listboxTag() {
364
397
  if (!this.hasItems || isOption(this.items[0])) return 'ul';
365
398
  return 'div';
@@ -567,6 +600,10 @@ var script = {
567
600
  (_this$scrollObserver = this.scrollObserver) === null || _this$scrollObserver === void 0 ? void 0 : _this$scrollObserver.disconnect();
568
601
  },
569
602
  methods: {
603
+ onFocusContent(event) {
604
+ event.preventDefault();
605
+ this.open();
606
+ },
570
607
  open() {
571
608
  this.$refs.baseDropdown.open();
572
609
  },
@@ -874,9 +911,9 @@ var script = {
874
911
  const __vue_script__ = script;
875
912
 
876
913
  /* template */
877
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-base-dropdown',{ref:"baseDropdown",attrs:{"aria-haspopup":"listbox","aria-labelledby":_vm.toggleAriaLabelledBy,"block":_vm.block,"toggle-id":_vm.toggleIdComputed,"toggle-text":_vm.listboxToggleText,"toggle-class":_vm.toggleButtonClasses,"text-sr-only":_vm.textSrOnly,"category":_vm.category,"variant":_vm.variant,"size":_vm.size,"icon":_vm.icon,"disabled":_vm.disabled,"loading":_vm.loading,"no-caret":_vm.noCaret,"placement":_vm.placement,"offset":_vm.dropdownOffset,"fluid-width":_vm.fluidWidth,"positioning-strategy":_vm.positioningStrategy},on:_vm._d({},[_vm.$options.events.GL_DROPDOWN_SHOWN,_vm.onShow,_vm.$options.events.GL_DROPDOWN_HIDDEN,_vm.onHide]),scopedSlots:_vm._u([(_vm.hasCustomToggle)?{key:"toggle",fn:function(){return [_vm._t("toggle")]},proxy:true}:null,{key:"default",fn:function(ref){
914
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-base-dropdown',{ref:"baseDropdown",attrs:{"aria-haspopup":"listbox","active-item-id":_vm.activeItemId,"aria-labelledby":_vm.toggleAriaLabelledBy,"block":_vm.block,"has-searchable-listbox":_vm.searchable,"has-external-label":_vm.isInFormGroup,"listbox-id":_vm.listboxIdComputed,"toggle-id":_vm.toggleIdComputed,"toggle-text":_vm.listboxToggleText,"toggle-class":_vm.toggleButtonClasses,"text-sr-only":_vm.textSrOnly,"category":_vm.category,"variant":_vm.variant,"size":_vm.size,"icon":_vm.icon,"disabled":_vm.disabled,"loading":_vm.loading,"no-caret":_vm.noCaret,"placement":_vm.placement,"offset":_vm.dropdownOffset,"fluid-width":_vm.fluidWidth,"positioning-strategy":_vm.positioningStrategy},on:_vm._d({},[_vm.$options.events.GL_DROPDOWN_FOCUS_CONTENT,_vm.onFocusContent,_vm.$options.events.GL_DROPDOWN_SHOWN,_vm.onShow,_vm.$options.events.GL_DROPDOWN_HIDDEN,_vm.onHide]),scopedSlots:_vm._u([(_vm.hasCustomToggle)?{key:"toggle",fn:function(slotProps){return [_vm._t("toggle",null,null,slotProps)]}}:null,{key:"default",fn:function(ref){
878
915
  var visible = ref.visible;
879
- return [(_vm.headerText)?_c('div',{staticClass:"gl-flex gl-min-h-8 gl-items-center !gl-p-4",class:_vm.$options.HEADER_ITEMS_BORDER_CLASSES},[_c('div',{staticClass:"gl-grow gl-pr-2 gl-text-sm gl-font-bold gl-text-strong",attrs:{"id":_vm.headerId,"data-testid":"listbox-header-text"}},[_vm._v("\n "+_vm._s(_vm.headerText)+"\n ")]),_vm._v(" "),(_vm.showResetButton)?_c('gl-button',{staticClass:"!gl-m-0 !gl-w-auto gl-max-w-1/2 gl-flex-shrink-0 gl-text-ellipsis !gl-px-2 !gl-text-sm focus:!gl-focus-inset",attrs:{"category":"tertiary","size":"small","data-testid":"listbox-reset-button"},on:{"click":_vm.onResetButtonClicked}},[_vm._v("\n "+_vm._s(_vm.resetButtonLabel)+"\n ")]):_vm._e(),_vm._v(" "),(_vm.showSelectAllButton)?_c('gl-button',{staticClass:"!gl-m-0 !gl-w-auto gl-max-w-1/2 gl-flex-shrink-0 gl-text-ellipsis !gl-px-2 !gl-text-sm focus:!gl-focus-inset",attrs:{"category":"tertiary","size":"small","data-testid":"listbox-select-all-button"},on:{"click":_vm.onSelectAllButtonClicked}},[_vm._v("\n "+_vm._s(_vm.showSelectAllButtonLabel)+"\n ")]):_vm._e()],1):_vm._e(),_vm._v(" "),(_vm.searchable)?_c('div',{class:_vm.$options.HEADER_ITEMS_BORDER_CLASSES},[_c('gl-listbox-search-input',{ref:"searchBox",class:{ 'gl-listbox-topmost': !_vm.headerText },attrs:{"id":_vm.searchInputId,"data-testid":"listbox-search-input","role":"combobox","aria-expanded":String(visible),"aria-controls":_vm.listboxId,"aria-activedescendant":_vm.activeItemId,"aria-haspopup":"listbox","placeholder":_vm.searchPlaceholder},on:{"input":_vm.search,"keydown":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"enter",13,$event.key,"Enter")){ return null; }$event.preventDefault();},_vm.onKeydown]},model:{value:(_vm.searchStr),callback:function ($$v) {_vm.searchStr=$$v;},expression:"searchStr"}}),_vm._v(" "),(_vm.searching)?_c('gl-loading-icon',{staticClass:"gl-my-3",attrs:{"data-testid":"listbox-search-loader","size":"md"}}):_vm._e()],1):_vm._e(),_vm._v(" "),(_vm.showList)?_c(_vm.listboxTag,{ref:"list",tag:"component",staticClass:"gl-new-dropdown-contents gl-new-dropdown-contents-with-scrim-overlay",class:_vm.listboxClasses,attrs:{"id":_vm.listboxId,"aria-busy":_vm.isBusy,"aria-labelledby":_vm.ariaLabelledByID,"aria-multiselectable":_vm.multiple ? 'true' : undefined,"role":"listbox","tabindex":"0"},on:{"keydown":_vm.onKeydown}},[_c(_vm.itemTag,{tag:"component",staticClass:"top-scrim-wrapper",attrs:{"aria-hidden":"true","data-testid":"top-scrim"}},[_c('div',{staticClass:"top-scrim",class:{ 'top-scrim-light': !_vm.hasHeader, 'top-scrim-dark': _vm.hasHeader }})]),_vm._v(" "),_c(_vm.itemTag,{ref:"top-boundary",tag:"component",attrs:{"aria-hidden":"true"}}),_vm._v(" "),_vm._l((_vm.items),function(item,index){return [(_vm.isOption(item))?[_c('gl-listbox-item',_vm._b({key:_vm.listboxItemKey(item),attrs:{"id":_vm.generateItemId(item),"data-testid":("listbox-item-" + (item.value)),"is-highlighted":_vm.isHighlighted(item),"is-selected":_vm.isSelected(item),"is-focused":_vm.isFocused(item),"is-check-centered":_vm.isCheckCentered},on:{"select":function($event){return _vm.onSelect(item, $event)}}},'gl-listbox-item',_vm.listboxItemMoreItemsAriaAttributes(index),false),[_vm._t("list-item",function(){return [_vm._v("\n "+_vm._s(item.text)+"\n ")]},{"item":item})],2)]:[_c('gl-listbox-group',{key:item.text,class:_vm.groupClasses(index),attrs:{"name":item.text,"text-sr-only":item.textSrOnly},scopedSlots:_vm._u([(_vm.$scopedSlots['group-label'])?{key:"group-label",fn:function(){return [_vm._t("group-label",null,{"group":item})]},proxy:true}:null],null,true)},[_vm._v(" "),_vm._l((item.options),function(option){return _c('gl-listbox-item',{key:_vm.listboxItemKey(option),attrs:{"id":_vm.generateItemId(option),"data-testid":("listbox-item-" + (option.value)),"is-highlighted":_vm.isHighlighted(option),"is-selected":_vm.isSelected(option),"is-focused":_vm.isFocused(option),"is-check-centered":_vm.isCheckCentered},on:{"select":function($event){return _vm.onSelect(option, $event)}}},[_vm._t("list-item",function(){return [_vm._v("\n "+_vm._s(option.text)+"\n ")]},{"item":option})],2)})],2)]]}),_vm._v(" "),(_vm.infiniteScrollLoading)?_c(_vm.itemTag,{tag:"component"},[_c('gl-loading-icon',{staticClass:"gl-my-3",attrs:{"data-testid":"listbox-infinite-scroll-loader","size":"md"}})],1):_vm._e(),_vm._v(" "),(_vm.showIntersectionObserver)?_c('gl-intersection-observer',{on:{"appear":_vm.onIntersectionObserverAppear}}):_vm._e(),_vm._v(" "),_c(_vm.itemTag,{ref:"bottom-boundary",tag:"component",attrs:{"aria-hidden":"true"}}),_vm._v(" "),_c(_vm.itemTag,{tag:"component",staticClass:"bottom-scrim-wrapper",attrs:{"aria-hidden":"true","data-testid":"bottom-scrim"}},[_c('div',{staticClass:"bottom-scrim",class:{ '!gl-rounded-none': _vm.hasFooter }})])],2):_vm._e(),_vm._v(" "),(_vm.announceSRSearchResults)?_c('span',{staticClass:"gl-sr-only",attrs:{"data-testid":"listbox-number-of-results","aria-live":"assertive"}},[_vm._t("search-summary-sr-only",function(){return [_vm._v("\n "+_vm._s(_vm.srOnlyResultsLabel(_vm.flattenedOptions.length))+"\n ")]})],2):_vm._e(),_vm._v(" "),(_vm.isBusy)?_c('span',{staticClass:"gl-sr-only",attrs:{"aria-live":"polite","data-testid":"listbox-loading-announcement"}},[_vm._v("\n "+_vm._s(_vm.loadingAnnouncementText)+"\n ")]):(_vm.showNoResultsText)?_c('div',{staticClass:"gl-py-3 gl-pl-7 gl-pr-5 gl-text-base gl-text-subtle",attrs:{"aria-live":"assertive","data-testid":"listbox-no-results-text"}},[_vm._v("\n "+_vm._s(_vm.noResultsText)+"\n ")]):_vm._e(),_vm._v(" "),_vm._t("footer")]}}],null,true)})};
916
+ return [(_vm.headerText)?_c('div',{staticClass:"gl-flex gl-min-h-8 gl-items-center !gl-p-4",class:_vm.$options.HEADER_ITEMS_BORDER_CLASSES},[_c('div',{staticClass:"gl-grow gl-pr-2 gl-text-sm gl-font-bold gl-text-strong",attrs:{"id":_vm.headerId,"data-testid":"listbox-header-text"}},[_vm._v("\n "+_vm._s(_vm.headerText)+"\n ")]),_vm._v(" "),(_vm.showResetButton)?_c('gl-button',{staticClass:"!gl-m-0 !gl-w-auto gl-max-w-1/2 gl-flex-shrink-0 gl-text-ellipsis !gl-px-2 !gl-text-sm focus:!gl-focus-inset",attrs:{"category":"tertiary","size":"small","data-testid":"listbox-reset-button"},on:{"click":_vm.onResetButtonClicked}},[_vm._v("\n "+_vm._s(_vm.resetButtonLabel)+"\n ")]):_vm._e(),_vm._v(" "),(_vm.showSelectAllButton)?_c('gl-button',{staticClass:"!gl-m-0 !gl-w-auto gl-max-w-1/2 gl-flex-shrink-0 gl-text-ellipsis !gl-px-2 !gl-text-sm focus:!gl-focus-inset",attrs:{"category":"tertiary","size":"small","data-testid":"listbox-select-all-button"},on:{"click":_vm.onSelectAllButtonClicked}},[_vm._v("\n "+_vm._s(_vm.showSelectAllButtonLabel)+"\n ")]):_vm._e()],1):_vm._e(),_vm._v(" "),(_vm.searchable)?_c('div',{class:_vm.$options.HEADER_ITEMS_BORDER_CLASSES},[_c('gl-listbox-search-input',{ref:"searchBox",class:{ 'gl-listbox-topmost': !_vm.headerText },attrs:{"id":_vm.searchInputId,"data-testid":"listbox-search-input","role":"combobox","aria-expanded":String(visible),"aria-controls":_vm.listboxId,"aria-activedescendant":_vm.activeItemId,"aria-haspopup":"listbox","placeholder":_vm.searchPlaceholder},on:{"input":_vm.search,"keydown":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"enter",13,$event.key,"Enter")){ return null; }$event.preventDefault();},_vm.onKeydown]},model:{value:(_vm.searchStr),callback:function ($$v) {_vm.searchStr=$$v;},expression:"searchStr"}}),_vm._v(" "),(_vm.searching)?_c('gl-loading-icon',{staticClass:"gl-my-3",attrs:{"data-testid":"listbox-search-loader","size":"md"}}):_vm._e()],1):_vm._e(),_vm._v(" "),(_vm.showList)?_c(_vm.listboxTag,{ref:"list",tag:"component",staticClass:"gl-new-dropdown-contents gl-new-dropdown-contents-with-scrim-overlay",class:_vm.listboxClasses,attrs:{"id":_vm.listboxId,"aria-busy":_vm.isBusy,"aria-labelledby":_vm.listboxAriaLabelledByID,"aria-multiselectable":_vm.multiple ? 'true' : undefined,"role":"listbox","tabindex":"0"},on:{"keydown":_vm.onKeydown}},[_c(_vm.itemTag,{tag:"component",staticClass:"top-scrim-wrapper",attrs:{"aria-hidden":"true","data-testid":"top-scrim"}},[_c('div',{staticClass:"top-scrim",class:{ 'top-scrim-light': !_vm.hasHeader, 'top-scrim-dark': _vm.hasHeader }})]),_vm._v(" "),_c(_vm.itemTag,{ref:"top-boundary",tag:"component",attrs:{"aria-hidden":"true"}}),_vm._v(" "),_vm._l((_vm.items),function(item,index){return [(_vm.isOption(item))?[_c('gl-listbox-item',_vm._b({key:_vm.listboxItemKey(item),attrs:{"id":_vm.generateItemId(item),"data-testid":("listbox-item-" + (item.value)),"is-highlighted":_vm.isHighlighted(item),"is-selected":_vm.isSelected(item),"is-focused":_vm.isFocused(item),"is-check-centered":_vm.isCheckCentered},on:{"select":function($event){return _vm.onSelect(item, $event)}}},'gl-listbox-item',_vm.listboxItemMoreItemsAriaAttributes(index),false),[_vm._t("list-item",function(){return [_vm._v("\n "+_vm._s(item.text)+"\n ")]},{"item":item})],2)]:[_c('gl-listbox-group',{key:item.text,class:_vm.groupClasses(index),attrs:{"name":item.text,"text-sr-only":item.textSrOnly},scopedSlots:_vm._u([(_vm.$scopedSlots['group-label'])?{key:"group-label",fn:function(){return [_vm._t("group-label",null,{"group":item})]},proxy:true}:null],null,true)},[_vm._v(" "),_vm._l((item.options),function(option){return _c('gl-listbox-item',{key:_vm.listboxItemKey(option),attrs:{"id":_vm.generateItemId(option),"data-testid":("listbox-item-" + (option.value)),"is-highlighted":_vm.isHighlighted(option),"is-selected":_vm.isSelected(option),"is-focused":_vm.isFocused(option),"is-check-centered":_vm.isCheckCentered},on:{"select":function($event){return _vm.onSelect(option, $event)}}},[_vm._t("list-item",function(){return [_vm._v("\n "+_vm._s(option.text)+"\n ")]},{"item":option})],2)})],2)]]}),_vm._v(" "),(_vm.infiniteScrollLoading)?_c(_vm.itemTag,{tag:"component"},[_c('gl-loading-icon',{staticClass:"gl-my-3",attrs:{"data-testid":"listbox-infinite-scroll-loader","size":"md"}})],1):_vm._e(),_vm._v(" "),(_vm.showIntersectionObserver)?_c('gl-intersection-observer',{on:{"appear":_vm.onIntersectionObserverAppear}}):_vm._e(),_vm._v(" "),_c(_vm.itemTag,{ref:"bottom-boundary",tag:"component",attrs:{"aria-hidden":"true"}}),_vm._v(" "),_c(_vm.itemTag,{tag:"component",staticClass:"bottom-scrim-wrapper",attrs:{"aria-hidden":"true","data-testid":"bottom-scrim"}},[_c('div',{staticClass:"bottom-scrim",class:{ '!gl-rounded-none': _vm.hasFooter }})])],2):_vm._e(),_vm._v(" "),(_vm.announceSRSearchResults)?_c('span',{staticClass:"gl-sr-only",attrs:{"data-testid":"listbox-number-of-results","aria-live":"assertive"}},[_vm._t("search-summary-sr-only",function(){return [_vm._v("\n "+_vm._s(_vm.srOnlyResultsLabel(_vm.flattenedOptions.length))+"\n ")]})],2):_vm._e(),_vm._v(" "),(_vm.isBusy)?_c('span',{staticClass:"gl-sr-only",attrs:{"aria-live":"polite","data-testid":"listbox-loading-announcement"}},[_vm._v("\n "+_vm._s(_vm.loadingAnnouncementText)+"\n ")]):(_vm.showNoResultsText)?_c('div',{staticClass:"gl-py-3 gl-pl-7 gl-pr-5 gl-text-base gl-text-subtle",attrs:{"aria-live":"assertive","data-testid":"listbox-no-results-text"}},[_vm._v("\n "+_vm._s(_vm.noResultsText)+"\n ")]):_vm._e(),_vm._v(" "),_vm._t("footer")]}}],null,true)})};
880
917
  var __vue_staticRenderFns__ = [];
881
918
 
882
919
  /* style */