Skip to content

Input ​

Campo de texto con label, hint y error integrados. Accesible por defecto.


Import ​

jsx
import { Input } from '@imansi/ui';

Uso básico ​

jsx
<Input placeholder="Escribí tu email" />

Con label ​

jsx
<Input
  label="Email"
  type="email"
  placeholder="correo@ejemplo.com"
/>

El label se asocia automáticamente al input con htmlFor / id.


Con hint (texto de ayuda) ​

jsx
<Input
  label="Contraseña"
  type="password"
  hint="Debe tener al menos 8 caracteres"
/>

Con error ​

jsx
<Input
  label="Email"
  type="email"
  error="El correo no es válido"
/>

Cuando hay error, el borde se pinta en rojo y se muestra el mensaje abajo.


Estados ​

Deshabilitado ​

jsx
<Input label="Email" disabled value="usuario@ejemplo.com" />

Readonly ​

jsx
<Input label="ID" readOnly value="usr_abc123" />

Con íconos ​

jsx
import { Mail, Search } from 'lucide-react';

<div className="relative">
  <Mail className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
  <Input placeholder="correo@ejemplo.com" className="pl-10" />
</div>

Tipos soportados ​

Input pasa el type nativo directamente al <input>:

jsx
<Input type="text" />
<Input type="email" />
<Input type="password" />
<Input type="number" />
<Input type="tel" />
<Input type="url" />
<Input type="search" />
<Input type="date" />
<Input type="time" />
<Input type="file" />

Props ​

PropTipoDefaultDescripción
labelstring—Etiqueta del campo
hintstring—Texto de ayuda debajo del campo
errorstring—Mensaje de error (pinta el campo en rojo)
idstringautogeneradoID del input (se autogenera si no lo pasás)
typestring'text'Tipo nativo de <input>
disabledbooleanfalseDeshabilita el campo
readOnlybooleanfalseSolo lectura
classNamestring—Clases adicionales
...propsInputHTMLAttributes—Todas las props nativas de <input>

Accesibilidad ​

  • aria-invalid se aplica automáticamente cuando hay error
  • aria-describedby conecta el input con hint y error
  • Focus visible con ring
  • Compatible con navegación por teclado
jsx
<Input
  label="Email"
  type="email"
  hint="Nunca compartas tu correo"
  error={errors.email}
/>

Ejemplo completo ​

jsx
import { useState } from 'react';
import { Input, Button } from '@imansi/ui';

export function FormularioLogin() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [errors, setErrors] = useState({});

  function handleSubmit(e) {
    e.preventDefault();
    const nuevosErrores = {};

    if (!email.includes('@')) {
      nuevosErrores.email = 'Email inválido';
    }
    if (password.length < 8) {
      nuevosErrores.password = 'Mínimo 8 caracteres';
    }

    setErrors(nuevosErrores);

    if (Object.keys(nuevosErrores).length === 0) {
      // enviar formulario
    }
  }

  return (
    <form onSubmit={handleSubmit} className="space-y-4 max-w-sm">
      <Input
        label="Email"
        type="email"
        value={email}
        onChange={(e) => setEmail(e.target.value)}
        error={errors.email}
        hint="Usá tu correo principal"
      />

      <Input
        label="Contraseña"
        type="password"
        value={password}
        onChange={(e) => setPassword(e.target.value)}
        error={errors.password}
      />

      <Button type="submit" className="w-full">
        Iniciar sesión
      </Button>
    </form>
  );
}

Hecho con ❤️ en Argentina