Usage
Use a Button or any other component in the default slot of the Popover.
Then, use the #content
slot to add the content displayed when the Popover is open.
<template>
<UPopover>
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
Mode
Use the mode
prop to change the mode of the Popover. Defaults to click
.
<template>
<UPopover mode="hover">
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
Delay
When using the hover
mode, you can use the open-delay
and close-delay
props to control the delay before the Popover is opened or closed.
<template>
<UPopover mode="hover" :open-delay="500" :close-delay="300">
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
Content
Use the content
prop to control how the Popover content is rendered, like its align
or side
for example.
<template>
<UPopover
:content="{
align: 'center',
side: 'bottom',
sideOffset: 8
}"
>
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
Arrow
Use the arrow
prop to display an arrow on the Popover.
<template>
<UPopover arrow>
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
Examples
Control open state
You can control the open state by using the default-open
prop or the v-model:open
directive.
<script setup lang="ts">
const open = ref(false)
defineShortcuts({
o: () => open.value = !open.value
})
</script>
<template>
<UPopover v-model:open="open">
<UButton label="Open" color="neutral" variant="subtle" />
<template #content>
<Placeholder class="size-48 m-4 inline-flex" />
</template>
</UPopover>
</template>
With command palette
You can use a CommandPalette component inside the Popover's content.
<script setup lang="ts">
const items = ref([
{
label: 'bug',
value: 'bug',
chip: {
color: 'error' as const
}
},
{
label: 'feature',
value: 'feature',
chip: {
color: 'success' as const
}
},
{
label: 'enhancement',
value: 'enhancement',
chip: {
color: 'info' as const
}
}
])
const label = ref([])
</script>
<template>
<UPopover :content="{ side: 'right', align: 'start' }">
<UButton
icon="i-lucide-tag"
label="Select labels"
color="neutral"
variant="subtle"
/>
<template #content>
<UCommandPalette
v-model="label"
multiple
placeholder="Search labels..."
:groups="[{ id: 'labels', items }]"
:ui="{ input: '[&>input]:h-8' }"
/>
</template>
</UPopover>
</template>
API
Props
Prop | Default | Type |
---|---|---|
mode |
|
The display mode of the popover. |
content |
|
The content of the popover. |
arrow |
|
Display an arrow alongside the popover. |
portal |
|
Render the popover in a portal. |
preventClose |
|
When |
defaultOpen |
The open state of the popover when it is initially rendered. Use when you do not need to control its open state. | |
open |
The controlled open state of the popover. | |
modal |
|
The modality of the popover. When set to true, interaction with outside elements will be disabled and only popover content will be visible to screen readers. |
openDelay |
|
The duration from when the mouse enters the trigger until the hover card opens. |
closeDelay |
|
The duration from when the mouse leaves the trigger or content until the hover card closes. |
ui |
|
Slots
Slot | Type |
---|---|
default |
|
content |
|
Emits
Event | Type |
---|---|
update:open |
|
Theme
export default defineAppConfig({
ui: {
popover: {
slots: {
content: 'bg-[var(--ui-bg)] shadow-lg rounded-[calc(var(--ui-radius)*1.5)] ring ring-[var(--ui-border)] data-[state=open]:animate-[scale-in_100ms_ease-out] data-[state=closed]:animate-[scale-out_100ms_ease-in] focus:outline-none',
arrow: 'fill-[var(--ui-border)]'
}
}
}
})