import * as TabsPrimitive from '@radix-ui/react-tabs'; import classNames from 'classnames'; import type { ReactElement, ReactNode } from 'react'; import { Children, isValidElement, useState } from 'react'; interface TabsProps { children: ReactElement[]; active?: string; } export const Tabs = ({ children, active: activeDefaultId }: TabsProps) => { const [activeTab, setActiveTab] = useState(() => { return activeDefaultId ?? children[0].props.id; }); return ( setActiveTab(value)} >
{Children.map(children, (child) => { if (!isValidElement(child) || child.props.hidden) return null; const isActive = child.props.id === activeTab; const triggerClass = classNames( 'relative px-4 py-2 border-r border-default', 'uppercase', { 'cursor-default': isActive, 'text-neutral-400 hover:text-neutral-500 dark:hover:text-neutral-300': !isActive, } ); const borderClass = classNames( 'absolute bottom-[-1px] left-0 w-full h-0 border-b', 'border-b-white dark:border-b-black', { hidden: !isActive } ); return ( {child.props.name} ); })}
{Children.map(children, (child) => { if (!isValidElement(child) || child.props.hidden) return null; return ( {child.props.children} ); })}
); }; interface TabProps { children: ReactNode; id: string; name: string; hidden?: boolean; } export const Tab = ({ children, ...props }: TabProps) => { return
{children}
; };