SutraUI.DropdownMenu (Sutra UI v0.2.0)

View Source

A dropdown menu component that displays a list of actions or options.

The dropdown menu provides a trigger button that opens a popover menu with full keyboard navigation support:

  • Click to open/close the menu
  • Arrow keys (Up/Down) for navigation
  • Home/End keys to jump to first/last item
  • Enter/Space to activate items
  • Escape to close the menu
  • Mouse hover to highlight items
  • Automatic closure when clicking outside

Requirements

  • A unique id attribute is required for the JavaScript hook
  • The component uses CSS anchor positioning for popover placement

Examples

# Basic dropdown menu
<.dropdown_menu id="user-menu">
  <:trigger>Options</:trigger>
  <.dropdown_item><a href="/profile">Profile</a></.dropdown_item>
  <.dropdown_item><.link navigate={~p"/settings"}>Settings</.link></.dropdown_item>
  <.dropdown_separator />
  <.dropdown_item variant="destructive">
    <.link href={~p"/logout"} method="delete">Logout</.link>
  </.dropdown_item>
</.dropdown_menu>

# With icons and shortcuts
<.dropdown_menu id="file-menu">
  <:trigger>File</:trigger>
  <.dropdown_item shortcut="Ctrl+N">
    <a href="/new">New</a>
  </.dropdown_item>
  <.dropdown_item shortcut="Ctrl+O">
    <a href="/open">Open</a>
  </.dropdown_item>
</.dropdown_menu>

# With groups and labels
<.dropdown_menu id="settings-menu">
  <:trigger>Settings</:trigger>
  <.dropdown_label>Account</.dropdown_label>
  <.dropdown_item><a href="/profile">Profile</a></.dropdown_item>
  <.dropdown_item><a href="/billing">Billing</a></.dropdown_item>
  <.dropdown_separator />
  <.dropdown_label>Danger Zone</.dropdown_label>
  <.dropdown_item variant="destructive">
    <button phx-click="delete_account">Delete Account</button>
  </.dropdown_item>
</.dropdown_menu>

# With disabled items
<.dropdown_menu id="edit-menu">
  <:trigger>Edit</:trigger>
  <.dropdown_item><button phx-click="cut">Cut</button></.dropdown_item>
  <.dropdown_item><button phx-click="copy">Copy</button></.dropdown_item>
  <.dropdown_item disabled><button>Paste</button></.dropdown_item>
</.dropdown_menu>

# Custom positioning
<.dropdown_menu id="actions-menu" side="top" align="end">
  <:trigger>Actions</:trigger>
  <.dropdown_item><button phx-click="action1">Action 1</button></.dropdown_item>
  <.dropdown_item><button phx-click="action2">Action 2</button></.dropdown_item>
</.dropdown_menu>

Accessibility

  • The trigger button has aria-haspopup="menu" and aria-expanded attributes
  • The menu has role="menu" and is referenced by aria-controls
  • Menu items have role="menuitem"
  • The active item is tracked via aria-activedescendant
  • Disabled items have aria-disabled="true"
  • Keyboard navigation follows WAI-ARIA menu pattern

Summary

Functions

Renders a menu item wrapper.

Renders a non-interactive label for a group of items.

Renders a dropdown menu component.

Renders a separator between menu items.

Functions