@gitlab/ui 136.3.2 → 137.0.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 (28) hide show
  1. package/dist/components/base/alert/alert.js +4 -4
  2. package/dist/components/base/datepicker/datepicker.js +1 -1
  3. package/dist/components/base/infinite_scroll/infinite_scroll.js +12 -3
  4. package/dist/components/base/new_dropdowns/constants.js +2 -2
  5. package/dist/components/base/new_dropdowns/disclosure/disclosure_dropdown.js +1 -1
  6. package/dist/components/base/sorting/sorting.js +2 -2
  7. package/dist/components/charts/chart/chart.js +1 -1
  8. package/dist/components/charts/sparkline/sparkline.js +2 -2
  9. package/dist/components/dashboards/dashboard_panel/dashboard_panel.js +1 -1
  10. package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip-template.js +4 -2
  11. package/dist/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip.js +3 -1
  12. package/dist/vendor/bootstrap-vue/src/directives/tooltip/tooltip.js +2 -1
  13. package/package.json +1 -1
  14. package/src/components/base/alert/alert.vue +4 -4
  15. package/src/components/base/datepicker/datepicker.vue +1 -1
  16. package/src/components/base/infinite_scroll/infinite_scroll.vue +7 -3
  17. package/src/components/base/new_dropdowns/constants.js +2 -2
  18. package/src/components/base/new_dropdowns/disclosure/disclosure_dropdown.vue +1 -1
  19. package/src/components/base/sorting/sorting.vue +2 -2
  20. package/src/components/charts/chart/chart.vue +1 -1
  21. package/src/components/charts/sparkline/sparkline.vue +2 -2
  22. package/src/components/dashboards/dashboard_panel/dashboard_panel.vue +2 -2
  23. package/src/tokens/build/docs/tokens-tailwind-docs.dark.json +34 -0
  24. package/src/tokens/build/docs/tokens-tailwind-docs.json +34 -0
  25. package/src/tokens/build/tailwind/tokens.cjs +1 -0
  26. package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip-template.js +4 -2
  27. package/src/vendor/bootstrap-vue/src/components/tooltip/helpers/bv-tooltip.js +3 -1
  28. package/src/vendor/bootstrap-vue/src/directives/tooltip/tooltip.js +2 -1
@@ -192,19 +192,19 @@ var script = {
192
192
  /**
193
193
  * Emitted when the primary action button is clicked.
194
194
  *
195
- * @event primaryAction
195
+ * @event primary-action
196
196
  * @type {object}
197
197
  */
198
- this.$emit('primaryAction', event);
198
+ this.$emit('primary-action', event);
199
199
  },
200
200
  secondaryButtonClicked(event) {
201
201
  /**
202
202
  * Emitted when the secondary action button is clicked.
203
203
  *
204
- * @event secondaryAction
204
+ * @event secondary-action
205
205
  * @type {object}
206
206
  */
207
- this.$emit('secondaryAction', event);
207
+ this.$emit('secondary-action', event);
208
208
  },
209
209
  onDismiss() {
210
210
  /**
@@ -417,7 +417,7 @@ var script = {
417
417
  /**
418
418
  * Emitted when the datepicker draws a new month.
419
419
  */
420
- this.$emit('monthChange');
420
+ this.$emit('month-change');
421
421
  },
