# Accordion URL: /lynx/components/accordion Source: https://github.com/daangn/seed-design/blob/dev/docs/content/lynx/components/accordion.mdx 관련된 정보 섹션을 접고 펼쳐 화면을 간결하게 구성하는 컴포넌트입니다. Lynx Engine 최소 버전: 3.6 사용 가능 버전: @seed-design/lynx-react@0.5.0, @seed-design/lynx-css@0.9.0 ## Preview ```tsx import "./styles"; import { Box, Text } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { return ( 첫 번째 항목의 내용입니다. 두 번째 항목의 내용입니다. 세 번째 항목의 내용입니다. ); } ``` ## Installation - npm: npx @seed-design/cli@latest add ui:accordion - pnpm: pnpm dlx @seed-design/cli@latest add ui:accordion - yarn: yarn dlx @seed-design/cli@latest add ui:accordion - bun: bun x @seed-design/cli@latest add ui:accordion ## Props ### `Accordion` ### `AccordionItem` ### `AccordionTrigger` ### `AccordionContent` 고유 prop이 없습니다. `className`, `style`, `children`을 받습니다. ## Examples ### Inline Variant 기본 `inline` variant는 항목 사이에 구분선을 표시합니다. ```tsx import "./styles"; import { Box, Text } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { return ( 첫 번째 항목의 내용입니다. 두 번째 항목의 내용입니다. 세 번째 항목의 내용입니다. ); } ``` ### Separated `variant="separated"`를 사용하면 각 항목이 분리된 카드로 표시됩니다. ```tsx import "./styles"; import { Box, Text } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { return ( 첫 번째 항목의 내용입니다. 두 번째 항목의 내용입니다. 세 번째 항목의 내용입니다. ); } ``` ### Multiple 기본적으로 한 항목만 펼칠 수 있습니다. `multiple`을 사용하면 여러 항목을 함께 펼칠 수 있습니다. ```tsx import "./styles"; import { Box, Text } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { return ( 여러 항목을 동시에 펼칠 수 있습니다. 각 항목은 다른 항목과 독립적으로 열고 닫힙니다. 세 번째 항목의 내용입니다. ); } ``` ### Always one open 빈 배열은 무시하도록 `onValuesChange`를 처리하면 항상 한 항목을 열어 둘 수 있습니다. ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { Box, Text } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { const [values, setValues] = useState(["item-1"]); function handleValuesChange(nextValues: string[]) { "background only"; if (nextValues.length === 0) return; setValues(nextValues); } return ( 현재 항목은 다시 눌러도 닫히지 않고, 다른 항목을 선택할 때만 전환됩니다. 평일 오후 2시 이전 주문은 당일 출고되며, 주말 주문은 다음 영업일에 출고됩니다. 수령 후 7일 이내에 교환 또는 반품을 요청할 수 있습니다. ); } ``` ### Size Lynx에서는 `medium`과 `large`를 지원하며 기본값은 `medium`입니다. ```tsx import "./styles"; import { Box, Text, VStack } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { return ( 항목의 내용입니다. 항목의 내용입니다. ); } ``` ### Prefix `prefix`에 아이콘 같은 앞쪽 요소를 전달할 수 있습니다. ```tsx import "./styles"; import IconCardLine from "@karrotmarket/lynx-monochrome-icon/IconCardLine"; import IconQuestionmarkCircleLine from "@karrotmarket/lynx-monochrome-icon/IconQuestionmarkCircleLine"; import IconTruckLine from "@karrotmarket/lynx-monochrome-icon/IconTruckLine"; import { Box, Icon, Text } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { return ( } size="full" />} title="배송 방법" /> 일반 배송, 빠른 배송, 방문 수령 중 주문 상황에 맞는 방법을 선택할 수 있습니다. } size="full" />} title="결제 및 쿠폰" /> 카드, 간편결제, 보유 쿠폰을 한 번에 확인하고 결제에 적용할 수 있습니다. } size="full" />} title="문의와 환불" /> 주문 취소 가능 시간, 환불 소요 기간, 고객센터 문의 방법을 확인할 수 있습니다. ); } ``` ### Description `description`으로 트리거에 설명을 추가할 수 있습니다. ```tsx import "./styles"; import { Box, Text } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { return ( 첫 번째 항목의 내용입니다. 두 번째 항목의 내용입니다. 세 번째 항목의 내용입니다. ); } ``` ### Disabled 전체를 비활성화하려면 `Accordion`, 한 항목만 비활성화하려면 `AccordionItem`에 `disabled`를 설정합니다. ```tsx import "./styles"; import { Box, Text } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { return ( 이 항목은 활성화 상태입니다. 이 항목은 비활성화 상태입니다. 이 항목은 활성화 상태입니다. ); } ``` ### Controlled `values`와 `onValuesChange`로 열림 상태를 제어할 수 있습니다. ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { Box, Text } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { const [values, setValues] = useState(["item-1"]); function handleValuesChange(nextValues: string[]) { "background only"; setValues(nextValues); } return ( 첫 번째 항목의 내용입니다. 두 번째 항목의 내용입니다. 세 번째 항목의 내용입니다. ); } ``` ### Value Array Changes 트리거를 누르면 현재 `values`와 최근 `onValuesChange` 값을 표시합니다. ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { Box, Text, VStack } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; const DEFAULT_VALUES = ["shipping"]; export default function Example() { const [values, setValues] = useState(DEFAULT_VALUES); const [history, setHistory] = useState([DEFAULT_VALUES]); function handleValuesChange(nextValues: string[]) { "background only"; setValues(nextValues); setHistory((previous) => [nextValues, ...previous].slice(0, 5)); } return ( 빠른 배송, 새벽 배송, 방문 수령 옵션을 비교할 수 있습니다. 카드, 계좌이체, 간편결제 중에서 원하는 결제 수단을 선택할 수 있습니다. 주문 취소 가능 시간과 환불 소요 기간을 확인할 수 있습니다. values: {JSON.stringify(values)} onValuesChange history: {history.map((snapshot, index) => ( {index + 1}. {JSON.stringify(snapshot)} ))} ); } ``` ### Default Expanded `defaultValues`로 처음 펼칠 항목을 지정할 수 있습니다. ```tsx import "./styles"; import { Box, Text } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { return ( 첫 번째 항목은 기본으로 펼쳐진 상태입니다. 두 번째 항목의 내용입니다. 세 번째 항목의 내용입니다. ); } ``` ### Custom Content `AccordionContent`는 콘텐츠 스타일을 제공하지 않습니다. 내부 콘텐츠에 패딩, 배경, 타이포그래피를 지정합니다. ```tsx import "./styles"; import { Box, Text, VStack } from "@seed-design/lynx-react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; export default function Example() { return ( 일반 배송 주문 후 영업일 기준 2-3일 내에 배송됩니다. 제주 및 도서산간 지역은 1-2일이 추가 소요될 수 있습니다. 1. 고객센터로 반품/교환 요청 2. 상품 수거 (택배 방문 수거) 3. 검수 후 환불 또는 교환 처리 ); } ``` ## Web Version Differences Lynx `Accordion`은 네이티브 탭 이벤트와 접근성 속성을 사용합니다. `AccordionTrigger`의 `title`이 문자열이 아니면 `accessibility-label`을 직접 지정합니다. ## Unsupported Lynx Features | 기능 | 설명 | | ----------------------- | --------------------------------------------------------------- | | `asChild` | `asChild` 기반 요소 교체를 지원하지 않습니다. | | `headingLevel` | heading level을 지정할 수 없습니다. | | DOM ARIA 연결 | `aria-controls`, `aria-labelledby`, `role="region"`을 지원하지 않습니다. | | Arrow / Home / End 키 탐색 | 웹과 같은 키보드 포커스 이동을 지원하지 않습니다. | | `size="responsive"` | `medium` 또는 `large`를 사용합니다. |