|
import type { FC } from 'react' |
|
import cn from '@/utils/classnames' |
|
|
|
type Option = { |
|
value: string |
|
text: string |
|
} |
|
type TabSliderProps = { |
|
className?: string |
|
itemWidth?: number |
|
value: string |
|
onChange: (v: string) => void |
|
options: Option[] |
|
} |
|
const TabSlider: FC<TabSliderProps> = ({ |
|
className, |
|
itemWidth = 118, |
|
value, |
|
onChange, |
|
options, |
|
}) => { |
|
const currentIndex = options.findIndex(option => option.value === value) |
|
const current = options[currentIndex] |
|
|
|
return ( |
|
<div className={cn(className, 'relative flex p-0.5 rounded-lg bg-gray-200')}> |
|
{ |
|
options.map((option, index) => ( |
|
<div |
|
key={option.value} |
|
className={` |
|
flex justify-center items-center h-7 text-[13px] |
|
font-semibold text-gray-600 rounded-[7px] cursor-pointer |
|
hover:bg-gray-50 |
|
${index !== options.length - 1 && 'mr-[1px]'} |
|
`} |
|
style={{ |
|
width: itemWidth, |
|
}} |
|
onClick={() => onChange(option.value)} |
|
> |
|
{option.text} |
|
</div> |
|
)) |
|
} |
|
{ |
|
current && ( |
|
<div |
|
className={` |
|
absolute flex justify-center items-center h-7 bg-white text-[13px] font-semibold text-primary-600 |
|
border-[0.5px] border-gray-200 rounded-[7px] shadow-xs transition-transform |
|
`} |
|
style={{ |
|
width: itemWidth, |
|
transform: `translateX(${currentIndex * itemWidth + 1}px)`, |
|
}} |
|
> |
|
{current.text} |
|
</div> |
|
) |
|
} |
|
</div> |
|
) |
|
} |
|
|
|
export default TabSlider |
|
|