Formularios
Input
El campo de texto. Tres alturas y el mismo cuerpo que Select, Combobox y Textarea.
import { Input } from "sebs7n-ui/input"Ejemplos
Con etiqueta
import { Input } from "sebs7n-ui/input"
import { Label } from "sebs7n-ui/label"
import { useId } from "react"
function ConEtiqueta() {
const id = useId()
return (
<div className="flex w-full max-w-sm flex-col gap-2">
<Label htmlFor={id} required>
Razón social
</Label>
<Input id={id} placeholder="Acme S.A." />
</div>
)
}Tamaños
import { Input } from "sebs7n-ui/input"
function Tamanos() {
return (
<div className="flex w-full max-w-sm flex-col gap-3">
<Input size="sm" placeholder="sm · 32px" />
<Input size="md" placeholder="md · 40px" />
<Input size="lg" placeholder="lg · 48px" />
</div>
)
}Error
`aria-invalid` es todo: el borde rojo y el anillo salen de ahí.
Escribí un email válido, con dominio.
import { Input } from "sebs7n-ui/input"
import { Label } from "sebs7n-ui/label"
import { useId, useState } from "react"
function Error() {
const id = useId()
const [valor, setValor] = useState("acme@")
const invalido = !/^[^@\s]+@[^@\s.]+\.[^@\s]+$/.test(valor)
return (
<div className="flex w-full max-w-sm flex-col gap-2">
<Label htmlFor={id}>Email</Label>
<Input
aria-describedby={invalido ? `${id}-error` : undefined}
aria-invalid={invalido || undefined}
id={id}
onChange={(event) => setValor(event.target.value)}
type="email"
value={valor}
/>
{invalido && (
<p className="text-copy-13 text-red-900" id={`${id}-error`}>
Escribí un email válido, con dominio.
</p>
)}
</div>
)
}Deshabilitado y solo lectura
import { Input } from "sebs7n-ui/input"
function Estados() {
return (
<div className="flex w-full max-w-sm flex-col gap-3">
<Input defaultValue="No se puede editar" disabled />
<Input defaultValue="30-71234567-9" readOnly />
</div>
)
}Props
Generadas del TypeScript del paquete. Solo las props propias: las heredadas del primitivo de Base UI o del elemento HTML están en la línea «hereda de».
Input
Hereda las props de Input.
| Prop | Tipo | Por defecto | Descripción |
|---|---|---|---|
size | "sm" | "md" | "lg" | "md" | sm 32px · md 40px · lg 48px, con el texto un paso más grande. |
className | string | — |
Teclado
- Tab
- Entra y sale del campo.
- Escape
- No hace nada por defecto: si limpia el campo, lo implementa la app.
Accesibilidad
- `aria-invalid` es todo lo que hace falta para el error: el borde rojo y el anillo salen de ahí, no de una clase aparte.
- Siempre con
Labelasociado porhtmlFor/id. Unplaceholderno es una etiqueta: desaparece al escribir. - El mensaje de error va en un
<p id="…-error">referenciado conaria-describedby, para que se lea al enfocar. focus:focus-borderen vez del anillo: en un campo el borde teñido molesta menos y se ve igual.
Reglas de uso
- El tamaño se elige una vez por formulario, no por campo.
md(40px) es el de una app;lgpara un formulario de una sola pregunta. typeimporta más que el estilo:email,tel,urlynumericcambian el teclado del celular.- Un campo obligatorio se marca en el
Label(required), no con un asterisco pegado al placeholder. - Para un buscador con sugerencias no uses
Inputa mano:ComboboxoAutocomplete.