"use client"; import * as React from "react"; import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "@/lib/utils"; type TabsContextValue = { value: string; setValue: (value: string) => void; orientation: "horizontal" | "vertical"; }; const TabsContext = React.createContext(null); function useTabsContext(component: string) { const context = React.useContext(TabsContext); if (!context) { throw new Error(`${component} must be used inside Tabs`); } return context; } function Tabs({ className, defaultValue = "", value, onValueChange, orientation = "horizontal", children, ...props }: React.HTMLAttributes & { defaultValue?: string; value?: string; onValueChange?: (value: string) => void; orientation?: "horizontal" | "vertical"; }) { const [internalValue, setInternalValue] = React.useState(defaultValue); const currentValue = value ?? internalValue; const setValue = React.useCallback( (nextValue: string) => { if (value === undefined) { setInternalValue(nextValue); } onValueChange?.(nextValue); }, [onValueChange, value], ); return (
{children}
); } const tabsListVariants = cva( "group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none", { variants: { variant: { default: "bg-muted", line: "gap-1 bg-transparent", }, }, defaultVariants: { variant: "default", }, }, ); function TabsList({ className, variant = "default", ...props }: React.HTMLAttributes & VariantProps) { const { orientation } = useTabsContext("TabsList"); return (
); } function TabsTrigger({ className, value, disabled, onClick, ...props }: React.ButtonHTMLAttributes & { value: string }) { const { value: currentValue, setValue } = useTabsContext("TabsTrigger"); const active = currentValue === value; return (