Saltar al contenido principal

Core · Campos de formulario

Partes del campo

Lo que envuelve a un control: la etiqueta, la pista, el error y el grupo.

Esta traducción la ha escrito una IA y todavía no la ha revisado ninguna persona. Leer esta página en inglés

Etiqueta, pista y error

El texto que da nombre a un control, dice lo que necesita e indica qué ha fallado.

Letters, numbers and dashes.
Error: Use letters, numbers and dashes only.

Código

Copiar el marcado

.luz-field envuelve la etiqueta, el control, la pista y el error. aria-describedby une la pista y el error al control:

HTML
<div class="luz-field">
  <label class="luz-field__label luz-field__label--required" for="slug">Slug</label>
  <input class="luz-input luz-input--error" id="slug" type="text" required aria-invalid="true" aria-describedby="slug-hint slug-error">
  <div class="luz-field__helper" id="slug-hint">Letters, numbers and dashes.</div>
  <div class="luz-field__error" id="slug-error"><span class="u-sr-only">Error: </span>Use letters, numbers and dashes only.</div>
</div>

Variantes y opciones

  • .luz-field__label: la etiqueta visible. --required añade detrás un « *» rojo.
  • .luz-field__helper: la pista, bajo el control. .luz-field__error: el error, en el color de peligro.
  • .luz-input--error con aria-invalid="true": un subrayado de peligro de 2 px en el control.

Cómo funciona

La etiqueta da nombre al control mediante for e id, y un clic en ella lleva el foco al control. LUZ no marca un campo como no válido por ti: añade la clase de error, aria-invalid y el mensaje cuando falle tu validación.

Sin JavaScript

La etiqueta, la pista y el error son texto de tu HTML, así que se muestran sin script. El navegador sigue comprobando required y el tipo al enviar el formulario.

Teclado y ARIA

  • Una etiqueta y un mensaje no reciben el foco y no tienen teclas propias.
  • Escribe «Error: » antes del texto del error, oculto con .u-sr-only si quieres, y enumera la pista y el error en aria-describedby.

El contraste y el foco están en la pestaña Diseño.

Diseño

Cuándo usarlo

Usa una etiqueta en cada control, una pista cuando el lector necesite el formato o el motivo, y un error cuando falle una comprobación.

  • La etiqueta siempre se ve: permanece en pantalla mientras el lector escribe.
  • El error va junto al campo al que se refiere, con palabras.

Cuándo no usarlo

No sustituyas una de estas partes por otra ni ocultes ninguna.

  • Un texto de ejemplo (placeholder) no es una etiqueta: desaparece cuando el lector escribe.
  • Un color o un borde solos no son un error: di qué está mal. No muestres el error solo en un aviso emergente: desaparece.

Qué hacer y qué no

Hazlo Un error junto al campo que dice cómo corregirlo.
Evítalo Un borde rojo sin palabras: el lector no sabe qué cambiar.

Cómo escribir el contenido

  • La etiqueta es un sustantivo corto, con mayúscula solo al inicio: «Nombre del proyecto».
  • La pista indica el formato o por qué lo pides.
  • El error dice qué está mal y cómo corregirlo. Si marcas los campos obligatorios con «*», explica una vez, sobre el formulario, qué significa.

Contraste y foco

Compartido con las demás partes del campo: contraste y foco de las partes del campo.

Tokens que usa

Compartido con las demás partes del campo: tokens de las partes del campo.

El teclado y ARIA están en la pestaña Código.

Grupo de campos

Un grupo con borde de controles relacionados, con el nombre de su leyenda.

Shipping address

Código

Copiar el marcado

Un <fieldset> nativo cuyo primer hijo es un <legend>:

HTML
<fieldset class="luz-fieldset">
  <legend>Shipping address</legend>
  <div class="luz-field">
    <label class="luz-field__label" for="street">Street</label>
    <input class="luz-input" id="street" type="text">
  </div>
  <div class="luz-field">
    <label class="luz-field__label" for="city">City</label>
    <input class="luz-input" id="city" type="text">
  </div>
