Files
imphnen-frontend-service/libs/ui/src/atoms/input/input.tsx
T

53 lines
1.2 KiB
TypeScript
Raw Normal View History

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
);
};