"use client"; import * as React from "react"; import { cva, type VariantProps } from "class-variance-authority"; import { Tabs as TabsPrimitive } from "radix-ui"; import { motion, useReducedMotion } from "framer-motion"; import { cn } from "../lib/utils"; /** Same raised selection and spring as Coline and Upstream navigation. */ export const TABS_LAYOUT_SPRING = { type: "spring" as const, stiffness: 300, damping: 26, mass: 1 }; const TabsContext = React.createContext<{ value: string | undefined; id: string } | null>(null); const ListVariantContext = React.createContext<"default" | "line">("default"); function Tabs({ className, orientation = "horizontal", value, defaultValue, onValueChange, ...props }: React.ComponentProps) { const [localValue, setLocalValue] = React.useState(defaultValue); const id = React.useId(); const activeValue = value ?? localValue; const context = React.useMemo(() => ({ value: activeValue, id }), [activeValue, id]); return ( { if (value === undefined) setLocalValue(next); onValueChange?.(next); }} data-slot="tabs" className={cn("coline-tabs", className)} /> ); } const tabsListVariants = cva("coline-tabs-list", { variants: { variant: { default: "coline-tabs-raised", line: "coline-tabs-line" } }, defaultVariants: { variant: "default" }, }); function TabsList({ className, variant = "default", ...props }: React.ComponentProps & VariantProps) { return ( ); } // Keep the existing explicit indicator API working without adding a second pill. function hasIndicator(children: React.ReactNode): boolean { return React.Children.toArray(children).some((child) => React.isValidElement<{ children?: React.ReactNode }>(child) && (child.type === TabsIndicator || hasIndicator(child.props.children))); } function TabsTrigger({ className, children, value, asChild = false, ...props }: React.ComponentProps) { const tabs = React.useContext(TabsContext); const variant = React.useContext(ListVariantContext); const indicator = tabs?.value === value && variant === "default" && !hasIndicator(children) ? : null; const content = asChild && React.isValidElement<{ children?: React.ReactNode }>(children) ? React.cloneElement(children, undefined, indicator, children.props.children) : <>{indicator}{children}; return ( {content} ); } /** Optional customization; the raised indicator is included automatically. */ function TabsIndicator({ className, layoutId = "selection" }: { className?: string; layoutId?: string }) { const tabs = React.useContext(TabsContext); const fallbackId = React.useId(); const reducedMotion = useReducedMotion(); return (