"use client"; import { useId, useState, type ReactNode } from "react"; import { cx } from "../../utils"; /** `box`는 색을 깐 상자, `line`은 위쪽 선 하나로 나뉘는 목록형이다. */ export type FoxAccordionType = "box" | "line"; export type FoxAccordionSize = "lg" | "md"; export interface FoxAccordionProps { title: ReactNode; children?: ReactNode; type?: FoxAccordionType; size?: FoxAccordionSize; /** 제목 앞자리. 시안은 배지 묶음이다. */ badge?: ReactNode; /** 주면 호출부가 열림을 소유한다. 없으면 컴포넌트가 스스로 여닫는다. */ open?: boolean; defaultOpen?: boolean; onOpenChange?: (open: boolean) => void; /** 참이면 렌더하지 않는다(DOM에 남지 않는다). */ hidden?: boolean; /** 배치 조정용. */ className?: string; } /** * @fox 아코디언. 제목을 누르면 아래 내용이 열린다. * * 열림을 밖에서 쥐면 여러 개 중 하나만 열리게 하는 것도 호출부가 정할 수 있다. 넘기지 * 않으면 스스로 여닫는다. * * ⚠️ 스타일은 이 파일이 import하지 않는다 — 호스트 앱이 `@use "@fox/styles/components"` * (또는 개별 파티셜)로 한 번 불러와야 한다. */ export function FoxAccordion({ title, children, type = "box", size = "lg", badge, open, defaultOpen = false, onOpenChange, hidden = false, className, }: FoxAccordionProps) { const autoId = useId(); const [inner, setInner] = useState(defaultOpen); if (hidden) { return null; } const expanded = open ?? inner; const panelId = `${autoId}-panel`; const toggle = () => { if (open === undefined) { setInner(!expanded); } onOpenChange?.(!expanded); }; return (