"use client"; import { Tabs as TabsPrimitive } from "@base-ui/react/tabs"; import { cva, type VariantProps } from "class-variance-authority"; import { createContext, useContext, useState } from "react"; import { cn } from "@/lib/utils"; // Tracks the active tab value so keepMounted panels can lazy-mount on first // activation. undefined = untracked (Tabs given neither value nor defaultValue). const TabsActiveValueContext = createContext(undefined); function Tabs({ className, orientation = "horizontal", value, defaultValue, onValueChange, ...props }: TabsPrimitive.Root.Props) { const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue); const activeValue = value !== undefined ? value : uncontrolledValue; return ( { setUncontrolledValue(newValue); onValueChange?.(newValue, eventDetails); }} {...props} /> ); } const tabsListVariants = cva( "rounded-lg p-[3px] group-data-horizontal/tabs:h-8 data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col", { variants: { variant: { default: "bg-muted", line: "gap-1 bg-transparent", }, }, defaultVariants: { variant: "default", }, }, ); function TabsList({ className, variant = "default", ...props }: TabsPrimitive.List.Props & VariantProps) { return ( ); } function TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) { return ( ); } function TabsContent({ className, value, keepMounted, children, ...props }: TabsPrimitive.Panel.Props) { const activeValue = useContext(TabsActiveValueContext); const isActive = activeValue !== undefined && activeValue === value; const [hasBeenActive, setHasBeenActive] = useState(isActive); if (isActive && !hasBeenActive) setHasBeenActive(true); // Lazy-mount-once: a keepMounted panel renders its children only after its // tab has been active at least once, then keeps them mounted so state and // data survive tab switches (hidden panels no longer fetch on page load). // Falls back to eager rendering when the active value is untracked. const shouldRenderChildren = !keepMounted || activeValue === undefined || hasBeenActive; return ( {shouldRenderChildren ? children : null} ); } export { Tabs, TabsContent, TabsList, tabsListVariants, TabsTrigger };