PopoverDemo
import { Button } from '@/components/ui/button'
import {
Popover,
PopoverContent,
PopoverDescription,
PopoverHeader,
PopoverTitle,
PopoverTrigger,
} from '@/components/ui/popover'
export function PopoverDemo() {
return (
<div className='flex flex-wrap items-center gap-4'>
<Popover>
<PopoverTrigger asChild>
<Button size='sm' variant='outline'>
Open Popover
</Button>
</PopoverTrigger>
<PopoverContent align='start'>
<PopoverHeader>
<PopoverTitle>Notifications</PopoverTitle>
<PopoverDescription>Manage how you receive activity updates.</PopoverDescription>
</PopoverHeader>
</PopoverContent>
</Popover>
</div>
)
}
Installation
- Install the following dependencies
pnpm add @radix-ui/react-popover- Copy and paste the following code into your project
src/components/ui/popover.tsx
'use client'
import * as React from 'react'
import * as PopoverPrimitive from '@radix-ui/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 PopoverAnchor({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {
return <PopoverPrimitive.Anchor data-slot='popover-anchor' {...props} />
}
function PopoverContent({
className,
align = 'center',
sideOffset = 4,
...props
}: React.ComponentProps<typeof PopoverPrimitive.Content>) {
return (
<PopoverPrimitive.Portal>
<PopoverPrimitive.Content
data-slot='popover-content'
align={align}
sideOffset={sideOffset}
className={cn(
'z-50 flex w-72 origin-(--radix-popover-content-transform-origin) flex-col gap-3 rounded-2xl bg-surface-container-high p-3 text-on-surface shadow-elevation-3 ring-1 ring-outline-variant outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95',
className,
)}
{...props}
/>
</PopoverPrimitive.Portal>
)
}
function PopoverHeader({ className, ...props }: React.ComponentProps<'div'>) {
return <div data-slot='popover-header' className={cn('flex flex-col gap-1', className)} {...props} />
}
function PopoverTitle({ className, ...props }: React.ComponentProps<'h2'>) {
return <h2 data-slot='popover-title' className={cn('font-medium text-on-surface', className)} {...props} />
}
function PopoverDescription({ className, ...props }: React.ComponentProps<'p'>) {
return <p data-slot='popover-description' className={cn('text-on-surface-variant', className)} {...props} />
}
export { Popover, PopoverAnchor, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger }
Usage
import {
Popover,
PopoverContent,
PopoverDescription,
PopoverHeader,
PopoverTitle,
PopoverTrigger,
} from '@/components/ui/popover'<Popover>
<PopoverTrigger>Open</PopoverTrigger>
<PopoverContent>
<PopoverHeader>
<PopoverTitle>Notifications</PopoverTitle>
<PopoverDescription>Manage how you receive activity updates.</PopoverDescription>
</PopoverHeader>
</PopoverContent>
</Popover>API Reference
Popover
| Prop | type | default |
|---|---|---|
| open | boolean | |
| defaultOpen | boolean | |
| onOpenChange | function | |
| modal | boolean | false |
PopoverTrigger
| Prop | type | default |
|---|---|---|
| asChild | boolean | false |
PopoverContent
| Prop | type | default |
|---|---|---|
| onOpenAutoFocus | function | |
| onCloseAutoFocus | function | |
| onEscapeKeyDown | function | |
| onPointerDownOutside | function | |
| onFocusOutside | function | |
| onInteractOutside | function | |
| forceMount | boolean | |
| side | top | right | bottom | left | bottom |
| sideOffset | number | 4 |
| align | start | center | end | center |
| alignOffset | number | 0 |
| avoidCollisions | boolean | true |
| collisionBoundary | element | element[] | |
| collisionPadding | number | padding | 0 |
| arrowPadding | number | 0 |
| sticky | partial | always | partial |
| hideWhenDetached | boolean | false |
PopoverAnchor
| Prop | type | default |
|---|---|---|
| asChild | boolean | false |
PopoverHeader
| Prop | type | default |
|---|---|---|
| - | - | - |
PopoverTitle
| Prop | type | default |
|---|---|---|
| - | - | - |
PopoverDescription
| Prop | type | default |
|---|---|---|
| - | - | - |