@gitlab/ui 111.8.1 → 111.9.1

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 (34) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/components/base/breadcrumb/breadcrumb.js +1 -1
  3. package/dist/components/base/breadcrumb/breadcrumb_item.js +6 -5
  4. package/dist/components/base/daterange_picker/daterange_picker.js +1 -1
  5. package/dist/components/base/filtered_search/filtered_search.js +1 -1
  6. package/dist/components/base/new_dropdowns/listbox/listbox.js +3 -1
  7. package/dist/components/base/search_box_by_click/search_box_by_click.js +1 -1
  8. package/dist/components/base/sorting/sorting.js +1 -1
  9. package/dist/components/base/tooltip/tooltip.js +4 -2
  10. package/dist/components/shared_components/clear_icon_button/clear_icon_button.js +1 -1
  11. package/dist/components/utilities/truncate/truncate.js +1 -1
  12. package/dist/directives/tooltip/container.js +7 -0
  13. package/dist/directives/tooltip/tooltip.js +18 -0
  14. package/dist/index.js +2 -1
  15. package/dist/tokens/tokens_story.js +1 -1
  16. package/dist/tokens/tokens_table.js +1 -1
  17. package/package.json +1 -1
  18. package/src/components/base/breadcrumb/breadcrumb.vue +1 -1
  19. package/src/components/base/breadcrumb/breadcrumb_item.vue +11 -5
  20. package/src/components/base/daterange_picker/daterange_picker.vue +1 -1
  21. package/src/components/base/filtered_search/filtered_search.vue +1 -1
  22. package/src/components/base/new_dropdowns/listbox/listbox.vue +3 -1
  23. package/src/components/base/search_box_by_click/search_box_by_click.vue +1 -1
  24. package/src/components/base/sorting/sorting.vue +1 -1
  25. package/src/components/base/tooltip/tooltip.vue +3 -0
  26. package/src/components/shared_components/clear_icon_button/clear_icon_button.vue +1 -1
  27. package/src/components/utilities/truncate/truncate.vue +1 -1
  28. package/src/directives/tooltip/container.js +7 -0
  29. package/src/directives/tooltip/tooltip.js +22 -0
  30. package/src/index.js +2 -1
  31. package/src/tokens/tokens_story.vue +1 -1
  32. package/src/tokens/tokens_table.vue +1 -1
  33. package/dist/directives/tooltip.js +0 -1
  34. package/src/directives/tooltip.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## [111.9.1](https://gitlab.com/gitlab-org/gitlab-ui/compare/v111.9.0...v111.9.1) (2025-03-28)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **GlCollapsibleListbox:** Enter press should toggle selection ([0a89dc6](https://gitlab.com/gitlab-org/gitlab-ui/commit/0a89dc60c427c5671bbb9a809c1b89088aff1735))
