import { createContext, useContext, useState, Children, cloneElement, ReactNode, ReactElement, } from 'react'; type TabsCtx = { active: number; setActive: (i: number) => void }; const Ctx = createContext<TabsCtx | null>(null); function useTabs(): TabsCtx { const ctx = useContext(Ctx); if (!ctx) throw new Error('Tabs.* must be used within <Tabs>'); return ctx; } export function Tabs({ defaultIndex = 0, children, }: { defaultIndex?: number; children: ReactNode; }) { // TODO: useState로 active 인덱스 관리, Provider로 children을 감싸세요 return <>{children}</>; } function List({ children }: { children: ReactNode }) { // TODO: Children.map으로 각 자식(Tab)에 자기 인덱스를 주입하세요 return <div role="tablist">{children}</div>; } function Tab({ children, __idx }: { children: ReactNode; __idx?: number }) { // TODO: useTabs()로 active를 받고, 클릭 시 setActive(__idx) return <button role="tab">{children}</button>; } function Panels({ children }: { children: ReactNode }) { // TODO: Children.map으로 각 Panel에 인덱스를 주입하세요 return <div>{children}</div>; } function Panel({ children, __idx }: { children: ReactNode; __idx?: number }) { // TODO: useTabs()로 active를 받고, active === __idx일 때만 렌더 return null; } Tabs.List = List; Tabs.Tab = Tab; Tabs.Panels = Panels; Tabs.Panel = Panel;
Tests