'use client'; import React, { useState, createContext, useContext } from 'react'; import { Icon } from './Icon'; interface AccordionContextType { openItems: string[]; toggleItem: (id: string) => void; } const AccordionContext = createContext(null); export interface AccordionProps { multiple?: boolean; defaultOpen?: string[]; children: React.ReactNode; className?: string; } export const Accordion: React.FC = ({ multiple = false, defaultOpen = [], children, className = '', }) => { const [openItems, setOpenItems] = useState(defaultOpen); const toggleItem = (id: string) => { setOpenItems((prev) => { if (prev.includes(id)) { return prev.filter((item) => item !== id); } return multiple ? [...prev, id] : [id]; }); }; return (
{children}
); }; export const AccordionItem: React.FC<{ id: string; children: React.ReactNode; className?: string; }> = ({ id, children, className = '' }) => { const ctx = useContext(AccordionContext); if (!ctx) throw new Error('AccordionItem must be used inside Accordion'); const isOpen = ctx.openItems.includes(id); return (
{children}
); }; export const AccordionTrigger: React.FC<{ id: string; children: React.ReactNode; className?: string; }> = ({ id, children, className = '' }) => { const ctx = useContext(AccordionContext); if (!ctx) throw new Error('AccordionTrigger must be used inside Accordion'); const isOpen = ctx.openItems.includes(id); return ( ); }; export const AccordionContent: React.FC<{ id: string; children: React.ReactNode; className?: string; }> = ({ id, children, className = '' }) => { const ctx = useContext(AccordionContext); if (!ctx) throw new Error('AccordionContent must be used inside Accordion'); if (!ctx.openItems.includes(id)) return null; return (
{children}
); };