import React, { forwardRef, useCallback } from 'react' import { motion } from 'framer-motion' import { type TabsTriggerProps, TabsVariant, TabsSize } from './types' import { StyledTabsTrigger, IconContainer } from './StyledTabs' import type { TabsTokensType } from './tabs.token' import { useResponsiveTokens } from '../../hooks/useResponsiveTokens' import { X } from 'lucide-react' import Skeleton from '../Skeleton/Skeleton' import { getSkeletonState } from '../Skeleton/utils' import Block from '../Primitives/Block/Block' const TabsTrigger = forwardRef( ( { className, value, variant = TabsVariant.UNDERLINE, size = TabsSize.MD, children, leftSlot, rightSlot, closable = false, onClose, disable = false, isOverlay = false, tabsGroupId = '', showSkeleton = false, skeletonVariant = 'pulse', ...props }, ref ) => { const tabsToken = useResponsiveTokens('TABS') const { shouldShowSkeleton } = getSkeletonState(showSkeleton) const isActive = props.isActive const isDisabled = shouldShowSkeleton ? true : disable const handleCloseClick = useCallback( (e: React.MouseEvent) => { // Stop all event propagation to prevent tab activation e.stopPropagation() e.preventDefault() // Also stop immediate propagation on native event if (e.nativeEvent && e.nativeEvent.stopImmediatePropagation) { e.nativeEvent.stopImmediatePropagation() } if (!isDisabled) { onClose?.() } }, [onClose, isDisabled] ) const handleCloseMouseDown = useCallback((e: React.MouseEvent) => { // Stop mousedown event to prevent it from triggering tab activation e.stopPropagation() e.preventDefault() if (e.nativeEvent && e.nativeEvent.stopImmediatePropagation) { e.nativeEvent.stopImmediatePropagation() } }, []) const handleCloseKeyDown = useCallback( (e: React.KeyboardEvent) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault() e.stopPropagation() if (!isDisabled) { onClose?.() } } }, [onClose, isDisabled] ) const effectiveRightSlot = closable && ( ) const skeletonBorderRadius = tabsToken.borderRadius[size][variant] const { isActive: _isActive, style, ...domProps } = props void _isActive // Prevent tab activation when clicking on close button const handleTriggerClick = useCallback((e: React.MouseEvent) => { // Check if the click target is the close button or its children const target = e.target as HTMLElement const isCloseButtonClick = target.closest('[role="button"][aria-label*="Close"]') !== null || target.getAttribute('aria-label')?.includes('Close') || target.closest('span[role="button"]') !== null if (isCloseButtonClick) { e.preventDefault() e.stopPropagation() if (e.nativeEvent && e.nativeEvent.stopImmediatePropagation) { e.nativeEvent.stopImmediatePropagation() } } }, []) const triggerContent = ( {!isOverlay && isActive && variant !== TabsVariant.UNDERLINE && !shouldShowSkeleton && ( )} {leftSlot && ( {leftSlot} )} {children} {rightSlot && ( {rightSlot} )} {effectiveRightSlot && ( {effectiveRightSlot} )} ) if (shouldShowSkeleton) { return ( {triggerContent} ) } return triggerContent } ) TabsTrigger.displayName = 'TabsTrigger' export default TabsTrigger