Skip to content

Commit 4663f72

Browse files
committed
Improve popover dismissal and tooltip timing
Add handlers to prevent unwanted popover closing and delay tooltip activation. Register @pointer-down-outside and @focus-outside to call onDismissOutside, which prevents the popover from closing when interacting with nested floating-vue poppers (checks .v-popper__popper and calls event.preventDefault()). Introduce tooltipsReady reactive state and a watch on open to enable tooltips 400ms after opening; update v-tooltip bindings to use tooltipsReady. Also import watch from Vue.
1 parent 5e7fdd1 commit 4663f72

1 file changed

Lines changed: 24 additions & 3 deletions

File tree

app/components/PopoverPanel.vue

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
side="top"
99
class="w-auto max-w-sm p-0"
1010
@interact-outside="autoHide ? (open = false) : undefined"
11+
@pointer-down-outside="onDismissOutside"
12+
@focus-outside="onDismissOutside"
1113
>
1214
<div
1315
class="flex items-center justify-between gap-2 border-b border-zinc-200 p-2 text-zinc-600 dark:border-zinc-800 dark:text-zinc-300"
@@ -19,7 +21,7 @@
1921
v-if="resets"
2022
size="sm"
2123
variant="ghost"
22-
v-tooltip="'Reset'"
24+
v-tooltip="tooltipsReady ? 'Reset' : undefined"
2325
@click="$emit('reset')"
2426
>
2527
<RefreshCwIcon class="h-4 w-4" />
@@ -29,7 +31,7 @@
2931
v-if="closes"
3032
size="sm"
3133
variant="ghost"
32-
v-tooltip="'Close'"
34+
v-tooltip="tooltipsReady ? 'Close' : undefined"
3335
@click="open = false"
3436
>
3537
<XIcon class="h-4 w-4" />
@@ -43,7 +45,7 @@
4345
</template>
4446

4547
<script setup>
46-
import { ref } from 'vue';
48+
import { ref, watch } from 'vue';
4749
import { Popover as UiPopover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
4850
import { XIcon, RefreshCwIcon } from 'lucide-vue-next';
4951
@@ -57,4 +59,23 @@ defineProps({
5759
defineEmits(['reset']);
5860
5961
const open = ref(false);
62+
const tooltipsReady = ref(false);
63+
64+
watch(open, (isOpen) => {
65+
tooltipsReady.value = false;
66+
67+
if (isOpen) {
68+
setTimeout(() => (tooltipsReady.value = true), 400);
69+
}
70+
});
71+
72+
function onDismissOutside(event) {
73+
// Prevent the popover from closing when interacting
74+
// with a nested floating-vue dropdown (e.g. color picker).
75+
const target = event.detail?.originalEvent?.target ?? event.target;
76+
77+
if (target?.closest?.('.v-popper__popper')) {
78+
event.preventDefault();
79+
}
80+
}
6081
</script>

0 commit comments

Comments
 (0)