7
+
8
+ # [111.9.0](https://gitlab.com/gitlab-org/gitlab-ui/compare/v111.8.1...v111.9.0) (2025-03-27)
9
+
10
+
11
+ ### Features
12
+
13
+ * **GlTooltip:** add custom global container selector ([691e2b0](https://gitlab.com/gitlab-org/gitlab-ui/commit/691e2b0a7dda4135f2c8b0a665952edb51ec046e))
14
+
1
15
  ## [111.8.1](https://gitlab.com/gitlab-org/gitlab-ui/compare/v111.8.0...v111.8.1) (2025-03-27)
2
16
 
3
17
 
@@ -2,7 +2,7 @@ import debounce from 'lodash/debounce';
2
2
  import { translate } from '../../../utils/i18n';
3
3
  import GlAvatar from '../avatar/avatar';
4
4
  import GlDisclosureDropdown from '../new_dropdowns/disclosure/disclosure_dropdown';
5
- import { GlTooltipDirective } from '../../../directives/tooltip';
5
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
6
6
  import { breadCrumbSizeOptions } from '../../../utils/constants';
7
7
  import GlBreadcrumbItem from './breadcrumb_item';
8
8
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
@@ -1,11 +1,11 @@
1
- import { BLink } from '../../../vendor/bootstrap-vue/src/components/link/link';
2
- import { breadCrumbSizeOptions } from '../../../utils/constants';
1
+ import GlLink from '../link/link';
2
+ import { breadCrumbSizeOptions, linkVariantUnstyled } from '../../../utils/constants';
3
3
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
4
4
 
5
5
  var script = {
6
6
  name: 'GlBreadcrumbItem',
7
7
  components: {
8
- BLink
8
+ GlLink
9
9
  },
10
10
  inheritAttrs: false,
11
11
  props: {
@@ -38,14 +38,15 @@ var script = {
38
38
  default: breadCrumbSizeOptions.sm,
39
39
  validator: value => Object.keys(breadCrumbSizeOptions).includes(value)
40
40
  }
41
- }
41
+ },
42
+ linkVariantUnstyled
42
43
  };
43
44
 
44
45
  /* script */
45
46
  const __vue_script__ = script;
46
47
 
47
48
  /* template */
48
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',{class:("gl-breadcrumb-item gl-breadcrumb-item-" + _vm.size)},[_c('b-link',{attrs:{"href":_vm.href,"to":_vm.to,"aria-current":_vm.ariaCurrent}},[_vm._t("default",function(){return [_vm._v(_vm._s(_vm.text))]})],2)],1)};
49
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',{class:("gl-breadcrumb-item gl-breadcrumb-item-" + _vm.size)},[_c('gl-link',{attrs:{"href":_vm.href,"to":_vm.to,"aria-current":_vm.ariaCurrent,"variant":_vm.$options.linkVariantUnstyled}},[_vm._t("default",function(){return [_vm._v(_vm._s(_vm.text))]})],2)],1)};
49
50
  var __vue_staticRenderFns__ = [];
50
51
 
51
52
  /* style */
@@ -1,5 +1,5 @@
1
1
  import uniqueId from 'lodash/uniqueId';
2
- import { GlTooltipDirective } from '../../../directives/tooltip';
2
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
3
3
  import { getDateInPast, getDateInFuture, getDayDifference } from '../../../utils/datetime_utility';
4
4
  import GlDatepicker from '../datepicker/datepicker';
5
5
  import GlIcon from '../icon/icon';
@@ -1,7 +1,7 @@
1
1
  import isEqual from 'lodash/isEqual';
2
2
  import cloneDeep from 'lodash/cloneDeep';
3
3
  import { PortalTarget } from 'portal-vue';
4
- import { GlTooltipDirective } from '../../../directives/tooltip';
4
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
5
5
  import GlIcon from '../icon/icon';
6
6
  import GlSearchBoxByClick from '../search_box_by_click/search_box_by_click';
7
7
  import GlFilteredSearchTerm from './filtered_search_term';
@@ -621,7 +621,9 @@ var script = {
621
621
  }
622
622
  } else if (code === ENTER && isSearchInput) {
623
623
  if (this.searchHasOptions && elements.length > 0) {
624
- this.onSelect(this.flattenedOptions[0], true);
624
+ // Toggle selection state of the first item
625
+ const firstItem = this.flattenedOptions[0];
626
+ this.onSelect(firstItem, !this.isSelected(firstItem));
625
627
  }
626
628
  stop = true;
627
629
  } else {
@@ -1,4 +1,4 @@
1
- import { GlTooltipDirective } from '../../../directives/tooltip';
1
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
2
2
  import GlClearIconButton from '../../shared_components/clear_icon_button/clear_icon_button';
3
3
  import GlButton from '../button/button';
4
4
  import GlDisclosureDropdown from '../new_dropdowns/disclosure/disclosure_dropdown';
@@ -1,4 +1,4 @@
1
- import { GlTooltipDirective } from '../../../directives/tooltip';
1
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
2
2
  import GlButton from '../button/button';
3
3
  import GlButtonGroup from '../button_group/button_group';
4
4
  import GlCollapsibleListbox from '../new_dropdowns/listbox/listbox';
@@ -1,6 +1,7 @@
1
1
  import { BTooltip } from '../../../vendor/bootstrap-vue/src/components/tooltip/tooltip';
2
2
  import { tooltipDelay } from '../../../utils/constants';
3
3
  import tooltipMixin from '../../mixins/tooltip_mixin';
4
+ import { getGlTooltipDefaultContainer } from '../../../directives/tooltip/container';
4
5
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
5
6
 
6
7
  //
@@ -13,14 +14,15 @@ var script = {
13
14
  },
14
15
  mixins: [tooltipMixin(tooltipRefName)],
15
16
  inheritAttrs: false,
16
- tooltipRefName
17
+ tooltipRefName,
18
+ getGlTooltipDefaultContainer
17
19
  };
18
20
 
19
21
  /* script */
20
22
  const __vue_script__ = script;
21
23
 
22
24
  /* template */
