import * as React from 'react' import * as SelectPrimitive from '@radix-ui/react-select' import { cva, type VariantProps } from 'class-variance-authority' import { cn } from '@/lib/utils' import { ArrowDownSLine, ArrowUpSLine, CheckLine } from './icons-inline' import { getThemeFromDocument } from './theme-from-document' /** 取消 outline/ring,避免与全局 *:focus-visible 冲突产生偶现 focus 环;用 !important 压过全局 */ const FOCUS_RESET = 'outline-none focus:outline-none focus:ring-0 focus-visible:outline-none focus-visible:ring-0 focus-visible:!outline-none focus-visible:!ring-0 focus-visible:outline-offset-0 focus-visible:!outline-offset-0 focus-visible:ring-offset-0 focus-visible:!ring-offset-0' const Select = SelectPrimitive.Root const SelectGroup = SelectPrimitive.Group const SelectValue = SelectPrimitive.Value const selectTriggerVariants = cva( [ 'flex w-full items-center justify-between gap-2 whitespace-nowrap rounded-lg border border-border-tertiary bg-bg-container text-text placeholder:text-muted-foreground transition-colors disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1', 'focus:border-border-secondary focus-visible:border-border-secondary data-[state=open]:border-border-secondary', ].join(' '), { variants: { size: { sm: 'h-[var(--control-height-sm)] px-[var(--control-padding-x-sm)] py-[var(--control-padding-y-sm)] text-[length:var(--control-font-size-sm)] leading-[var(--control-line-height-sm)]', md: 'h-[var(--control-height-md)] px-[var(--control-padding-x-md)] py-[var(--control-padding-y-md)] text-[length:var(--control-font-size-md)] leading-[var(--control-line-height-md)]', lg: 'h-[var(--control-height-lg)] px-[var(--control-padding-x-lg)] py-[var(--control-padding-y-lg)] text-[length:var(--control-font-size-lg)] leading-[var(--control-line-height-lg)]', }, }, defaultVariants: { size: 'md' }, } ) export interface SelectTriggerProps extends Omit, 'size'>, VariantProps { triggerIcon?: React.ReactNode size?: 'sm' | 'md' | 'lg' } const SelectTrigger = React.forwardRef< React.ElementRef, SelectTriggerProps >(({ className, children, disabled, triggerIcon, size = 'md', ...props }, ref) => ( {children} {triggerIcon ?? } )) SelectTrigger.displayName = SelectPrimitive.Trigger.displayName const SelectScrollUpButton = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { scrollUpIcon?: React.ReactNode } >(({ className, scrollUpIcon, ...rest }, ref) => ( {scrollUpIcon ?? } )) SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName const SelectScrollDownButton = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { scrollDownIcon?: React.ReactNode } >(({ className, scrollDownIcon, ...rest }, ref) => ( {scrollDownIcon ?? } )) SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName const SelectContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { /** When provided (e.g. from ThemeStyleProvider), used for portal wrapper */ dataStyle?: string dataTheme?: string } >(({ className, children, position = 'popper', sideOffset = 4, dataStyle, dataTheme, ...props }, ref) => { const fromDoc = getThemeFromDocument() const dataProps = dataStyle !== undefined ? { 'data-style': dataStyle, 'data-theme': dataTheme ?? fromDoc['data-theme'] ?? '' } : fromDoc return ( {children} ) }) SelectContent.displayName = SelectPrimitive.Content.displayName const SelectLabel = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )) SelectLabel.displayName = SelectPrimitive.Label.displayName const SelectItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef & { itemIndicatorIcon?: React.ReactNode } >(({ className, children, itemIndicatorIcon, ...rest }, ref) => ( {itemIndicatorIcon ?? } {children} )) SelectItem.displayName = SelectPrimitive.Item.displayName const SelectSeparator = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )) SelectSeparator.displayName = SelectPrimitive.Separator.displayName export { Select, SelectGroup, SelectValue, SelectTrigger, SelectContent, SelectLabel, SelectItem, SelectSeparator, SelectScrollUpButton, SelectScrollDownButton, selectTriggerVariants, }