Popover
A popup for displaying content.
popover-demo.tsx
import { CopyIcon, Share2Icon } from "lucide-react"
import { toast } from "sonner"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import {
Popover,
PopoverContent,
PopoverDescription,
PopoverHeader,
PopoverTitle,
PopoverTrigger,
} from "@/components/ui/popover"
export function PopoverDemo() {
const copyToClipboard = () => {
toast.success("Copied to clipboard")
navigator.clipboard.writeText(window.location.href)
}
return (
<Popover>
<PopoverTrigger
render={(props) => (
<Button {...props} variant="outline" size="icon">
<Share2Icon />
</Button>
)}
/>
<PopoverContent className="w-[calc(100vw-4rem)] sm:w-[500px]">
<PopoverHeader>
<PopoverTitle>Share</PopoverTitle>
<PopoverDescription>Share this component.</PopoverDescription>
</PopoverHeader>
<div className="mt-2 flex w-full gap-2">
<Input
inputWrapperClassName="w-full"
defaultValue={window.location.href}
autoFocus={false}
readOnly
/>
<Button className="shrink-0" size="icon" onClick={copyToClipboard}>
<CopyIcon />
</Button>
</div>
</PopoverContent>
</Popover>
)
}
Installation
npx shadcn@latest add https://9ui.dev/r/popover.json
Usage
Imports
import {
Popover,
PopoverClose,
PopoverContent,
PopoverDescription,
PopoverFooter,
PopoverHeader,
PopoverTitle,
PopoverTrigger,
} from "@/components/ui/popover"
Anatomy
<Popover>
<PopoverTrigger />
<PopoverContent>
<PopoverHeader>
<PopoverTitle />
<PopoverDescription />
</PopoverHeader>
<PopoverFooter>
<PopoverClose />
</PopoverFooter>
</PopoverContent>
</Popover>