Accordion
Accordion은 접을 수 있는 콘텐츠 패널을 제공하여 정보를 깔끔하게 표시하는 컴포넌트입니다.
- 접근성이 고려된 아코디언 인터페이스를 제공합니다
- 단일 패널 또는 다중 패널 표시를 지원합니다
- 부드러운 확장/축소 애니메이션을 포함합니다
Installation
npx @jongh/cli add accordionUsage
Accordion 컴포넌트는 Radix UI의 Accordion 컴포넌트를 기반으로 구현되었으며, 여러 하위 컴포넌트로 구성됩니다.
컴포넌트 구조
Accordion.Root: 아코디언의 모든 파트를 감싸는 컨테이너입니다.Accordion.Item: 각각의 아코디언 항목을 나타냅니다.Accordion.Header: 아코디언 항목의 헤더 영역입니다.Accordion.Trigger: 아코디언 항목을 펼치거나 접는 버튼입니다.Accordion.Content: 아코디언 항목이 펼쳐졌을 때 표시되는 내용입니다.
주요 Props
Accordion.Root
| Prop | Type | Description |
|---|---|---|
type | "single" | "multiple" | 한 번에 하나만 열릴지('single') 또는 여러 개가 열릴 수 있는지('multiple') 지정합니다. |
collapsible | boolean | type='single' 일 때, 선택된 항목을 다시 클릭하여 접을 수 있는지 여부를 지정합니다. |
defaultValue | string | string[] | 초기에 열려 있는 항목의 값입니다. |
value | string | string[] | 현재 열려 있는 항목의 값입니다 (제어 모드). |
onValueChange | (value: string | string[]) => void | 열린 항목이 변경될 때 호출되는 함수입니다 (제어 모드). |
Accordion.Item
| Prop | Type | Description |
|---|---|---|
value* | string | 이 아코디언 항목과 연결된 고유한 값입니다. |
CSS 클래스 적용
각 컴포넌트는 className 속성을 통해 스타일을 커스터마이징할 수 있습니다.
Example
import * as Accordion from "@/components/accordion"
import { css } from "@styled-system/css"
import { ChevronDown } from "lucide-react"
// 기본 사용 예시 (단일 패널 모드)
<Accordion.Root type="single" collapsible>
<Accordion.Item value="item-1">
<Accordion.Header>
<Accordion.Trigger>
아코디언 제목 1
<ChevronDown />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Content>
아코디언 내용 1. 이 영역은 아코디언 항목이 펼쳐졌을 때만 표시됩니다.
</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-2">
<Accordion.Header>
<Accordion.Trigger>
아코디언 제목 2
<ChevronDown />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Content>
아코디언 내용 2. 이 영역은 아코디언 항목이 펼쳐졌을 때만 표시됩니다.
</Accordion.Content>
</Accordion.Item>
</Accordion.Root>
// 다중 패널 모드 예시
<Accordion.Root type="multiple" defaultValue={["item-1"]}>
<Accordion.Item value="item-1">
<Accordion.Header>
<Accordion.Trigger>
아코디언 제목 1
<ChevronDown />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Content>
아코디언 내용 1. 여러 패널이 동시에 열릴 수 있습니다.
</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-2">
<Accordion.Header>
<Accordion.Trigger>
아코디언 제목 2
<ChevronDown />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Content>
아코디언 내용 2. 여러 패널이 동시에 열릴 수 있습니다.
</Accordion.Content>
</Accordion.Item>
</Accordion.Root>
// 스타일 커스터마이징 예시
<Accordion.Root
type="single"
collapsible
className={css({
maxW: "600px",
border: "base",
borderRadius: "md",
overflow: "hidden"
})}
>
<Accordion.Item value="item-1">
<Accordion.Header>
<Accordion.Trigger
className={css({
bg: "muted",
color: "primary",
fontWeight: "bold",
px: "4"
})}
>
커스텀 아코디언 제목
<ChevronDown />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Content
className={css({
p: "4",
bg: "card",
color: "card.foreground"
})}
>
커스텀 스타일이 적용된 아코디언 내용입니다.
</Accordion.Content>
</Accordion.Item>
</Accordion.Root>