Skip to content

Context Menu Nuevo

El componente hp-context-menu muestra un menú contextual posicionado en el cursor al hacer clic derecho o con Shift+F10. Implementa el patrón WAI-ARIA Menu.

Demostración

Sin estilos (solo base.css)

Así se ve hp-context-menu usando únicamente @headless-primitives/utils/base.css. El clic derecho, la navegación por teclado y la visibilidad funcionan completamente sin estilos adicionales.

Haz clic derecho aquí (sin estilos)
Opción 1Opción 2

Con estilos personalizados

El componente estilizado usando clases CSS y variables de tema.

Haz clic derecho aquí
Acciones📋 Copiar✂️ Cortar📎 Pegar🗑️ Eliminar
html
<hp-context-menu>
  <hp-context-menu-trigger>
    <div class="trigger-area">Clic derecho aquí</div>
  </hp-context-menu-trigger>
  <hp-context-menu-content class="menu-content">
    <hp-context-menu-label>Acciones</hp-context-menu-label>
    <hp-context-menu-item value="copy">Copiar</hp-context-menu-item>
    <hp-context-menu-item value="cut">Cortar</hp-context-menu-item>
    <hp-context-menu-separator></hp-context-menu-separator>
    <hp-context-menu-item value="delete" disabled>Eliminar</hp-context-menu-item>
  </hp-context-menu-content>
</hp-context-menu>
css
hp-context-menu-content[data-state="closed"] {
  display: none;
}
hp-context-menu-content[data-state="open"] {
  position: absolute;
  background: var(--vp-c-bg);
  border: 1px solid var(--vp-c-divider);
  border-radius: 6px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  min-width: 160px;
  padding: 4px 0;
  z-index: 100;
}
hp-context-menu-item {
  padding: 6px 12px;
  cursor: pointer;
}
hp-context-menu-item:hover {
  background: var(--vp-c-bg-soft);
}
hp-context-menu-item[aria-disabled="true"] {
  opacity: 0.5;
  cursor: not-allowed;
}
hp-context-menu-separator {
  height: 1px;
  background: var(--vp-c-divider);
  margin: 4px 0;
}

Instalación

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

Features

  • ⌨️ Soporte completo de navegación por teclado (Shift+F10, flechas, Enter, Escape, Home, End).
  • ♿️ Accesibilidad WAI-ARIA incorporada (role="menu", aria-activedescendant).
  • 🎨 Sin estilos visuales (Headless) — posicionamiento dinámico en coordenadas del cursor.
  • 📏 Soporte para separadores y etiquetas de sección para organizar opciones.
  • 🔒 Gestión de estados deshabilitados por ítem o para el menú completo.

Anatomía

html
<hp-context-menu>
  <hp-context-menu-trigger></hp-context-menu-trigger>
  <hp-context-menu-content>
    <hp-context-menu-label></hp-context-menu-label>
    <hp-context-menu-item value="action1"></hp-context-menu-item>
    <hp-context-menu-separator></hp-context-menu-separator>
    <hp-context-menu-item value="action2"></hp-context-menu-item>
  </hp-context-menu-content>
</hp-context-menu>

API Reference

hp-context-menu

Contenedor raíz del menú contextual.

Atributos / Propiedades

Atributo / PropiedadTipoPor DefectoDescripción
openbooleanfalseEstado abierto/cerrado del menú.
disabledbooleanfalseDeshabilita la interacción con el menú.

Métodos

MétodoDescripción
openMenu(edge?)Abre el menú. edge: "first" | "last".
close()Cierra el menú y restaura el foco al trigger.
toggle()Alterna entre abierto y cerrado.

Eventos

EventoDetalleDescripción
hp-select{ value, label, item }Se emite al seleccionar una opción.
hp-highlight{ value, label, item }Se emite al navegar/destacar una opción con el teclado.
hp-openSe emite cuando el menú se abre.
hp-closeSe emite cuando el menú se cierra.

hp-context-menu-trigger

Área sensible al clic derecho que dispara el menú.

hp-context-menu-content

Contenedor flotante que alberga los ítems del menú.

Atributos ARIA gestionados automáticamente

  • role="menu" — Identifica el elemento como un menú de acciones.
  • data-state"open" | "closed" para animaciones CSS.
  • aria-hidden — Sincronizado con el estado de visibilidad.
  • aria-activedescendant — ID del ítem que tiene el foco virtual.

hp-context-menu-item

Opción individual dentro del menú.

Atributos / Propiedades

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

Atributos ARIA gestionados automáticamente

  • role="menuitem" — Identifica el elemento como un ítem de menú.
  • aria-disabled — Sincronizado con la propiedad disabled.

hp-context-menu-separator

Línea divisoria para separar grupos de ítems (role="separator").

hp-context-menu-label

Encabezado de sección para agrupar ítems (role="presentation").

Accesibilidad

Adhiere al patrón WAI-ARIA APG para Menu.

TeclaAcción
Clic derecho / Shift+F10Abre el menú en la posición exacta del cursor.
ArrowDown / ArrowRightMueve el foco al siguiente ítem.
ArrowUp / ArrowLeftMueve el foco al ítem anterior.
HomeSalta al primer ítem del menú.
EndSalta al último ítem del menú.
Enter / SpaceSelecciona el ítem destacado y cierra el menú.
EscapeCierra el menú y devuelve el foco al trigger.
TabCierra el menú inmediatamente.

Lanzado bajo la MIT License.