Skip to content

Dropdown Menu

A menu that appears on trigger click, displaying a list of actions or options.

---
import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuTrigger } from '@bejamas/ui/components/dropdown-menu';
---
<DropdownMenu>
<DropdownMenuTrigger variant="outline">Open</DropdownMenuTrigger>
<DropdownMenuContent align="start">
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuGroup>
<DropdownMenuItem>
Profile
<DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>Settings</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuItem disabled>API</DropdownMenuItem>
<DropdownMenuItem>Log out</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
Terminal window
bunx bejamas add dropdown-menu
---
import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from '@bejamas/ui/components/dropdown-menu';
---
<DropdownMenu>
<DropdownMenuTrigger variant="outline">Menu</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>Item 1</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
PropTypeDefault
classstring""
---
import { Button } from '@bejamas/ui/components/button';
import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator } from '@bejamas/ui/components/dropdown-menu';
---
<DropdownMenu>
<Button variant="outline" data-slot="dropdown-menu-trigger">Account</Button>
<DropdownMenuContent>
<DropdownMenuLabel>Actions</DropdownMenuLabel>
<DropdownMenuGroup>
<DropdownMenuItem>Edit</DropdownMenuItem>
<DropdownMenuItem>Duplicate</DropdownMenuItem>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuItem>Delete</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
---
import { Button } from '@bejamas/ui/components/button';
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuShortcut } from '@bejamas/ui/components/dropdown-menu';
---
<DropdownMenu>
<Button variant="outline" data-slot="dropdown-menu-trigger">Edit</Button>
<DropdownMenuContent>
<DropdownMenuItem>
Undo
<DropdownMenuShortcut>⌘Z</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Redo
<DropdownMenuShortcut>⇧⌘Z</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>
Cut
<DropdownMenuShortcut>⌘X</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Copy
<DropdownMenuShortcut>⌘C</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem>
Paste
<DropdownMenuShortcut>⌘V</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
---
import { Button } from '@bejamas/ui/components/button';
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem } from '@bejamas/ui/components/dropdown-menu';
---
<DropdownMenu>
<Button variant="outline" data-slot="dropdown-menu-trigger">Options</Button>
<DropdownMenuContent>
<DropdownMenuItem>Available action</DropdownMenuItem>
<DropdownMenuItem disabled>Disabled action</DropdownMenuItem>
<DropdownMenuItem>Another action</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>

The dropdown menu emits custom events that you can listen to:

EventDetailDescription
dropdown-menu:change{ open: boolean }Fired when the menu opens or closes
dropdown-menu:select{ value: string }Fired when an item is selected
<DropdownMenu id="my-dropdown">
<DropdownMenuTrigger>Menu</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem value="edit">Edit</DropdownMenuItem>
<DropdownMenuItem value="delete">Delete</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
const dropdown = document.getElementById('my-dropdown');
dropdown.addEventListener('dropdown-menu:change', (e) => {
console.log('Is open:', e.detail.open);
});
dropdown.addEventListener('dropdown-menu:select', (e) => {
console.log('Selected:', e.detail.value);
});

You can control the dropdown menu programmatically by dispatching a dropdown-menu:set event:

const dropdown = document.getElementById('my-dropdown');
// Open the dropdown menu
dropdown.dispatchEvent(new CustomEvent('dropdown-menu:set', {
detail: { open: true }
}));
// Close the dropdown menu
dropdown.dispatchEvent(new CustomEvent('dropdown-menu:set', {
detail: { open: false }
}));

The dropdown menu sets these data attributes that you can use for styling or querying state:

AttributeElementDescription
data-statedropdown-menu, dropdown-menu-contentCurrent state (open or closed)
data-sidedropdown-menu-contentComputed position (top, right, bottom, or left)
data-aligndropdown-menu-contentAlignment (start, center, or end)
data-highlighteddropdown-menu-itemPresent when item is focused
data-disableddropdown-menu-itemPresent when item is disabled