422
422
  onKeydown() {
423
423
  if (this.textInput === '') {
@@ -77,9 +77,18 @@ var script = {
77
77
  }
78
78
  },
79
79
  async mounted() {
80
+ var _this = this;
80
81
  // Scroll to bottom for reverse effect
81
82
  await this.$nextTick();
82
- if (this.$listeners.topReached && !this.$listeners.bottomReached) {
83
+
84
+ // Check both kebab-case (Vue 2) and camelCase (@vue/compat) $listeners.
85
+ const listening = function () {
86
+ for (var _len = arguments.length, names = new Array(_len), _key = 0; _key < _len; _key++) {
87
+ names[_key] = arguments[_key];
88
+ }
89
+ return names.some(name => _this.$listeners[name]);
90
+ };
91
+ if (listening('top-reached', 'topReached') && !listening('bottom-reached', 'bottomReached')) {
83
92
  this.scrollDown();
84
93
  }
85
94
  },
@@ -124,13 +133,13 @@ var script = {
124
133
  /**
125
134
  * Emitted when item container is scrolled to the top
126
135
  */
127
- this.$emit('topReached');
136
+ this.$emit('top-reached');
128
137
  }, throttleDuration),
129
138
  bottomReached: throttle(function bottomReachedThrottled() {
130
139
  /**
131
140
  * Emitted when item container is scrolled to the bottom
132
141
  */
133
- this.$emit('bottomReached');
142
+ this.$emit('bottom-reached');
134
143
  }, throttleDuration),
135
144
  itemsListHeight() {
136
145
  return this.$refs.infiniteContainer.scrollHeight;
@@ -1,8 +1,8 @@
1
1
  // base dropdown events
2
2
  const GL_DROPDOWN_SHOWN = 'shown';
3
3
  const GL_DROPDOWN_HIDDEN = 'hidden';
4
- const GL_DROPDOWN_BEFORE_CLOSE = 'beforeClose';
5
- const GL_DROPDOWN_FOCUS_CONTENT = 'focusContent';
4
+ const GL_DROPDOWN_BEFORE_CLOSE = 'before-close';
5
+ const GL_DROPDOWN_FOCUS_CONTENT = 'focus-content';
6
6
 
7
7
  // KeyboardEvent.code values
8
8
  const ARROW_DOWN = 'ArrowDown';
@@ -270,7 +270,7 @@ var script = {
270
270
  /**
271
271
  * Emitted when dropdown is about to be closed
272
272
  *
273
- * @event beforeClose
273
+ * @event before-close
274
274
  */
275
275
  this.$emit(GL_DROPDOWN_BEFORE_CLOSE, event);
276
276
  },
@@ -145,7 +145,7 @@ var script = {
145
145
  *
146
146
  * @property {boolean} isAscending
147
147
  */
148
- this.$emit('sortDirectionChange', newDirection);
148
+ this.$emit('sort-direction-change', newDirection);
149
149
  },
150
150
  onSortByChanged(event) {
151
151
  /**
@@ -157,7 +157,7 @@ var script = {
157
157
  *
158
158
  * @property {string|number} value
159
159
  */
160
- this.$emit('sortByChange', event);
160
+ this.$emit('sort-by-change', event);
161
161
  }
162
162
  }
163
163
  };
