Overlays

Display a non-modal dialog that floats around a trigger element.

Usage

<template>
  <UPopover>
    <UButton color="white" label="Open" trailing-icon="i-heroicons-chevron-down-20-solid" />

    <template #panel>
      <div class="p-4">
        <Placeholder class="h-20 w-48" />
      </div>
    </template>
  </UPopover>
</template>

Mode

Use the mode prop to switch between click and hover modes.

<template>
  <UPopover mode="hover">
    <UButton color="white" label="Open" trailing-icon="i-heroicons-chevron-down-20-solid" />

    <template #panel>
      <div class="p-4">
        <Placeholder class="h-20 w-48" />
      </div>
    </template>
  </UPopover>
</template>

Manual

Use the open prop to manually control showing the panel.

<script setup>
const open = ref(false)
</script>

<template>
  <div class="flex gap-4 items-center">
    <UToggle v-model="open" />
    <UPopover :open="open">
      <UButton color="white" label="Open" trailing-icon="i-heroicons-chevron-down-20-solid" />

      <template #panel>
        <div class="p-4">
          <Placeholder class="h-20 w-48" />
        </div>
      </template>
    </UPopover>
  </div>
</template>

Overlay New

<template>
  <div class="flex gap-4 items-center">
    <UPopover overlay>
      <UButton color="white" label="Open" trailing-icon="i-heroicons-chevron-down-20-solid" />

      <template #panel>
        <div class="p-4">
          <Placeholder class="h-20 w-48" />
        </div>
      </template>
    </UPopover>
  </div>
</template>
Clicking on the overlay emits update:open. If you are manually controlling the open prop, you will need to use a v-model argument (v-model:open).

Popper

Use the popper prop to customize the popper instance.

Arrow

<template>
  <UPopover :popper="{ arrow: true }">
    <UButton color="white" label="Open" trailing-icon="i-heroicons-chevron-down-20-solid" />

    <template #panel>
      <div class="p-4">
        <Placeholder class="h-20 w-48" />
      </div>
    </template>
  </UPopover>
</template>

Placement

<template>
  <UPopover :popper="{ placement: 'top-end' }">
    <UButton color="white" label="Open" trailing-icon="i-heroicons-chevron-down-20-solid" />

    <template #panel>
      <div class="p-4">
        <Placeholder class="h-20 w-48" />
      </div>
    </template>
  </UPopover>
</template>

Offset

<template>
  <UPopover :popper="{ offsetDistance: 0 }">
    <UButton color="white" label="Open" trailing-icon="i-heroicons-chevron-down-20-solid" />

    <template #panel>
      <div class="p-4">
        <Placeholder class="h-20 w-48" />
      </div>
    </template>
  </UPopover>
</template>

Slots

panel

Use the #panel slot to fill the content of the panel. You will have access to the open property and the close method in the slot scope.

<template>
  <UPopover>
    <UButton color="white" label="Open" trailing-icon="i-heroicons-chevron-down-20-solid" />

    <template #panel="{ close }">
      <div class="p-8">
        <UButton label="Close" @click="close" />
      </div>
    </template>
  </UPopover>
</template>

Props

ui
{}
{}
mode
"click" | "hover"
"click"
popper
PopperOptions
{}
openDelay
number
0
closeDelay
number
0
disabled
boolean
false
open
boolean
undefined
overlay
boolean
false

Config

{
  "wrapper": "relative",
  "container": "z-50 group",
  "trigger": "inline-flex w-full",
  "width": "",
  "background": "bg-white dark:bg-gray-900",
  "shadow": "shadow-lg",
  "rounded": "rounded-md",
  "ring": "ring-1 ring-gray-200 dark:ring-gray-800",
  "base": "overflow-hidden focus:outline-none relative",
  "transition": {
    "enterActiveClass": "transition ease-out duration-200",
    "enterFromClass": "opacity-0 translate-y-1",
    "enterToClass": "opacity-100 translate-y-0",
    "leaveActiveClass": "transition ease-in duration-150",
    "leaveFromClass": "opacity-100 translate-y-0",
    "leaveToClass": "opacity-0 translate-y-1"
  },
  "overlay": {
    "base": "fixed inset-0 transition-opacity z-50",
    "background": "bg-gray-200/75 dark:bg-gray-800/75",
    "transition": {
      "enterActiveClass": "ease-out duration-200",
      "enterFromClass": "opacity-0",
      "enterToClass": "opacity-100",
      "leaveActiveClass": "ease-in duration-150",
      "leaveFromClass": "opacity-100",
      "leaveToClass": "opacity-0"
    }
  },
  "popper": {
    "strategy": "fixed"
  },
  "arrow": {
    "base": "invisible before:visible before:block before:rotate-45 before:z-[-1] before:w-2 before:h-2",
    "ring": "before:ring-1 before:ring-gray-200 dark:before:ring-gray-800",
    "rounded": "before:rounded-sm",
    "background": "before:bg-gray-200 dark:before:bg-gray-800",
    "shadow": "before:shadow",
    "placement": "group-data-[popper-placement*='right']:-left-1 group-data-[popper-placement*='left']:-right-1 group-data-[popper-placement*='top']:-bottom-1 group-data-[popper-placement*='bottom']:-top-1"
  }
}