import React from 'react';
interface TabComponentProps {
activeValue: string;
onValueChange: (value: string) => void;
}
export const Tabs = ({
children,
value,
onValueChange,
className = '',
}: {
children?: React.ReactNode;
value: string;
onValueChange: (value: string) => void;
className?: string;
}) => {
return (
{React.Children.map(children, (child) => {
if (React.isValidElement(child)) {
return React.cloneElement(child as React.ReactElement, {
activeValue: value,
onValueChange,
});
}
return child;
})}
);
};
export const TabsList = ({
children,
className = '',
activeValue,
onValueChange,
}: {
children?: React.ReactNode;
className?: string;
activeValue?: string;
onValueChange?: (value: string) => void;
}) => {
const handleKeyDown = (e: React.KeyboardEvent) => {
const tabs = Array.from(e.currentTarget.querySelectorAll('[role="tab"]')) as HTMLElement[];
const currentIndex = tabs.findIndex((tab) => tab === e.target);
let newIndex = currentIndex;
if (e.key === 'ArrowLeft') {
newIndex = currentIndex > 0 ? currentIndex - 1 : tabs.length - 1;
} else if (e.key === 'ArrowRight') {
newIndex = currentIndex < tabs.length - 1 ? currentIndex + 1 : 0;
} else if (e.key === 'Home') {
newIndex = 0;
} else if (e.key === 'End') {
newIndex = tabs.length - 1;
}
if (newIndex !== currentIndex) {
e.preventDefault();
tabs[newIndex]?.focus();
tabs[newIndex]?.click();
}
};
return (
{React.Children.map(children, (child) => {
if (React.isValidElement(child)) {
const childProps = child.props as { value: string };
return React.cloneElement(child, {
isActive: childProps.value === activeValue,
onClick: () => onValueChange?.(childProps.value),
});
}
return child;
})}
);
};
export const TabsTrigger = ({
children,
value,
isActive,
onClick,
className = '',
}: {
value: string;
children?: React.ReactNode;
isActive?: boolean;
onClick?: () => void;
className?: string;
}) => {
return (
);
};
TabsTrigger.displayName = 'TabsTrigger';
export const TabsContent = ({
children,
value,
className = '',
activeValue,
}: {
value: string;
children?: React.ReactNode;
className?: string;
activeValue?: string;
}) => {
const isHidden = value !== activeValue;
return (
{children}
);
};
TabsContent.displayName = 'TabsContent';