@@ -172,7 +172,7 @@ var script = {
172
172
  * @property {object} chart The chart instance
173
173
  * @property {object} params A params object, see also https://echarts.apache.org/en/api.html#events.Mouse%20events
174
174
  */
175
- this.$emit('chartItemClicked', {
175
+ this.$emit('chart-item-clicked', {
176
176
  chart: this.chart,
177
177
  params
178
178
  });
@@ -261,10 +261,10 @@ var script = {
261
261
  /**
262
262
  * Emitted when the chart is created.
263
263
  * The payload contains the echarts instance.
264
- * @event chartCreated
264
+ * @event chart-created
265
265
  * @type {object}
266
266
  */
267
- this.$emit('chartCreated', chartInstance);
267
+ this.$emit('chart-created', chartInstance);
268
268
  },
269
269
  handleResize() {
270
270
  this.chartInstance.resize();
@@ -201,7 +201,7 @@ const __vue_script__ = script;
201
201
  /* template */
202
202
  var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"gl-border gl-h-full gl-rounded-lg gl-bg-default gl-p-5",class:_vm.containerClasses,attrs:{"id":_vm.panelId}},[_c('div',{staticClass:"gl-flex gl-h-full gl-flex-col"},[_c('div',{staticClass:"gl-mb-3 gl-flex gl-items-start gl-justify-between",attrs:{"data-testid":"panel-title"}},[(_vm.loading)?_c('gl-skeleton-loader',{attrs:{"lines":1}}):_c('div',{staticClass:"gl-flex gl-items-center gl-gap-2 gl-overflow-hidden"},[(_vm.hasTitleIcon)?_c('gl-icon',{class:_vm.titleIconClass,attrs:{"name":_vm.titleIcon,"data-testid":"panel-title-icon"}}):_vm._e(),_vm._v(" "),_c('div',{staticClass:"gl-min-w-0"},[_c('div',{staticClass:"gl-flex gl-items-center gl-gap-2"},[(_vm.hasTitle)?_c('gl-truncate',{staticClass:"gl-min-w-0 gl-font-bold gl-text-default",attrs:{"text":_vm.title,"with-tooltip":""}}):_vm._e(),_vm._v(" "),(_vm.hasTitlePopover)?[_c('gl-icon',{staticClass:"gl-min-w-5",attrs:{"id":_vm.titlePopoverId,"data-testid":"panel-title-popover-icon","name":"information-o","variant":"info"}}),_vm._v(" "),_c('gl-popover',{attrs:{"data-testid":"panel-title-popover","boundary":"viewport","target":_vm.titlePopoverId,"css-classes":_vm.titlePopoverClasses},scopedSlots:_vm._u([(_vm.hasInfoPopoverTitleSlot)?{key:"title",fn:function(){return [_vm._t("info-popover-title")]},proxy:true}:null],null,true)},[_vm._v(" "),(_vm.hasInfoPopoverContentSlot)?[_vm._t("info-popover-content")]:_vm._e(),_vm._v(" "),(!_vm.hasInfoPopoverContentSlot)?[(_vm.hasTitlePopoverLink)?_c('gl-sprintf',{attrs:{"message":_vm.titlePopover.description},scopedSlots:_vm._u([{key:"link",fn:function(ref){
203
203
  var content = ref.content;
204
- return [_c('gl-link',{staticClass:"gl-text-sm",attrs:{"href":_vm.titlePopover.descriptionLink}},[_vm._v(_vm._s(content))])]}}],null,false,3051540671)}):[_vm._v(" "+_vm._s(_vm.titlePopover.description)+" ")]]:_vm._e()],2)]:_vm._e()],2),_vm._v(" "),(_vm.subtitle)?_c('p',{staticClass:"gl-mb-0 gl-mt-1 gl-text-sm gl-text-subtle",attrs:{"data-testid":"panel-subtitle"}},[_vm._v("\n "+_vm._s(_vm.subtitle)+"\n ")]):_vm._e()])],1),_vm._v(" "),(_vm.shouldShowActions || _vm.$scopedSlots.filters)?_c('div',{staticClass:"gl-flex gl-flex-col gl-items-end gl-gap-2",attrs:{"data-testid":"panel-actions-filters-container"}},[(_vm.shouldShowActions)?_c('gl-disclosure-dropdown',{attrs:{"items":_vm.actions,"icon":"ellipsis_v","toggle-text":_vm.actionsToggleText,"text-sr-only":"","no-caret":"","placement":"bottom-end","fluid-width":"","toggle-class":"gl-ml-1","category":"tertiary","positioning-strategy":"fixed","size":"small"},on:{"shown":function($event){return _vm.$emit('dropdownOpen')},"hidden":function($event){return _vm.$emit('dropdownClosed')}},scopedSlots:_vm._u([{key:"list-item",fn:function(ref){
204
+ return [_c('gl-link',{staticClass:"gl-text-sm",attrs:{"href":_vm.titlePopover.descriptionLink}},[_vm._v(_vm._s(content))])]}}],null,false,3051540671)}):[_vm._v(" "+_vm._s(_vm.titlePopover.description)+" ")]]:_vm._e()],2)]:_vm._e()],2),_vm._v(" "),(_vm.subtitle)?_c('p',{staticClass:"gl-mb-0 gl-mt-1 gl-text-sm gl-text-subtle",attrs:{"data-testid":"panel-subtitle"}},[_vm._v("\n "+_vm._s(_vm.subtitle)+"\n ")]):_vm._e()])],1),_vm._v(" "),(_vm.shouldShowActions || _vm.$scopedSlots.filters)?_c('div',{staticClass:"gl-flex gl-flex-col gl-items-end gl-gap-2",attrs:{"data-testid":"panel-actions-filters-container"}},[(_vm.shouldShowActions)?_c('gl-disclosure-dropdown',{attrs:{"items":_vm.actions,"icon":"ellipsis_v","toggle-text":_vm.actionsToggleText,"text-sr-only":"","no-caret":"","placement":"bottom-end","fluid-width":"","toggle-class":"gl-ml-1","category":"tertiary","positioning-strategy":"fixed","size":"small"},on:{"shown":function($event){return _vm.$emit('dropdown-open')},"hidden":function($event){return _vm.$emit('dropdown-closed')}},scopedSlots:_vm._u([{key:"list-item",fn:function(ref){
205
205
  var item = ref.item;
206
206
  return [_c('span',[_vm._v(_vm._s(item.text))])]}}],null,false,3418607560)}):_vm._e(),_vm._v(" "),(_vm.$scopedSlots.filters)?_c('div',{staticClass:"gl-flex gl-items-center gl-justify-end",attrs:{"data-testid":"panel-filters-container"}},[_vm._t("filters")],2):_vm._e()],1):_vm._e()],1),_vm._v(" "),_c('div',{class:_vm.bodyClasses},[(_vm.loading)?[_c('gl-loading-icon',{staticClass:"gl-min-h-8 gl-w-full",attrs:{"size":"lg"}}),_vm._v(" "),(_vm.isLoadingDelayed)?_c('div',{staticClass:"gl-w-full gl-text-subtle",attrs:{"data-testId":"panel-loading-delayed-indicator"}},[_vm._v("\n "+_vm._s(_vm.loadingDelayedText)+"\n ")]):_vm._e()]:_vm._t("body")],2),_vm._v(" "),_vm._t("alert-message",null,{"panelId":_vm.panelId})],2)])};
