123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- 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
|