mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-30 18:33:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import type { FC } from 'react'
 | |
| import cn from '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
 | 
