"use client"; import * as React from "react"; import { cn } from "@/lib/utils"; interface TabsProps extends React.HTMLAttributes { defaultValue?: string; value?: string; onValueChange?: (value: string) => void; } interface TabsListProps extends React.HTMLAttributes {} interface TabsTriggerProps extends React.ButtonHTMLAttributes { value: string; } interface TabsContentProps extends React.HTMLAttributes { value: string; } const TabsContext = React.createContext<{ value: string; onValueChange: (value: string) => void; } | null>(null); const Tabs = React.forwardRef( ({ className, defaultValue, value, onValueChange, children, ...props }, ref) => { const [selectedValue, setSelectedValue] = React.useState(value || defaultValue || ""); const handleValueChange = React.useCallback( (newValue: string) => { if (value === undefined) { setSelectedValue(newValue); } onValueChange?.(newValue); }, [value, onValueChange] ); const contextValue = React.useMemo( () => ({ value: value ?? selectedValue, onValueChange: handleValueChange, }), [value, selectedValue, handleValueChange] ); return (
{children}
); } ); Tabs.displayName = "Tabs"; const TabsList = React.forwardRef(({ className, ...props }, ref) => (
)); TabsList.displayName = "TabsList"; const TabsTrigger = React.forwardRef( ({ className, value, ...props }, ref) => { const context = React.useContext(TabsContext); if (!context) { throw new Error("TabsTrigger must be used within a Tabs component"); } const { value: selectedValue, onValueChange } = context; const isSelected = selectedValue === value; return (