207
207
  var __vue_staticRenderFns__ = [];
@@ -62,8 +62,10 @@ const BVTooltipTemplate = /*#__PURE__*/extend({
62
62
  templateAttributes() {
63
63
  const id = this.id;
64
64
  return {
65
- // Apply attributes from root tooltip component
66
- ...this.bvParent.bvParent.$attrs,
65
+ // Apply attributes from root tooltip component. A directive has no such component, so
66
+ // `bvParent.bvParent` is the component holding the target element, whose attributes
67
+ // must not leak onto the template.
68
+ ...(this.bvParent.isDirective ? {} : this.bvParent.bvParent.$attrs),
67
69
  id,
68
70
  role: 'tooltip',
69
71
  tabindex: '-1',
@@ -90,7 +90,9 @@ const templateData = {
90
90
  // ID to use for tooltip/popover
91
91
  id: null,
92
92
  // Flag used by directives only, for HTML content
93
- html: false
93
+ html: false,
94
+ // Flag used by directives only, to suppress attribute forwarding
95
+ isDirective: false
94
96
  };
95
97
 
96
98
  // --- Main component ---
@@ -217,7 +217,8 @@ const applyTooltip = (el, bindings, vnode) => {
217
217
  id: config.id,
218
218
  interactive: config.interactive,
219
219
  disabled: config.disabled,
220
- html: config.html
220
+ html: config.html,
221
+ isDirective: true
221
222
  };
222
223
  const oldData = el[BV_TOOLTIP].__bv_prev_data__;
223
224
  el[BV_TOOLTIP].__bv_prev_data__ = data;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/ui",
3
- "version": "136.3.2",
3
+ "version": "137.0.0",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -203,19 +203,19 @@ export default {
203
203
  /**
204
204
  * Emitted when the primary action button is clicked.
205
205
  *
206
- * @event primaryAction
206
+ * @event primary-action
207
207
  * @type {object}
208
208
  */
209
- this.$emit('primaryAction', event);
209
+ this.$emit('primary-action', event);
210
210
  },
211
211
  secondaryButtonClicked(event) {
212
212
  /**
213
213
  * Emitted when the secondary action button is clicked.
214
214
  *
215
- * @event secondaryAction
215
+ * @event secondary-action
216
216
  * @type {object}
217
217
  */
218
- this.$emit('secondaryAction', event);
218
+ this.$emit('secondary-action', event);
219
219
  },
220
220
  onDismiss() {
221
221
  /**
@@ -434,7 +434,7 @@ export default {
434
434
  /**
435
435
  * Emitted when the datepicker draws a new month.
436
436
  */
437
- this.$emit('monthChange');
437
+ this.$emit('month-change');
438
438
  },
439
439
  onKeydown() {
440
440
  if (this.textInput === '') {
@@ -79,7 +79,11 @@ export default {
79
79
  async mounted() {
80
80
  // Scroll to bottom for reverse effect
81
81
  await this.$nextTick();
82
- if (this.$listeners.topReached && !this.$listeners.bottomReached) {
82
+
83
+ // Check both kebab-case (Vue 2) and camelCase (@vue/compat) $listeners.
84
+ const listening = (...names) => names.some((name) => this.$listeners[name]);
85
+
86
+ if (listening('top-reached', 'topReached') && !listening('bottom-reached', 'bottomReached')) {
83
87
  this.scrollDown();
84
88
  }
85
89
  },
@@ -117,13 +121,13 @@ export default {
117
121
  /**
118
122
  * Emitted when item container is scrolled to the top
119
123
  */
120
- this.$emit('topReached');
124
+ this.$emit('top-reached');
121
125
  }, throttleDuration),
122
126
  bottomReached: throttle(function bottomReachedThrottled() {
123
127
  /**
124
128
  * Emitted when item container is scrolled to the bottom
125
129
  */
126
- this.$emit('bottomReached');
130
+ this.$emit('bottom-reached');
127
131
  }, throttleDuration),
128
132
  itemsListHeight() {
129
133
  return this.$refs.infiniteContainer.scrollHeight;
@@ -1,8 +1,8 @@
1
1
  // base dropdown events
2
2
  export const GL_DROPDOWN_SHOWN = 'shown';
3
3
  export const GL_DROPDOWN_HIDDEN = 'hidden';
4
- export const GL_DROPDOWN_BEFORE_CLOSE = 'beforeClose';
5
- export const GL_DROPDOWN_FOCUS_CONTENT = 'focusContent';
4
+ export const GL_DROPDOWN_BEFORE_CLOSE = 'before-close';
5
+ export const GL_DROPDOWN_FOCUS_CONTENT = 'focus-content';
6
6
 
7
7
  // KeyboardEvent.code values
8
8
  export const ARROW_DOWN = 'ArrowDown';
@@ -296,7 +296,7 @@ export default {
296
296
  /**
297
297
  * Emitted when dropdown is about to be closed
298
298
  *
299
- * @event beforeClose
299
+ * @event before-close
300
300
  */
301
301
  this.$emit(GL_DROPDOWN_BEFORE_CLOSE, event);
302
302
  },
@@ -152,7 +152,7 @@ export default {
152
152
  *
153
153
  * @property {boolean} isAscending
154
154
  */
155
- this.$emit('sortDirectionChange', newDirection);
155
+ this.$emit('sort-direction-change', newDirection);
156
156
  },
157
157
  onSortByChanged(event) {
158
158
  /**
@@ -164,7 +164,7 @@ export default {
164
164
  *
165
165
  * @property {string|number} value
166
166
  */
167
- this.$emit('sortByChange', event);
167
+ this.$emit('sort-by-change', event);
168
168
  },
169
169
  },
170
170
  };
@@ -171,7 +171,7 @@ export default {
171
171
  * @property {object} chart The chart instance
172
172
  * @property {object} params A params object, see also https://echarts.apache.org/en/api.html#events.Mouse%20events
173
173
  */
174
- this.$emit('chartItemClicked', { chart: this.chart, params });
174
+ this.$emit('chart-item-clicked', { chart: this.chart, params });
175
175
  },
176
176
  handleResize() {
177
177
  this.chart.resize();
@@ -210,10 +210,10 @@ export default {
210
210
  /**
211
211
  * Emitted when the chart is created.
212
212
  * The payload contains the echarts instance.
213
- * @event chartCreated
213
+ * @event chart-created
214
214
  * @type {object}
215
215
  */
216
- this.$emit('chartCreated', chartInstance);
216
+ this.$emit('chart-created', chartInstance);
217
217
  },
218
218
  handleResize() {
219
219
  this.chartInstance.resize();
@@ -290,8 +290,8 @@ export default {
290
290
  category="tertiary"
291
291
  positioning-strategy="fixed"
292
292
  size="small"
293
- @shown="$emit('dropdownOpen')"
294
- @hidden="$emit('dropdownClosed')"
293
+ @shown="$emit('dropdown-open')"
294
+ @hidden="$emit('dropdown-closed')"
295
295
  >
296
296
  <template #list-item="{ item }">
297
297
  <span>{{ item.text }}</span>
@@ -5795,6 +5795,40 @@
5795
5795
  "cssWithValue": "var(--gl-feedback-brand-background-color)"
5796
5796
  }
5797
5797
  },
5798
+ "application-chrome": {
5799
+ "key": "{application-chrome.background.color}",
5800
+ "$value": "#050506",
5801
+ "$type": "color",
5802
+ "$description": "Used for the application chrome background, the lowest layer of the interface that sits beneath panels and contains global navigation, user actions, application navigation, and AI navigation.",
5803
+ "$extensions": {
5804
+ "com.figma.scopes": [
5805
+ "FRAME_FILL",
5806
+ "SHAPE_FILL"
5807
+ ]
5808
+ },
5809
+ "filePath": "src/tokens/contextual/application-chrome.tokens.json",
5810
+ "isSource": true,
5811
+ "original": {
5812
+ "$value": "{color.neutral.1000}",
5813
+ "$type": "color",
5814
+ "$description": "Used for the application chrome background, the lowest layer of the interface that sits beneath panels and contains global navigation, user actions, application navigation, and AI navigation.",
5815
+ "$extensions": {
5816
+ "com.figma.scopes": [
5817
+ "FRAME_FILL",
5818
+ "SHAPE_FILL"
5819
+ ]
5820
+ },
5821
+ "key": "{application-chrome.background.color}"
5822
+ },
5823
+ "name": "APPLICATION_CHROME_BACKGROUND_COLOR",
5824
+ "attributes": {},
5825
+ "path": [
5826
+ "application-chrome",
5827
+ "background",
5828
+ "color"
5829
+ ],
5830
+ "cssWithValue": "var(--gl-application-chrome-background-color)"
5831
+ },
5798
5832
  "dropdown": {
5799
5833
  "key": "{dropdown.background.color}",
5800
5834
  "$value": "#28272d",
@@ -5795,6 +5795,40 @@
5795
5795
  "cssWithValue": "var(--gl-feedback-brand-background-color)"
5796
5796
  }
5797
5797
  },
5798
+ "application-chrome": {
5799
+ "key": "{application-chrome.background.color}",
5800
+ "$value": "#ececef",
5801
+ "$type": "color",
5802
+ "$description": "Used for the application chrome background, the lowest layer of the interface that sits beneath panels and contains global navigation, user actions, application navigation, and AI navigation.",
5803
+ "$extensions": {
5804
+ "com.figma.scopes": [
5805
+ "FRAME_FILL",
5806
+ "SHAPE_FILL"
5807
+ ]
5808
+ },
5809
+ "filePath": "src/tokens/contextual/application-chrome.tokens.json",
5810
+ "isSource": true,
5811
+ "original": {
5812
+ "$value": "{color.neutral.50}",
5813
+ "$type": "color",
5814
+ "$description": "Used for the application chrome background, the lowest layer of the interface that sits beneath panels and contains global navigation, user actions, application navigation, and AI navigation.",
5815
+ "$extensions": {
5816
+ "com.figma.scopes": [
5817
+ "FRAME_FILL",
5818
+ "SHAPE_FILL"
5819
+ ]
5820
+ },
5821
+ "key": "{application-chrome.background.color}"
5822
+ },
5823
+ "name": "APPLICATION_CHROME_BACKGROUND_COLOR",
5824
+ "attributes": {},
5825
+ "path": [
5826
+ "application-chrome",
5827
+ "background",
5828
+ "color"
5829
+ ],
5830
+ "cssWithValue": "var(--gl-application-chrome-background-color)"
5831
+ },
5798
5832
  "dropdown": {
5799
5833
  "key": "{dropdown.background.color}",
5800
5834
  "$value": "#fff",
@@ -430,6 +430,7 @@ const backgroundColor = {
430
430
  ...backgroundColors,
431
431
  ...statusBackgroundColors,
432
432
  ...feedbackBackgroundColors,
433
+ 'application-chrome': 'var(--gl-application-chrome-background-color)',
433
434
  dropdown: 'var(--gl-dropdown-background-color)',
434
435
  control: {
435
436
  default: 'var(--gl-control-background-color-default)',
@@ -70,8 +70,10 @@ export const BVTooltipTemplate = /*#__PURE__*/ extend({
70
70
  const { id } = this
71
71
 
72
72
  return {
73
- // Apply attributes from root tooltip component
74
- ...this.bvParent.bvParent.$attrs,
73
+ // Apply attributes from root tooltip component. A directive has no such component, so
74
+ // `bvParent.bvParent` is the component holding the target element, whose attributes
75
+ // must not leak onto the template.
76
+ ...(this.bvParent.isDirective ? {} : this.bvParent.bvParent.$attrs),
75
77
 
76
78
  id,
77
79
  role: 'tooltip',
@@ -130,7 +130,9 @@ const templateData = {
130
130
  // ID to use for tooltip/popover
131
131
  id: null,
132
132
  // Flag used by directives only, for HTML content
133
- html: false
133
+ html: false,
134
+ // Flag used by directives only, to suppress attribute forwarding
135
+ isDirective: false
134
136
  }
135
137
 
136
138
  // --- Main component ---
@@ -225,7 +225,8 @@ const applyTooltip = (el, bindings, vnode) => {
225
225
  id: config.id,
226
226
  interactive: config.interactive,
227
227
  disabled: config.disabled,
228
- html: config.html
228
+ html: config.html,
229
+ isDirective: true
229
230
  }
230
231
  const oldData = el[BV_TOOLTIP].__bv_prev_data__
231
232
  el[BV_TOOLTIP].__bv_prev_data__ = data