Skip to content

Events

Event model, keyboard navigation, and hook filtering across all adapters.

Delivery by adapter

All adapters emit the same event types. Delivery mechanism varies:

AdapterDelivery
DOM (AlapUI)Constructor callback options (onItemHover, etc.)
Web ComponentCustom DOM events (alap:item-hover, etc.) — bubble, composed
ReactCallback props (onItemHover, etc.)
VueEmitted events (@item-hover, etc.)
SvelteCallback props (onItemHover, etc.)
SolidJSCallback props (onItemHover, etc.)
QwikQRL callback props (onItemHover$, etc.)
AlpineCustom DOM events (alap:item-hover, etc.) — bubble

Event types

TriggerHoverDetail

Fired when mouse enters a trigger element.

typescript
{ query: string; anchorId?: string }

TriggerContextDetail

Fired on right-click of a trigger element.

typescript
{ query: string; anchorId?: string; event: MouseEvent }

ItemHoverDetail

Fired when mouse enters a menu item.

typescript
{ id: string; link: AlapLink; query: string }

ItemContextDetail

Fired on right-click of a menu item, or ArrowRight key on a focused item (if the item has item-context in its hooks).

typescript
{ id: string; link: AlapLink; query: string; event: MouseEvent | KeyboardEvent }

ItemContextDismissDetail

Fired on ArrowLeft key on a focused menu item (if the item has item-context in its hooks).

typescript
{ id: string; link: AlapLink; query: string }

Hook filtering

Events only fire for items that opt in via hooks. An item participates if:

  1. It has hooks: ['item-hover'] (per-item), OR
  2. The global settings.hooks includes 'item-hover'

The resolved hooks are written to data-alap-hooks on the rendered <a> element.

typescript
// Building a context menu on right-click
onItemContext: ({ id, link, event }) => {
  event.preventDefault();
  showContextPopup({
    x: event instanceof MouseEvent ? event.pageX : 0,
    y: event instanceof MouseEvent ? event.pageY : 0,
    title: link.label,
    image: link.thumbnail,
    description: link.description,
    directUrl: link.url,
  });
}

Keyboard navigation

All adapters implement the same keyboard bindings:

KeyAction
ArrowDownFocus next menu item (wraps to first)
ArrowUpFocus previous menu item (wraps to last)
HomeFocus first item
EndFocus last item
EscapeClose menu, return focus to trigger
TabClose menu, continue normal tab order
ArrowRightFire item-context on focused item (if item has item-context hook)
ArrowLeftFire item-context-dismiss (if item has item-context hook)
Enter / SpaceActivate focused link

Dismiss behavior

Menus auto-dismiss via three channels:

  1. Mouse leave timeout — configurable via settings.menuTimeout (default: 5000ms)
  2. Click outside — clicking anywhere outside the menu closes it
  3. Escape key — returns focus to the trigger