Saltar al contenido
EspañolEnglish
Todos los componentes (204)

Campo de texto

Campos · TextField · .amset-field

Qué es y cuándo usarlo

El campo de una línea, con etiqueta, ayuda y error ya cableados: el propio campo pone el for/id y el aria-describedby, así que no hay forma de montarlo sin relación accesible entre las partes. Por dentro es un <input> nativo.

Cuándo usarlo

  • Nombres, correos, referencias: cualquier texto corto. Con type="email", tel o url, el móvil saca el teclado que toca.
  • front y back para un icono, un prefijo o una unidad dentro de la caja.
  • numeric para cifras que tienen que cuadrar en columna (referencias, NIF, fechas escritas).
  • readOnly para un dato que se puede copiar pero no cambiar: el borde pasa a discontinuo.
  • inputRef para llegar al <input> de verdad (darle el foco, medirlo), no a la caja.

Cuándo no

  • Un número que se suma o tiene mínimo y máximo: NumberField.
  • Más de una línea: TextArea. Una contraseña: PasswordField.
  • Un NIF, un IBAN, un teléfono o una tarjeta: DocumentField, IbanField, PhoneField o CardField, que además los comprueban.
  • Elegir de una lista larga: SearchField.

Teclado: Tab llega al campo y se escribe como en cualquier entrada. Deshabilitado sale del orden del Tab; en solo lectura se sigue pudiendo enfocar y copiar.

Accesibilidad: la etiqueta es obligatoria; con hiddenLabel solo la oye el lector de pantalla, para cuando lo de alrededor ya lo explica. La ayuda y el error se leen como descripción del campo. El asterisco de obligatorio no entra en el nombre: se dice con aria-required. Con el dedo, la caja pasa a 48 px y la letra a 16 px, para que el iPhone no amplíe la página.

Aspecto fino: variables CSS --amset-field-height, -padding, -font, -label, -description, -radius, -background y -border.

Cómo se ve

Como aparece en el documento
Ese correo ya está dado de alta

<TextField label="Nombre y apellidos" placeholder="Ada Lovelace" hint="Como aparece en el documento" />
<TextField label="Correo" type="email" error="Ese correo ya esta dado de alta" />

Props

Se importa con import { TextField } from '@amset/ui'. Las obligatorias van marcadas.

PropTipoPara qué sirve
labelobligatoriastringObligatoria: un campo sin etiqueta visible no entra en la libreria.
backReactNodeContenido detras del texto: una unidad ("€"), un boton de copiar.
classNamestring—
defaultValuestring—
disabledboolean—
errorstringMensaje de error. Al pasarlo, el campo queda marcado como invalido.
frontReactNodeContenido delante del texto: un icono, un prefijo ("+34").
hiddenLabelbooleanLa etiqueta solo para el lector de pantalla. Para cuando el campo va dentro de algo que ya se explica solo (el buscador de un grupo de filtros), nunca para ahorrar espacio.
hintstringTexto de ayuda permanente bajo el campo. No sustituye a la etiqueta.
inputRefRef<HTMLInputElement>El `<input>` de verdad, para enfocarlo, seleccionar su texto o medirlo desde fuera. Va aparte del `ref` porque el componente pinta una caja con etiqueta, ayuda y error, y quien pide un ref casi siempre quiere el control.
invalidboolean—
numericbooleanCifras con ancho fijo (importes, NIF, fechas).
onChange(value: string) => void—
onChangeEvent(event: ChangeEvent<HTMLInputElement>) => voidComo `onChange`, pero con el evento nativo del `<input>`: `e.target.value`, `e.currentTarget`... Existe para migrar un front que ya escribe sus manejadores con el evento (AMS-735). Si solo quieres el texto, `onChange` lo entrega ya.
placeholderstring—
readOnlyboolean—
requiredboolean—
size"sm" | "md" | "lg"—
validationBehavior"aria" | "native"`aria` (por defecto) anuncia el estado sin que el navegador interrumpa el envio con su globo; `native` añade ademas su validacion.
valuestring—
variantFieldVariant—

Acepta además los atributos del elemento que pinta: className, style, data-*, aria-* y sus eventos.

Mandos

Estas variables CSS son la forma de adaptarlo. Se declaran sobre el selector del componente, no en :root: la hoja las redeclara en la propia regla y una declaración en el mismo elemento gana siempre.

VariablePor defecto
--amset-field-heightvar(--amset-height-control)
--amset-field-paddingvar(--amset-space-3)
--amset-field-fontvar(--amset-text-base)
--amset-field-labelvar(--amset-text-sm)
--amset-field-descriptionvar(--amset-text-sm)
--amset-field-radiusvar(--amset-radius)
--amset-field-backgroundvar(--amset-surface)
--amset-field-bordervar(--amset-border-bold)
--amset-field-familyvar(--amset-font)
--amset-field-shadowvar(--amset-shadow-1)
--amset-field-gapvar(--amset-space-1)
--amset-field-label-linevar(--amset-line-tight)
--amset-field-inkvar(--amset-ink)
--amset-field-label-colorinherit
--amset-field-label-familyinherit
--amset-field-label-weightvar(--amset-weight-medium)
--amset-field-label-transformnone
--amset-field-label-spacingnormal
--amset-field-required-displayinline
--amset-field-focus-shadow0 0 0 1px var(--amset-focus)

Cómo se cambia

.amset-field {
  --amset-field-height: ...;
  --amset-field-padding: ...;
}

En el banco de pruebas

Cada estado y cada variante, para tocarlos de uno en uno, en su ficha de ui.amset.tech: