import React, { useRef } from 'react' import { ChevronDown } from 'lucide-react' import Block from '../Primitives/Block/Block' import PrimitiveButton from '../Primitives/PrimitiveButton/PrimitiveButton' import FloatingLabels from '../Inputs/utils/FloatingLabels/FloatingLabels' import Text from '../Text/Text' import { MultiSelectV2SelectionTagType, MultiSelectV2Size, MultiSelectV2Variant, type SelectV2TriggerDimensions, } from './multiSelectV2.types' import type { MultiSelectV2TokensType } from './multiSelectV2.tokens' import { getTriggerLeftPadding, getTriggerTopPadding } from './utils' const DEFAULT_TRIGGER_DIMENSIONS: SelectV2TriggerDimensions = { width: 'fit-content', } export type MultiSelectV2TriggerProps = { selectedValues: string[] slot?: React.ReactNode variant: MultiSelectV2Variant size: MultiSelectV2Size isSmallScreen: boolean name: string label: string placeholder: string required: boolean selectionTagType: MultiSelectV2SelectionTagType valueLabelMap: Record fallbackToValue?: boolean open: boolean multiSelectTokens: MultiSelectV2TokensType inline?: boolean error?: boolean disabled?: boolean triggerDimensions?: SelectV2TriggerDimensions borderRadius: string borderRight?: string [key: string]: unknown } const MultiSelectV2Trigger = ({ selectedValues, slot, variant, size, isSmallScreen, name, label, placeholder, required, selectionTagType, valueLabelMap, fallbackToValue = false, open, multiSelectTokens, inline = false, error = false, disabled = false, triggerDimensions = DEFAULT_TRIGGER_DIMENSIONS, borderRadius, borderRight, ...rest }: MultiSelectV2TriggerProps) => { const slotRef = useRef(null) const slotWidth = slotRef.current?.offsetWidth const isContainer = variant === MultiSelectV2Variant.CONTAINER const isItemSelected = selectedValues.length > 0 const isSmallScreenWithLargeSize = isSmallScreen && size === MultiSelectV2Size.LG const paddingX = getTriggerLeftPadding(multiSelectTokens, size, variant) const paddingY = getTriggerTopPadding(multiSelectTokens, size, variant) const slotGap = Number(multiSelectTokens.trigger?.slot?.gap ?? 8) const paddingInlineStart = slot && slotWidth ? paddingX + slotWidth + slotGap : paddingX const chevronWidth = multiSelectTokens.trigger?.chevron?.width ?? 20 const chevronHeight = multiSelectTokens.trigger?.chevron?.height ?? 20 const chevronIconSize = multiSelectTokens.trigger?.chevron?.iconSize ?? 16 const floatingLabelPaddingTop = multiSelectTokens.trigger?.floatingLabel?.paddingTop ?? '0.375rem' const triggerState = error ? 'error' : open ? 'open' : 'closed' const trigger = multiSelectTokens.trigger const outline = trigger?.outline?.[variant]?.[triggerState] ?? 'none' const backgroundColor = trigger?.backgroundColor?.[variant]?.[triggerState] ?? 'transparent' const showContainerStyles = !inline || isContainer const hoverState = error ? 'error' : 'hover' const focusState = error ? 'error' : 'focus' const hoverOutline = trigger?.outline?.[variant]?.[hoverState] ?? 'none' const hoverBackgroundColor = trigger?.backgroundColor?.[variant]?.[hoverState] ?? 'transparent' const focusOutline = trigger?.outline?.[variant]?.[focusState] ?? 'none' const focusBackgroundColor = trigger?.backgroundColor?.[variant]?.[focusState] ?? 'transparent' const resolvedBorderRadius = borderRadius ?? trigger?.borderRadius?.[size]?.[variant] const tagToken = multiSelectTokens.trigger.selectionTag?.[variant]?.[selectionTagType] const selectionTagPadding = tagToken && tagToken.paddingTop !== undefined && tagToken.paddingRight !== undefined ? { paddingTop: tagToken.paddingTop, paddingRight: tagToken.paddingRight, paddingBottom: tagToken.paddingBottom, paddingLeft: tagToken.paddingLeft, } : selectionTagType === MultiSelectV2SelectionTagType.COUNT ? { paddingTop: 0, paddingRight: slotGap, paddingBottom: 0, paddingLeft: slotGap, } : { paddingTop: 0, paddingRight: 0, paddingBottom: 0, paddingLeft: 0, } return ( {slot && ( {slot} )} {variant === MultiSelectV2Variant.NO_CONTAINER && ( {label} )} {isSmallScreenWithLargeSize && isContainer && ( )} {isContainer && (selectedValues.length > 0 || !isSmallScreen || size !== MultiSelectV2Size.LG) && ( {placeholder} )} {selectedValues.length > 0 && ( valueLabelMap[v] ?? (fallbackToValue ? v : undefined) ) .join(', ') } > {selectionTagType === MultiSelectV2SelectionTagType.COUNT ? selectedValues.length : selectedValues .map( (v) => valueLabelMap[v] ?? (fallbackToValue ? v : undefined) ) .join(', ')} )} ) } MultiSelectV2Trigger.displayName = 'MultiSelectV2Trigger' export default MultiSelectV2Trigger