The Dropdown component provides a trigger button with a floating menu of actions. Built on top of PUI's Popover, it supports keyboard navigation, shortcuts display, separators, and destructive action variants.
Import
use PUI
# or
import PUI.Dropdown
Basic Usage
The simplest dropdown uses the item slot:
<.menu_button>
Actions
<:item>Edit</:item>
<:item>Duplicate</:item>
<:item>Delete</:item>
</.menu_button>
With Shortcuts
Display keyboard shortcuts alongside menu items:
<.menu_button>
File
<:item shortcut="⌘N">New File</:item>
<:item shortcut="⌘O">Open</:item>
<:item shortcut="⌘S">Save</:item>
</.menu_button>
Destructive Items
Mark dangerous actions with the destructive variant:
<.menu_button>
Manage
<:item>Settings</:item>
<:item>Export</:item>
<:item variant="destructive" phx-click="delete">Delete</:item>
</.menu_button>
Button Variants
The trigger button supports all button variants:
<.menu_button variant="outline">Options</.menu_button>
<.menu_button variant="ghost">More</.menu_button>
<.menu_button variant="destructive">Danger</.menu_button>
With Navigation
Items can navigate using Phoenix's navigate, patch, or href:
<.menu_button>
Go To
<:item navigate={~p"/dashboard"}>Dashboard</:item>
<:item navigate={~p"/settings"}>Settings</:item>
<:item href="https://docs.example.com">Documentation</:item>
</.menu_button>
Custom Content
Use menu_content, menu_item, and menu_separator for full control:
<.menu_button>
Options
<:items>
<.menu_item>
<.icon name="hero-pencil" class="size-4 mr-2" /> Edit
</.menu_item>
<.menu_item>
<.icon name="hero-document-duplicate" class="size-4 mr-2" /> Duplicate
</.menu_item>
<.menu_separator />
<.menu_item variant="destructive">
<.icon name="hero-trash" class="size-4 mr-2" /> Delete
</.menu_item>
</:items>
</.menu_button>
API Reference
MenuButton Attributes
| Name | Type | Default | Description |
|---|---|---|---|
variant |
string |
"secondary" |
Trigger button variant: "default", "secondary", "outline", "ghost", "destructive", "unstyled" |
class |
string |
"" |
Additional CSS classes for trigger |
content_class |
string |
"" |
Additional CSS classes for dropdown content |
MenuButton Slots
| Name | Required | Description |
|---|---|---|
inner_block |
✓ | Trigger button text |
item |
— | Quick menu items (supports variant, shortcut, href, navigate, patch, phx-click) |
items |
— | Full custom content using menu_item components |
MenuItem Attributes
| Name | Type | Default | Description |
|---|---|---|---|
variant |
string |
"default" |
"default" or "destructive" |
shortcut |
string |
nil |
Keyboard shortcut display text |
class |
string |
"" |
Additional CSS classes |
is_unstyled |
boolean |
false |
Remove default styles |