{"version":3,"file":"VMenu.mjs","names":["VDialogTransition","VDefaultsProvider","VOverlay","makeVOverlayProps","forwardRefs","useRtl","useProxiedModel","useScopeId","computed","inject","mergeProps","nextTick","onBeforeUnmount","onDeactivated","provide","ref","shallowRef","watch","VMenuSymbol","focusableChildren","focusChild","genericComponent","getNextElement","getUid","isClickInsideElement","omit","propsFactory","useRender","makeVMenuProps","id","String","submenu","Boolean","closeDelay","closeOnContentClick","locationStrategy","location","undefined","openDelay","scrim","scrollStrategy","transition","component","VMenu","name","props","emits","value","setup","_ref","slots","isActive","scopeId","isRtl","uid","overlay","parent","openChildren","Set","register","add","unregister","delete","closeParents","e","setTimeout","size","persistent","contentEl","onFocusIn","before","relatedTarget","after","target","globalTop","document","includes","contains","focusable","focus","val","addEventListener","once","removeEventListener","onClickOutside","onKeydown","disabled","key","HTMLTextAreaElement","HTMLInputElement","closest","preventDefault","nextElement","shiftKey","el","tabIndex","activatorEl","onActivatorKeydown","stopImmediatePropagation","activatorProps","overlayProps","filterProps","_createVNode","_mergeProps","class","style","$event","activator","default","_len","arguments","length","args","Array","_key","ΨopenChildren"],"sources":["../../../src/components/VMenu/VMenu.tsx"],"sourcesContent":["// Styles\nimport './VMenu.sass'\n\n// Components\nimport { VDialogTransition } from '@/components/transitions'\nimport { VDefaultsProvider } from '@/components/VDefaultsProvider'\nimport { VOverlay } from '@/components/VOverlay'\nimport { makeVOverlayProps } from '@/components/VOverlay/VOverlay'\n\n// Composables\nimport { forwardRefs } from '@/composables/forwardRefs'\nimport { useRtl } from '@/composables/locale'\nimport { useProxiedModel } from '@/composables/proxiedModel'\nimport { useScopeId } from '@/composables/scopeId'\n\n// Utilities\nimport {\n  computed,\n  inject,\n  mergeProps,\n  nextTick,\n  onBeforeUnmount,\n  onDeactivated,\n  provide,\n  ref,\n  shallowRef,\n  watch,\n} from 'vue'\nimport { VMenuSymbol } from './shared'\nimport {\n  focusableChildren,\n  focusChild,\n  genericComponent,\n  getNextElement,\n  getUid,\n  isClickInsideElement,\n  omit,\n  propsFactory,\n  useRender,\n} from '@/util'\n\n// Types\nimport type { Component } from 'vue'\nimport type { OverlaySlots } from '@/components/VOverlay/VOverlay'\n\nexport const makeVMenuProps = propsFactory({\n  // TODO\n  // disableKeys: Boolean,\n  id: String,\n  submenu: Boolean,\n\n  ...omit(makeVOverlayProps({\n    closeDelay: 250,\n    closeOnContentClick: true,\n    locationStrategy: 'connected' as const,\n    location: undefined,\n    openDelay: 300,\n    scrim: false,\n    scrollStrategy: 'reposition' as const,\n    transition: { component: VDialogTransition as Component },\n  }), ['absolute']),\n}, 'VMenu')\n\nexport const VMenu = genericComponent<OverlaySlots>()({\n  name: 'VMenu',\n\n  props: makeVMenuProps(),\n\n  emits: {\n    'update:modelValue': (value: boolean) => true,\n  },\n\n  setup (props, { slots }) {\n    const isActive = useProxiedModel(props, 'modelValue')\n    const { scopeId } = useScopeId()\n    const { isRtl } = useRtl()\n\n    const uid = getUid()\n    const id = computed(() => props.id || `v-menu-${uid}`)\n\n    const overlay = ref<VOverlay>()\n\n    const parent = inject(VMenuSymbol, null)\n    const openChildren = shallowRef(new Set<number>())\n    provide(VMenuSymbol, {\n      register () {\n        openChildren.value.add(uid)\n      },\n      unregister () {\n        openChildren.value.delete(uid)\n      },\n      closeParents (e) {\n        setTimeout(() => {\n          if (!openChildren.value.size &&\n            !props.persistent &&\n            (e == null || (overlay.value?.contentEl && !isClickInsideElement(e, overlay.value.contentEl)))\n          ) {\n            isActive.value = false\n            parent?.closeParents()\n          }\n        }, 40)\n      },\n    })\n\n    onBeforeUnmount(() => parent?.unregister())\n    onDeactivated(() => isActive.value = false)\n\n    async function onFocusIn (e: FocusEvent) {\n      const before = e.relatedTarget as HTMLElement | null\n      const after = e.target as HTMLElement | null\n\n      await nextTick()\n\n      if (\n        isActive.value &&\n        before !== after &&\n        overlay.value?.contentEl &&\n        // We're the topmost menu\n        overlay.value?.globalTop &&\n        // It isn't the document or the menu body\n        ![document, overlay.value.contentEl].includes(after!) &&\n        // It isn't inside the menu body\n        !overlay.value.contentEl.contains(after)\n      ) {\n        const focusable = focusableChildren(overlay.value.contentEl)\n        focusable[0]?.focus()\n      }\n    }\n\n    watch(isActive, val => {\n      if (val) {\n        parent?.register()\n        document.addEventListener('focusin', onFocusIn, { once: true })\n      } else {\n        parent?.unregister()\n        document.removeEventListener('focusin', onFocusIn)\n      }\n    })\n\n    function onClickOutside (e: MouseEvent) {\n      parent?.closeParents(e)\n    }\n\n    function onKeydown (e: KeyboardEvent) {\n      if (props.disabled) return\n\n      if (e.key === 'Tab' || (e.key === 'Enter' && !props.closeOnContentClick)) {\n        if (\n          e.key === 'Enter' &&\n          ((e.target instanceof HTMLTextAreaElement) ||\n          (e.target instanceof HTMLInputElement && !!e.target.closest('form')))\n        ) return\n        if (e.key === 'Enter') e.preventDefault()\n\n        const nextElement = getNextElement(\n          focusableChildren(overlay.value?.contentEl as Element, false),\n          e.shiftKey ? 'prev' : 'next',\n          (el: HTMLElement) => el.tabIndex >= 0\n        )\n        if (!nextElement) {\n          isActive.value = false\n          overlay.value?.activatorEl?.focus()\n        }\n      } else if (props.submenu && e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) {\n        isActive.value = false\n        overlay.value?.activatorEl?.focus()\n      }\n    }\n\n    function onActivatorKeydown (e: KeyboardEvent) {\n      if (props.disabled) return\n\n      const el = overlay.value?.contentEl\n      if (el && isActive.value) {\n        if (e.key === 'ArrowDown') {\n          e.preventDefault()\n          e.stopImmediatePropagation()\n          focusChild(el, 'next')\n        } else if (e.key === 'ArrowUp') {\n          e.preventDefault()\n          e.stopImmediatePropagation()\n          focusChild(el, 'prev')\n        } else if (props.submenu) {\n          if (e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) {\n            isActive.value = false\n          } else if (e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight')) {\n            e.preventDefault()\n            focusChild(el, 'first')\n          }\n        }\n      } else if (\n        props.submenu\n          ? e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight')\n          : ['ArrowDown', 'ArrowUp'].includes(e.key)\n      ) {\n        isActive.value = true\n        e.preventDefault()\n        setTimeout(() => setTimeout(() => onActivatorKeydown(e)))\n      }\n    }\n\n    const activatorProps = computed(() =>\n      mergeProps({\n        'aria-haspopup': 'menu',\n        'aria-expanded': String(isActive.value),\n        'aria-owns': id.value,\n        onKeydown: onActivatorKeydown,\n      }, props.activatorProps)\n    )\n\n    useRender(() => {\n      const overlayProps = VOverlay.filterProps(props)\n\n      return (\n        <VOverlay\n          ref={ overlay }\n          id={ id.value }\n          class={[\n            'v-menu',\n            props.class,\n          ]}\n          style={ props.style }\n          { ...overlayProps }\n          v-model={ isActive.value }\n          absolute\n          activatorProps={ activatorProps.value }\n          location={ props.location ?? (props.submenu ? 'end' : 'bottom') }\n          onClick:outside={ onClickOutside }\n          onKeydown={ onKeydown }\n          { ...scopeId }\n        >\n          {{\n            activator: slots.activator,\n            default: (...args) => (\n              <VDefaultsProvider root=\"VMenu\">\n                { slots.default?.(...args) }\n              </VDefaultsProvider>\n            ),\n          }}\n        </VOverlay>\n      )\n    })\n\n    return forwardRefs({ id, ΨopenChildren: openChildren }, overlay)\n  },\n})\n\nexport type VMenu = InstanceType<typeof VMenu>\n"],"mappings":";AAAA;AACA;;AAEA;AAAA,SACSA,iBAAiB;AAAA,SACjBC,iBAAiB;AAAA,SACjBC,QAAQ;AAAA,SACRC,iBAAiB,oCAE1B;AAAA,SACSC,WAAW;AAAA,SACXC,MAAM;AAAA,SACNC,eAAe;AAAA,SACfC,UAAU,yCAEnB;AACA,SACEC,QAAQ,EACRC,MAAM,EACNC,UAAU,EACVC,QAAQ,EACRC,eAAe,EACfC,aAAa,EACbC,OAAO,EACPC,GAAG,EACHC,UAAU,EACVC,KAAK,QACA,KAAK;AAAA,SACHC,WAAW;AAAA,SAElBC,iBAAiB,EACjBC,UAAU,EACVC,gBAAgB,EAChBC,cAAc,EACdC,MAAM,EACNC,oBAAoB,EACpBC,IAAI,EACJC,YAAY,EACZC,SAAS,gCAGX;AAIA,OAAO,MAAMC,cAAc,GAAGF,YAAY,CAAC;EACzC;EACA;EACAG,EAAE,EAAEC,MAAM;EACVC,OAAO,EAAEC,OAAO;EAEhB,GAAGP,IAAI,CAACtB,iBAAiB,CAAC;IACxB8B,UAAU,EAAE,GAAG;IACfC,mBAAmB,EAAE,IAAI;IACzBC,gBAAgB,EAAE,WAAoB;IACtCC,QAAQ,EAAEC,SAAS;IACnBC,SAAS,EAAE,GAAG;IACdC,KAAK,EAAE,KAAK;IACZC,cAAc,EAAE,YAAqB;IACrCC,UAAU,EAAE;MAAEC,SAAS,EAAE1C;IAA+B;EAC1D,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;AAClB,CAAC,EAAE,OAAO,CAAC;AAEX,OAAO,MAAM2C,KAAK,GAAGtB,gBAAgB,CAAe,CAAC,CAAC;EACpDuB,IAAI,EAAE,OAAO;EAEbC,KAAK,EAAEjB,cAAc,CAAC,CAAC;EAEvBkB,KAAK,EAAE;IACL,mBAAmB,EAAGC,KAAc,IAAK;EAC3C,CAAC;EAEDC,KAAKA,CAAEH,KAAK,EAAAI,IAAA,EAAa;IAAA,IAAX;MAAEC;IAAM,CAAC,GAAAD,IAAA;IACrB,MAAME,QAAQ,GAAG7C,eAAe,CAACuC,KAAK,EAAE,YAAY,CAAC;IACrD,MAAM;MAAEO;IAAQ,CAAC,GAAG7C,UAAU,CAAC,CAAC;IAChC,MAAM;MAAE8C;IAAM,CAAC,GAAGhD,MAAM,CAAC,CAAC;IAE1B,MAAMiD,GAAG,GAAG/B,MAAM,CAAC,CAAC;IACpB,MAAMM,EAAE,GAAGrB,QAAQ,CAAC,MAAMqC,KAAK,CAAChB,EAAE,IAAI,UAAUyB,GAAG,EAAE,CAAC;IAEtD,MAAMC,OAAO,GAAGxC,GAAG,CAAW,CAAC;IAE/B,MAAMyC,MAAM,GAAG/C,MAAM,CAACS,WAAW,EAAE,IAAI,CAAC;IACxC,MAAMuC,YAAY,GAAGzC,UAAU,CAAC,IAAI0C,GAAG,CAAS,CAAC,CAAC;IAClD5C,OAAO,CAACI,WAAW,EAAE;MACnByC,QAAQA,CAAA,EAAI;QACVF,YAAY,CAACV,KAAK,CAACa,GAAG,CAACN,GAAG,CAAC;MAC7B,CAAC;MACDO,UAAUA,CAAA,EAAI;QACZJ,YAAY,CAACV,KAAK,CAACe,MAAM,CAACR,GAAG,CAAC;MAChC,CAAC;MACDS,YAAYA,CAAEC,CAAC,EAAE;QACfC,UAAU,CAAC,MAAM;UACf,IAAI,CAACR,YAAY,CAACV,KAAK,CAACmB,IAAI,IAC1B,CAACrB,KAAK,CAACsB,UAAU,KAChBH,CAAC,IAAI,IAAI,IAAKT,OAAO,CAACR,KAAK,EAAEqB,SAAS,IAAI,CAAC5C,oBAAoB,CAACwC,CAAC,EAAET,OAAO,CAACR,KAAK,CAACqB,SAAS,CAAE,CAAC,EAC9F;YACAjB,QAAQ,CAACJ,KAAK,GAAG,KAAK;YACtBS,MAAM,EAAEO,YAAY,CAAC,CAAC;UACxB;QACF,CAAC,EAAE,EAAE,CAAC;MACR;IACF,CAAC,CAAC;IAEFnD,eAAe,CAAC,MAAM4C,MAAM,EAAEK,UAAU,CAAC,CAAC,CAAC;IAC3ChD,aAAa,CAAC,MAAMsC,QAAQ,CAACJ,KAAK,GAAG,KAAK,CAAC;IAE3C,eAAesB,SAASA,CAAEL,CAAa,EAAE;MACvC,MAAMM,MAAM,GAAGN,CAAC,CAACO,aAAmC;MACpD,MAAMC,KAAK,GAAGR,CAAC,CAACS,MAA4B;MAE5C,MAAM9D,QAAQ,CAAC,CAAC;MAEhB,IACEwC,QAAQ,CAACJ,KAAK,IACduB,MAAM,KAAKE,KAAK,IAChBjB,OAAO,CAACR,KAAK,EAAEqB,SAAS;MACxB;MACAb,OAAO,CAACR,KAAK,EAAE2B,SAAS;MACxB;MACA,CAAC,CAACC,QAAQ,EAAEpB,OAAO,CAACR,KAAK,CAACqB,SAAS,CAAC,CAACQ,QAAQ,CAACJ,KAAM,CAAC;MACrD;MACA,CAACjB,OAAO,CAACR,KAAK,CAACqB,SAAS,CAACS,QAAQ,CAACL,KAAK,CAAC,EACxC;QACA,MAAMM,SAAS,GAAG3D,iBAAiB,CAACoC,OAAO,CAACR,KAAK,CAACqB,SAAS,CAAC;QAC5DU,SAAS,CAAC,CAAC,CAAC,EAAEC,KAAK,CAAC,CAAC;MACvB;IACF;IAEA9D,KAAK,CAACkC,QAAQ,EAAE6B,GAAG,IAAI;MACrB,IAAIA,GAAG,EAAE;QACPxB,MAAM,EAAEG,QAAQ,CAAC,CAAC;QAClBgB,QAAQ,CAACM,gBAAgB,CAAC,SAAS,EAAEZ,SAAS,EAAE;UAAEa,IAAI,EAAE;QAAK,CAAC,CAAC;MACjE,CAAC,MAAM;QACL1B,MAAM,EAAEK,UAAU,CAAC,CAAC;QACpBc,QAAQ,CAACQ,mBAAmB,CAAC,SAAS,EAAEd,SAAS,CAAC;MACpD;IACF,CAAC,CAAC;IAEF,SAASe,cAAcA,CAAEpB,CAAa,EAAE;MACtCR,MAAM,EAAEO,YAAY,CAACC,CAAC,CAAC;IACzB;IAEA,SAASqB,SAASA,CAAErB,CAAgB,EAAE;MACpC,IAAInB,KAAK,CAACyC,QAAQ,EAAE;MAEpB,IAAItB,CAAC,CAACuB,GAAG,KAAK,KAAK,IAAKvB,CAAC,CAACuB,GAAG,KAAK,OAAO,IAAI,CAAC1C,KAAK,CAACX,mBAAoB,EAAE;QACxE,IACE8B,CAAC,CAACuB,GAAG,KAAK,OAAO,KACfvB,CAAC,CAACS,MAAM,YAAYe,mBAAmB,IACxCxB,CAAC,CAACS,MAAM,YAAYgB,gBAAgB,IAAI,CAAC,CAACzB,CAAC,CAACS,MAAM,CAACiB,OAAO,CAAC,MAAM,CAAE,CAAC,EACrE;QACF,IAAI1B,CAAC,CAACuB,GAAG,KAAK,OAAO,EAAEvB,CAAC,CAAC2B,cAAc,CAAC,CAAC;QAEzC,MAAMC,WAAW,GAAGtE,cAAc,CAChCH,iBAAiB,CAACoC,OAAO,CAACR,KAAK,EAAEqB,SAAS,EAAa,KAAK,CAAC,EAC7DJ,CAAC,CAAC6B,QAAQ,GAAG,MAAM,GAAG,MAAM,EAC3BC,EAAe,IAAKA,EAAE,CAACC,QAAQ,IAAI,CACtC,CAAC;QACD,IAAI,CAACH,WAAW,EAAE;UAChBzC,QAAQ,CAACJ,KAAK,GAAG,KAAK;UACtBQ,OAAO,CAACR,KAAK,EAAEiD,WAAW,EAAEjB,KAAK,CAAC,CAAC;QACrC;MACF,CAAC,MAAM,IAAIlC,KAAK,CAACd,OAAO,IAAIiC,CAAC,CAACuB,GAAG,MAAMlC,KAAK,CAACN,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC,EAAE;QAChFI,QAAQ,CAACJ,KAAK,GAAG,KAAK;QACtBQ,OAAO,CAACR,KAAK,EAAEiD,WAAW,EAAEjB,KAAK,CAAC,CAAC;MACrC;IACF;IAEA,SAASkB,kBAAkBA,CAAEjC,CAAgB,EAAE;MAC7C,IAAInB,KAAK,CAACyC,QAAQ,EAAE;MAEpB,MAAMQ,EAAE,GAAGvC,OAAO,CAACR,KAAK,EAAEqB,SAAS;MACnC,IAAI0B,EAAE,IAAI3C,QAAQ,CAACJ,KAAK,EAAE;QACxB,IAAIiB,CAAC,CAACuB,GAAG,KAAK,WAAW,EAAE;UACzBvB,CAAC,CAAC2B,cAAc,CAAC,CAAC;UAClB3B,CAAC,CAACkC,wBAAwB,CAAC,CAAC;UAC5B9E,UAAU,CAAC0E,EAAE,EAAE,MAAM,CAAC;QACxB,CAAC,MAAM,IAAI9B,CAAC,CAACuB,GAAG,KAAK,SAAS,EAAE;UAC9BvB,CAAC,CAAC2B,cAAc,CAAC,CAAC;UAClB3B,CAAC,CAACkC,wBAAwB,CAAC,CAAC;UAC5B9E,UAAU,CAAC0E,EAAE,EAAE,MAAM,CAAC;QACxB,CAAC,MAAM,IAAIjD,KAAK,CAACd,OAAO,EAAE;UACxB,IAAIiC,CAAC,CAACuB,GAAG,MAAMlC,KAAK,CAACN,KAAK,GAAG,YAAY,GAAG,WAAW,CAAC,EAAE;YACxDI,QAAQ,CAACJ,KAAK,GAAG,KAAK;UACxB,CAAC,MAAM,IAAIiB,CAAC,CAACuB,GAAG,MAAMlC,KAAK,CAACN,KAAK,GAAG,WAAW,GAAG,YAAY,CAAC,EAAE;YAC/DiB,CAAC,CAAC2B,cAAc,CAAC,CAAC;YAClBvE,UAAU,CAAC0E,EAAE,EAAE,OAAO,CAAC;UACzB;QACF;MACF,CAAC,MAAM,IACLjD,KAAK,CAACd,OAAO,GACTiC,CAAC,CAACuB,GAAG,MAAMlC,KAAK,CAACN,KAAK,GAAG,WAAW,GAAG,YAAY,CAAC,GACpD,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC6B,QAAQ,CAACZ,CAAC,CAACuB,GAAG,CAAC,EAC5C;QACApC,QAAQ,CAACJ,KAAK,GAAG,IAAI;QACrBiB,CAAC,CAAC2B,cAAc,CAAC,CAAC;QAClB1B,UAAU,CAAC,MAAMA,UAAU,CAAC,MAAMgC,kBAAkB,CAACjC,CAAC,CAAC,CAAC,CAAC;MAC3D;IACF;IAEA,MAAMmC,cAAc,GAAG3F,QAAQ,CAAC,MAC9BE,UAAU,CAAC;MACT,eAAe,EAAE,MAAM;MACvB,eAAe,EAAEoB,MAAM,CAACqB,QAAQ,CAACJ,KAAK,CAAC;MACvC,WAAW,EAAElB,EAAE,CAACkB,KAAK;MACrBsC,SAAS,EAAEY;IACb,CAAC,EAAEpD,KAAK,CAACsD,cAAc,CACzB,CAAC;IAEDxE,SAAS,CAAC,MAAM;MACd,MAAMyE,YAAY,GAAGlG,QAAQ,CAACmG,WAAW,CAACxD,KAAK,CAAC;MAEhD,OAAAyD,YAAA,CAAApG,QAAA,EAAAqG,WAAA;QAAA,OAEUhD,OAAO;QAAA,MACR1B,EAAE,CAACkB,KAAK;QAAA,SACN,CACL,QAAQ,EACRF,KAAK,CAAC2D,KAAK,CACZ;QAAA,SACO3D,KAAK,CAAC4D;MAAK,GACdL,YAAY;QAAA,cACPjD,QAAQ,CAACJ,KAAK;QAAA,uBAAA2D,MAAA,IAAdvD,QAAQ,CAACJ,KAAK,GAAA2D,MAAA;QAAA;QAAA,kBAEPP,cAAc,CAACpD,KAAK;QAAA,YAC1BF,KAAK,CAACT,QAAQ,KAAKS,KAAK,CAACd,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;QAAA,mBAC7CqD,cAAc;QAAA,aACpBC;MAAS,GAChBjC,OAAO;QAGVuD,SAAS,EAAEzD,KAAK,CAACyD,SAAS;QAC1BC,OAAO,EAAE,SAAAA,CAAA;UAAA,SAAAC,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAAIC,IAAI,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;YAAJF,IAAI,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;UAAA;UAAA,OAAAZ,YAAA,CAAArG,iBAAA;YAAA;UAAA;YAAA2G,OAAA,EAAAA,CAAA,MAEX1D,KAAK,CAAC0D,OAAO,GAAG,GAAGI,IAAI,CAAC;UAAA;QAAA;MAE7B;IAIT,CAAC,CAAC;IAEF,OAAO5G,WAAW,CAAC;MAAEyB,EAAE;MAAEsF,aAAa,EAAE1D;IAAa,CAAC,EAAEF,OAAO,CAAC;EAClE;AACF,CAAC,CAAC","ignoreList":[]}