2025-03-16 00:56:02 +07:00
|
|
|
import {
|
|
|
|
|
DetailedHTMLProps,
|
|
|
|
|
FC,
|
|
|
|
|
InputHTMLAttributes,
|
|
|
|
|
ReactElement,
|
|
|
|
|
} from 'react';
|
|
|
|
|
import { cn } from '@imphnen-frontend-service/utils';
|
|
|
|
|
|
|
|
|
|
type TInputType = 'text' | 'email';
|
|
|
|
|
type TInputSize = 'sm' | 'md' | 'lg';
|
|
|
|
|
|
|
|
|
|
type TInputProps = Omit<
|
|
|
|
|
DetailedHTMLProps<InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>,
|
|
|
|
|
'size' | 'type'
|
|
|
|
|
> & {
|
|
|
|
|
type?: TInputType;
|
|
|
|
|
size?: TInputSize;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const sizeClasses: Record<TInputSize, string> = {
|
|
|
|
|
sm: 'text-[10px] max-h-[28px]',
|
|
|
|
|
md: 'text-[12px] max-h-[30px]',
|
|
|
|
|
lg: 'text-[15px] max-h-[34px]',
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const disabledClass = 'opacity-50 hover:border-neutral-200 cursor-not-allowed';
|
|
|
|
|
|
|
|
|
|
export const Input: FC<TInputProps> = ({
|
|
|
|
|
size = 'md',
|
2025-03-27 05:25:02 +07:00
|
|
|
type = 'text',
|
2025-03-16 00:56:02 +07:00
|
|
|
placeholder = 'Placeholder',
|
|
|
|
|
disabled,
|
|
|
|
|
className,
|
|
|
|
|
...rest
|
|
|
|
|
}): ReactElement => {
|
|
|
|
|
const mergedClassName = cn(
|
|
|
|
|
'px-[12px] py-[8px] text-neutral-800 placeholder:text-neutral-300 border border-neutral-200 hover:border-blue-300 focus:outline-1 focus:outline-blue-500 rounded-md font-bai-jamjuree',
|
|
|
|
|
sizeClasses[size],
|
|
|
|
|
disabled && disabledClass,
|
|
|
|
|
className
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return (
|
2025-03-27 05:25:02 +07:00
|
|
|
<input
|
|
|
|
|
className={mergedClassName}
|
|
|
|
|
type={type}
|
|
|
|
|
disabled={disabled}
|
|
|
|
|
placeholder={placeholder}
|
|
|
|
|
{...rest}
|
|
|
|
|
/>
|
2025-03-16 00:56:02 +07:00
|
|
|
);
|
|
|
|
|
};
|