@dialpad/dialtone
Version:
Dialpad's Dialtone design system monorepo
1 lines • 20.9 kB
Source Map (JSON)
{"version":3,"file":"tooltip.cjs","names":[],"sources":["../../../components/tooltip/tooltip.vue"],"sourcesContent":["<template>\n <div data-qa=\"dt-tooltip-container\">\n <!-- disabling as the below events are for capturing events from interactive\n elements within the span rather than on the span itself -->\n <!-- eslint-disable-next-line vuejs-accessibility/no-static-element-interactions -->\n <span\n v-if=\"!externalAnchor && !externalAnchorElement\"\n ref=\"anchor\"\n data-qa=\"dt-tooltip-anchor\"\n @focusin=\"onEnterAnchor\"\n @focusout=\"onLeaveAnchor\"\n @mouseenter=\"onEnterAnchor\"\n @mouseleave=\"onLeaveAnchor\"\n @keydown.esc=\"onLeaveAnchor\"\n >\n <!-- @slot Slot for the anchor element -->\n <slot\n name=\"anchor\"\n />\n </span>\n <div\n :id=\"id\"\n ref=\"content\"\n data-qa=\"dt-tooltip\"\n :class=\"[\n 'd-tooltip',\n {\n [ TOOLTIP_KIND_MODIFIERS.inverted ]: inverted,\n },\n contentClass,\n ]\"\n >\n <!-- In case when transitionend event doesn't work correct (for ex. tooltip component with custom trigger) -->\n <!-- after-leave event can be used instead of transitionend -->\n <!-- @slot Slot for the content, defaults to message prop -->\n <slot>\n {{ message }}\n </slot>\n </div>\n </div>\n</template>\n\n<script>\nimport {\n TOOLTIP_KIND_MODIFIERS,\n TOOLTIP_DIRECTIONS,\n TOOLTIP_STICKY_VALUES,\n TOOLTIP_DELAY_MS,\n} from './tooltip_constants.js';\nimport {\n POPOVER_APPEND_TO_VALUES,\n} from '../popover/popover_constants';\nimport { flushPromises, getUniqueString, hasSlotContent, warnIfUnmounted, returnFirstEl } from '@/common/utils';\nimport {\n createTippy,\n getAnchor,\n getPopperOptions,\n} from '@/components/popover/tippy_utils';\n\n/**\n * A tooltip is a floating label that briefly explains an action, function, or an element.\n * Its content is exclusively text and shouldn't be vital information for users.\n * If richer media is desired, consider using a popover instead.\n * @see https://dialtone.dialpad.com/components/tooltip.html\n */\nexport default {\n compatConfig: { MODE: 3 },\n name: 'DtTooltip',\n\n props: {\n /**\n * The id of the tooltip\n */\n id: {\n type: String,\n default () { return getUniqueString(); },\n },\n\n /**\n * If the popover does not fit in the direction described by \"placement\",\n * it will attempt to change its direction to the \"fallbackPlacements\"\n * if defined, otherwise it will automatically position to a new location\n * as it sees best fit. See\n * <a\n * class=\"d-link\"\n * href=\"https://popper.js.org/docs/v2/modifiers/flip/#fallbackplacements\"\n * target=\"_blank\"\n * >\n * Popper.js docs\n * </a>\n * */\n fallbackPlacements: {\n type: Array,\n default: () => ['auto'],\n },\n\n /**\n * If true, applies inverted styles to the tooltip\n * @values true, false\n */\n inverted: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Displaces the tooltip from its reference element\n * by the specified number of pixels. See\n * <a\n * class=\"d-link\"\n * href=\"https://atomiks.github.io/tippyjs/v6/all-props/#offset\"\n * target=\"_blank\"\n * >\n * Tippy.js docs\n * </a>\n */\n offset: {\n type: Array,\n default: () => [0, 12],\n },\n\n /**\n * The direction the popover displays relative to the anchor. See\n * <a\n * class=\"d-link\"\n * href=\"https://atomiks.github.io/tippyjs/v6/all-props/#placement\"\n * target=\"_blank\"\n * >\n * Tippy.js docs\n * </a>\n * @values top, top-start, top-end,\n * right, right-start, right-end,\n * left, left-start, left-end,\n * bottom, bottom-start, bottom-end,\n * auto, auto-start, auto-end\n */\n placement: {\n type: String,\n default: 'top',\n validator (placement) {\n return TOOLTIP_DIRECTIONS.includes(placement);\n },\n },\n\n /**\n * If the tooltip sticks to the anchor. This is usually not needed, but can be needed\n * if the reference element's position is animating, or to automatically update the popover\n * position in those cases the DOM layout changes the reference element's position.\n * `true` enables it, `reference` only checks the \"reference\" rect for changes and `popper` only\n * checks the \"popper\" rect for changes. See\n * <a\n * class=\"d-link\"\n * href=\"https://atomiks.github.io/tippyjs/v6/all-props/#sticky\"\n * target=\"_blank\"\n * >\n * Tippy.js docs\n * </a>\n * @values true, false, reference, popper\n */\n sticky: {\n type: [Boolean, String],\n default: true,\n validator: (sticky) => {\n return TOOLTIP_STICKY_VALUES.includes(sticky);\n },\n },\n\n /**\n * Sets the element to which the tooltip is going to append to.\n * 'body' will append to the nearest body (supports shadow DOM).\n * This prop is not reactive, must be set on initial render.\n * @values 'body', 'parent', HTMLElement,\n */\n appendTo: {\n type: [HTMLElement, String],\n default: 'body',\n validator: appendTo => {\n return POPOVER_APPEND_TO_VALUES.includes(appendTo) ||\n (appendTo instanceof HTMLElement);\n },\n },\n\n /**\n * Additional css classes for the tooltip content element.\n * Can accept all of: String, Object, and Array, i.e. has the\n * same api as Vue's built-in handling of the class attribute.\n */\n contentClass: {\n type: [String, Object, Array],\n default: '',\n },\n\n /**\n * A provided message for the tooltip content\n */\n message: {\n type: String,\n default: '',\n },\n\n /**\n * Controls whether hover/focus causes the tooltip to appear.\n * Cannot be combined with the show prop. show value will be ignored.\n * by default this is true, if you override with false, the tooltip will never show up.\n */\n enabled: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Controls whether the tooltip is shown. Leaving this null will have the tooltip trigger on mouseover by default.\n * If you set this value, the default mouseover behavior will be disabled and you can control it as you need.\n * Supports .sync modifier\n * @values null, true, false\n */\n show: {\n type: Boolean,\n default: null,\n },\n\n /**\n * Whether the tooltip should have a transition effect (fade).\n */\n transition: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Whether the tooltip will have a delay when being focused or moused over.\n * @values true, false\n */\n delay: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Set a custom theme on the tooltip. See https://atomiks.github.io/tippyjs/v6/themes/\n */\n theme: {\n type: String,\n default: null,\n },\n\n /**\n * External anchor id to use in those cases the anchor can't be provided via the slot.\n * For instance, using the combobox's input as the anchor for the popover.\n * @deprecated Use externalAnchorElement instead for Shadow DOM compatibility.\n */\n externalAnchor: {\n type: String,\n default: null,\n },\n\n /**\n * External anchor element reference. Use this instead of externalAnchor when\n * the anchor may be inside a Shadow DOM, as querySelector cannot pierce shadow boundaries.\n */\n externalAnchorElement: {\n type: HTMLElement,\n default: null,\n },\n },\n\n emits: [\n /**\n * Emitted when tooltip is shown or hidden\n *\n * @event shown\n * @type {Boolean}\n */\n 'shown',\n\n /**\n * Sync show value\n *\n * @event update:show\n */\n 'update:show',\n ],\n\n data () {\n return {\n TOOLTIP_KIND_MODIFIERS,\n hasSlotContent,\n tip: null,\n\n inTimer: null,\n\n // Internal state for whether the tooltip is shown. Changing the prop\n // will update this.\n internalShow: false,\n\n // this is where the placement currently is, this can be different than\n // the placement prop when there is not enough available room for the tip\n // to display and it uses a fallback placement.\n currentPlacement: this.placement,\n };\n },\n\n computed: {\n\n tippyProps () {\n return {\n offset: this.offset,\n delay: this.delay ? TOOLTIP_DELAY_MS : false,\n placement: this.placement,\n sticky: this.sticky,\n theme: this.inverted ? 'inverted' : this.theme,\n animation: this.transition ? 'fade' : false,\n // onShown only triggers when transition is truthy\n onShown: (tooltipInstance) => this.onShow(tooltipInstance, 'onShown'),\n // onShown will always be called, but it will be called before the animation is complete\n onShow: (tooltipInstance) => this.onShow(tooltipInstance, 'onShow'),\n onHidden: this.onHide,\n\n popperOptions: getPopperOptions({\n fallbackPlacements: this.fallbackPlacements,\n hasHideModifierEnabled: true,\n onChangePlacement: this.onChangePlacement,\n }),\n };\n },\n\n anchor () {\n if (this.externalAnchorElement) return this.externalAnchorElement;\n return this.externalAnchor ? document.body.querySelector(this.externalAnchor) : getAnchor(this.$refs.anchor);\n },\n },\n\n watch: {\n\n tippyProps: {\n handler: 'setProps',\n deep: true,\n },\n\n show: {\n handler: function (show) {\n if (show !== null && this.enabled) {\n this.internalShow = show;\n }\n },\n\n immediate: true,\n },\n\n internalShow (value) {\n if (!this.tip || !this.anchor) return;\n\n if (value) {\n this.setProps();\n this.tip.show();\n } else {\n this.tip.hide();\n }\n },\n\n sticky (sticky) {\n this.tip.setProps({\n sticky,\n });\n },\n },\n\n async mounted () {\n if (!this.enabled && this.show != null) {\n console.warn('Tooltip: You cannot use both the enabled and show props at the same time.');\n console.warn('The show prop will be ignored.');\n }\n\n this.tip = createTippy(this.anchor, this.initOptions());\n if (this.externalAnchor || this.externalAnchorElement) {\n await flushPromises();\n this.addExternalAnchorEventListeners();\n }\n warnIfUnmounted(returnFirstEl(this.$el), this.$options.name);\n },\n\n beforeUnmount () {\n (this.externalAnchor || this.externalAnchorElement) && this.removeExternalAnchorEventListeners();\n\n if (this.anchor?._tippy) {\n this.tip?.destroy();\n }\n },\n\n methods: {\n calculateAnchorZindex () {\n // if a modal is currently active render at modal-element z-index, otherwise at tooltip z-index\n if (returnFirstEl(this.$el).getRootNode()\n .querySelector(\n `.d-modal[aria-hidden=\"false\"],\n .d-modal--transparent[aria-hidden=\"false\"],\n .d-modal:not([aria-hidden]),\n .d-modal--transparent:not([aria-hidden])`) ||\n // Special case because we don't have any dialtone drawer component yet. Render at 651 when\n // anchor of popover is within a drawer.\n returnFirstEl(this.$el).closest('.d-zi-drawer')) {\n return 651;\n } else {\n return 400;\n }\n },\n\n hasVisibleFocus () {\n return this.anchor.matches(':focus-visible');\n },\n\n onEnterAnchor (e) {\n if (!this.enabled) return;\n if (this.delay && this.inTimer === null) {\n this.inTimer = setTimeout(() => {\n this.triggerShow(e);\n }, TOOLTIP_DELAY_MS);\n } else {\n this.triggerShow(e);\n }\n },\n\n triggerShow (e) {\n if (e.type === 'focusin') {\n // only show tooltips on visible focus when triggered via focus.\n // when the user is using the mouse they only want tooltips to display\n // on mouseover.\n //\n // Example: anchor of a popover is a button with tooltip.\n // closing it with the mouse would trigger the tooltip to display as\n // the anchor is focused on close. Not what we want.\n if (this.show === null && this.hasVisibleFocus()) {\n this.internalShow = true;\n }\n } else {\n if (this.show === null) this.internalShow = true;\n }\n },\n\n onLeaveAnchor (e) {\n if (e.type === 'keydown' && e.code !== 'Escape') return;\n\n clearTimeout(this.inTimer);\n this.inTimer = null;\n this.triggerHide();\n },\n\n triggerHide () {\n if (this.show === null) this.internalShow = false;\n },\n\n onChangePlacement (placement) {\n this.currentPlacement = placement;\n },\n\n onHide () {\n this.tip?.unmount();\n this.$emit('shown', false);\n if (this.show !== null) {\n this.$emit('update:show', false);\n }\n },\n\n onShow (tooltipInstance, callingMethod) {\n if (!this.tooltipHasContent(tooltipInstance)) {\n return false;\n }\n if (this.transition && callingMethod === 'onShow') {\n return;\n }\n this.$emit('shown', true);\n if (this.show !== null) {\n this.$emit('update:show', true);\n }\n },\n\n setProps () {\n if (!this.tip || !this.tip.setProps || !this.anchor) return;\n\n if (this.tip && this.tip.setProps) {\n this.tip.setProps({\n ...this.tippyProps,\n // these need to be set here rather than in tippyProps because they are non-reactive\n appendTo: this.appendTo === 'body' ? this.anchor?.getRootNode()?.querySelector('body') : this.appendTo,\n zIndex: this.calculateAnchorZindex(),\n });\n }\n },\n\n onMount () {\n this.setProps();\n },\n\n tooltipHasContent (tooltipInstance) {\n // don't show tooltip when no content\n if (tooltipInstance.props.content.textContent.trim().length === 0) {\n return false;\n }\n return true;\n },\n\n // set initial options here. If any of the options need to dynamically change, they should be put in\n // tippyProps instead.\n initOptions () {\n const template = this.$refs.content;\n return {\n content: template,\n arrow: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"7\"><path d=\"M 14.5,7 8,0 1.5,7 Z\"/></svg>',\n // transition duration - same as our custom fade delay in dialtone-globals.less\n duration: 180,\n interactive: false,\n trigger: 'manual',\n hideOnClick: false,\n // disable tooltip from displaying on touch devices\n touch: false,\n onMount: this.onMount,\n showOnCreate: this.internalShow,\n popperOptions: getPopperOptions({\n hasHideModifierEnabled: true,\n }),\n };\n },\n\n addExternalAnchorEventListeners () {\n ['focusin', 'mouseenter'].forEach(listener => {\n this.anchor?.addEventListener(listener, (event) => this.onEnterAnchor(event));\n });\n ['focusout', 'mouseleave', 'keydown'].forEach(listener => {\n this.anchor?.addEventListener(listener, (event) => this.onLeaveAnchor(event));\n });\n },\n\n removeExternalAnchorEventListeners () {\n ['focusin', 'mouseenter'].forEach(listener => {\n this.anchor?.removeEventListener(listener, (event) => this.onEnterAnchor(event));\n });\n ['focusout', 'mouseleave', 'keydown'].forEach(listener => {\n this.anchor?.removeEventListener(listener, (event) => this.onLeaveAnchor(event));\n });\n },\n },\n};\n</script>\n"],"mappings":"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"}