23
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('b-tooltip',_vm._g(_vm._b({ref:_vm.$options.tooltipRefName,attrs:{"delay":_vm.$options.tooltipDelay}},'b-tooltip',_vm.$attrs,false),_vm.$listeners),[_vm._t("default")],2)};
25
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('b-tooltip',_vm._g(_vm._b({ref:_vm.$options.tooltipRefName,attrs:{"container":_vm.$attrs.container || _vm.$options.getGlTooltipDefaultContainer(),"delay":_vm.$options.tooltipDelay}},'b-tooltip',_vm.$attrs,false),_vm.$listeners),[_vm._t("default")],2)};
24
26
  var __vue_staticRenderFns__ = [];
25
27
 
26
28
  /* style */
@@ -1,4 +1,4 @@
1
- import { GlTooltipDirective } from '../../../directives/tooltip';
1
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
2
2
  import GlButton from '../../base/button/button';
3
3
  import { translate } from '../../../utils/i18n';
4
4
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
@@ -1,4 +1,4 @@
1
- import { GlTooltipDirective } from '../../../directives/tooltip';
1
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
2
2
  import { GlResizeObserverDirective } from '../../../directives/resize_observer/resize_observer';
3
3
  import { POSITION, ZERO_WIDTH_SPACE } from './constants';
4
4
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
@@ -0,0 +1,7 @@
1
+ let containerSelector;
2
+ const setGlTooltipDefaultContainer = selector => {
3
+ containerSelector = selector;
4
+ };
5
+ const getGlTooltipDefaultContainer = () => containerSelector;
6
+
7
+ export { getGlTooltipDefaultContainer, setGlTooltipDefaultContainer };
@@ -0,0 +1,18 @@
1
+ import { VBTooltip } from '../../vendor/bootstrap-vue/src/directives/tooltip';
2
+ import { getGlTooltipDefaultContainer } from './container';
3
+
4
+ const patchHook = hook => (el, bindings, vnode) => {
5
+ hook(el, {
6
+ ...bindings,
7
+ arg: bindings.arg || getGlTooltipDefaultContainer()
8
+ }, vnode);
9
+ };
10
+ const bind = patchHook(VBTooltip.bind);
11
+ const componentUpdated = patchHook(VBTooltip.componentUpdated);
12
+ const GlTooltipDirective = {
13
+ ...VBTooltip,
14
+ bind,
15
+ componentUpdated
16
+ };
17
+
18
+ export { GlTooltipDirective };
package/dist/index.js CHANGED
@@ -104,7 +104,8 @@ export { default as GlSprintf } from './components/utilities/sprintf/sprintf';
104
104
  export { default as GlTruncate } from './components/utilities/truncate/truncate';
105
105
  export { default as GlTruncateText } from './components/utilities/truncate_text/truncate_text';
106
106
  export { GlModalDirective } from './directives/modal';
107
- export { GlTooltipDirective } from './directives/tooltip';
107
+ export { GlTooltipDirective } from './directives/tooltip/tooltip';
108
+ export { setGlTooltipDefaultContainer } from './directives/tooltip/container';
108
109
  export { GlResizeObserverDirective } from './directives/resize_observer/resize_observer';
109
110
  export { GlCollapseToggleDirective } from './directives/collapse_toggle';
110
111
  export { SafeLinkDirective as GlSafeLinkDirective } from './directives/safe_link/safe_link';
@@ -1,5 +1,5 @@
1
1
  import { colorFromBackground } from '../utils/utils';
2
- import { GlTooltipDirective } from '../directives/tooltip';
2
+ import { GlTooltipDirective } from '../directives/tooltip/tooltip';
3
3
  import GlBadge from '../components/base/badge/badge';
4
4
  import GlColorContrast from '../internal/color_contrast/color_contrast';
5
5
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
@@ -6,7 +6,7 @@ import GlSearchBoxByType from '../components/base/search_box_by_type/search_box_
6
6
  import GlLink from '../components/base/link/link';
7
7
  import GlTable from '../components/base/table/table';
8
8
  import GlPagination from '../components/base/pagination/pagination';
9
- import { GlTooltipDirective } from '../directives/tooltip';
9
+ import { GlTooltipDirective } from '../directives/tooltip/tooltip';
10
10
  import TOKENS_DEFAULT from './build/json/tokens.json';
11
11
  import TOKENS_DARK from './build/json/tokens.dark.json';
12
12
  import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/ui",
3
- "version": "111.8.1",
3
+ "version": "111.9.1",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -4,7 +4,7 @@ import debounce from 'lodash/debounce';
4
4
  import { translate } from '../../../utils/i18n';
5
5
  import GlAvatar from '../avatar/avatar.vue';
6
6
  import GlDisclosureDropdown from '../new_dropdowns/disclosure/disclosure_dropdown.vue';
