Popover

Reference

auto-placementfalse
Boolean
Automatically calculates best placement for floating element

base"popover"
String
Base name used to style component

fliptrue
Boolean
Allows fliping dropdown to opposite placement if outside of current view

mod-headerempty string
String
Style of the header element

nameempty string
String
Name of the component

offset-x0
Number
Offset of dropdown relative to reference element. See how to use this offset here

offset-y0
Number
Offset of dropdown relative to reference element. See how to use this offset here

placement"bottom-start"
String
Initial placement of dropdown content. See valid values in FloatingUI documentation

titleundefined
String
Title displayed in popover header

transition"fade"
String
Sets animation effect when showing or hiding popover. Valid values are: 'fade' or empty string to disable animations.

trigger"click"
String
How to trigger dropdown. Valid triggers are 'click', 'focus' and 'hover'

variantempty string
String
Active variant of the element mod-* props
Slots
reference
Slot for element that activates dropdown. Dropdown is positioned relative to element in this slot. Slot props: reference, onTrigger and isOpen

default
Slot for popover content
Components

v-popover-header


Notes

Popover activation

To control popover visibility and placement you can use:

  • element in the reference slot of the v-popover (recommended method)
  • element in the v-trigger component. See the usage and example.

To control it programatically you can add optional v-model or call exposed show() and hide() functions.

Teleport

Open popover is by default appended to the body element.


Example - props

Simple popover

Form popover

Tooltip popover

right
click
fade
    <template>
  <!-- simple popover -->

  <p class="my-4">Simple popover</p>

  <v-popover v-bind="example">
    <template #reference="{ reference, onTrigger }">
      <v-button
        :ref="reference"
        v-on="onTrigger"
      >
        Show simple popover
      </v-button>
    </template>
    <v-card width="220px">
      <v-popover-header />
      <div class="p-5">This is popover.</div>
    </v-card>
  </v-popover>

  <!-- form popover -->

  <p class="my-4">Form popover</p>

  <v-popover
    v-bind="example"
    title="Login"
  >
    <template #reference="{ reference, onTrigger }">
      <v-button
        :ref="reference"
        v-on="onTrigger"
      >
        Show form popover
      </v-button>
    </template>
    <v-card class="w-[250px]">
      <v-popover-header />
      <div class="flex flex-col gap-y-4 p-5">
        <div class="flex flex-col gap-y-1">
          <v-input
            type="text"
            label="Email"
            id="login"
            placeholder="Enter email"
          ></v-input>
        </div>
        <div class="flex flex-col gap-y-1">
          <v-input
            type="password"
            label="Password"
            id="password"
            placeholder="Enter password"
          ></v-input>
        </div>
        <v-button
          mod-button="size:small"
          class="ml-auto mt-2"
        >
          Login
        </v-button>
      </div>
    </v-card>
  </v-popover>

  <!-- tooltip popover -->

  <p class="my-4">Tooltip popover</p>

  <v-popover
    v-bind="example"
    title="Header"
  >
    <template #reference="{ reference, onTrigger }">
      <v-button
        :ref="reference"
        v-on="onTrigger"
      >
        Show tooltip popover
      </v-button>
    </template>
    <v-card
      mod-card="preset:tooltip"
      class="w-[330px] p-7"
    >
      Lorem Ipsum is simply dummy text of the printing and typesetting industry.
      Lorem Ipsum has been the industry's standard dummy text ever since the
      1500s, when an unknown printer took a galley of type and scrambled it to
      make a type specimen book. It has survived not only five centuries, but
      also the leap into electronic typesetting, remaining essentially
      unchanged. It was popularised in the 1960s with the release of Letraset
      sheets containing Lorem Ipsum passages, and more recently with desktop
      publishing software like Aldus PageMaker including versions of Lorem
      Ipsum.
    </v-card>
  </v-popover>

</template>
  
    <script setup>
import { ref, reactive } from "vue";

let example = reactive({
  placement: "right",
  trigger: "click",
  noHeader: false,
  title: "Popover title",
  transition: "fade",
  offsetY: 10,
});

let events = ref([]);
</script>
  

Example - open by id

You can also control state of the popover by using v-trigger component. The for prop of the v-trigger should be the same as id of the popover. The advantage of this method over reference slot is that v-triggers can be put anywhere in application.

    <template>
  <v-popover id="popover" title="Popover title" placement="right" :offsetY="10">
    <v-card width="220px">
      <v-popover-header />
      <div class="p-5">This is popover.</div>
    </v-card>
  </v-popover>

  <v-trigger for="popover" v-slot="{ reference, onTrigger }">
    <v-button :ref="reference" v-on="onTrigger">
      Show popover
    </v-button>
  </v-trigger>
</template>