"use client" import * as React from "react" import * as TabsPrimitive from "@radix-ui/react-tabs" import { cn } from "@/lib/utils" const Tabs = TabsPrimitive.Root const TabsList = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )) TabsList.displayName = TabsPrimitive.List.displayName const TabsTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )) TabsTrigger.displayName = TabsPrimitive.Trigger.displayName const TabsContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )) TabsContent.displayName = TabsPrimitive.Content.displayName const SlidingTabsList = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, ...props }, ref) => { const [activeIndex, setActiveIndex] = React.useState(0) const combinedRef = React.useCallback((node: HTMLDivElement | null) => { if (node) { const updateActiveIndex = () => { const triggers = node.querySelectorAll('[data-state="active"]') if (triggers.length > 0) { const allTriggers = node.querySelectorAll('[role="tab"]') const activeElement = triggers[0] const index = Array.from(allTriggers).indexOf(activeElement) if (index >= 0) { setActiveIndex(index) } } } setTimeout(updateActiveIndex, 0) const observer = new MutationObserver(updateActiveIndex) observer.observe(node, { attributes: true, attributeFilter: ['data-state'], subtree: true }) return () => observer.disconnect() } if (typeof ref === 'function') { ref(node) } }, [ref]) const childrenArray = React.Children.toArray(children) const tabCount = childrenArray.length const tabWidth = `calc(${100 / tabCount}% - ${2 * (tabCount - 1) / tabCount}px)` const slidePosition = `calc(${(100 / tabCount) * activeIndex}% + ${activeIndex}px)` return (
{children} ) }) SlidingTabsList.displayName = "SlidingTabsList" const SlidingTabsTrigger = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )) SlidingTabsTrigger.displayName = "SlidingTabsTrigger" export { Tabs, TabsList, TabsTrigger, TabsContent, SlidingTabsList, SlidingTabsTrigger }