Components

Menu

A dropdown menu that presents a list of actions or options to a user.

Common use case are:

  • A "more" menu, where the menu items are different actions
  • A "filter" menu, where one or more items can be selected to filter a table or list

Import

  • Menu: The wrapper component that provides context, state, and focus management.
  • MenuList: The wrapper for the menu items. Must be a direct child of Menu.
  • MenuButton: The trigger for the menu list. Must be a direct child of Menu.
  • MenuItem: The trigger that handles menu selection. Must be a direct child of a MenuList.
  • MenuGroup: A wrapper to group related menu items.
  • MenuDivider: A visual separator for menu items and groups.
  • MenuOptionGroup: A wrapper for checkable menu items (radio and checkbox)
  • MenuItemOption: The checkable menu item, to be used with MenuOptionGroup
import {
Menu,
MenuButton,
MenuList,
MenuItem,
MenuGroup,
MenuDivider,
MenuOptionGroup,
MenuItemOption,
} from '@outfitio/outkit';

Usage

Accessing the internal state

To access the internal state of the Menu, use a function as a children (commonly known as a render prop). You'll get access to the internal state isOpen and method onClose.

To group related MenuItems, use the MenuGroup component and pass it a label for the group name.

For sorting and filtering options. Use the MenuOptionGroup and MenuItemOption components.

Multiple MenuOptionGroups can be combined in the same menu.

Accessibility

MenuButton has role set to button. When the menu is displayed, MenuButton has aria-expanded set to true. MenuButton has aria-controls set to the id of the MenuList.

When MenuButton is focused:

  • Enter or Space opens the menu and places focus on the first menu item
  • ArrowDown opens the menu and moves focus on the first menu item
  • ArrowUp opens the menu and moves focus on the last menu item

When the menu is open:

  • Escape closes the menu and sets focus to the MenuButton
  • Home moves focus to the first item
  • End moves focus to the last item
  • ArrowUp and ArrowDown navigate up and down through the menu items
  • The letter keys moves focus to the next menu item with a label that starts with the typed character if such an menu item exists

Best Practice

Menus should

  • Contain actions or options that are related to each other
  • Use clear and predictable language
  • Avoid using very long item names

Props

NameTypeDefaultDescription
childrenReact.ReactNodeThe children of the menu must be MenuButton and MenuList
isOpenbooleanIf true, the menu will be opened
autoSelectbooleantrueThe menu will select the first enabled item when it opens
closeOnBlurbooleantrueIf true, the menu will close on outside click or blur
closeOnSelectbooleantrueIf true, the menu will close on menu item select
NameType
childrenReact.ReactNode
onClickReact.MouseEventHandler
onKeyDownReact.KeyboardEventHandler
NameTypeDescription
childrenReact.ReactNodeThe content of the MenuList, should be the MenuItem component
onClickReact.MouseEventHandlerFunction to be called when you click on the menu item
onBlurReact.FocusEventHandlerFunction to be called when you blur out of the menu list
placementPopperJS.placementThe placement of the MenuList
NameTypeDescription
isDisabledbooleanIf true, the menu item will be disabled
onClickReact.MouseEventHandlerFunction that is called on click and enter/space keypress
onKeyDownReact.KeyboardEventHanderFunction that is called on keydown
rolemenuitem, menuitemradio, menuitemcheckboxThe ARIA role of the menuitem
NameTypeDescription
childrenReact.ReactNodeThe content of the menu group
titlestringThe title of the menu group
NameTypeDescription
childrenReact.ReactNodeThe content of the option group
titlestringTitle of the option group
typeradio, checkboxUsed to add roles menuitemradio or menuitemcheckbox
defaultValuestring, number, Array<string or number>The initial value of the option group
valuestring, number, Array<string or number>The value of the option group
onChange(value) => voidFunction called when selection changes
NameTypeDescription
isDisabledbooleanIf true, the menu item will be disabled
childrenReact.ReactNodeThe content of the option item
valueStringOrNumberUsed to add roles menuitemradio or menuitemcheckbox
typeradio, checkboxThe initial value of the option item
onMouseLeaveReact.MouseEventHandlerThe value of the option item
onMouseEnterReact.MouseEventHandlerFunction called when selection changes

The auto placements will choose the side with most space.

defaultstartend
autoauto-startauto-end
toptop-starttop-end
bottombottom-startbottom-end
rightright-startright-end
leftleft-startleft-end