7
- import { GlTooltipDirective } from '../../../directives/tooltip';
7
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
8
8
  import { breadCrumbSizeOptions } from '../../../utils/constants';
9
9
  import GlBreadcrumbItem from './breadcrumb_item.vue';
10
10
 
@@ -1,11 +1,11 @@
1
1
  <script>
2
- import { BLink } from '../../../vendor/bootstrap-vue/src/components/link/link';
3
- import { breadCrumbSizeOptions } from '../../../utils/constants';
2
+ import GlLink from '../link/link.vue';
3
+ import { breadCrumbSizeOptions, linkVariantUnstyled } from '../../../utils/constants';
4
4
 
5
5
  export default {
6
6
  name: 'GlBreadcrumbItem',
7
7
  components: {
8
- BLink,
8
+ GlLink,
9
9
  },
10
10
  inheritAttrs: false,
11
11
  props: {
@@ -39,13 +39,19 @@ export default {
39
39
  validator: (value) => Object.keys(breadCrumbSizeOptions).includes(value),
40
40
  },
41
41
  },
42
+ linkVariantUnstyled,
42
43
  };
43
44
  </script>
44
45
 
45
46
  <template>
46
47
  <li :class="`gl-breadcrumb-item gl-breadcrumb-item-${size}`">
47
- <b-link :href="href" :to="to" :aria-current="ariaCurrent">
48
+ <gl-link
49
+ :href="href"
50
+ :to="to"
51
+ :aria-current="ariaCurrent"
52
+ :variant="$options.linkVariantUnstyled"
53
+ >
48
54
  <slot>{{ text }}</slot>
49
- </b-link>
55
+ </gl-link>
50
56
  </li>
51
57
  </template>
@@ -1,6 +1,6 @@
1
1
  <script>
2
2
  import uniqueId from 'lodash/uniqueId';
3
- import { GlTooltipDirective } from '../../../directives/tooltip';
3
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
4
4
  import { getDayDifference, getDateInPast, getDateInFuture } from '../../../utils/datetime_utility';
5
5
  import GlDatepicker from '../datepicker/datepicker.vue';
6
6
  import GlIcon from '../icon/icon.vue';
@@ -2,7 +2,7 @@
2
2
  import isEqual from 'lodash/isEqual';
3
3
  import cloneDeep from 'lodash/cloneDeep';
4
4
  import { PortalTarget } from 'portal-vue';
5
- import { GlTooltipDirective } from '../../../directives/tooltip';
5
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
6
6
  import GlIcon from '../icon/icon.vue';
7
7
  import GlSearchBoxByClick from '../search_box_by_click/search_box_by_click.vue';
8
8
  import GlFilteredSearchTerm from './filtered_search_term.vue';
@@ -653,7 +653,9 @@ export default {
653
653
  }
