Skip to content

Commit

Permalink
feat(Popover): handle hovering mode (#47)
Browse files Browse the repository at this point in the history
  • Loading branch information
smarroufin authored Apr 11, 2022
1 parent 289de07 commit c431f8b
Showing 1 changed file with 60 additions and 4 deletions.
64 changes: 60 additions & 4 deletions src/runtime/components/overlays/Popover.vue
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<template>
<Popover v-slot="{ open, close }" :class="wrapperClass">
<PopoverButton ref="trigger" as="div">
<Popover v-slot="{ open, close }" :class="wrapperClass" @mouseleave="onMouseLeave">
<PopoverButton ref="trigger" as="div" @mouseover="onMouseOver">
<slot :open="open" :close="close">
<button>Open</button>
</slot>
</PopoverButton>

<div v-if="open" ref="container" :class="containerClass">
<div v-if="open" ref="container" :class="containerClass" @mouseover="onMouseOver">
<transition
appear
enter-active-class="transition ease-out duration-200"
Expand Down Expand Up @@ -44,6 +44,13 @@ export default {
type: String,
default: 'fixed'
},
mode: {
type: String,
default: 'click',
validator: (value) => {
return ['click', 'hover'].includes(value)
}
},
wrapperClass: {
type: String,
default: 'relative'
Expand Down Expand Up @@ -82,9 +89,58 @@ export default {
}]
})
const popoverApi = ref(null)
let openTimeout = null
let closeTimeout = null
onMounted(() => {
setTimeout(() => {
const popoverProvides = trigger.value?.$.provides
const popoverProvidesSymbols = Object.getOwnPropertySymbols(popoverProvides)
popoverApi.value = popoverProvidesSymbols.length && popoverProvides[popoverProvidesSymbols[0]]
}, 0)
})
function onMouseOver () {
if (props.mode !== 'hover' || !popoverApi.value) {
return
}
// cancel programmed closing
if (closeTimeout) {
clearTimeout(closeTimeout)
closeTimeout = null
}
// dropdown already open
if (popoverApi.value.popoverState === 0) {
return
}
openTimeout = openTimeout || setTimeout(() => {
popoverApi.value.togglePopover && popoverApi.value.togglePopover()
openTimeout = null
}, 200)
}
function onMouseLeave () {
if (props.mode !== 'hover' || !popoverApi.value) {
return
}
// cancel programmed opening
if (openTimeout) {
clearTimeout(openTimeout)
openTimeout = null
}
// dropdown already closed
if (popoverApi.value.popoverState === 1) {
return
}
closeTimeout = closeTimeout || setTimeout(() => {
popoverApi.value.closePopover && popoverApi.value.closePopover()
closeTimeout = null
}, 100)
}
return {
trigger,
container
container,
onMouseOver,
onMouseLeave
}
}
}
Expand Down

1 comment on commit c431f8b

@vercel
Copy link

@vercel vercel bot commented on c431f8b Apr 11, 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 – ./

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

Please sign in to comment.