UNPKG

maz-ui

Version:

A standalone components library for Vue.Js 3 & Nuxt.Js 3

1 lines 10.6 kB
import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper.ChmETRGw.js";import{t as hasSlotContent}from"./hasSlotContent.akaXJLAp.js";import{useInstanceUniqId}from"../composables/useInstanceUniqId.js";import{vClickOutside as directive}from"../directives/vClickOutside.js";import{t as getColor}from"./types.CpBj759L.js";import{Fragment,Teleport,Transition,computed,createBlock,createCommentVNode,createElementBlock,createElementVNode,createVNode,defineComponent,mergeModels,mergeProps,nextTick,normalizeClass,normalizeStyle,onBeforeUnmount,onMounted,onUnmounted,openBlock,renderSlot,unref,useAttrs,useModel,useTemplateRef,watch,withCtx,withDirectives}from"vue";import{isClient}from"@maz-ui/utils/helpers/isClient";import{autoPlacement,autoUpdate,flip,hide,offset,shift,useFloating}from"@floating-ui/vue";import '../assets/MazPopover.Q-jqGJFr.css';var _hoisted_1=[`id`,`aria-expanded`,`aria-haspopup`,`aria-describedby`,`aria-labelledby`,`aria-controls`];var _hoisted_2=[`id`,`role`,`aria-label`,`aria-labelledby`,`aria-describedby`,`aria-modal`,`tabindex`,`aria-live`];var MazPopover_default=_plugin_vue_export_helper_default(defineComponent({name:`MazPopover`,inheritAttrs:!1,__name:`MazPopover`,props:mergeModels({modelValue:{type:Boolean},position:{default:`auto`},preferPosition:{},fallbackPosition:{},trigger:{default:`click`},role:{default:`dialog`},ariaLabel:{},announceChanges:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},offset:{default:8},delay:{default:0},hoverDelay:{default:150},transition:{default:`scale-pop`},teleportTo:{default:`body`},overlayClass:{type:[Boolean,null,String,Object,Array]},panelClass:{type:[Boolean,null,String,Object,Array]},panelStyle:{type:[Boolean,null,String,Object,Array]},closeOnClickOutside:{type:Boolean,default:!0},closeOnEscape:{type:Boolean,default:!0},persistent:{type:Boolean,default:!1},id:{},ariaLabelledby:{},ariaDescribedby:{},color:{default:`background`},trapFocus:{type:Boolean,default:!0},keepOpenOnHover:{type:Boolean,default:!1},block:{type:Boolean,default:!1},positionReference:{}},{modelValue:{default:!1},modelModifiers:{}}),emits:mergeModels([`update:model-value`,`open`,`close`,`after-close-animation`,`toggle`],[`update:modelValue`]),setup(__props,{expose:__expose,emit:__emit}){let emits=__emit;let triggerId=useInstanceUniqId({componentName:`MazPopover`,providedId:__props.id});let attrs=useAttrs();let triggerRef=useTemplateRef(`trigger`);let panelRef=useTemplateRef(`panel`);let middleware=computed(()=>{let middleware=[offset(__props.offset),hide(),shift({padding:5})];return middleware.push(__props.position===`auto`&&!__props.preferPosition&&!__props.fallbackPosition?autoPlacement({allowedPlacements:[`top`,`bottom`,`left`,`right`]}):flip({fallbackPlacements:__props.fallbackPosition?[__props.fallbackPosition]:void 0})),middleware});let floatingPosition=computed(()=>__props.position===`auto`?__props.preferPosition:__props.position);let transitionName=computed(()=>[`scale-pop`,`scale-fade`].includes(__props.transition)?`maz-${__props.transition}`:__props.transition);let positionRef=computed(()=>__props.positionReference?typeof __props.positionReference==`string`?triggerRef.value?.querySelector(__props.positionReference)||(isClient()?document.querySelector(__props.positionReference):null):__props.positionReference:triggerRef.value);let{floatingStyles,placement,update,middlewareData}=useFloating(computed(()=>positionRef.value||triggerRef.value),panelRef,{placement:floatingPosition,middleware,transform:!1,whileElementsMounted:autoUpdate});let computedPosition=computed(()=>placement.value??floatingPosition.value);let isOpen=useModel(__props,`modelValue`);let openTimeout=null;let closeTimeout=null;let initialFocusElement=null;let ignoreNextClickOutside=!1;let panelId=computed(()=>`${triggerId.value}-panel`);let rootStyles=computed(()=>attrs.style);let panelStyles=computed(()=>({...floatingStyles.value,pointerEvents:isOpen.value?`auto`:`none`}));let isTouchDevice=computed(()=>isClient()?`ontouchstart`in globalThis||navigator.maxTouchPoints>0:!1);let effectiveTrigger=computed(()=>__props.trigger===`adaptive`?isTouchDevice.value?`click`:`hover`:__props.trigger);let triggerEvents=computed(()=>{if(__props.disabled||effectiveTrigger.value===`manual`)return{};let events={};return effectiveTrigger.value===`hover`&&(events.onMouseenter=()=>{clearCloseTimeout(),open()},events.onMouseleave=close),effectiveTrigger.value===`click`&&(events.onClick=toggle),events});let panelEvents=computed(()=>effectiveTrigger.value===`hover`?{onMouseenter:()=>{__props.keepOpenOnHover&&clearCloseTimeout()},onMouseleave:()=>{__props.keepOpenOnHover&&close()}}:{});let panelClasses=computed(()=>[__props.overlayClass,__props.panelClass,`--position-${computedPosition.value}`,`--${getColor(__props.color)}`]);function cleanup(){clearOpenTimeout(),clearCloseTimeout(),isClient()&&document.removeEventListener(`keydown`,onKeydown)}function open(){__props.disabled||(clearCloseTimeout(),effectiveTrigger.value===`click`&&(ignoreNextClickOutside=!0),__props.delay>0?openTimeout=setTimeout(()=>{setOpen(!0)},__props.delay):setOpen(!0))}function close(){clearOpenTimeout(),__props.delay>0&&effectiveTrigger.value===`hover`?closeTimeout=setTimeout(()=>{setOpen(!1)},__props.delay):effectiveTrigger.value===`hover`&&__props.keepOpenOnHover?closeTimeout=setTimeout(()=>{setOpen(!1)},__props.hoverDelay):setOpen(!1)}function toggle(){isOpen.value?close():open()}function setOpen(value){isOpen.value=value,ignoreNextClickOutside=!1,value?(emits(`open`),emits(`toggle`,value),nextTick(()=>{update(),setupFocusTrap()})):(emits(`toggle`,value),emits(`close`),__props.trapFocus&&restoreFocus())}function clearOpenTimeout(){openTimeout&&=(clearTimeout(openTimeout),null)}function clearCloseTimeout(){closeTimeout&&=(clearTimeout(closeTimeout),null)}function getTransformOrigin(position){switch(position){case`top`:return`center bottom`;case`top-start`:return`left bottom`;case`top-end`:return`right bottom`;case`bottom`:return`center top`;case`bottom-start`:return`left top`;case`bottom-end`:return`right top`;case`left`:return`right center`;case`left-start`:return`right top`;case`left-end`:return`right bottom`;case`right`:return`left center`;case`right-start`:return`left top`;case`right-end`:return`left bottom`;default:return`center`}}function setupFocusTrap(){__props.role===`tooltip`||effectiveTrigger.value===`hover`||!__props.trapFocus||!isClient()||(initialFocusElement=document.activeElement,nextTick(()=>{let focusableElements=panelRef.value?.querySelectorAll(`a[href], button, textarea, input[type="text"], input[type="radio"], input[type="checkbox"], select, [tabindex]:not([tabindex="-1"])`);focusableElements&&focusableElements.length>0?focusableElements[0].focus({preventScroll:!0}):panelRef.value?.focus({preventScroll:!0})}))}function restoreFocus(){__props.role===`tooltip`||effectiveTrigger.value===`hover`||!__props.trapFocus||!isClient()||nextTick(()=>{initialFocusElement?.focus({preventScroll:!0})})}function onKeydown(event){isOpen.value&&(event.key===`Escape`&&__props.closeOnEscape&&!__props.persistent&&(event.preventDefault(),close()),event.key===`Tab`&&__props.trapFocus&&handleTrapFocus(event))}function handleTrapFocus(event){if(!panelRef.value||!isClient())return;let focusableElements=panelRef.value.querySelectorAll(`a[href], button, textarea, input[type="text"], input[type="radio"], input[type="checkbox"], select, [tabindex]:not([tabindex="-1"])`);if(focusableElements.length===0)return;let firstElement=focusableElements[0];let lastElement=focusableElements[focusableElements.length-1];event.shiftKey?document.activeElement===firstElement&&(event.preventDefault(),lastElement.focus()):document.activeElement===lastElement&&(event.preventDefault(),firstElement.focus())}function onClickOutside(event){if(effectiveTrigger.value!==`manual`){if(ignoreNextClickOutside){ignoreNextClickOutside=!1;return}if(__props.closeOnClickOutside&&!__props.persistent){if(triggerRef.value&&triggerRef.value.contains(event.target))return;close()}}}return watch(isOpen,(value,oldValue)=>{!isClient()||value===oldValue||(value?open():oldValue&&!value&&close())},{immediate:!0}),watch(()=>__props.position,()=>{isOpen.value&&nextTick(()=>update())}),onMounted(()=>{document.addEventListener(`keydown`,onKeydown)}),onBeforeUnmount(cleanup),onUnmounted(cleanup),__expose({open,close,toggle,isOpen,updatePosition:update,panelRef}),(_ctx,_cache)=>(openBlock(),createElementBlock(Fragment,null,[unref(hasSlotContent)(_ctx.$slots.trigger)?(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`m-popover m-reset-css`,[unref(attrs).class,{"--open":isOpen.value,"--disabled":__props.disabled,"--block":__props.block}]]),style:normalizeStyle(rootStyles.value)},[createElementVNode(`div`,mergeProps({id:unref(triggerId),ref:`trigger`,role:`button`,class:`m-popover-trigger`,"aria-expanded":__props.role===`dialog`||__props.role===`menu`?isOpen.value:void 0,"aria-haspopup":__props.role===`dialog`?`dialog`:void 0,"aria-describedby":__props.role===`tooltip`&&isOpen.value?panelId.value:__props.ariaDescribedby,"aria-labelledby":__props.ariaLabelledby,"aria-controls":panelId.value},triggerEvents.value),[renderSlot(_ctx.$slots,`trigger`,{open,close,toggle,isOpen:isOpen.value,trigger:effectiveTrigger.value},void 0,!0)],16,_hoisted_1)],6)):createCommentVNode(``,!0),(openBlock(),createBlock(Teleport,{to:__props.teleportTo},[createVNode(Transition,{name:transitionName.value,appear:``,onAfterLeave:_cache[0]||=$event=>emits(`after-close-animation`)},{default:withCtx(()=>[isOpen.value?withDirectives((openBlock(),createElementBlock(`div`,mergeProps({key:0,id:panelId.value,ref:`panel`,role:__props.role,"aria-label":__props.ariaLabel,"aria-labelledby":__props.role===`dialog`?__props.ariaLabelledby||unref(triggerId):void 0,"aria-describedby":__props.role===`dialog`?__props.ariaDescribedby:void 0,"aria-modal":__props.role===`dialog`?`true`:void 0,tabindex:__props.role===`dialog`?`-1`:void 0,class:[`m-popover-panel`,panelClasses.value],"aria-live":__props.announceChanges?`polite`:void 0,style:[__props.panelStyle,panelStyles.value,{transformOrigin:getTransformOrigin(computedPosition.value),visibility:unref(middlewareData).hide?.referenceHidden?`hidden`:`visible`}]},panelEvents.value),[renderSlot(_ctx.$slots,`default`,{open,close,toggle,isOpen:isOpen.value},void 0,!0)],16,_hoisted_2)),[[unref(directive),onClickOutside]]):createCommentVNode(``,!0)]),_:3},8,[`name`])],8,[`to`]))],64))}}),[[`__scopeId`,`data-v-e3324c41`]]);export{MazPopover_default as t};