654
654
  } else if (code === ENTER && isSearchInput) {
655
655
  if (this.searchHasOptions && elements.length > 0) {
656
- this.onSelect(this.flattenedOptions[0], true);
656
+ // Toggle selection state of the first item
657
+ const firstItem = this.flattenedOptions[0];
658
+ this.onSelect(firstItem, !this.isSelected(firstItem));
657
659
  }
658
660
  stop = true;
659
661
  } else {
@@ -1,5 +1,5 @@
1
1
  <script>
2
- import { GlTooltipDirective } from '../../../directives/tooltip';
2
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
3
3
  import GlClearIconButton from '../../shared_components/clear_icon_button/clear_icon_button.vue';
4
4
  import GlButton from '../button/button.vue';
5
5
  import GlDisclosureDropdown from '../new_dropdowns/disclosure/disclosure_dropdown.vue';
@@ -1,5 +1,5 @@
1
1
  <script>
2
- import { GlTooltipDirective } from '../../../directives/tooltip';
2
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
3
3
  import GlButton from '../button/button.vue';
4
4
  import GlButtonGroup from '../button_group/button_group.vue';
5
5
  import GlCollapsibleListbox from '../new_dropdowns/listbox/listbox.vue';
@@ -3,6 +3,7 @@
3
3
  import { BTooltip } from '../../../vendor/bootstrap-vue/src/components/tooltip/tooltip';
4
4
  import { tooltipDelay } from '../../../utils/constants';
5
5
  import tooltipMixin from '../../mixins/tooltip_mixin';
6
+ import { getGlTooltipDefaultContainer } from '../../../directives/tooltip/container';
6
7
 
7
8
  const tooltipRefName = 'bvTooltip';
8
9
 
@@ -15,6 +16,7 @@ export default {
15
16
  mixins: [tooltipMixin(tooltipRefName)],
16
17
  inheritAttrs: false,
17
18
  tooltipRefName,
19
+ getGlTooltipDefaultContainer,
18
20
  };
19
21
  </script>
20
22
 
@@ -22,6 +24,7 @@ export default {
22
24
  <b-tooltip
23
25
  :ref="$options.tooltipRefName"
24
26
  v-bind="$attrs"
27
+ :container="$attrs.container || $options.getGlTooltipDefaultContainer()"
25
28
  :delay="$options.tooltipDelay"
26
29
  v-on="$listeners"
27
30
  >
@@ -1,5 +1,5 @@
1
1
  <script>
2
- import { GlTooltipDirective } from '../../../directives/tooltip';
2
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
3
3
  import GlButton from '../../base/button/button.vue';
4
4
  import { translate } from '../../../utils/i18n';
5
5
 
@@ -1,6 +1,6 @@
1
1
  <!-- eslint-disable vue/multi-word-component-names -->
2
2
  <script>
3
- import { GlTooltipDirective } from '../../../directives/tooltip';
3
+ import { GlTooltipDirective } from '../../../directives/tooltip/tooltip';
4
4
  import { GlResizeObserverDirective } from '../../../directives/resize_observer/resize_observer';
5
5
  import { POSITION, ZERO_WIDTH_SPACE } from './constants';
6
6
 
@@ -0,0 +1,7 @@
1
+ let containerSelector;
2
+
3
+ export const setGlTooltipDefaultContainer = (selector) => {
4
+ containerSelector = selector;
5
+ };
6
+
7
+ export const getGlTooltipDefaultContainer = () => containerSelector;
@@ -0,0 +1,22 @@
1
+ import { VBTooltip } from '../../vendor/bootstrap-vue/src/directives/tooltip';
2
+ import { getGlTooltipDefaultContainer } from './container';
3
+
4
+ const patchHook = (hook) => (el, bindings, vnode) => {
5
+ hook(
6
+ el,
7
+ {
8
+ ...bindings,
9
+ arg: bindings.arg || getGlTooltipDefaultContainer(),
10
+ },
11
+ vnode
12
+ );
13
+ };
14
+
15
+ const bind = patchHook(VBTooltip.bind);
16
+ const componentUpdated = patchHook(VBTooltip.componentUpdated);
17
+
18
+ export const GlTooltipDirective = {
19
+ ...VBTooltip,
20
+ bind,
21
+ componentUpdated,
22
+ };
package/src/index.js CHANGED
@@ -120,7 +120,8 @@ export { default as GlTruncateText } from './components/utilities/truncate_text/
120
120
 
121
121
  // Directives
122
122
  export { GlModalDirective } from './directives/modal';
123
- export { GlTooltipDirective } from './directives/tooltip';
123
+ export { GlTooltipDirective } from './directives/tooltip/tooltip';
124
+ export { setGlTooltipDefaultContainer } from './directives/tooltip/container';
124
125
  export { GlResizeObserverDirective } from './directives/resize_observer/resize_observer';
125
126
  export { GlCollapseToggleDirective } from './directives/collapse_toggle';
126
127
  export { SafeLinkDirective as GlSafeLinkDirective } from './directives/safe_link/safe_link';
@@ -1,6 +1,6 @@
1
1
  <script>
2
2
  import { colorFromBackground } from '../utils/utils';
3
- import { GlTooltipDirective } from '../directives/tooltip';
3
+ import { GlTooltipDirective } from '../directives/tooltip/tooltip';
4
4
  import GlBadge from '../components/base/badge/badge.vue';
5
5
  import GlColorContrast from '../internal/color_contrast/color_contrast.vue';
6
6
 
@@ -7,7 +7,7 @@ import GlSearchBoxByType from '../components/base/search_box_by_type/search_box_
7
7
  import GlLink from '../components/base/link/link.vue';
8
8
  import GlTable from '../components/base/table/table.vue';
9
9
  import GlPagination from '../components/base/pagination/pagination.vue';
10
- import { GlTooltipDirective } from '../directives/tooltip';
10
+ import { GlTooltipDirective } from '../directives/tooltip/tooltip';
11
11
  import TOKENS_DEFAULT from './build/json/tokens.json';
12
12
  import TOKENS_DARK from './build/json/tokens.dark.json';
13
13
 
@@ -1 +0,0 @@
1
- export { VBTooltip as GlTooltipDirective } from '../vendor/bootstrap-vue/src/directives/tooltip/tooltip';
@@ -1 +0,0 @@
1
- export { VBTooltip as GlTooltipDirective } from '../vendor/bootstrap-vue/src/directives/tooltip/tooltip';