focus-trap-vue
Version:
Vue component to trap the focus within a DOM element
7 lines (6 loc) • 2.05 kB
JavaScript
/*!
* focus-trap-vue v4.0.3
* (c) 2025 Eduardo San Martin Morote
* @license MIT
*/
var FocusTrapVue=function(e,t,a){"use strict";const c={escapeDeactivates:{type:Boolean,default:!0},returnFocusOnDeactivate:{type:Boolean,default:!0},allowOutsideClick:{type:[Boolean,Function],default:!0},clickOutsideDeactivates:[Boolean,Function],initialFocus:[String,Function,Boolean],fallbackFocus:[String,Function],checkCanFocusTrap:Function,checkCanReturnFocus:Function,delayInitialFocus:{type:Boolean,default:!0},document:Object,preventScroll:Boolean,setReturnFocus:[Object,String,Boolean,Function],tabbableOptions:Object},n=t.defineComponent({name:"FocusTrap",props:Object.assign({active:{type:Boolean,default:!0}},c),emits:["update:active","activate","postActivate","deactivate","postDeactivate"],render(){return this.renderImpl()},setup(e,{slots:c,emit:n}){let i;const o=t.ref(null),l=t.computed((()=>{const e=o.value;return e&&(e instanceof HTMLElement?e:e.$el)}));function u(){return i||(i=a.createFocusTrap(l.value,{escapeDeactivates:e.escapeDeactivates,allowOutsideClick:e.allowOutsideClick,returnFocusOnDeactivate:e.returnFocusOnDeactivate,clickOutsideDeactivates:e.clickOutsideDeactivates,onActivate:()=>{n("update:active",!0),n("activate")},onDeactivate:()=>{n("update:active",!1),n("deactivate")},onPostActivate:()=>n("postActivate"),onPostDeactivate:()=>n("postDeactivate"),initialFocus:e.initialFocus,fallbackFocus:e.fallbackFocus,tabbableOptions:e.tabbableOptions,delayInitialFocus:e.delayInitialFocus,preventScroll:e.preventScroll}))}return t.onMounted((()=>{t.watch((()=>e.active),(e=>{e&&l.value?u().activate():i&&(i.deactivate(),l.value&&l.value.nodeType!==Node.COMMENT_NODE||(i=null))}),{immediate:!0,flush:"post"})})),t.onUnmounted((()=>{i&&i.deactivate(),i=null})),{activate(){u().activate()},deactivate(){i&&i.deactivate()},renderImpl(){if(!c.default)return null;const e=c.default().filter((e=>e.type!==t.Comment));if(!e||!e.length||e.length>1)return e;return t.cloneVNode(e[0],{ref:o})}}}});return e.FocusTrap=n,e}({},Vue,FocusTrap);