Popoverstandard
트리거(trigger)를 누르면 그 옆에 떠서 제목·설명·입력 같은 짧은 내용을 보여 주는 팝오버(popover)입니다. shadcn base-nova 의 stock 아이템이며 Base UI `Popover` 위에 서 있습니다. 모달이 필요한 긴 작업에는 `dialog`, 마우스를 올렸을 때만 보이는 짧은 글에는 `hover-card` 나 `tooltip` 을 씁니다.
설치
pnpm
pnpm dlx shadcn@4.23.0 add @uikit/popoverDefault
popover-example.tsx
import { Example, ExampleWrapper,} from "@/components/example"import { Button } from "@/components/ui/button"import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger,} from "@/components/ui/dialog"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 PopoverExample() { return ( <ExampleWrapper> <PopoverBasic /> <PopoverSides /> <PopoverWithForm /> <PopoverAlignments /> <PopoverInDialog /> </ExampleWrapper> )}
function PopoverBasic() { return ( <Example title="Basic"> <Popover> <PopoverTrigger render={<Button variant="outline" className="w-fit" />}> Open Popover </PopoverTrigger> <PopoverContent align="start"> <PopoverHeader> <PopoverTitle>Dimensions</PopoverTitle> <PopoverDescription> Set the dimensions for the layer. </PopoverDescription> </PopoverHeader> </PopoverContent> </Popover> </Example> )}
function PopoverSides() { return ( <Example title="Sides"> <div className="flex flex-col gap-2"> <div className="flex flex-wrap gap-2"> {(["inline-start", "left", "top"] as const).map((side) => ( <Popover key={side}> <PopoverTrigger render={ <Button variant="outline" className="w-fit capitalize" /> } > {side.replace("-", " ")} </PopoverTrigger> <PopoverContent side={side} className="w-40"> <p>Popover on {side.replace("-", " ")}</p> </PopoverContent> </Popover> ))} </div> <div className="flex flex-wrap gap-2"> {(["bottom", "right", "inline-end"] as const).map((side) => ( <Popover key={side}> <PopoverTrigger render={ <Button variant="outline" className="w-fit capitalize" /> } > {side.replace("-", " ")} </PopoverTrigger> <PopoverContent side={side} className="w-40"> <p>Popover on {side.replace("-", " ")}</p> </PopoverContent> </Popover> ))} </div> </div> </Example> )}
function PopoverWithForm() { return ( <Example title="With Form"> <Popover> <PopoverTrigger render={<Button variant="outline" />}> Open Popover </PopoverTrigger> <PopoverContent className="w-64" align="start"> <PopoverHeader> <PopoverTitle>Dimensions</PopoverTitle> <PopoverDescription> Set the dimensions for the layer. </PopoverDescription> </PopoverHeader> <FieldGroup className="gap-4"> <Field orientation="horizontal"> <FieldLabel htmlFor="width" className="w-1/2"> Width </FieldLabel> <Input id="width" defaultValue="100%" /> </Field> <Field orientation="horizontal"> <FieldLabel htmlFor="height" className="w-1/2"> Height </FieldLabel> <Input id="height" defaultValue="25px" /> </Field> </FieldGroup> </PopoverContent> </Popover> </Example> )}
function PopoverAlignments() { return ( <Example title="Alignments"> <div className="flex gap-6"> <Popover> <PopoverTrigger render={<Button variant="outline" size="sm" />}> Start </PopoverTrigger> <PopoverContent align="start" className="w-40"> Aligned to start </PopoverContent> </Popover> <Popover> <PopoverTrigger render={<Button variant="outline" size="sm" />}> Center </PopoverTrigger> <PopoverContent align="center" className="w-40"> Aligned to center </PopoverContent> </Popover> <Popover> <PopoverTrigger render={<Button variant="outline" size="sm" />}> End </PopoverTrigger> <PopoverContent align="end" className="w-40"> Aligned to end </PopoverContent> </Popover> </div> </Example> )}
function PopoverInDialog() { return ( <Example title="In Dialog"> <Dialog> <DialogTrigger render={<Button variant="outline" />}> Open Dialog </DialogTrigger> <DialogContent> <DialogHeader> <DialogTitle>Popover Example</DialogTitle> <DialogDescription> Click the button below to see the popover. </DialogDescription> </DialogHeader> <Popover> <PopoverTrigger render={<Button variant="outline" className="w-fit" />} > Open Popover </PopoverTrigger> <PopoverContent align="start"> <PopoverHeader> <PopoverTitle>Popover in Dialog</PopoverTitle> <PopoverDescription> This popover appears inside a dialog. Click the button to open it. </PopoverDescription> </PopoverHeader> </PopoverContent> </Popover> </DialogContent> </Dialog> </Example> )}