ActionMenu is composed of ActionList and Overlay patterns used for quick actions and selections.
Page navigation navigation
React
readyNot reviewed for a11y
Rails
readyNot reviewed for a11y
Figma
An ActionMenu comprises a set of ActionList items, where each item represents an action, command, submenu, or the current selection that can be either a single or multi-select. The ActionMenu can be invoked by clicking on a Button, IconButton, or right-clicking on the list items.
<ActionMenu><ActionMenu.Button>Open menu</ActionMenu.Button><ActionMenu.Overlay><ActionList><ActionList.ItemonSelect={()=>{alert('Item one clicked')}}> Item one</ActionList.Item><ActionList.ItemonSelect={()=>{alert('Item two clicked')}}> Item two</ActionList.Item><ActionList.ItemonSelect={()=>{alert('Item three clicked')}}> Item three</ActionList.Item></ActionList></ActionMenu.Overlay></ActionMenu>
Menu items affected by a system error, such as an outage, may become inactive and display a message explaining why.
If an ActionMenu (e.g., adding a file to a repo) has no available items, the trigger Button should be inactive.
Inactive ActionMenu items follow the same patterns as inactive list items, with two exceptions:
The unavailability message is displayed directly in the item, not in a tooltip, since the menu is hidden until opened.
No alert icon is needed, as the error message provides sufficient context.
<Stackalign="start"><ActionMenu><ActionMenu.Button>Open menu</ActionMenu.Button><ActionMenu.Overlay><ActionList><ActionList.IteminactiveText="Unavailable due to an outage">Item one</ActionList.Item><ActionList.ItemonSelect={()=>{alert('Item two clicked')}}> Item two</ActionList.Item><ActionList.ItemonSelect={()=>{alert('Item three clicked')}}> Item three</ActionList.Item></ActionList></ActionMenu.Overlay></ActionMenu><ActionMenu><ActionMenu.Buttoninactive>Open menu (all items inactive)</ActionMenu.Button><ActionMenu.Overlay><ActionList><ActionList.IteminactiveText="Unavailable due to an outage">Item one</ActionList.Item><ActionList.IteminactiveText="Unavailable due to an outage">Item two</ActionList.Item><ActionList.IteminactiveText="Unavailable due to an outage">Item three</ActionList.Item></ActionList></ActionMenu.Overlay></ActionMenu></Stack>
To enhance the readability of menus that contain numerous item descriptions, it is recommended to incorporate dividers. This can effectively prevent the menu from becoming overwhelming.
importReactfrom'react'import{ActionList,ActionMenu}from'@primer/react'exportdefaultfunctionDividers(){return(<ActionMenu><ActionMenu.Button>Options</ActionMenu.Button><ActionMenu.Overlay><ActionListshowDividersaria-label="Watch preference options"><ActionList.ItemonSelect={()=>{alert('Item one clicked')}}> Item one<ActionList.Descriptionvariant="block"> Description about item one that is kind of long and bulky</ActionList.Description></ActionList.Item><ActionList.ItemonSelect={()=>{alert('Item two clicked')}}> Item two<ActionList.Descriptionvariant="block"> A long and bulky description for the second item</ActionList.Description></ActionList.Item><ActionList.ItemonSelect={()=>{alert('Item three clicked')}}> Item three<ActionList.Descriptionvariant="block"> One last and long bulky description we will use for the third item</ActionList.Description></ActionList.Item></ActionList></ActionMenu.Overlay></ActionMenu>)}
A menu with multiple levels is a common UI component used in desktop and mobile applications. It allows users to access nested subitems without cluttering the screen.
<ActionMenu><ActionMenu.Button>Open menu</ActionMenu.Button><ActionMenu.Overlay><ActionList><ActionList.ItemonSelect={()=>{alert('Item one clicked')}}> Item one</ActionList.Item><ActionList.ItemonSelect={()=>{alert('Item two clicked')}}> Item two</ActionList.Item><ActionMenu><ActionMenu.Anchor><ActionList.Item>Item with submenus</ActionList.Item></ActionMenu.Anchor><ActionMenu.Overlay><ActionList><ActionList.ItemonSelect={()=>{alert('Sub-item one clicked')}}> Sub-item one</ActionList.Item><ActionList.ItemonSelect={()=>{alert('Sub-item two clicked')}}> Sub-item two</ActionList.Item><ActionMenu><ActionMenu.Anchor><ActionList.Item>Sub-item with submenu</ActionList.Item></ActionMenu.Anchor><ActionMenu.Overlay><ActionList><ActionList.ItemonSelect={()=>{alert('Sub-item one clicked')}}> Sub-item one</ActionList.Item><ActionList.ItemonSelect={()=>{alert('Sub-item two clicked')}}> Sub-item two</ActionList.Item></ActionList></ActionMenu.Overlay></ActionMenu></ActionList></ActionMenu.Overlay></ActionMenu></ActionList></ActionMenu.Overlay></ActionMenu>