import React, { useState } from 'react'; import { Eye, EyeOff } from 'lucide-react'; interface InputProps extends React.InputHTMLAttributes { label: string; error?: string; mask?: 'phone' | 'cnpj' | 'cep'; } export const Input: React.FC = ({ label, error, className = '', type, mask, onChange, ...props }) => { const [showPassword, setShowPassword] = useState(false); const isPassword = type === 'password'; const inputType = isPassword && showPassword ? 'text' : type; const applyMask = (value: string, maskType?: 'phone' | 'cnpj' | 'cep') => { if (!maskType) return value; const numbers = value.replace(/\D/g, ''); switch (maskType) { case 'phone': // Limita a 11 dígitos (celular) const phoneNumbers = numbers.slice(0, 11); if (phoneNumbers.length <= 10) { return phoneNumbers.replace(/(\d{2})(\d{4})(\d{0,4})/, '($1) $2-$3'); } return phoneNumbers.replace(/(\d{2})(\d{5})(\d{0,4})/, '($1) $2-$3'); case 'cnpj': // Limita a 14 dígitos const cnpjNumbers = numbers.slice(0, 14); return cnpjNumbers.replace(/(\d{2})(\d{3})(\d{3})(\d{4})(\d{0,2})/, '$1.$2.$3/$4-$5'); case 'cep': // Limita a 8 dígitos const cepNumbers = numbers.slice(0, 8); return cepNumbers.replace(/(\d{5})(\d{0,3})/, '$1-$2'); default: return value; } }; const handleChange = (e: React.ChangeEvent) => { if (mask) { const maskedValue = applyMask(e.target.value, mask); e.target.value = maskedValue; } onChange?.(e); }; // Define maxLength baseado na máscara const getMaxLength = () => { if (!mask) return undefined; switch (mask) { case 'phone': return 15; // (00) 00000-0000 case 'cnpj': return 18; // 00.000.000/0000-00 case 'cep': return 9; // 00000-000 default: return undefined; } }; return (
{isPassword && ( )}
{error && {error}}
); }; interface SelectProps extends React.SelectHTMLAttributes { label: string; options: { value: string; label: string }[]; error?: string; } export const Select: React.FC = ({ label, options, error, className = '', ...props }) => { return (
{error && {error}}
); };