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-heroicons-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. | 
| 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)]'
      }
    }
  }
})