maz-ui
Version:
A standalone components library for Vue.Js 3 & Nuxt.Js 3
1 lines • 4.12 kB
JavaScript
import{t as MazPopover_default}from"../chunks/MazPopover.BTvrYenI.js";import{useMountComponent}from"../composables/useMountComponent.js";import{h,nextTick,ref,watch}from"vue";var tooltipInstances=new WeakMap;var TooltipHandler=class{defaultProps;constructor(options={}){this.defaultProps={open:!1,position:`top`,trigger:`hover`,role:`tooltip`,closeOnClickOutside:!1,closeOnEscape:!1,color:`contrast`,...options}}getTooltipProps(binding){let baseOptions={...this.defaultProps};return typeof binding.value==`string`?{...baseOptions,text:binding.value,position:this.getPositionFromModifiers(binding)||baseOptions.position||`top`}:{...baseOptions,...binding.value,position:this.getPositionFromModifiers(binding)||binding.value.position||baseOptions.position||`top`}}getPositionFromModifiers(binding){let modifiers=Object.keys(binding.modifiers);let validPositions=[`top`,`bottom`,`left`,`right`,`top-start`,`top-end`,`bottom-start`,`bottom-end`,`left-start`,`left-end`,`right-start`,`right-end`,`auto`];for(let modifier of modifiers)if(validPositions.includes(modifier))return modifier}mount(el,binding){let tooltipProps=this.getTooltipProps(binding);if(!tooltipProps.text&&!tooltipProps.html){console.warn(`[maz-ui](vTooltip) No text or html content provided`);return}let isOpen=ref(!!tooltipProps.open);let vNodeInstance=null;let createTooltip=()=>{vNodeInstance=useMountComponent(MazPopover_default,{props:{...tooltipProps,panelClass:[`m-tooltip-panel`,`maz-text-sm`,`maz-whitespace-pre-wrap`,`maz-break-words`,`maz-p-2`,`maz-max-w-xs`,tooltipProps.panelClass].filter(Boolean).join(` `),modelValue:isOpen.value,positionReference:el,onAfterCloseAnimation:()=>{vNodeInstance?.destroy(),vNodeInstance=null}},children:{default:()=>tooltipProps.html?h(`div`,{innerHTML:tooltipProps.html}):tooltipProps.text||``},element:el})};function isTouchDevice(){return`ontouchstart`in globalThis||navigator.maxTouchPoints>0}function getEffectiveTrigger(){return tooltipProps.trigger===`adaptive`?isTouchDevice()?`click`:`hover`:tooltipProps.trigger||`hover`}let mouseEnterHandler=null;let mouseLeaveHandler=null;let clickHandler=null;function setupTriggers(){cleanupTriggers();let effectiveTrigger=getEffectiveTrigger();effectiveTrigger===`hover`?(mouseEnterHandler=()=>{isOpen.value=!0},mouseLeaveHandler=()=>{isOpen.value=!1},el.addEventListener(`mouseenter`,mouseEnterHandler),el.addEventListener(`mouseleave`,mouseLeaveHandler)):effectiveTrigger===`click`&&(clickHandler=()=>{isOpen.value=!isOpen.value},el.addEventListener(`click`,clickHandler))}function cleanupTriggers(){mouseEnterHandler&&=(el.removeEventListener(`mouseenter`,mouseEnterHandler),null),mouseLeaveHandler&&=(el.removeEventListener(`mouseleave`,mouseLeaveHandler),null),clickHandler&&=(el.removeEventListener(`click`,clickHandler),null)}nextTick(()=>{setupTriggers()}),watch(isOpen,value=>{value?createTooltip():vNodeInstance&&vNodeInstance?.vNode.component?.exposed?.close()},{immediate:!0});function destroy(){cleanupTriggers(),vNodeInstance&&=(vNodeInstance.destroy(),null)}function updateProps(newProps){let oldTrigger=tooltipProps.trigger;Object.assign(tooltipProps,newProps),isOpen.value=!!newProps.open,oldTrigger!==newProps.trigger&&setupTriggers(),createTooltip()}tooltipInstances.set(el,{destroy,updateProps,isOpen})}update(el,binding){let instance=tooltipInstances.get(el);if(instance){let newProps=this.getTooltipProps(binding);instance.updateProps(newProps)}else this.mount(el,binding)}unmount(el){let instance=tooltipInstances.get(el);instance&&(instance.destroy(),tooltipInstances.delete(el))}};var globalHandler;var directive={mounted(el,binding){return globalHandler||=new TooltipHandler,globalHandler.mount(el,binding)},updated(el,binding){return globalHandler||=new TooltipHandler,globalHandler.update(el,binding)},unmounted(el){globalHandler&&globalHandler.unmount(el)}};var plugin={install:(app,options)=>{let handler=new TooltipHandler(options);app.directive(`tooltip`,{beforeMount:handler.mount.bind(handler),updated:handler.update.bind(handler),unmounted:handler.unmount.bind(handler)})}};export{directive as vTooltip,plugin as vTooltipInstall};