import React, { createContext, useContext, useState } from 'react'; import { cn } from '@/lib/utils'; interface TabsContextType { activeTab: string; setActiveTab: (value: string) => void; } const TabsContext = createContext(undefined); function useTabs() { const context = useContext(TabsContext); if (!context) { throw new Error('Tabs components must be used within a Tabs component'); } return context; } interface TabsProps extends React.HTMLAttributes { defaultValue?: string; value?: string; onValueChange?: (value: string) => void; } function Tabs({ className, defaultValue, value: controlledValue, onValueChange, children, ...props }: TabsProps) { const [internalValue, setInternalValue] = useState(defaultValue || ''); const isControlled = controlledValue !== undefined; const activeTab = isControlled ? controlledValue : internalValue; const handleValueChange = (newValue: string) => { if (!isControlled) { setInternalValue(newValue); } onValueChange?.(newValue); }; return (
{children}
); } interface TabsListProps extends React.HTMLAttributes { children: React.ReactNode; } function TabsList({ className, children, ...props }: TabsListProps) { return (
{children}
); } interface TabsTriggerProps extends React.ButtonHTMLAttributes { value: string; children: React.ReactNode; } function TabsTrigger({ className, value, children, ...props }: TabsTriggerProps) { const { activeTab, setActiveTab } = useTabs(); const isActive = activeTab === value; return ( ); } interface TabsContentProps extends React.HTMLAttributes { value: string; children: React.ReactNode; } function TabsContent({ className, value, children, ...props }: TabsContentProps) { const { activeTab } = useTabs(); if (activeTab !== value) { return null; } return (
{children}
); } export { Tabs, TabsList, TabsTrigger, TabsContent };