Popover
Displays rich content in a portal, triggered by a button.
Kobalte
The Popover component is built on top of Kobalte Popover, which provides accessible dialog, keyboard, and focus behavior.
import { Button } from "~/components/ui/button";import { Input } from "~/components/ui/input";import { Label } from "~/components/ui/label";import { Popover, PopoverContent, PopoverTrigger } from "~/components/ui/popover";
export default function PopoverDemo() { return ( <Popover> <PopoverTrigger as={Button} variant="outline"> Open popover </PopoverTrigger> <PopoverContent class="w-80"> <div class="grid gap-4"> <div class="space-y-2"> <h4 class="leading-none font-medium">Dimensions</h4> <p class="text-sm text-muted-foreground">Set the dimensions for the layer.</p> </div> <div class="grid gap-2"> <div class="grid grid-cols-3 items-center gap-4"> <Label for="popover-demo-width">Width</Label> <Input id="popover-demo-width" defaultValue="100%" class="col-span-2 h-8" /> </div> <div class="grid grid-cols-3 items-center gap-4"> <Label for="popover-demo-max-width">Max. width</Label> <Input id="popover-demo-max-width" defaultValue="300px" class="col-span-2 h-8" /> </div> <div class="grid grid-cols-3 items-center gap-4"> <Label for="popover-demo-height">Height</Label> <Input id="popover-demo-height" defaultValue="25px" class="col-span-2 h-8" /> </div> <div class="grid grid-cols-3 items-center gap-4"> <Label for="popover-demo-max-height">Max. height</Label> <Input id="popover-demo-max-height" defaultValue="none" class="col-span-2 h-8" /> </div> </div> </div> </PopoverContent> </Popover> );}Installation
Usage
import { Button } from "~/components/ui/button";import { Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger,} from "~/components/ui/popover";<Popover> <PopoverTrigger as={Button} variant="outline"> Open Popover </PopoverTrigger> <PopoverContent> <PopoverHeader> <PopoverTitle>Title</PopoverTitle> <PopoverDescription>Description text here.</PopoverDescription> </PopoverHeader> </PopoverContent></Popover>See the Kobalte Popover documentation for primitive-level options, accessibility, and keyboard behavior.
Composition
Use the following composition to build a Popover:
Popover├── PopoverTrigger└── PopoverContentBasic
A simple popover with a header, title, and description.
import { Button } from "~/components/ui/button";import { Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger,} from "~/components/ui/popover";
export default function PopoverBasic() { return ( <Popover placement="bottom-start"> <PopoverTrigger as={Button} variant="outline" class="w-fit"> Open Popover </PopoverTrigger> <PopoverContent> <PopoverHeader> <PopoverTitle>Dimensions</PopoverTitle> <PopoverDescription>Set the dimensions for the layer.</PopoverDescription> </PopoverHeader> </PopoverContent> </Popover> );}Align
Use the placement prop on Popover (e.g. bottom-start, bottom, bottom-end) to control the horizontal alignment.
import { Button } from "~/components/ui/button";import { Popover, PopoverContent, PopoverTrigger } from "~/components/ui/popover";
export default function PopoverAlignments() { return ( <div class="flex gap-6"> <Popover placement="bottom-start"> <PopoverTrigger as={Button} variant="outline" size="sm"> Start </PopoverTrigger> <PopoverContent class="w-40">Aligned to start</PopoverContent> </Popover> <Popover placement="bottom"> <PopoverTrigger as={Button} variant="outline" size="sm"> Center </PopoverTrigger> <PopoverContent class="w-40">Aligned to center</PopoverContent> </Popover> <Popover placement="bottom-end"> <PopoverTrigger as={Button} variant="outline" size="sm"> End </PopoverTrigger> <PopoverContent class="w-40">Aligned to end</PopoverContent> </Popover> </div> );}With Form
A popover with form fields inside.
import { Button } from "~/components/ui/button";import { Field, FieldGroup, FieldLabel } from "~/components/ui/field";import { Input } from "~/components/ui/input";import { Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger,} from "~/components/ui/popover";
export default function PopoverForm() { return ( <Popover> <PopoverTrigger as={Button} variant="outline"> Open Popover </PopoverTrigger> <PopoverContent class="w-64"> <PopoverHeader> <PopoverTitle>Dimensions</PopoverTitle> <PopoverDescription>Set the dimensions for the layer.</PopoverDescription> </PopoverHeader> <FieldGroup class="gap-4"> <Field orientation="horizontal"> <FieldLabel for="popover-form-width" class="w-1/2"> Width </FieldLabel> <Input id="popover-form-width" defaultValue="100%" /> </Field> <Field orientation="horizontal"> <FieldLabel for="popover-form-height" class="w-1/2"> Height </FieldLabel> <Input id="popover-form-height" defaultValue="25px" /> </Field> </FieldGroup> </PopoverContent> </Popover> );}API Reference
See the Kobalte Popover API reference for primitive props, keyboard behavior, and accessibility details.