"use client"; import { motion } from "framer-motion"; import * as TabsPrimitive from "@radix-ui/react-tabs"; import * as React from "react"; import { cn } from "~/utils/cn"; import { type Variants } from "./Tabs"; type ClientTabsContextValue = { value?: string; }; const ClientTabsContext = React.createContext(undefined); function useClientTabsContext() { return React.useContext(ClientTabsContext); } const ClientTabs = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ onValueChange, value: valueProp, defaultValue, ...props }, ref) => { const [value, setValue] = React.useState(valueProp ?? defaultValue); React.useEffect(() => { if (valueProp !== undefined) { setValue(valueProp); } }, [valueProp]); const handleValueChange = React.useCallback( (nextValue: string) => { if (valueProp === undefined) { setValue(nextValue); } onValueChange?.(nextValue); }, [onValueChange, valueProp] ); const controlledProps = valueProp !== undefined ? { value: valueProp } : defaultValue !== undefined ? { defaultValue } : {}; const contextValue = React.useMemo(() => ({ value }), [value]); return ( ); }); ClientTabs.displayName = TabsPrimitive.Root.displayName; const ClientTabsList = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { variant?: Variants; } >(({ className, variant = "pipe-divider", ...props }, ref) => { const variantClassName = (() => { switch (variant) { case "segmented": return "relative flex h-10 w-full items-center rounded bg-background-raised/50 p-1"; case "underline": return "flex gap-x-6 border-b border-grid-bright"; default: return "inline-flex items-center justify-center transition duration-100"; } })(); return ; }); ClientTabsList.displayName = TabsPrimitive.List.displayName; const ClientTabsTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { variant?: Variants; layoutId?: string; } >(({ className, variant = "pipe-divider", layoutId, children, ...props }, ref) => { const context = useClientTabsContext(); const activeValue = context?.value; const isActive = activeValue === props.value; if (variant === "segmented") { return (
{children}
{isActive ? ( layoutId ? ( ) : (
) ) : null} ); } if (variant === "underline") { return ( {children} {layoutId ? ( isActive ? ( ) : (
) ) : isActive ? (
) : (
)} ); } return ( {children} ); }); ClientTabsTrigger.displayName = TabsPrimitive.Trigger.displayName; const ClientTabsContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )); ClientTabsContent.displayName = TabsPrimitive.Content.displayName; export type TabsProps = { tabs: { label: string; value: string; }[]; currentValue: string; className?: string; layoutId: string; variant?: Variants; }; export { ClientTabs, ClientTabsContent, ClientTabsList, ClientTabsTrigger };