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.