Popover

Displays rich content in a portal, triggered by a button.

Preview

Installation

Copy and paste this into your project

// ~/components/ui/popover.tsx

import {
  Popover as PopoverPrimitive,
  PopoverContent as PopoverContentPrimitive,
  PopoverPositioner,
  PopoverTrigger,
  PopoverProps,
} from "@ark-ui/vue";
import { ExtendProps, cn } from "~/lib/utils";
import { defineComponent, onMounted, ref } from "vue";

const Popover = defineComponent({
  props: {} as ExtendProps<PopoverProps>,
  setup(_, { slots }) {
    const key = ref("ssr");
    onMounted(() => {
      key.value = "csr";
    });
    return () => (
      <PopoverPrimitive key={key.value}>{slots.default?.()}</PopoverPrimitive>
    );
  },
});

const PopoverContent = defineComponent({
  setup(_, { slots, attrs }) {
    return () => (
      <PopoverPositioner>
        <PopoverContentPrimitive
          class={cn(
            "z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none",
            attrs.class ?? ""
          )}
        >
          {slots.default?.()}
        </PopoverContentPrimitive>
      </PopoverPositioner>
    );
  },
});

export { Popover, PopoverContent, PopoverPositioner, PopoverTrigger };

Usage

import {
  Popover,
  PopoverTrigger,
  PopoverContent,
} from "~/components/ui/popover";
<Popover>
  <PopoverTrigger>
    <button>Open Popover</button>
  </PopoverTrigger>
  <PopoverContent>
    <div class="p-4">Popover content</div>
  </PopoverContent>
</Popover>