Installation
CLI
npx shadcn@latest add "https://eo-n.vercel.app/r/popover"
Manual
Copy and paste the following code into your project.
"use client";
import * as React from "react";
import { Popover as PopoverPrimitive } from "@base-ui-components/react/popover";
import { cn } from "@/lib/utils";
function Popover({
...props
}: React.ComponentProps<typeof PopoverPrimitive.Root>) {
return <PopoverPrimitive.Root data-slot="popover" {...props} />;
}
function PopoverTrigger({
...props
}: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {
return <PopoverPrimitive.Trigger data-slot="popover-trigger" {...props} />;
}
function PopoverBackdrop({
...props
}: React.ComponentProps<typeof PopoverPrimitive.Backdrop>) {
return <PopoverPrimitive.Backdrop data-slot="popover-backdrop" {...props} />;
}
function PopoverPortal({
...props
}: React.ComponentProps<typeof PopoverPrimitive.Portal>) {
return <PopoverPrimitive.Portal data-slot="popover-portal" {...props} />;
}
interface PopoverContentProps
extends Omit<
React.ComponentProps<typeof PopoverPrimitive.Positioner>,
"render"
> {}
function PopoverContent({
className,
sideOffset = 4,
children,
...props
}: PopoverContentProps) {
return (
<PopoverPortal>
<PopoverBackdrop />
<PopoverPrimitive.Positioner
data-slot="popover-positioner"
sideOffset={sideOffset}
className="z-50 size-auto"
{...props}
>
<PopoverPrimitive.Popup
data-slot="popover-content"
className={cn(
"bg-popover text-popover-foreground max-h-[var(--available-height)] w-72 max-w-[var(--available-width)] overflow-x-hidden overflow-y-auto overscroll-contain rounded-md border p-4 shadow-md transition-[transform,scale,opacity] duration-150 ease-out",
"origin-[var(--transform-origin)] data-[ending-style]:scale-95 data-[ending-style]:opacity-0 data-[starting-style]:scale-95 data-[starting-style]:opacity-0",
className
)}
>
{children}
</PopoverPrimitive.Popup>
</PopoverPrimitive.Positioner>
</PopoverPortal>
);
}
function PopoverHeader({ className, ...props }: React.ComponentProps<"div">) {
return (
<div
data-slot="popover-header"
className={cn("flex flex-col gap-2", className)}
{...props}
/>
);
}
function PopoverTitle({
className,
...props
}: React.ComponentProps<typeof PopoverPrimitive.Title>) {
return (
<PopoverPrimitive.Title
data-slot="popover-title"
className={cn("text-base leading-none font-medium", className)}
{...props}
/>
);
}
function PopoverDescription({
className,
...props
}: React.ComponentProps<typeof PopoverPrimitive.Description>) {
return (
<PopoverPrimitive.Description
data-slot="popover-description"
className={cn("text-muted-foreground text-sm", className)}
{...props}
/>
);
}
function PopoverCLose({
...props
}: React.ComponentProps<typeof PopoverPrimitive.Close>) {
return <PopoverPrimitive.Close data-slot="popover-close" {...props} />;
}
export {
Popover,
PopoverTrigger,
PopoverBackdrop,
PopoverPortal,
PopoverContent,
PopoverHeader,
PopoverTitle,
PopoverDescription,
PopoverCLose,
};
Update the import paths to match your project setup.
Usage
Import all parts and piece them together.
import {
Popover,
PopoverContent,
PopoverDescription,
PopoverTitle,
PopoverTrigger,
} from "@/components/ui/dialog";
<Popover>
<PopoverTrigger>Open</PopoverTrigger>
<PopoverContent>
<PopoverTitle>Popover Title</PopoverTitle>
<PopoverDescription>
This is some content inside the popover.
</PopoverDescription>
</PopoverContent>
</Popover>