Skip to content

Select Nuevo

El componente hp-select implementa el patrón WAI-ARIA Select-only Combobox, con popup anchored, navegación completa por teclado, roving tabindex y soporte nativo de formularios HTML.

Demostración

Sin estilos (solo base.css)

AppleBananaCherry

Con estilos personalizados

🍎 Apple🍌 Banana🍒 Cherry📅 Date (deshabilitado)🫐 Elderberry
html
<hp-select name="fruit" placeholder="Elige una fruta">
  <hp-select-trigger>
    <hp-select-value></hp-select-value>
    <span aria-hidden="true">▼</span>
  </hp-select-trigger>
  <hp-select-content>
    <hp-select-item value="apple">Manzana</hp-select-item>
    <hp-select-item value="banana">Plátano</hp-select-item>
    <hp-select-item value="date" disabled>Dátil</hp-select-item>
  </hp-select-content>
</hp-select>
css
hp-select-trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0.5rem 1rem;
  border: 1px solid #e5e7eb;
  border-radius: 6px;
  cursor: pointer;
}

hp-select-trigger[aria-expanded="true"] {
  border-color: #3b82f6;
  box-shadow: 0 0 0 1px #3b82f6;
}

hp-select-content[data-state="closed"] {
  display: none;
}

hp-select-item[aria-selected="true"] {
  background: #eff6ff;
  color: #3b82f6;
  font-weight: 500;
}

hp-select-item[aria-disabled="true"] {
  opacity: 0.5;
  cursor: not-allowed;
}

Instalación

bash
pnpm add @headless-primitives/select
bash
npm install @headless-primitives/select
bash
yarn add @headless-primitives/select
bash
bun add @headless-primitives/select

Features

  • ⌨️ Navegación completa: flechas, Home, End, Escape, Enter/Space.
  • ♿️ role="combobox", role="listbox", role="option", aria-expanded y aria-selected automáticos.
  • 🎨 Sin estilos visuales (Headless) — posicionamiento computado automático.
  • 📋 Integración con formularios HTML via <input type="hidden"> generado.
  • 🔒 Items deshabilitados individualmente.

Anatomía

html
<hp-select>
  <hp-select-trigger>
    <hp-select-value></hp-select-value>
  </hp-select-trigger>
  <hp-select-content>
    <hp-select-item value="option-1"></hp-select-item>
    <hp-select-item value="option-2"></hp-select-item>
  </hp-select-content>
</hp-select>

API Reference

hp-select

Contenedor raíz con gestión de estado y formularios.

Atributos / Propiedades

Atributo / PropiedadTipoPor DefectoDescripción
valuestring | nullnullValor seleccionado.
openbooleanfalseEstado abierto/cerrado.
disabledbooleanfalseDeshabilita el select.
namestring""Nombre para integración con formularios.
placeholderstring""Texto cuando no hay selección.
requiredbooleanfalseCampo requerido en formularios.

Métodos

MétodoDescripción
openSelect(edge?)Abre el select. edge: "first" | "last".
close()Cierra el select y devuelve foco al trigger.
toggle()Alterna abierto/cerrado.
select(value)Selecciona un item por valor.
clear()Limpia la selección (value = null).

Eventos

EventoDetalleDescripción
hp-change{ value, label, item }Cuando el usuario selecciona un item.
hp-highlight{ value, label, item }Cuando un item se destaca con teclado.
hp-openCuando el popup se abre.
hp-closeCuando el popup se cierra.

hp-select-trigger

Botón que abre/cierra el popup.

Atributos ARIA gestionados automáticamente

  • role="combobox" — Siempre presente.
  • aria-expanded"true" | "false".
  • aria-disabled — Sincronizado con disabled.
  • aria-controls — ID del content.
  • aria-activedescendant — ID del item activo.
  • tabindex="0" — Siempre focusable.

hp-select-value

Muestra el texto del valor seleccionado o placeholder.

hp-select-content

Popup listbox con los items.

Atributos ARIA gestionados automáticamente

  • role="listbox" — Siempre presente.
  • data-state"open" | "closed".
  • aria-hidden — Sincronizado con estado.

hp-select-item

Opción individual.

Atributos / Propiedades

Atributo / PropiedadTipoPor DefectoDescripción
valuestring""Identificador único del item.
disabledbooleanfalseDeshabilita el item.

Atributos ARIA gestionados automáticamente

  • role="option" — Siempre presente.
  • aria-selected"true" | "false".
  • aria-disabled — Sincronizado con disabled.

Accesibilidad

Adhiere al patrón WAI-ARIA APG para Select-only Combobox.

TeclaAcción
Enter / SpaceAbre el select (trigger) o selecciona el item activo (content).
ArrowDownAbre y mueve al primer item (trigger) o siguiente item (content).
ArrowUpAbre y mueve al último item (trigger) o anterior item (content).
HomeMueve al primer item habilitado.
EndMueve al último item habilitado.
EscapeCierra el popup y devuelve foco al trigger.

Lanzado bajo la MIT License.