</fieldset>

Variantes y opciones

  • disabled en el grupo desactiva todos los controles que contiene.
  • role="group" con aria-labelledby en un <div> da nombre a un grupo sin borde, como hace el ejemplo de la casilla de verificación.

Cómo funciona

Un <fieldset> nativo estilizado por components/form.css: un borde de 1 px, esquinas suaves y el fondo del campo. El <legend> es un texto pequeño en mayúsculas.

Sin JavaScript

No cambia nada: el grupo y su leyenda son nativos y no necesitan script.

Teclado y ARIA

  • Un grupo no recibe el foco; Tab recorre los controles que contiene.
  • La leyenda da nombre al grupo: el navegador expone un fieldset como un grupo con el nombre de su leyenda.

El contraste y el foco están en la pestaña Diseño.

Diseño

Cuándo usarlo

Usa un grupo de campos para controles que responden juntos a una sola pregunta.

  • Un conjunto de botones de opción o de casillas, o una dirección.
  • Pon la leyenda primero y mantenla corta.

Cuándo no usarlo

Un grupo de campos es un grupo con nombre, no una caja para maquetar.

  • Un solo control: su etiqueta basta.
  • Espaciado o columnas: los objetos de maquetación, o-stack u o-grid. No envuelvas cada sección de un formulario.

Qué hacer y qué no

Hazlo Una leyenda que nombra el grupo al que responden juntos los controles.
Evítalo Un grupo alrededor de un solo campo: su leyenda repite la etiqueta.

Cómo escribir el contenido

  • La leyenda es un sustantivo o una pregunta: «Dirección de envío», «Plan».
  • Sin dos puntos al final: el estilo añade el espacio.
  • No repitas la leyenda en cada etiqueta.

Contraste y foco

Compartido con las demás partes del campo: contraste y foco de las partes del campo.

Tokens que usa

Compartido con las demás partes del campo: tokens de las partes del campo.

El teclado y ARIA están en la pestaña Código.

Contraste y foco de las partes del campo

La etiqueta y la pista son texto secundario de la página; el error es texto de peligro.

ParteColor sobre el fondoClaroOscuroAlto contrasteMínimo
Etiqueta
--luz-text-secondary sobre --luz-surface-page
6,2:1
7,5:1
19,3:1
4,5:1
Pista
--luz-text-secondary sobre --luz-surface-page
6,2:1
7,5:1
19,3:1
4,5:1
Mensaje de error
--luz-color-danger sobre --luz-surface-page
5,3:1
11,7:1
9,3:1
4,5:1
Asterisco de obligatorio
--luz-color-danger sobre --luz-surface-page
5,3:1
11,7:1
9,3:1
4,5:1
Borde de error
--luz-color-danger sobre --luz-input-bg
5,5:1
10,8:1
9,3:1
3:1
Leyenda
--luz-text-secondary sobre --luz-input-bg
6,4:1
6,9:1
19,3:1
4,5:1

Medido a partir de los valores de los tokens de cada modo y redondeado hacia abajo. El mínimo requerido es el de WCAG 2.2 AA: 4,5:1 para texto y 3:1 para anillos de foco, bordes e iconos.

  • Foco: una etiqueta, un mensaje y una leyenda no lo reciben; un clic en una etiqueta lleva el foco a su control.
  • No depende solo del color: un campo no válido tiene un borde inferior de 2 px y un mensaje de error con palabras.
  • Objetivo táctil: un clic en una etiqueta llega a su control.

Tokens de las partes del campo

Los 12 tokens que leen las reglas de estos controles, por familia de tokens. Cada familia enlaza a su página, con los valores de todos los modos.

Espaciado y tamaños
--luz-space-2xs, --luz-space-lg, --luz-space-md, --luz-space-xs
Tipografía
--luz-font-sans, --luz-text-md, --luz-text-sm
Radio
--luz-radius-md

Problemas conocidos

Ninguno conocido.