Component
Sheet
화면 가장자리에서 보조 작업이나 정보를 표시합니다.
Playground
옵션을 조절하며 화면과 사용 코드를 함께 확인하세요.
PC 1280px
Controls
헤더·본문·푸터의 기본 여백
닫기 버튼의 접근 가능한 이름입니다.
PC 방향입니다. 모바일에서는 전체 화면 하단 Sheet로 열립니다.
필수 접근 가능한 제목
닫기 버튼 표시
backOptions.show에 전달하는 예제용 값입니다.
긴 설정 목록으로 본문 스크롤을 확인합니다.
backOptions.label에 전달하는 접근명·왼쪽 xs 툴팁입니다.
Code
import { type SheetSide, Sheet, SheetTrigger, Button, SheetContent, SheetBody, Input, SheetFooter, SheetClose } from '@amineslab/ui'
import { useState } from 'react'
function SheetExample({ side, padding, title, closeLabel, showClose, showBack, backLabel, richContent, }: {
side: SheetSide;
padding: 'none' | 'md';
title: string;
closeLabel: string;
showClose: boolean;
showBack: boolean;
backLabel: string;
richContent: boolean;
}) {
const [detail, setDetail] = useState(true);
return (<Sheet>
<SheetTrigger asChild>
<Button variant="outline" onClick={() => setDetail(true)}>
패널 열기
</Button>
</SheetTrigger>
<SheetContent side={side} padding={padding} title={detail ? title || '빠른 설정' : '설정'} closeLabel={closeLabel} showClose={showClose} backOptions={{
show: showBack && detail,
onClick: () => setDetail(false),
label: backLabel,
}}>
<SheetBody>
{detail ? (<div className="grid gap-4">
<p className="m-0 text-body-2 text-text-secondary">
모바일에서는 전체 화면 하단 Sheet로 열립니다. 이전 버튼은 설정 목록으로 돌아갑니다.
</p>
{richContent &&
Array.from({ length: 24 }, (_, index) => (<section key={index} className="grid gap-3 rounded-lg border border-elevation-700 p-4">
<h3 className="m-0 text-title-3">알림 설정 {index + 1}</h3>
<Input aria-label={`알림 ${index + 1} 이름`} placeholder="알림 이름"/>
</section>))}
</div>) : (<Button variant="outline" onClick={() => setDetail(true)}>
빠른 설정으로 이동
</Button>)}
</SheetBody>
<SheetFooter>
<SheetClose asChild>
<Button>완료</Button>
</SheetClose>
</SheetFooter>
</SheetContent>
</Sheet>);
}
export default function ExamplePreview() {
return ((<SheetExample padding={"md"} closeLabel={"닫기"} title={"빠른 설정"} showClose={true} showBack={true} backLabel={"이전으로"} richContent={false} side={"right"}/>))
}Props
import {
Sheet,
SheetTrigger,
SheetContent,
SheetHeader,
SheetBody,
SheetFooter,
SheetClose,
// ...
} from '@amineslab/ui'Sheet
| Name | Type | Default | Description |
|---|---|---|---|
SheetContent.backOptions | { show?: boolean; onClick: () => void; label: string } | - | 이전 버튼 설정입니다. 객체를 전달하면 표시하며 show: false이면 숨깁니다. 클릭 시 onClick만 실행합니다. label은 접근명과 xs·left 고정 텍스트 툴팁입니다. |
SheetContent.title | ReactNode | - | 접근 가능한 제목을 만드는 단축 prop입니다. |
SheetContent.description | ReactNode | - | 접근 가능한 설명을 만드는 단축 prop입니다. |
SheetContent.side | 'top' | 'left' | 'right' | 'bottom' | 'right' | PC에서 열리는 방향입니다. 모바일에서는 항상 bottom입니다. |
SheetContent.padding | 'none' | 'md' | 'md' | Header·Body·Footer의 기본 여백입니다. none이면 모두 없앱니다. |
SheetContent.closeIcon | ReactNode | - | 닫기 버튼에 표시할 선택적 아이콘입니다. |
SheetContent.closeLabel | string | '닫기' | 닫기 버튼의 접근 가능한 이름입니다. |
SheetContent.showClose | boolean | true | 닫기 버튼 표시 여부입니다. |
Examples
자주 쓰는 조합을 살펴보고, 필요한 예시의 코드를 펼쳐 확인하세요.
Bottom sheet
import { Sheet, SheetTrigger, Button, SheetContent } from '@amineslab/ui'
export default function ExamplePreview() {
return ((<Sheet>
<SheetTrigger asChild>
<Button variant="outline">필터</Button>
</SheetTrigger>
<SheetContent side="bottom" title="필터">
<p>모바일 필터 패널</p>
</SheetContent>
</Sheet>))
}사용 기준
권장하는 사용
- PC에서는 side 방향으로 열리고, 768px 미만에서는 항상 전체 화면 높이의 하단 Sheet로 열립니다.
- Header와 Footer는 고정되고 SheetBody만 스크롤합니다.
- backOptions.onClick은 이전 단계로 이동하는 콜백입니다. 패널을 자동으로 닫지 않습니다.
피해야 할 사용
- 겉모양만으로 사용을 결정하지 마세요.
- 의미와 키보드 동작, 모바일에서의 흐름을 함께 확인하세요.
접근성
화면에 맞는 이름을 제공하고, 키보드만으로 작업을 마칠 수 있는지 확인하세요.
Tab: sheet 안에서 포커스 이동Escape: 닫고 trigger로 포커스 복귀