DropdownMenu
Click-to-open menu built from MenuItem and MenuDivider.
Preview
Props
DropdownMenu wraps trigger in an inline anchor span, so any component can be used as a trigger without needing to forwardRef.
| Prop | Type | Default | Description |
|---|---|---|---|
trigger | ReactNode | — | The clickable element that opens the menu. |
children | ReactNode | — | MenuItem and MenuDivider components. |
placement | Placement | "bottom-start" | Menu placement relative to trigger. |
open | boolean | — | Controlled open state. |
defaultOpen | boolean | — | Uncontrolled initial open state. |
onOpenChange | (open: boolean) => void | — | Controlled change handler. |
closeOnSelect | boolean | true | Close the menu after any click inside it. |
fullWidth | boolean | — | Stretch the anchor wrapper to full width. |
Examples
Basic dropdown
import { DropdownMenu, MenuItem, MenuDivider, Button } from "@solarius/onset";
import { IconSettings, IconDownload, IconTrash } from "@tabler/icons-react";
<DropdownMenu trigger={<Button>Actions ▾</Button>}>
<MenuItem
icon={<IconSettings size={14} />}
onClick={() => console.log("Settings")}
>
Settings
</MenuItem>
<MenuItem
icon={<IconDownload size={14} />}
onClick={() => console.log("Export")}
>
Export
</MenuItem>
<MenuDivider />
<MenuItem
icon={<IconTrash size={14} />}
danger
onClick={() => console.log("Delete")}
>
Delete
</MenuItem>
</DropdownMenu>;Controlled open state
const [open, setOpen] = useState(false);
<DropdownMenu
open={open}
onOpenChange={setOpen}
trigger={<Button>Actions ▾</Button>}
>
<MenuItem
onClick={() => {
setOpen(false);
handleAction();
}}
>
Do something
</MenuItem>
</DropdownMenu>;With closeOnSelect=false
<DropdownMenu trigger={<Button>Settings ▾</Button>} closeOnSelect={false}>
<MenuItem onClick={() => console.log("Toggle A")}>Toggle A</MenuItem>
<MenuItem onClick={() => console.log("Toggle B")}>Toggle B</MenuItem>
</DropdownMenu>