PUI.Dropdown (pui v1.0.0-alpha.29)

Copy Markdown

Dropdown menu component for displaying actions and options.

Basic Menu Button

<.menu_button>
  Open Menu
  <:item>Profile</:item>
  <:item>Settings</:item>
  <:item variant="destructive">Delete</:item>
</.menu_button>

With Shortcuts

<.menu_button content_class="w-52">
  <.icon name="hero-user" class="size-4" /> Account
  <:item shortcut="⌘P">Profile</:item>
  <:item shortcut="⌘S">Settings</:item>
  <:item shortcut="⇧⌘Q">Log out</:item>
</.menu_button>
<.menu_button>
  Actions
  <:item navigate="/profile">View Profile</:item>
  <:item patch="/settings">Edit Settings</:item>
  <:item href="/logout">Sign Out</:item>
</.menu_button>

Custom Items

For more control, use the :items slot with menu_item:

<.menu_button content_class="w-56">
  Options
  <:items>
    <.menu_item navigate="/dashboard">
      <.icon name="hero-home" class="size-4" /> Dashboard
    </.menu_item>
    <.menu_separator />
    <.menu_item variant="destructive" phx-click="delete">
      <.icon name="hero-trash" class="size-4" /> Delete
    </.menu_item>
  </:items>
</.menu_button>

Destructive Actions

<.menu_button>
  Danger Zone
  <:item variant="destructive" shortcut="⌘⌫">
    <.icon name="hero-trash" class="size-4" /> Delete Account
  </:item>
</.menu_button>

Attributes (menu_button/1)

AttributeTypeDefaultDescription
variantstring"secondary"Button variant style
placementstring"bottom-start"Popup placement for Floating UI
wrapper_classstring"w-fit"Classes for the outer wrapper
content_classstring""CSS classes for dropdown content
classstring""Additional CSS classes for button

Slots (menu_button/1)

SlotDescription
inner_blockButton content (required)
itemMenu items with optional attributes
itemsCustom menu content using menu_item

Item Attributes

AttributeTypeDescription
variantstringItem style: "default" or "destructive"
shortcutstringKeyboard shortcut display
hrefstringLink URL
navigatestringPhoenix navigate path
patchstringPhoenix patch path

Unstyled Mode

When variant="unstyled", PUI still toggles aria-hidden on the popup. Your content_class should include both the hidden and visible selectors, for example:

<.menu_button
  variant="unstyled"
  content_class="aria-hidden:hidden not-aria-hidden:block min-w-48"
>
  ...
</.menu_button>

Summary

Functions