Menu
Action list on a native popover, anchored to its invoker.
Open it with command="toggle-popover" + commandfor. Arrow keys move between items; click, Enter, or
Escape dismisses.
MenuExamples.tsrx
import { Button, Menu, MenuItem } from "@octaneui/core";
export function MenuExamples() @{
<>
<Button
command="toggle-popover"
commandfor="account-menu"
aria-haspopup="menu"
>
Account
</Button>
<Menu id="account-menu" aria-label="Account">
<MenuItem>Profile</MenuItem>
<MenuItem>Settings</MenuItem>
<MenuItem>Sign out</MenuItem>
</Menu>
</>
}Icons
MenuIconsExample.tsrx
import { Button, Menu, MenuItem } from "@octaneui/core";
import { LogOut, Settings, User } from "@octaneui/icons/lucide";
export function MenuIconsExample() @{
<>
<Button
command="toggle-popover"
commandfor="account-icons-menu"
aria-haspopup="menu"
>
Account
</Button>
<Menu id="account-icons-menu" aria-label="Account">
<MenuItem left={<User size={16} />}>Profile</MenuItem>
<MenuItem left={<Settings size={16} />}>Settings</MenuItem>
<MenuItem left={<LogOut size={16} />}>Sign out</MenuItem>
</Menu>
</>
}Separators and disabled items
MenuDisabledExample.tsrx
import { Button, Menu, MenuItem, MenuSeparator } from "@octaneui/core";
export function MenuDisabledExample() @{
<>
<Button
command="toggle-popover"
commandfor="file-menu"
aria-haspopup="menu"
>
File
</Button>
<Menu id="file-menu" aria-label="File">
<MenuItem>New</MenuItem>
<MenuItem>Open</MenuItem>
<MenuItem disabled>Save</MenuItem>
<MenuSeparator />
<MenuItem>Export</MenuItem>
</Menu>
</>
}Actions
Handle onClick on a MenuItem to run an action.
The menu closes after a successful click unless you preventDefault().
Last action: None
MenuActionsExample.tsrx
import { useState } from "octane";
import { Button, Menu, MenuItem } from "@octaneui/core";
export function MenuActionsExample() @{
const [last, setLast] = useState("None");
<div class="stack">
<Button
command="toggle-popover"
commandfor="actions-menu"
aria-haspopup="menu"
>
Actions
</Button>
<Menu id="actions-menu" aria-label="Actions">
<MenuItem onClick={() => setLast("Duplicate")}>Duplicate</MenuItem>
<MenuItem onClick={() => setLast("Archive")}>Archive</MenuItem>
<MenuItem onClick={() => setLast("Delete")}>Delete</MenuItem>
</Menu>
<p class="status">Last action: {last}</p>
<style>
.stack {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.75rem;
}
.status {
margin: 0;
color: var(--oc-text-secondary);
}
</style>
</div>
}