Menu
The Menu component displays a dropdown menu with selectable actions. It supports custom width, flexible interaction, and simple styling options.
Default
<MenuContainer>
{({ open, toggleMenu, closeMenu }) => (
<>
<MenuButton onClick={toggleMenu} showChevron>Actions</MenuButton>
{open && (
<Menu width={200} closeMenu={closeMenu}>
<MenuItem onClick={() => { console.log('One clicked'); closeMenu(); }}>One</MenuItem>
<MenuItem onClick={() => { console.log('Two clicked'); closeMenu(); }}>Two</MenuItem>
<MenuItem onClick={() => { console.log('Three clicked'); closeMenu(); }}>Three</MenuItem>
<MenuItem type="error" onClick={() => { console.log('Delete clicked'); closeMenu(); }}>Delete</MenuItem>
</Menu>
)}
</>
)}
</MenuContainer>Disabled state
<MenuContainer>
{({ open, toggleMenu, closeMenu }) => (
<>
<MenuButton onClick={toggleMenu}>Options</MenuButton>
{open && (
<Menu width={200} closeMenu={closeMenu}>
<MenuItem onClick={() => { console.log('First clicked'); closeMenu(); }}>First</MenuItem>
<MenuItem disabled>Disabled option</MenuItem>
<MenuItem onClick={() => { console.log('Second clicked'); closeMenu(); }}>Second</MenuItem>
</Menu>
)}
</>
)}
</MenuContainer>Icon buttons
<MenuContainer>
{({ open, toggleMenu, closeMenu }) => (
<>
<MenuButton onClick={toggleMenu}>
<OverflowMenuHorizontal size={20} />
</MenuButton>
{open && (
<Menu width={180} closeMenu={closeMenu}>
<MenuItem onClick={() => { console.log('Edit clicked'); closeMenu(); }}>Edit</MenuItem>
<MenuItem onClick={() => { console.log('Delete clicked'); closeMenu(); }} type="error">Delete</MenuItem>
</Menu>
)}
</>
)}
</MenuContainer>With icons
<MenuContainer>
{({ open, toggleMenu, closeMenu }) => (
<>
<MenuButton onClick={toggleMenu} showChevron>
Account
</MenuButton>
{open && (
<Menu width={220} closeMenu={closeMenu}>
<MenuItem icon={<User size={16} />} onClick={() => { console.log('Profile clicked'); closeMenu(); }}>
Profile
</MenuItem>
<MenuItem icon={<Logout size={16} />} type="error" onClick={() => { console.log('Logout clicked'); closeMenu(); }}>
Logout
</MenuItem>
</Menu>
)}
</>
)}
</MenuContainer>Custom styled button
<MenuButton
onClick={toggleMenu}
showChevron
bgColor="bg-gray-900"
hoverColor="hover:bg-gray-100 hover:text-gray-800"
borderRadius="rounded-none"
borderColor="border border-gray-900 hover:border-gray-300"
padding="px-4 py-2"
textSize="text-base"
textColor="text-white"
>
Custom menu
</MenuButton>Usage
To create a dropdown menu, import the MenuContainer, MenuButton, Menu, and MenuItem components. The Menu component can be referenced in the following format:
import MenuContainer from "../../components/MenuContainer"; import MenuButton from "../../components/MenuButton"; import Menu from "../../components/Menu"; import MenuItem from "../../components/MenuItem";
Accessibility
The MenuButton uses role=“button” and can be triggered using a keyboard.
Future improvements should include adding aria-haspopup=“menu” and dynamically setting aria-expanded to reflect the menu open state.