'use client' import * as TabsPrimitive from '@radix-ui/react-tabs' import * as React from 'react' import { cn } from '../../utils' import { typographyVariants } from '../Typography' const NavTabs = TabsPrimitive.Root NavTabs.displayName = 'NavTabs' type NavTabsTitleProps = React.HTMLAttributes & { children: React.ReactNode ref?: React.Ref } const NavTabsTitle = ({ className, children, ref, ...props }: NavTabsTitleProps) => (
{children}
) NavTabsTitle.displayName = 'NavTabsTitle' type NavTabsListProps = React.ComponentPropsWithoutRef< typeof TabsPrimitive.List > & { indicatorOffset?: number ref?: React.Ref> } const NavTabsList = ({ className, children, indicatorOffset = 22, ref, ...props }: NavTabsListProps) => { const [indicatorStyle, setIndicatorStyle] = React.useState({ opacity: 0, left: 0, }) const internalRef = React.useRef(null) React.useImperativeHandle(ref, () => internalRef.current!) const updateIndicatorPosition = React.useCallback(() => { if (!internalRef.current) return const activeElement = internalRef.current.querySelector( '[data-state="active"]', ) as HTMLElement if (activeElement) { const listRect = internalRef.current.getBoundingClientRect() const tabRect = activeElement.getBoundingClientRect() const leftPosition = tabRect.left - listRect.left + tabRect.width / 2 - 8.5 setIndicatorStyle({ opacity: 1, left: leftPosition, transition: 'all 0.2s ease-in-out', }) } }, []) React.useEffect(() => { const observer = new MutationObserver(() => { updateIndicatorPosition() }) if (internalRef.current) { observer.observe(internalRef.current, { attributes: true, attributeFilter: ['data-state'], subtree: true, }) setTimeout(updateIndicatorPosition, 0) } return () => observer.disconnect() }, [updateIndicatorPosition]) React.useEffect(() => { const handleResize = () => updateIndicatorPosition() window.addEventListener('resize', handleResize) return () => window.removeEventListener('resize', handleResize) }, [updateIndicatorPosition]) return (
{children}
) } NavTabsList.displayName = 'NavTabsList' type NavTabsTriggerProps = React.ComponentPropsWithoutRef< typeof TabsPrimitive.Trigger > & { ref?: React.Ref> } const NavTabsTrigger = ({ className, ref, ...props }: NavTabsTriggerProps) => ( ) NavTabsTrigger.displayName = 'NavTabsTrigger' type NavTabsContentProps = React.ComponentPropsWithoutRef< typeof TabsPrimitive.Content > & { ref?: React.Ref> } const NavTabsContent = ({ className, ref, ...props }: NavTabsContentProps) => ( ) NavTabsContent.displayName = 'NavTabsContent' export { NavTabs, NavTabsTitle, NavTabsList, NavTabsTrigger, NavTabsContent }