import * as React from 'react'; import { motion } from 'framer-motion'; import { cn } from '../../lib/utils'; interface TabsProps extends React.HTMLAttributes { defaultValue?: string; value?: string; onValueChange?: (value: string) => void; children: React.ReactNode; } interface TabsContextValue { value: string; onValueChange: (value: string) => void; } const TabsContext = React.createContext(undefined); function useTabs() { const context = React.useContext(TabsContext); if (!context) { throw new Error('useTabs must be used within a Tabs provider'); } return context; } export function Tabs({ defaultValue, value, onValueChange, children, className, ...props }: TabsProps) { const [tabValue, setTabValue] = React.useState(defaultValue || ''); const handleValueChange = React.useCallback( (newValue: string) => { setTabValue(newValue); onValueChange?.(newValue); }, [onValueChange], ); const contextValue = React.useMemo( () => ({ value: value !== undefined ? value : tabValue, onValueChange: handleValueChange, }), [value, tabValue, handleValueChange], ); return (
{children}
); } interface TabsListProps extends React.HTMLAttributes { children: React.ReactNode; } export function TabsList({ children, className, ...props }: TabsListProps) { return (
{children}
); } interface TabsTriggerProps extends React.ButtonHTMLAttributes { value: string; icon?: React.ReactNode; children: React.ReactNode; } export function TabsTrigger({ value, icon, children, className, ...props }: TabsTriggerProps) { const { value: selectedValue, onValueChange } = useTabs(); const isSelected = selectedValue === value; return ( ); } interface TabsContentProps extends React.HTMLAttributes { value: string; children: React.ReactNode; } export function TabsContent({ value, children, className, ...props }: TabsContentProps) { const { value: selectedValue } = useTabs(); const isSelected = selectedValue === value; if (!isSelected) { return null; } return (
{children}
); }