Skip to content

Commit

Permalink
feat(Dropdown): add hover mode (#45)
Browse files Browse the repository at this point in the history
  • Loading branch information
smarroufin authored Apr 8, 2022
1 parent 3ff8ae7 commit 77149f0
Showing 1 changed file with 64 additions and 3 deletions.
67 changes: 64 additions & 3 deletions src/runtime/components/elements/Dropdown.vue
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<template>
<Menu v-slot="{ open }" as="div" :class="wrapperClass">
<MenuButton ref="trigger" as="div" class="inline-flex">
<Menu v-slot="{ open }" as="div" :class="wrapperClass" @mouseleave="onMouseLeave">
<MenuButton ref="trigger" as="div" class="inline-flex" @mouseover="onMouseOver">
<slot :open="open">
<button>Open</button>
</slot>
</MenuButton>

<div v-if="open" ref="container" :class="containerClass">
<div v-if="open" ref="container" :class="containerClass" @mouseover="onMouseOver">
<transition
appear
enter-active-class="transition duration-100 ease-out"
Expand Down Expand Up @@ -43,6 +43,7 @@ import {
MenuItem
} from '@headlessui/vue'
import { ref, onMounted } from 'vue'
import Icon from '../elements/Icon'
import Avatar from '../elements/Avatar'
import Link from '../elements/Link'
Expand Down Expand Up @@ -78,6 +79,13 @@ export default {
return ['absolute', 'fixed'].includes(value)
}
},
mode: {
type: String,
default: 'click',
validator: (value) => {
return ['click', 'hover'].includes(value)
}
},
wrapperClass: {
type: String,
default: () => $ui.dropdown.wrapper
Expand Down Expand Up @@ -159,10 +167,63 @@ export default {
}
}
const menuApi = ref(null)
let openTimeout = null
let closeTimeout = null
onMounted(() => {
setTimeout(() => {
const menuProvides = trigger.value?.$.provides
const menuProvidesSymbols = Object.getOwnPropertySymbols(menuProvides)
menuApi.value = menuProvidesSymbols.length && menuProvides[menuProvidesSymbols[0]]
}, 0)
})
function onMouseOver () {
if (props.mode !== 'hover' || !menuApi.value) {
return
}
// cancel programmed closing
if (closeTimeout) {
clearTimeout(closeTimeout)
closeTimeout = null
}
// dropdown already open
if (menuApi.value.menuState === 0) {
return
}
openTimeout = openTimeout || setTimeout(() => {
menuApi.value.openMenu && menuApi.value.openMenu()
openTimeout = null
}, 200)
}
function onMouseLeave () {
if (props.mode !== 'hover' || !menuApi.value) {
return
}
// cancel programmed opening
if (openTimeout) {
clearTimeout(openTimeout)
openTimeout = null
}
// dropdown already closed
if (menuApi.value.menuState === 1) {
return
}
closeTimeout = closeTimeout || setTimeout(() => {
menuApi.value.closeMenu && menuApi.value.closeMenu()
closeTimeout = null
}, 100)
}
return {
trigger,
container,
onItemClick,
onMouseOver,
onMouseLeave,
resolveItemClass
}
}
Expand Down

1 comment on commit 77149f0

@vercel
Copy link

@vercel vercel bot commented on 77149f0 Apr 8, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

ui – ./

nuxthq-ui.vercel.app
ui-nuxtlabs.vercel.app
ui-git-dev-nuxtlabs.vercel.app

Please sign in to comment.