import React, { forwardRef, useCallback } from 'react' import { motion } from 'framer-motion' import { X } from 'lucide-react' import { type TabsV2TriggerProps, TabsV2Variant } from './tabsV2.types' import { StyledTabsTrigger, TabsV2IconContainer } from './StyledTabsV2' import type { TabsV2TokensType } from './tabsV2.tokens' import { useResponsiveTokens } from '../../hooks/useResponsiveTokens' import Skeleton from '../Skeleton/Skeleton' import { getSkeletonState } from '../Skeleton/utils' import { useTabsV2Context } from './tabsV2.context' import PrimitiveButton from '../Primitives/PrimitiveButton/PrimitiveButton' const TabsV2Trigger = forwardRef( ( { className, value, variant: variantProp, size: sizeProp, children, leftSlot, rightSlot, disabled: disabledProp, closable = false, onClose, isOverlay = false, tabsGroupId = '', showSkeleton: showSkeletonProp, skeletonVariant: skeletonVariantProp, ...props }, ref ) => { const context = useTabsV2Context() const variant = variantProp ?? context.variant const size = sizeProp ?? context.size const disabled = disabledProp ?? context.disabled const showSkeleton = showSkeletonProp ?? context.showSkeleton const skeletonVariant = skeletonVariantProp ?? context.skeletonVariant const tabsToken = useResponsiveTokens('TABSV2') const { shouldShowSkeleton } = getSkeletonState(showSkeleton) const closeButtonTokens = tabsToken.tabList.trigger.closeButton const closeButtonSize = closeButtonTokens.width const closeIconSize = typeof closeButtonSize === 'number' ? closeButtonSize : Number.parseInt(String(closeButtonSize), 10) || 16 const isDisabled = shouldShowSkeleton ? true : disabled const closeButtonBackgroundColor = isDisabled ? closeButtonTokens.backgroundColor.disabled : closeButtonTokens.backgroundColor.default const skeletonBorderRadius = tabsToken.tabList.trigger.borderRadius[size][variant] const { isActive: isActiveProp, style, ...domProps } = props const stopEventPropagation = useCallback( ( e: React.MouseEvent | React.PointerEvent | React.KeyboardEvent ) => { e.stopPropagation() e.preventDefault() if ( e.nativeEvent && 'stopImmediatePropagation' in e.nativeEvent ) { ;( e.nativeEvent as { stopImmediatePropagation: () => void } ).stopImmediatePropagation() } }, [] ) const handleCloseClick = useCallback( (e: React.MouseEvent) => { stopEventPropagation(e) if (!isDisabled) { onClose?.() } }, [onClose, isDisabled, stopEventPropagation] ) const closeButton = closable && ( { if (isDisabled) return if (e.key === 'Enter' || e.key === ' ') { stopEventPropagation(e) onClose?.() } }} width={closeButtonSize} height={closeButtonSize} borderRadius={closeButtonTokens.borderRadius} backgroundColor={closeButtonBackgroundColor} cursor={isDisabled ? 'not-allowed' : 'pointer'} display="flex" alignItems="center" justifyContent="center" flexShrink={0} padding={0} _hover={ !isDisabled ? { backgroundColor: closeButtonTokens.backgroundColor.hover, } : undefined } _active={ !isDisabled ? { backgroundColor: closeButtonTokens.backgroundColor.active, } : undefined } > ) const triggerContent = ( } value={value} $variant={variant} $size={size} $tabsToken={tabsToken} $isOverlay={isOverlay} className={className} disabled={isDisabled} data-status={isDisabled ? 'disabled' : 'enabled'} data-id={children ?? ''} style={{ ...(shouldShowSkeleton && { color: 'transparent', pointerEvents: 'none', border: 'none', }), ...style, }} {...domProps} > {!isOverlay && isActiveProp && variant !== TabsV2Variant.UNDERLINE && !shouldShowSkeleton && ( )} {leftSlot && ( {leftSlot} )} {children} {rightSlot && ( {rightSlot} )} {closable && closeButton} ) if (shouldShowSkeleton) { return ( {triggerContent} ) } return triggerContent } ) TabsV2Trigger.displayName = 'TabsV2Trigger' export default TabsV2Trigger