Popover
Popover는 트리거 요소를 클릭하면 나타나는 플로팅 패널입니다. 폼 입력, 설정 패널, 리치 콘텐츠 표시 등 인터랙티브한 요소를 포함하는 오버레이에 적합합니다.
Playground
<Popover>
<Popover.Trigger asChild>
<Button variant="outline">Open Popover</Button>
</Popover.Trigger>
<Popover.Content>
<div className="space-y-2">
<h4 className="font-semibold text-foreground">Settings</h4>
<p className="text-sm text-text-muted">
Configure your preferences here.
</p>
</div>
</Popover.Content>
</Popover>Variants
Sizes
smdefaultlg| Size | 폰트 | 패딩 | Radius | 미리보기 |
|---|---|---|---|---|
sm | 13px (text-sm) | 12px | 8px (rounded-lg) | |
default | 13px (text-sm) | 16px | 12px (rounded-xl) | |
lg | 14px (text-md) | 20px | 12px (rounded-xl) |
Features
Side Placement
4방향(top, right, bottom, left)을 지원합니다. 기본값은bottom입니다.
<Popover.Content side="top">Top</Popover.Content>
<Popover.Content side="right">Right</Popover.Content>
<Popover.Content side="bottom">Bottom</Popover.Content>
<Popover.Content side="left">Left</Popover.Content>Arrow
showArrow로 트리거를 가리키는 화살표 표시를 제어합니다. 기본값은 표시입니다.
{/* With arrow (default) */}
<Popover.Content>With arrow</Popover.Content>
{/* Without arrow */}
<Popover.Content showArrow={false}>No arrow</Popover.Content>Alignment
align으로 트리거 기준 배치를 조정합니다.
<Popover.Content align="start">Start</Popover.Content>
<Popover.Content align="center">Center</Popover.Content>
<Popover.Content align="end">End</Popover.Content>Modal Mode
modal를 활성화하면 배경 조작이 비활성화됩니다. 포커스 트랩도 자동으로 적용됩니다.
<Popover modal>
<Popover.Trigger asChild>
<Button>Modal Popover</Button>
</Popover.Trigger>
<Popover.Content showClose>
Background interaction is blocked
</Popover.Content>
</Popover>API
Component Structure
Popover— Radix Popover.Trigger클릭 대상.ContentProps팝오버 본체(variant, size, side, arrow, close).Arrow화살표 인디케이터(Content 내장).Close닫기 버튼(Content 내장 또는 수동 배치).Anchor커스텀 앵커 포인트.Portal포털(Content 내장)Props
Popover (Root)
openundefinedboolean팝오버 표시 상태(제어 모드)
defaultOpenfalseboolean초기 표시 상태(비제어 모드)
onOpenChangeundefined(open: boolean) => void표시 상태 변경 시 콜백
modalfalseboolean배경 조작을 비활성화하고 포커스 트랩을 적용합니다
| Name | Type | Default | Description |
|---|---|---|---|
open | boolean | undefined | 팝오버 표시 상태(제어 모드) |
defaultOpen | boolean | false | 초기 표시 상태(비제어 모드) |
onOpenChange | (open: boolean) => void | undefined | 표시 상태 변경 시 콜백 |
modal | boolean | false | 배경 조작을 비활성화하고 포커스 트랩을 적용합니다 |
Popover.Content
variant"default""default" | "elevated"외관 variant(default: 페이퍼 배경+보더+그림자, elevated: 글래스모피즘)
size"default""sm" | "default" | "lg"텍스트 크기 및 패딩
side"bottom""top" | "right" | "bottom" | "left"표시 위치
sideOffsetauto (12 with arrow, 6 without)number트리거와의 거리(기본값: 화살표 있음 12px, 없음 6px)
align"center""start" | "center" | "end"트리거 기준 정렬
showArrowtrueboolean화살표 표시
showClosefalseboolean내장 닫기 버튼 표시
closeIconundefinedReactNode닫기 버튼 커스텀 아이콘
| Name | Type | Default | Description |
|---|---|---|---|
variant | "default" | "elevated" | "default" | 외관 variant(default: 페이퍼 배경+보더+그림자, elevated: 글래스모피즘) |
size | "sm" | "default" | "lg" | "default" | 텍스트 크기 및 패딩 |
side | "top" | "right" | "bottom" | "left" | "bottom" | 표시 위치 |
sideOffset | number | auto (12 with arrow, 6 without) | 트리거와의 거리(기본값: 화살표 있음 12px, 없음 6px) |
align | "start" | "center" | "end" | "center" | 트리거 기준 정렬 |
showArrow | boolean | true | 화살표 표시 |
showClose | boolean | false | 내장 닫기 버튼 표시 |
closeIcon | ReactNode | undefined | 닫기 버튼 커스텀 아이콘 |
Anatomy
Best Practices
권장
- ✓인라인 편집이나 폼 입력에 Popover를 사용합니다
- ✓링크, 버튼 등 인터랙티브한 콘텐츠에 적합합니다
- ✓확인 다이얼로그의 경량 대체재로 사용합니다
- ✓닫기 버튼 또는 Popover.Close로 명확한 닫기 방법을 제공합니다
지양
- ✕단순 보충 정보에 Popover를 쓰지 않습니다. Tooltip을 사용하세요
- ✕대량의 콘텐츠를 Popover에 넣지 않습니다. Modal을 사용하세요
- ✕메뉴 목록에 Popover를 쓰지 않습니다. Dropdown을 사용하세요
- ✕중첩 Popover는 사용하지 않습니다. UX가 복잡해집니다
Popover vs Tooltip
비슷한 플로팅 UI이지만 용도와 인터랙션이 다릅니다.
트리거
Popover: 클릭
Tooltip: 호버, 포커스
콘텐츠
Popover: 리치(폼, 버튼, 링크)
Tooltip: 텍스트만(짧은 보충)
인터랙션
Popover: 있음(조작 가능)
Tooltip: 없음(읽기 전용)
기본 방향
Popover: bottom(자연스러운 위아래 흐름)
Tooltip: top(읽기 흐름 방해 최소화)
닫기
Popover: 외부 클릭, Esc, 닫기 버튼
Tooltip: 호버 해제 시 자동
ARIA
Popover: aria-expanded + aria-controls
Tooltip: role="tooltip"
| 특징 | Popover | Tooltip |
|---|---|---|
| 트리거 | 클릭 | 호버, 포커스 |
| 콘텐츠 | 리치(폼, 버튼, 링크) | 텍스트만(짧은 보충) |
| 인터랙션 | 있음(조작 가능) | 없음(읽기 전용) |
| 기본 방향 | bottom(자연스러운 위아래 흐름) | top(읽기 흐름 방해 최소화) |
| 닫기 | 외부 클릭, Esc, 닫기 버튼 | 호버 해제 시 자동 |
| ARIA | aria-expanded + aria-controls | role="tooltip" |
구분 포인트: 클릭으로 열리는 인터랙티브한 콘텐츠에는 Popover를 사용합니다. 단순 보충 텍스트라면 Tooltip을 사용하세요.
Accessibility
키보드 조작
ARIA / WCAG
aria-expanded트리거에 자동 부여aria-controls자동 연결- 자동 포커스 관리(열기/닫기 시)
- 자동 충돌 회피(화면 밖 방지)