import type { CSSProperties } from 'react' import React from 'react' import { useTranslation } from 'react-i18next' import { RiCloseCircleFill, RiErrorWarningLine, RiSearchLine } from '@remixicon/react' import { type VariantProps, cva } from 'class-variance-authority' import cn from '@/utils/classnames' export const inputVariants = cva( '', { variants: { size: { regular: 'px-3 radius-md system-sm-regular', large: 'px-4 radius-lg system-md-regular', }, }, defaultVariants: { size: 'regular', }, }, ) export type InputProps = { showLeftIcon?: boolean showClearIcon?: boolean onClear?: () => void disabled?: boolean destructive?: boolean wrapperClassName?: string styleCss?: CSSProperties } & React.InputHTMLAttributes<HTMLInputElement> & VariantProps<typeof inputVariants> const Input = ({ size, disabled, destructive, showLeftIcon, showClearIcon, onClear, wrapperClassName, className, styleCss, value, placeholder, onChange, ...props }: InputProps) => { const { t } = useTranslation() return ( <div className={cn('relative w-full', wrapperClassName)}> {showLeftIcon && <RiSearchLine className={cn('absolute left-2 top-1/2 -translate-y-1/2 w-4 h-4 text-components-input-text-placeholder')} />} <input style={styleCss} className={cn( 'w-full py-[7px] bg-components-input-bg-normal border border-transparent text-components-input-text-filled hover:bg-components-input-bg-hover hover:border-components-input-border-hover focus:bg-components-input-bg-active focus:border-components-input-border-active focus:shadow-xs placeholder:text-components-input-text-placeholder appearance-none outline-none caret-primary-600', inputVariants({ size }), showLeftIcon && 'pl-[26px]', showLeftIcon && size === 'large' && 'pl-7', showClearIcon && value && 'pr-[26px]', showClearIcon && value && size === 'large' && 'pr-7', destructive && 'pr-[26px]', destructive && size === 'large' && 'pr-7', disabled && 'bg-components-input-bg-disabled border-transparent text-components-input-text-filled-disabled cursor-not-allowed hover:bg-components-input-bg-disabled hover:border-transparent', destructive && 'bg-components-input-bg-destructive border-components-input-border-destructive text-components-input-text-filled hover:bg-components-input-bg-destructive hover:border-components-input-border-destructive focus:bg-components-input-bg-destructive focus:border-components-input-border-destructive', className, )} placeholder={placeholder ?? (showLeftIcon ? t('common.operation.search') ?? '' : t('common.placeholder.input'))} value={value} onChange={onChange} disabled={disabled} {...props} /> {showClearIcon && value && !disabled && !destructive && ( <div className={cn('absolute right-2 top-1/2 -translate-y-1/2 group p-[1px] cursor-pointer')} onClick={onClear}> <RiCloseCircleFill className='w-3.5 h-3.5 text-text-quaternary cursor-pointer group-hover:text-text-tertiary' /> </div> )} {destructive && ( <RiErrorWarningLine className='absolute right-2 top-1/2 -translate-y-1/2 w-4 h-4 text-text-destructive-secondary' /> )} </div> ) } export default Input