Campo de texto

Aquí hay dos capas. input() y textarea() son los controles pelados; textField() y textareaField() envuelven uno en etiqueta, texto de ayuda y mensaje de error, y los conectan con for y aria-describedby. Tira de los segundos salvo que estés construyendo la maquetación tú.

Campo básico

textField({ label: 'Nombre', name: 'name', placeholder: 'Ada Lovelace' })

Texto de ayuda

El texto de ayuda se enlaza con aria-describedby, así que un lector de pantalla lo lee como parte del campo y no como texto suelto detrás.

Solo lo usamos para avisarte de compilaciones fallidas.
textField({
  label: 'Correo',
  name: 'email',
  type: 'email',
  help: 'Solo lo usamos para avisarte de compilaciones fallidas.',
})

Obligatorio y con error

Un error marca el campo como inválido, colorea el borde, pone aria-invalid y apunta aria-describedby al mensaje: una prop, las cuatro cosas.

Eso no es una URL.
stack({ gap: 'lg' },
  textField({ label: 'Proyecto', name: 'project', required: true, value: '' }),
  textField({
    label: 'Sitio',
    name: 'site',
    error: 'Eso no es una URL.',
    value: 'sitelo punto dev',
  }),
)

Tamaños

stack({ gap: 'md' },
  textField({ label: 'Pequeño', name: 'small', size: 'sm', placeholder: 'sm' }),
  textField({ label: 'Mediano', name: 'medium', size: 'md', placeholder: 'md' }),
  textField({ label: 'Grande', name: 'large', size: 'lg', placeholder: 'lg' }),
)

Adornos

Un prefijo o un sufijo pegados al propio control, para unidades y trozos fijos de un valor.

https://
segundos
stack({ gap: 'md' },
  textField({ label: 'Sitio', name: 'url', startAdornment: 'https://', placeholder: 'example.com' }),
  textField({ label: 'Tiempo límite de compilación', name: 'timeout', endAdornment: 'segundos', value: '30' }),
)

Deshabilitado y de solo lectura

stack({ gap: 'md' },
  textField({ label: 'Deshabilitado', name: 'disabled', value: 'No se puede editar', disabled: true }),
  textField({ label: 'Solo lectura', name: 'readonly', value: 'dist/', readonly: true }),
)

Multilínea

textareaField() es el mismo campo alrededor de un <textarea>. Su valor es contenido del elemento y no un atributo, cosa de la que se encarga el componente.

Se muestra en los resultados de búsqueda y en las tarjetas sociales.
textareaField({
  label: 'Descripción',
  name: 'description',
  rows: 4,
  help: 'Se muestra en los resultados de búsqueda y en las tarjetas sociales.',
  value: 'Generación de sitios estáticos sin configuración, sobre Vite.',
})

En un formulario

card(
  cardBody(
    stack({ gap: 'md' },
      textField({ label: 'Nombre', name: 'contact-name', required: true }),
      textField({ label: 'Correo', name: 'contact-email', type: 'email', required: true }),
      textareaField({ label: 'Mensaje', name: 'message', rows: 3 }),
    ),
  ),
  cardFooter({ divided: true, style: 'justify-content: flex-end' },
    button({ variant: 'ghost', color: 'neutral' }, 'Cancelar'),
    button({ type: 'submit' }, 'Enviar'),
  ),
)

Construirlo tú

field() es el envoltorio por su cuenta: admite cualquier control como hijo, así que puedes poner dos inputs en una fila, o un control que esta biblioteca no tiene, con el mismo tratamiento de etiqueta y error.

Una etiqueta no puede nombrar a dos controles, así que aquí cada input necesita su propio nombre accesible. Eso es lo que hacen los aria-label: la etiqueta visible nombra la pareja, y cada input dice qué extremo es.

Ambos extremos se incluyen.
field({ label: 'Rango de fechas', help: 'Ambos extremos se incluyen.' },
  stack({ direction: 'row', gap: 'sm' },
    input({ type: 'date', name: 'from', 'aria-label': 'Desde' }),
    input({ type: 'date', name: 'to', 'aria-label': 'Hasta' }),
  ),
)

Props

textField y textareaField

PropTipoPor defectoDescripción
labelChild—La etiqueta del campo. También deriva el id del control cuando no hay name.
namestring—Nombre del campo; el id se deriva de él.
helpChild—Pista bajo el control, enlazada con aria-describedby.
errorChild | false—Mensaje de error. También pone aria-invalid en el control.
requiredbooleanfalseMarca la etiqueta y el control.
size'sm' | 'md' | 'lg''md'Altura del control y tamaño del texto.
typestring'text'Cualquier tipo de input. Solo en textField.
startAdornmentChild—Prefijo pegado al control. Solo en textField.
endAdornmentChild—Sufijo pegado al control. Solo en textField.
valuestring | number—Valor inicial.
fieldClassstring—Clase para el envoltorio, no para el control.

Los ids se derivan de name — o de label cuando no hay name — y no de un contador, así que la misma página genera el mismo HTML en cada compilación. Pasa id para imponer otro.

field

PropTipoPor defectoDescripción
labelChild—El texto de la etiqueta.
helpChild—Pista bajo el control.
errorChild | false—Mensaje de error; también añade el estado inválido al envoltorio.
requiredbooleanfalseAñade la marca de obligatorio a la etiqueta.
forstring—Id del control al que etiqueta.