Menu
An accessible dropdown menu for the common dropdown menu button design pattern.
Menu uses roving tabIndex for focus management.
Import#
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 ofMenu.MenuButton: The trigger for the menu list. Must be a direct child ofMenu.MenuItem: The trigger that handles menu selection. Must be a direct child of aMenuList.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 withMenuOptionGroup.
import {Menu,MenuButton,MenuList,MenuItem,MenuItemOption,MenuGroup,MenuOptionGroup,MenuIcon,MenuCommand,MenuDivider,} from "@chakra-ui/react"
Usage#
Accessing the internal state#
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.
Customizing the button#
The default MenuButton can be styled using the usual styled-system props, but
it starts off plainly styled.
Using the as prop of the MenuButton, you can render a custom component
instead of the default MenuButton. For instance, you can use Chakra's Button
component, or your own custom component.
Custom components must take a
refprop which is assigned to the React component that triggers the menu opening. This is so that theMenuListpopover can be positioned correctly. Without this, theMenuListwill render in an undefined position.
Letter Navigation#
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.
Just another example#
Adding icons and commands#
You can add icon to each MenuItem by passing the icon prop. To add a
commands (or hotkeys) to menu items, you can use the command prop.
Lazily mounting MenuItem#
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.
Rendering menu in a portal#
To render menus in a portal, import the Portal component and wrap the
MenuList within the Portal.
MenuGroup#
To group related MenuItems, use the MenuGroup component and pass it a
title for the group name.
Menu option groups#
You can compose a menu for table headers to help with sorting and filtering
options. Use the MenuOptionGroup and MenuItemOption components.
Accessibility#
Keyboard Interaction#
| 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. |
ARIA roles#
For MenuButton:
roleis set tobutton.aria-haspopupis set tomenu.- When the menu is displayed,
aria-expandedis set totrue. aria-controlsis set to theidof theMenuList.
For MenuList:
roleis set tomenu.aria-orientationis set tovertical.
For MenuItem:
roleis set tomenuitem.- Gets one of these roles
menuitem/menuitemradio/menuitemcheckbox.
Props#
Menu Props#
| Name | Type | Description | Default |
|---|---|---|---|
| arrowPadding | number | The padding required to prevent the arrow from reaching the very edge of the popper. | 8 |
| autoSelect | boolean | If `true`, the first enabled menu item will receive focus and be selected when the menu opens. | true |
| boundary | HTMLElement | "clippingParents" | "scrollParent" | The boundary area for the popper. Used within the `preventOverflow` modifier | "clippingParents" |
| closeOnBlur | boolean | If `true`, the menu will close when you click outside the menu list | true |
| closeOnSelect | boolean | If `true`, the menu will close when a menu item is clicked | true |
| colorScheme | "blue" | "cyan" | "gray" | "green" | "orange" | "pink" | "purple" | "red" | "teal" | "yellow" | "whiteAlpha" | "blackAlpha" | "linkedin" | "facebook" | "messenger" | "whatsapp" | "twitter" | "telegram" | Color Schemes for Menu are not implemented in the default theme. You can extend the theme to implement them. | - |
| defaultIsOpen | boolean | - | |
| eventListeners | boolean | { scroll?: boolean; resize?: boolean | undefined; } | undefined | If provided, determines whether the popper will reposition itself on `scroll` and `resize` of the window. | - |
| flip | boolean | If `true`, the popper will change its placement and flip when it's about to overflow its boundary area. | true |
| gutter | number | The distance or margin between the reference and popper. It is used internally to create an `offset` modifier. NB: If you define `offset` prop, it'll override the gutter. | 8 |
| id | string | - | |
| isLazy | boolean | Performance 🚀: If `true`, the MenuItem rendering will be deferred until the menu is open. | - |
| isOpen | boolean | - | |
| matchWidth | boolean | If `true`, the popper will match the width of the reference at all times. It's useful for `autocomplete`, `date-picker` and `select` patterns. | - |
| modifiers | Partial<Modifier<string, any>>[] | Array of popper.js modifiers. Check the docs to see the list of possible modifiers you can pass. @see Docs https://popper.js.org/docs/v2/modifiers/ | - |
| offset | [crossAxis: number, mainAxis: number] | The main and cross-axis offset to displace popper element from its reference element. | - |
| onClose | (() => void) | - | |
| onOpen | (() => void) | - | |
| placement | "top" | "right" | "bottom" | "left" | "auto" | "auto-start" | "auto-end" | "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "right-end" | "left-start" | "left-end" | The placement of the popper relative to its reference. | "bottom" |
| preventOverflow | boolean | If `true`, will prevent the popper from being cut off and ensure it's visible within the boundary area. | true |
| size | string | Sizes for Menu are not implemented in the default theme. You can extend the theme to implement them. | - |
| strategy | "fixed" | "absolute" | The CSS positioning strategy to use. | "absolute" |
| variant | string | Variants for Menu are not implemented in the default theme. You can extend the theme to implement them. | - |
MenuButton Props#
MenuButton composes Box so you can pass all Box props to
change its style.
MenuList Props#
MenuList composes Box so you can pass all Box props to
change its style.
MenuItem Props#
| Name | Type | Description | Default |
|---|---|---|---|
| closeOnSelect | boolean | Overrides the parent menu's `closeOnSelect` prop. | - |
| command | string | Right-aligned label text content, useful for displaying hotkeys. | - |
| commandSpacing | SystemProps["ml"] | The spacing between the command and menu item's label. | - |
| icon | React.ReactElement | The icon to render before the menu item's label. | - |
| iconSpacing | SystemProps["mr"] | The spacing between the icon and menu item's label. | - |
| isDisabled | boolean | - | |
| isFocusable | boolean | - |
MenuGroup Props#
MenuGroup composes Box so you can pass all Box props to
change its style.
MenuOptionGroup Props#
| Name | Type | Description | Default |
|---|---|---|---|
| defaultValue | string | string[] | - | |
| onChange | ((value: string | string[]) => void) | - | |
| type | "checkbox" | "radio" | - | |
| value | string | string[] | - |
MenuItemOption Props#
MenuItemOption composes Box so you can pass all box props
in addition to these:
| Name | Type | Description | Default |
|---|---|---|---|
| closeOnSelect | boolean | Overrides the parent menu's `closeOnSelect` prop. | - |
| command | string | Right-aligned label text content, useful for displaying hotkeys. | - |
| commandSpacing | SystemProps["ml"] | The spacing between the command and menu item's label. | - |
| icon | React.ReactElement | The icon to render before the menu item's label. | - |
| iconSpacing | SystemProps["mr"] | The spacing between the icon and menu item's label. | - |
| isChecked | boolean | - | |
| isDisabled | boolean | - | |
| isFocusable | boolean | - | |
| type | "checkbox" | "radio" | - | |
| value | string | - |