/* eslint-disable @typescript-eslint/no-explicit-any */ import _ from 'lodash'; import React from 'react'; interface InputProps extends Omit< React.InputHTMLAttributes & React.TextareaHTMLAttributes, 'size' > { theme?: 'plain' | 'outline'; label?: string; size?: 'sm' | 'md' | 'lg'; feedback?: string; hasError?: boolean; multiline?: boolean; inputComponent?: React.ReactNode; inputClassName?: string; className?: string; inputRef?: React.Ref; } const baseInputClassName = 'tw-input block w-full rounded-md focus:ring-1 focus:ring-blue-500 z-0 focus:z-10 dark:text-white text-black text-base '; export const defaultInputClassName = (theme: 'plain' | 'outline' = 'plain') => { return ( baseInputClassName + (theme === 'plain' ? 'bg-zinc-100 border-zinc-100 dark:bg-zinc-800 dark:border-zinc-800' : 'bg-zinc-50 border-zinc-300 dark:bg-zinc-800 dark:border-zinc-700') ); }; export const errorInputClassName = (theme: 'plain' | 'outline' = 'plain') => { return ( baseInputClassName + (theme === 'plain' ? 'bg-red-200 border-red-200 dark:bg-red-800 dark:border-red-800' : 'bg-red-50 border-red-300 dark:bg-red-900 dark:border-red-800') ); }; export const Input = (props: InputProps) => { let inputClassName = props.hasError ? errorInputClassName(props.theme) : defaultInputClassName(props.theme); inputClassName = inputClassName + (props.disabled ? ' opacity-75' : ''); if (!props.multiline) { if (props.size === 'lg') inputClassName = inputClassName + ' h-10 pl-10'; else if (props.size === 'sm') inputClassName = inputClassName + ' h-7'; else inputClassName = inputClassName + ' h-9'; } return ( <> {props.inputComponent || (props.multiline ? ( ) : ( } type="text" className={inputClassName + ' ' + props.inputClassName + ' ' + props.className} {..._.omit(props, 'label', 'inputClassName', 'className', 'size')} /> ))} ); };