본문으로 건너뛰기
컨테이너 / accordion

Accordion

collapsible disclosure 스택(single/multiple).
컨테이너accordionStatic specimenaccordion아코디언disclosurefaq
01 · Specimen

먼저 보고, 그다음 계약을 읽습니다

collapsible disclosure 스택(single/multiple).

Workbench 불러오는 중…
Component intent의도와 경계 읽기

Radix Accordion 위에 .axe-accordion__* 스타일을 얹은 접이식 항목 스택이다. type="single"(한 번에 하나) 과 type="multiple"(동시 여러 개) 을 모두 지원하며 FAQ, 설정 그룹, 긴 폼의 섹션 접기 등에 쓴다. 각 트리거는 heading 안 버튼으로 렌더되고 chevron 이 자동으로 붙는다. 부드러운 height 접기는 Radix 가 노출하는 --radix-accordion-content-height 변수를 @keyframes 로 잡아 처리한다(하나의 영역만 접는 경량 패턴은 Collapsible).

02 · Use

예제

SSOT에 등록된 실제 API 기준 snippet입니다. standalone 배지만 독립 실행 단위이며, fragment는 주변 state·handler 문맥을 생략합니다.

01single (FAQ)tsxfragment
single (FAQ)
import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from "@axe/ui";<Accordion type="single" collapsible defaultValue="faq-1">  <AccordionItem value="faq-1">    <AccordionTrigger>배포는 어떻게 하나요?</AccordionTrigger>    <AccordionContent>axe ship &lt;svc&gt; 로 합니다.</AccordionContent>  </AccordionItem>  <AccordionItem value="faq-2">    <AccordionTrigger>롤백은?</AccordionTrigger>    <AccordionContent>blue/green 전환으로…</AccordionContent>  </AccordionItem></Accordion>
02multipletsxfragment
multiple
import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from "@axe/ui";<Accordion type="multiple" defaultValue={["a", "c"]}>  <AccordionItem value="a"><AccordionTrigger>A</AccordionTrigger><AccordionContent>…</AccordionContent></AccordionItem>  <AccordionItem value="b"><AccordionTrigger>B</AccordionTrigger><AccordionContent>…</AccordionContent></AccordionItem>  <AccordionItem value="c"><AccordionTrigger>C</AccordionTrigger><AccordionContent>…</AccordionContent></AccordionItem></Accordion>
03CSS-only (정적 open 항목)htmlfragment
CSS-only (정적 open 항목)
<div class="axe-accordion__item">  <h3 class="axe-accordion__header">    <button class="axe-accordion__trigger" data-state="open" aria-expanded="true">      <span class="axe-accordion__trigger-label">배포는 어떻게 하나요?</span>      <svg class="axe-accordion__chevron" viewBox="0 0 12 12" aria-hidden="true">        <path d="M4 2.5 L8 6 L4 9.5" fill="none" stroke="currentColor" stroke-width="1.75" />      </svg>    </button>  </h3>  <div class="axe-accordion__content" data-state="open">    <div class="axe-accordion__content-inner">axe ship &lt;svc&gt; 로 합니다.</div>  </div></div>
03 · React

Props

TSX 소스가 진실입니다. 주요 export 컴포넌트의 public API만 노출합니다.

이름타입필수기본값설명
Accordion.type"single" | "multiple"필수single = 한 번에 하나만 열림, multiple = 동시 여러 개.
Accordion.collapsiblebooleantype="single" 에서 열린 항목을 다시 눌러 전부 닫기 허용.
Accordion.defaultValuestring | string[]uncontrolled 초기 열림 value(single=string, multiple=string[]).
Accordion.valuestring | string[]controlled 열림 value.
Accordion.onValueChange(value: string | string[]) => void열림 value 변경 콜백.
Accordion.…restReact.ComponentPropsWithoutRef<Radix Accordion.Root>Accordion 은 Radix Root 를 그대로 재노출(axe 클래스 없음) — className 등은 Root 로 직접 전파.
AccordionItem.valuestring필수항목 식별 value(열림 상태 매핑 키).
AccordionItem.…restReact.ComponentPropsWithoutRef<Radix Accordion.Item>className 은 axe-accordion__item 과 병합, 나머지는 Radix Item 으로 전파.
AccordionTrigger.…restReact.ComponentPropsWithoutRef<Radix Accordion.Trigger>children=제목/질문. .axe-accordion__header 안에 렌더되고 chevron 자동. 나머지는 Radix Trigger 로 전파.
AccordionContent.…restReact.ComponentPropsWithoutRef<Radix Accordion.Content>children 은 .axe-accordion__content-inner 로 감싸 렌더. 나머지는 Radix Content 로 전파.
04 · Any stack

.axe-* 클래스 계약

React 밖에서도 같은 표면을 그리는 공개 계약입니다. stable은 minor 버전 안에서 이름을 바꾸지 않습니다.

클래스안정성용도
.axe-accordion__itemstable각 항목 래퍼 — 하단 border-subtle(마지막 항목 제외).
.axe-accordion__headerstable트리거를 감싸는 heading 래퍼(margin 0, flex).
.axe-accordion__triggerstable트리거 버튼(전폭, label+chevron, hover/focus 트림).
.axe-accordion__trigger-labelstable트리거 라벨 span(flex:1).
.axe-accordion__chevronstablechevron SVG — [data-state=open] 시 90deg 회전.
.axe-accordion__contentstable접히는 영역(overflow hidden). data-state open/closed 에 --radix-accordion-content-height 애니메이션.
.axe-accordion__content-innerstablecontent 내부 padding 래퍼.
비-React 소비 노트
정적 open/closed 는 트리거·컨텐츠에 data-state="open|closed" 를 직접 부여하면 .axe-accordion__* 스타일로 재현된다(chevron 회전 포함). 단 부드러운 height 애니메이션은 Radix 가 --radix-accordion-content-height 를 런타임 측정해 주입하므로 CSS-only 로는 즉시 토글만. 화살표 키 네비도 JS(Radix) 몫이다.
05 · Inclusive

접근성

키보드, ARIA, 구현 노트를 함께 검토합니다.

Keyboard
  • ↑/↓ — 트리거 간 이동(roving tabindex)
  • Home/End — 첫/마지막 트리거로
  • Enter/Space — 항목 열기/접기
ARIA

각 트리거는 heading(.axe-accordion__header) 안 버튼으로, aria-expanded + aria-controls 를 가지며 컨텐츠는 연결된 region 이다. 화살표 네비/포커스 관리는 Radix 가 제공. chevron 은 aria-hidden 장식.

Notes

smooth height 는 --radix-accordion-content-height 를 @keyframes from/to 로 잡아 처리하고 prefers-reduced-motion 시 즉시 토글한다. Accordion 루트는 axe 클래스 없이 Radix Root 그대로(레이아웃 중립) — 컨테이너 스타일이 필요하면 className 을 직접 부여한다.

06 · Judgment

권장 · 지양

권장
  • AccordionItem.value 는 유일하게 — 열림 상태가 이 키로 매핑된다.
  • 한 번에 하나만 펼치는 게 자연스러우면 type="single" + collapsible.
지양
  • 단일 영역 하나만 접는 데 Accordion 을 쓰지 말 것(그건 Collapsible).
  • AccordionTrigger 안에 인터랙티브 요소(버튼/링크)를 중첩하지 말 것(포커스 충돌).
검색창을 열면 컴포넌트 인덱스를 불러옵니다.