feat(ui): delay closing of Popover

2501-fix-compatibility-with-older-browsers
Flupsi 2025-08-02 15:41:27 +02:00
rodzic c6937c31d8
commit a90bd4bf33
1 zmienionych plików z 8 dodań i 3 usunięć

Wyświetl plik

@ -1,6 +1,6 @@
<script setup lang="ts">
import { computed, ref, inject, provide, shallowReactive, watch, onScopeDispose } from 'vue'
import { whenever, useElementBounding, onClickOutside } from '@vueuse/core'
import { whenever, useElementBounding, onClickOutside, refDebounced } from '@vueuse/core'
import { isMobileView, useScreenSize } from '~/composables/screen'
import { POPOVER_INJECTION_KEY, POPOVER_CONTEXT_INJECTION_KEY } from '~/injection-keys'
@ -13,6 +13,8 @@ import { type ColorProps, type DefaultProps, type RaisedProps, color } from '~/c
*/
const isOpen = defineModel<boolean>({ default: false })
// Delay closing by 300ms
const isOpenDelayed = refDebounced(isOpen, () => isOpen.value ? 0 : 300)
const { positioning = 'vertical', ...colorProps } = defineProps<{
positioning?:'horizontal' | 'vertical'
@ -136,7 +138,7 @@ watch(isOpen, (isOpen) => {
</div>
<teleport
v-if="isOpen"
v-if="isOpenDelayed"
to="body"
>
<div
@ -152,7 +154,10 @@ watch(isOpen, (isOpen) => {
v-bind="color(colorProps)()"
style="display:flex; flex-direction:column;"
>
<slot name="items" />
<slot
name="items"
:close="() => isOpen = false"
/>
</div>
</div>
</teleport>