Entrada
Un campo de texto de una sola línea para iniciar sesión, barras de búsqueda y formularios de pago, con el estilo neobrutalista de borde grueso y sombra marcada.
import {
Field,
FieldDescription,El input captura una sola línea de texto: nombres, correos, consultas de búsqueda. Está construido sobre el componente Base UI Input, una envoltura fina sobre el <input> nativo, y vestido con la receta neobrutalista: borde grueso, sombra marcada y un contorno de foco de alto contraste.
Recurre a este componente cuando:
- Formularios de acceso y registro — campos de correo, usuario y contraseña combinados con
FieldyFieldLabel. - Barras de búsqueda — en línea con un
Button, o con iconos medianteInputGroup. - Páginas de pago y ajustes — direcciones, números de tarjeta y campos de perfil dispuestos en un
FieldGroup.
Instalación#
pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/input.jsonnpx shadcn@latest add https://neobrutalism.com/r/base/input.jsonyarn dlx shadcn@latest add https://neobrutalism.com/r/base/input.jsonbunx --bun shadcn@latest add https://neobrutalism.com/r/base/input.json
Copia y pega el siguiente código en tu proyecto.
import * as React from "react"
import { cn } from "@/lib/utils"
function Input({ className, type, ...props }: React.ComponentProps<"input">) {
return (
<input
type={type}
data-slot="input"
className={cn(
"h-8 w-full min-w-0 rounded border-2 bg-input px-3 py-2 text-sm shadow-sm transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive",
className
)}
{...props}
/>
)
}
export { Input }
Actualiza las rutas de importación según la configuración de tu proyecto.
Uso#
import { Input } from "@/components/ui/input"<Input />Ejemplos#
Básico#
import { Input } from "@/components/ui/input"
export function InputBasic() {Field#
Usa Field, FieldLabel y FieldDescription para crear un campo con una
etiqueta y una descripción.
import {
Field,
FieldDescription,Field Group#
Usa FieldGroup para mostrar varios bloques Field y construir formularios.
import { Button } from "@/components/ui/button"
import {
Field,Deshabilitado#
Usa la prop disabled para deshabilitar el campo. Para aplicar estilos al estado deshabilitado, añade el atributo data-disabled al componente Field.
import {
Field,
FieldDescription,No válido#
Usa la prop aria-invalid para marcar el campo como no válido. Para aplicar estilos al estado no válido, añade el atributo data-invalid al componente Field.
import {
Field,
FieldDescription,Archivo#
Usa la prop type="file" para crear un campo de selección de archivos.
import {
Field,
FieldDescription,En línea#
Usa Field con orientation="horizontal" para crear un campo en línea.
Combínalo con Button para crear un campo de búsqueda con un botón.
import { Button } from "@/components/ui/button"
import { Field } from "@/components/ui/field"
import { Input } from "@/components/ui/input"Cuadrícula#
Usa una disposición en cuadrícula para colocar varios campos uno al lado del otro.
import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
import { Input } from "@/components/ui/input"
Obligatorio#
Usa el atributo required para indicar los campos obligatorios.
import {
Field,
FieldDescription,Badge#
Usa Badge en la etiqueta para destacar un campo recomendado.
import { Badge } from "@/components/ui/badge"
import { Field, FieldLabel } from "@/components/ui/field"
import { Input } from "@/components/ui/input"Input Group#
Para añadir iconos, texto o botones dentro de un campo, usa el componente InputGroup. Consulta el componente Input Group para ver más ejemplos.
import { InfoIcon } from "lucide-react"
import { Field, FieldLabel } from "@/components/ui/field"Button Group#
Para añadir botones a un campo, usa el componente ButtonGroup. Consulta el componente Button Group para ver más ejemplos.
import { Button } from "@/components/ui/button"
import { ButtonGroup } from "@/components/ui/button-group"
import { Field, FieldLabel } from "@/components/ui/field"Formulario#
Un ejemplo de formulario completo con varios campos, un select y un botón.
import { Button } from "@/components/ui/button"
import {
Field,RTL#
Para activar el soporte RTL en Neobrutalism, consulta la guía de configuración de RTL.
"use client"
import * as React from "react"Accesibilidad#
Input renderiza un <input> nativo, así que la edición con teclado, el foco y el envío del formulario no necesitan configuración ARIA. Lo que queda corre de tu cuenta:
- Etiqueta todos los inputs. Acompáñalo de un
FieldLabel(o de un<label htmlFor>): unplaceholderno es una etiqueta; desaparece al escribir y no se anuncia de forma fiable. - Asocia el texto de error. Establece
aria-invaliden el input y apuntaaria-describedbyal id de tuFieldErroroFieldDescriptionpara que los lectores de pantalla lean el mensaje junto con el campo. - Elige bien
typeyautocomplete.type="email"másautocomplete="email"consigue el teclado móvil correcto y el autocompletado.