Drawer
화면 가장자리에서 슬라이드되어 나타나는 패널 컴포넌트
개요
Drawer 컴포넌트는 vaul 기반으로 화면의 상/하/좌/우 가장자리에서 슬라이드되어 나타나는 패널을 제공합니다. 모바일 환경의 바텀 시트나 사이드 패널 UI에 적합하며, 스와이프 제스처로 닫기를 지원합니다.
주요 특징
- ✅ 4방향 지원: top, bottom, left, right 방향으로 열기
- ✅ 스와이프 닫기: 드래그 제스처로 자연스럽게 닫기
- ✅ 구조화된 레이아웃: DrawerHeader, DrawerFooter 제공
- ✅ 닫기 버튼: showCloseButton으로 우측 상단 닫기 버튼 표시
- ✅ 오버레이: 배경 딤 처리와 블러 효과
- ✅ 디자인 토큰: 테마 커스터마이징 지원
사용 예시
기본 사용
기본적으로 화면 하단에서 올라오는 바텀 시트입니다.
Preview
방향 지정
direction으로 Drawer가 열리는 방향을 지정합니다.
Preview
닫기 버튼 표시
showCloseButton으로 우측 상단에 닫기 버튼을 표시합니다.
Preview
API Reference
Drawer Props
vaul의 Drawer.Root props를 상속합니다.
| Prop | Type | Default | Description |
|---|---|---|---|
direction | "top" | "bottom" | "left" | "right" | "bottom" | Drawer가 열리는 방향 |
open | boolean | - | 열림 상태 (제어 모드) |
onOpenChange | (open: boolean) => void | - | 열림 상태 변경 콜백 |
dismissible | boolean | true | 오버레이 클릭/스와이프로 닫기 |
modal | boolean | true | 모달 동작 여부 (배경 차단) |
DrawerContent Props
Portal과 Overlay를 포함하여 렌더링합니다.
| Prop | Type | Default | Description |
|---|---|---|---|
showCloseButton | boolean | false | 우측 상단 닫기 버튼 표시 |
className | string | - | 추가 CSS 클래스 |
DrawerTrigger / DrawerClose Props
| Prop | Type | Default | Description |
|---|---|---|---|
asChild | boolean | false | 자식 요소를 트리거로 사용 |
기본 사용법
import {
Drawer,
DrawerTrigger,
DrawerContent,
DrawerHeader,
DrawerFooter,
DrawerTitle,
DrawerDescription,
DrawerClose,
} from "@vortex/ui-foundation"
<Drawer>
<DrawerTrigger asChild>
<Button variant="outline">열기</Button>
</DrawerTrigger>
<DrawerContent>
<DrawerHeader>
<DrawerTitle>제목</DrawerTitle>
<DrawerDescription>설명</DrawerDescription>
</DrawerHeader>
<div className="p-4">본문 콘텐츠</div>
<DrawerFooter>
<DrawerClose asChild>
<Button variant="outline">닫기</Button>
</DrawerClose>
</DrawerFooter>
</DrawerContent>
</Drawer>접근성
시맨틱 마크업
- vaul 기반으로
role="dialog"자동 적용 - DrawerTitle이
aria-labelledby, DrawerDescription이aria-describedby로 자동 연결 - 열린 동안 배경 콘텐츠가 보조 기술에서 숨김 처리
키보드 및 제스처
- ✅
Esc로 Drawer 닫기 - ✅ 포커스 트랩:
Tab순환이 Drawer 내부로 제한 - ✅ 스와이프(드래그) 제스처로 닫기 지원
- ⚠️
DrawerDescription을 생략할 경우aria-describedby={undefined}를 명시해야 경고가 발생하지 않습니다
관련 컴포넌트
- Dialog: 화면 중앙에 표시되는 모달 대화 상자
- Modal: bottomsheet 타입을 포함한 모달 컴포넌트
- DropdownMenu: 트리거 기반 간단 메뉴
Last updated on