- Accordion
- Alert
- Alert Dialog
- Aspect Ratio
- Attachment
- Avatar
- Badge
- Breadcrumb
- Bubble
- Button
- Button Group
- Card
- Checkbox
- Collapsible
- Combobox
- Context Menu
- Date Picker (Lite)
- Dialog
- Direction
- Drawer
- Dropdown Menu
- Empty
- Field
- Hover Card
- Input
- Input Group
- Input OTP (Lite)
- Item
- Kbd
- Label
- Marker
- Menubar
- Message
- Native Select
- Navigation Menu
- Pagination
- Popover
- Progress
- Radio Group
- Scroll Area
- Select
- Separator
- Sheet
- Sidebar
- Skeleton
- Slider
- Spinner
- Switch
- Table
- Tabs
- Textarea
- Toast
- Toggle
- Toggle Group
- Tooltip
Dimensions
Set the dimensions for the layer.
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 render={<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="width">Width</Label>
<Input id="width" value="100%" class="col-span-2 h-8" />
</div>
<div class="grid grid-cols-3 items-center gap-4">
<Label for="maxWidth">Max. width</Label>
<Input id="maxWidth" value="300px" class="col-span-2 h-8" />
</div>
<div class="grid grid-cols-3 items-center gap-4">
<Label for="height">Height</Label>
<Input id="height" value="25px" class="col-span-2 h-8" />
</div>
<div class="grid grid-cols-3 items-center gap-4">
<Label for="maxHeight">Max. height</Label>
<Input id="maxHeight" value="none" class="col-span-2 h-8" />
</div>
</div>
</div>
</PopoverContent>
</Popover>
)
}Installation
pnpm dlx shadcnui-hono-jsx@latest add popovernpx shadcnui-hono-jsx@latest add popoveryarn dlx shadcnui-hono-jsx@latest add popoverbunx shadcnui-hono-jsx@latest add popoverUsage
import {
Popover,
PopoverContent,
PopoverDescription,
PopoverHeader,
PopoverTitle,
PopoverTrigger,
} from "@/components/ui/popover"<Popover>
<PopoverTrigger render={<Button variant="outline" />}>
Open Popover
</PopoverTrigger>
<PopoverContent>
<PopoverHeader>
<PopoverTitle>Title</PopoverTitle>
<PopoverDescription>Description text here.</PopoverDescription>
</PopoverHeader>
</PopoverContent>
</Popover>Composition
Use the following composition to build a Popover:
Popover
├── PopoverTrigger
└── PopoverContentBasic
A simple popover with a header, title, and description.
Dimensions
Set the dimensions for the layer.
import { Button } from "@/components/ui/button"
import {
Popover,
PopoverContent,
PopoverDescription,
PopoverHeader,
PopoverTitle,
PopoverTrigger,
} from "@/components/ui/popover"
export function PopoverBasic() {
return (
<>
<Popover>
<PopoverTrigger render={<Button variant="outline" class="w-fit" />}>
Open Popover
</PopoverTrigger>
<PopoverContent align="start">
<PopoverHeader>
<PopoverTitle>Dimensions</PopoverTitle>
<PopoverDescription>
Set the dimensions for the layer.
</PopoverDescription>
</PopoverHeader>
</PopoverContent>
</Popover>
</>
)
}Align
Use the align prop on PopoverContent to control the horizontal alignment.
import { Button } from "@/components/ui/button"
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover"
export function PopoverAlignments() {
return (
<>
<div class="flex gap-6">
<Popover>
<PopoverTrigger render={<Button variant="outline" size="sm" />}>
Start
</PopoverTrigger>
<PopoverContent align="start" class="w-40">
Aligned to start
</PopoverContent>
</Popover>
<Popover>
<PopoverTrigger render={<Button variant="outline" size="sm" />}>
Center
</PopoverTrigger>
<PopoverContent align="center" class="w-40">
Aligned to center
</PopoverContent>
</Popover>
<Popover>
<PopoverTrigger render={<Button variant="outline" size="sm" />}>
End
</PopoverTrigger>
<PopoverContent align="end" class="w-40">
Aligned to end
</PopoverContent>
</Popover>
</div>
</>
)
}With Form
A popover with form fields inside.
Dimensions
Set the dimensions for the layer.
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 function PopoverForm() {
return (
<>
<Popover>
<PopoverTrigger render={<Button variant="outline" />}>
Open Popover
</PopoverTrigger>
<PopoverContent class="w-64" align="start">
<PopoverHeader>
<PopoverTitle>Dimensions</PopoverTitle>
<PopoverDescription>
Set the dimensions for the layer.
</PopoverDescription>
</PopoverHeader>
<FieldGroup class="gap-4">
<Field orientation="horizontal">
<FieldLabel for="width" class="w-1/2">
Width
</FieldLabel>
<Input id="width" value="100%" />
</Field>
<Field orientation="horizontal">
<FieldLabel for="height" class="w-1/2">
Height
</FieldLabel>
<Input id="height" value="25px" />
</Field>
</FieldGroup>
</PopoverContent>
</Popover>
</>
)
}RTL
To enable RTL support in shadcn/ui, see the RTL configuration guide.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
Dimensions
Set the dimensions for the layer.
الأبعاد
تعيين الأبعاد للطبقة.
الأبعاد
تعيين الأبعاد للطبقة.
الأبعاد
تعيين الأبعاد للطبقة.
الأبعاد
تعيين الأبعاد للطبقة.
الأبعاد
تعيين الأبعاد للطبقة.
الأبعاد
تعيين الأبعاد للطبقة.
מימדים
הגדר את המימדים לשכבה.
מימדים
הגדר את המימדים לשכבה.
מימדים
הגדר את המימדים לשכבה.
מימדים
הגדר את המימדים לשכבה.
מימדים
הגדר את המימדים לשכבה.
מימדים
הגדר את המימדים לשכבה.
// This example sets dir and uses useTranslation because this site is not RTL.
// In an RTL app you won't need them; see the RTL guide.
import {
type Translations,
useTranslation,
} from "@/components/language-selector"
import { Button } from "@/components/ui/button"
import {
Popover,
PopoverContent,
PopoverDescription,
PopoverHeader,
PopoverTitle,
PopoverTrigger,
} from "@/components/ui/popover"
const translations: Translations = {
en: {
dir: "ltr",
values: {
title: "Dimensions",
description: "Set the dimensions for the layer.",
"inline-start": "Inline Start",
left: "Left",
top: "Top",
bottom: "Bottom",
right: "Right",
"inline-end": "Inline End",
},
},
ar: {
dir: "rtl",
values: {
title: "الأبعاد",
description: "تعيين الأبعاد للطبقة.",
"inline-start": "بداية السطر",
left: "يسار",
top: "أعلى",
bottom: "أسفل",
right: "يمين",
"inline-end": "نهاية السطر",
},
},
he: {
dir: "rtl",
values: {
title: "מימדים",
description: "הגדר את המימדים לשכבה.",
"inline-start": "תחילת השורה",
left: "שמאל",
top: "למעלה",
bottom: "למטה",
right: "ימין",
"inline-end": "סוף השורה",
},
},
}
const physicalSides = ["left", "top", "bottom", "right"] as const
const logicalSides = ["inline-start", "inline-end"] as const
export function PopoverRtl() {
const { dir, t } = useTranslation(translations, "ar")
return (
<div class="grid gap-4">
<div class="flex flex-wrap justify-center gap-2">
{physicalSides.map((side) => (
<Popover key={side}>
<PopoverTrigger render={<Button variant="outline" />}>
{t[side]}
</PopoverTrigger>
<PopoverContent side={side} dir={dir}>
<PopoverHeader>
<PopoverTitle>{t.title}</PopoverTitle>
<PopoverDescription>{t.description}</PopoverDescription>
</PopoverHeader>
</PopoverContent>
</Popover>
))}
</div>
<div class="flex flex-wrap justify-center gap-2">
{logicalSides.map((side) => (
<Popover key={side}>
<PopoverTrigger render={<Button variant="outline" />}>
{t[side]}
</PopoverTrigger>
<PopoverContent side={side} dir={dir}>
<PopoverHeader>
<PopoverTitle>{t.title}</PopoverTitle>
<PopoverDescription>{t.description}</PopoverDescription>
</PopoverHeader>
</PopoverContent>
</Popover>
))}
</div>
</div>
)
}Notes
- Built on the native
popoverattribute with Invoker Commands and CSS anchor positioning: no JavaScript, but placement next to the trigger needs Chrome 135, Firefox 147 or Safari 26.2 (elsewhere the popover opens centered). Outside clicks and Escape close it. - Controlled state (
open,defaultOpen,onOpenChange) andopenOnHoverare not supported.side,align,sideOffsetandalignOffsetplace the popover; on collision it flips to the opposite side, butdata-sidekeeps the requested side. Focus is not moved into the popover, and the positioner's classes are not rendered. - Accepts
classinstead ofclassName. - Upstream documentation: shadcn/ui Popover. See also Differences from shadcn/ui.
API Reference
See the Base UI Popover documentation.