An accessible dropdown menu for the common dropdown menu button design pattern.
Menu uses roving tabIndex
for focus management.
Chakra UI exports 8 components for rendering menus:
Menu
: The wrapper component 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
To access the internal state of the Menu, use a function as children
(commonly
known as a render prop). You'll get access to the internal state isOpen
and
method onClose
.
When focus is on the MenuButton
or within the MenuList
and you type a letter
key, a search begins. Focus will move to the first MenuItem
that starts with
the letter you typed.
Open the menu, try and type any letter, (say "S") to see the focus movement.
You can add custom menu icons and commands (or hotkeys) for each menu by passing
the command
prop.
You can add transition support for the menu by importing the MenuTransition
component.
It's important to use the
sx
prop for the transitions to work properly. For some reason, it doesn't work with thestyle
native prop
By default, the Menu
component renders all children of MenuList
to the DOM,
meaning that invisible menu items are still rendered but are hidden by styles.
If you want to defer rendering of each children of MenuList
until that menu is
open, you can use the isLazy
prop. This is useful if your Menu
needs to be
extra performant, or make network calls on mount that should only happen when
the component is displayed.
To render menus in a portal, import the Portal
component and wrap the
MenuList
within the Portal
.
To group related MenuItem
s, use the MenuGroup
component and pass it a
title
for the group name.
You can compose a menu for table headers to help with sorting and filtering
options. Use the MenuOptionGroup
and MenuItemOption
components.
Key | Action |
---|---|
Enter or Space | When MenuButton receives focus, opens the menu and places focus on the first menu item |
ArrowDown | When MenuButton receives focus, opens the menu and moves focus to the first menu item |
ArrowUp | When MenuButton receives focus, opens the menu and moves focus to the last menu item |
Escape | When the menu is open, closes the menu and sets focus to the MenuButton |
Tab | no effect |
Home | When the menu is open, moves focus to the first item. |
End | When the menu is open, moves focus to the last item. |
A-Z or a-z | When the menu is open, moves focus to the next menu item with a label that starts with the typed character if such an menu item exists. |
For MenuButton
:
role
is set to button
.aria-haspopup
is set to menu
.MenuButton
has aria-expanded
set to true
.MenuButton
has aria-controls
set to the id
of the MenuList
.For MenuList
:
MenuItem
has role menu
.Name | Type | Default | Description |
---|---|---|---|
children | React.ReactNode | The children of the menu must be MenuButton and MenuList | |
isOpen | boolean | If true , the menu will be opened | |
autoSelect | boolean | true | The menu will select the first enabled item when it opens |
closeOnBlur | boolean | true | If true , the menu will close on outside click or blur |
closeOnSelect | boolean | true | If true , the menu will close on menu item select |
placement | PopperJS.placement | The placement of the MenuList | |
isLazy | boolean | If true , children of MenuList will not render until the menu is opened. |
Name | Type |
---|---|
children | React.ReactNode |
onClick | React.MouseEventHandler |
onKeyDown | React.KeyboardEventHandler |
Name | Type | Description |
---|---|---|
children | React.ReactNode | The content of the MenuList , should be the MenuItem component |
onClick | React.MouseEventHandler | Function to be called when you click on the menu item |
onBlur | React.FocusEventHandler | Function to be called when you blur out of the menu list |
Name | Type | Description |
---|---|---|
isDisabled | boolean | If true , the menu item will be disabled |
onClick | React.MouseEventHandler | Function that is called on click and enter/space keypress |
onKeyDown | React.KeyboardEventHander | Function that is called on keydown |
role | menuitem , menuitemradio , menuitemcheckbox | The ARIA role of the menuitem |
Name | Type | Description |
---|---|---|
children | React.ReactNode | The content of the menu group |
title | string | The title of the menu group |
Name | Type | Description |
---|---|---|
children | React.ReactNode | The content of the option group |
title | string | Title of the option group |
type | radio , checkbox | Used to add roles menuitemradio or menuitemcheckbox |
defaultValue | string , number , Array<string or number> | The initial value of the option group |
value | string , number , Array<string or number> | The value of the option group |
onChange | (value) => void | Function called when selection changes |
MenuItemOption extends Box
so you can pass all box props in addition to these:
Name | Type | Description |
---|---|---|
isDisabled | boolean | If true , the option item will be disabled |
value | StringOrNumber | The value of the option item |
type | radio , checkbox | Used to add menuitemradio or menuitemcheckbox roles to the option |