Design System
  • Home
  • Components
  • Tokens
  • Guidelines
  • Accordion

    Accordion은 접을 수 있는 콘텐츠 패널을 제공하여 정보를 깔끔하게 표시하는 컴포넌트입니다.

    • 접근성이 고려된 아코디언 인터페이스를 제공합니다
    • 단일 패널 또는 다중 패널 표시를 지원합니다
    • 부드러운 확장/축소 애니메이션을 포함합니다

    Installation

    npx @jongh/cli add accordion

    Usage

    Accordion 컴포넌트는 Radix UI의 Accordion 컴포넌트를 기반으로 구현되었으며, 여러 하위 컴포넌트로 구성됩니다.

    컴포넌트 구조

    • Accordion.Root: 아코디언의 모든 파트를 감싸는 컨테이너입니다.
    • Accordion.Item: 각각의 아코디언 항목을 나타냅니다.
    • Accordion.Header: 아코디언 항목의 헤더 영역입니다.
    • Accordion.Trigger: 아코디언 항목을 펼치거나 접는 버튼입니다.
    • Accordion.Content: 아코디언 항목이 펼쳐졌을 때 표시되는 내용입니다.

    주요 Props

    Accordion.Root

    • type ("single" | "multiple"): 한 번에 하나만 열릴지("single") 또는 여러 개가 열릴 수 있는지("multiple") 지정합니다.
    • collapsible (boolean): type="single" 일 때, 선택된 항목을 다시 클릭하여 접을 수 있는지 여부를 지정합니다.
    • defaultValue (string | string[]): 초기에 열려 있는 항목의 값입니다.
    • value (string | string[]): 현재 열려 있는 항목의 값입니다 (제어 모드).
    • onValueChange ((value: string | string[]) => void): 열린 항목이 변경될 때 호출되는 함수입니다 (제어 모드).

    Accordion.Item

    • 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>