import React, { useState } from 'react'; import styles from './Tabs.module.css'; export interface Tab { id: string; label: string; content: React.ReactNode; } export interface TabsProps { tabs: Tab[]; defaultTabId?: string; /** Controlled active tab. When provided, internal state is ignored. */ activeTabId?: string; onTabChange?: (tabId: string) => void; className?: string; } export function Tabs({ tabs, defaultTabId, activeTabId: controlledTabId, onTabChange, className = '' }: TabsProps) { const [internalTabId, setInternalTabId] = useState( defaultTabId || tabs[0]?.id || '' ); const activeTabId = controlledTabId ?? internalTabId; const handleTabClick = (tabId: string) => { if (!controlledTabId) setInternalTabId(tabId); onTabChange?.(tabId); }; const activeTab = tabs.find(tab => tab.id === activeTabId) || tabs[0]; if (!tabs || tabs.length === 0) { return null; } return (
{tabs.map(tab => ( ))}
{activeTab && activeTab.content}
); } export default Tabs;