MenuTrigger and Menu

The MenuTrigger serves as a wrapper around a Menu and its associated trigger, linking the Menu's open state with the trigger's press state.

The Menu allow users to choose from a list of options which can change based on the content. Menus are used to display transient content such as options, additional actions, and more. They stand out visually through stroke and drop shadow and float on top of the interface.

installyarn add @react-spectrum/menu
version3.0.0-rc.0
usageimport {Menu, MenuTrigger} from '@react-spectrum/menu'

Example#


<MenuTrigger>
  <ActionButton>
      Edit
  </ActionButton>
  <Menu>
    <Item>Cut</Item>
    <Item>Copy</Item>
    <Item>Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
      Edit
  </ActionButton>
  <Menu>
    <Item>Cut</Item>
    <Item>Copy</Item>
    <Item>Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
      Edit
  </ActionButton>
  <Menu>
    <Item>Cut</Item>
    <Item>Copy</Item>
    <Item>Paste</Item>
  </Menu>
</MenuTrigger>

Content#


The Menu accepts Items and Sections as children. Items can be statically populated (initial example above) or dynamically (below). The dynamic method would be better suited to use if the actions within a Menu came from a data object such as values returned via an API call. A unique key prop must be set on each item.

<MenuTrigger>
  <ActionButton>
      Edit
  </ActionButton>
  <Menu items={[{name: 'Cut'}, {name: 'Copy'}, {name: 'Paste'}]}>
    {item => <Item key={item.name}>{item.name}</Item>}
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>Edit</ActionButton>
  <Menu
    items={[
      {name: 'Cut'},
      {name: 'Copy'},
      {name: 'Paste'}
    ]}>
    {(item) => <Item key={item.name}>{item.name}</Item>}
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    Edit
  </ActionButton>
  <Menu
    items={[
      {name: 'Cut'},
      {name: 'Copy'},
      {name: 'Paste'}
    ]}>
    {(item) => (
      <Item
        key={
          item.name
        }>
        {item.name}
      </Item>
    )}
  </Menu>
</MenuTrigger>

The MenuTrigger accepts exactly two children: the Menu and the element which triggers the opening of the Menu. The trigger must be the first child passed into the MenuTrigger and should be an element that supports press events.

If the Menu is open within a MenuTrigger it will close on blur or scroll events.

Selection#

Changes to the Menu's selected Item are propagated via the event onAction.

The defaultSelectedKeys prop can be used to preselect Menu Items in the Menu placing selection of a Menu in an uncontrolled state. Alternatively, the selectedKeys prop preselects an Item in the Menu placing Item selection in a controlled state.

<MenuTrigger closeOnSelect={false}>
  <ActionButton>
      Edit (Controlled)
  </ActionButton>
  <Menu selectionMode="single" selectedKeys={['copy']}>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect={false}>
  <ActionButton>
      Edit (Uncontrolled)
  </ActionButton>
  <Menu selectionMode="single" defaultSelectedKeys={['paste']}>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect={false}>
  <ActionButton>Edit (Controlled)</ActionButton>
  <Menu selectionMode="single" selectedKeys={['copy']}>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect={false}>
  <ActionButton>Edit (Uncontrolled)</ActionButton>
  <Menu
    selectionMode="single"
    defaultSelectedKeys={['paste']}>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger
  closeOnSelect={
    false
  }>
  <ActionButton>
    Edit (Controlled)
  </ActionButton>
  <Menu
    selectionMode="single"
    selectedKeys={[
      'copy'
    ]}>
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>
<MenuTrigger
  closeOnSelect={
    false
  }>
  <ActionButton>
    Edit (Uncontrolled)
  </ActionButton>
  <Menu
    selectionMode="single"
    defaultSelectedKeys={[
      'paste'
    ]}>
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>

The selectionMode prop specifies how many Menu Items can be selected, with the options being a single Menu Item, multiple Menu Items, or disabling selection entirely (default).

<MenuTrigger closeOnSelect={false}>
  <ActionButton>
      Show (Multiple)
  </ActionButton>
  <Menu selectionMode="multiple" defaultSelectedKeys={['Sidebar', 'Console']}>
    <Item key='Sidebar'>Sidebar</Item>
    <Item key='Searchbar'>Searchbar</Item>
    <Item key='Tools'>Tools</Item>
    <Item key='Console'>Console</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect={false}>
  <ActionButton>
      Edit (Selection Mode None)
  </ActionButton>
  <Menu selectionMode="none">
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect={false}>
  <ActionButton>Show (Multiple)</ActionButton>
  <Menu
    selectionMode="multiple"
    defaultSelectedKeys={['Sidebar', 'Console']}>
    <Item key="Sidebar">Sidebar</Item>
    <Item key="Searchbar">Searchbar</Item>
    <Item key="Tools">Tools</Item>
    <Item key="Console">Console</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect={false}>
  <ActionButton>Edit (Selection Mode None)</ActionButton>
  <Menu selectionMode="none">
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger
  closeOnSelect={
    false
  }>
  <ActionButton>
    Show (Multiple)
  </ActionButton>
  <Menu
    selectionMode="multiple"
    defaultSelectedKeys={[
      'Sidebar',
      'Console'
    ]}>
    <Item key="Sidebar">
      Sidebar
    </Item>
    <Item key="Searchbar">
      Searchbar
    </Item>
    <Item key="Tools">
      Tools
    </Item>
    <Item key="Console">
      Console
    </Item>
  </Menu>
</MenuTrigger>
<MenuTrigger
  closeOnSelect={
    false
  }>
  <ActionButton>
    Edit (Selection
    Mode None)
  </ActionButton>
  <Menu selectionMode="none">
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>

Sections#

Menus may have Sections which can be used to wrap groups of Items. Each Section takes a title and key prop.

Static Items

<MenuTrigger>
  <ActionButton>
      Edit
  </ActionButton>
  <Menu>
    <Section key="rollback" title="Rollback Options">
      <Item key="undo">Undo</Item>
      <Item key="redo">Redo</Item>
    </Section>
    <Section key="select" title="Selected Text Options">
      <Item key="cut">Cut</Item>
      <Item key="copy">Copy</Item>
      <Item key="paste">Paste</Item>
    </Section>
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
      Edit
  </ActionButton>
  <Menu>
    <Section key="rollback" title="Rollback Options">
      <Item key="undo">Undo</Item>
      <Item key="redo">Redo</Item>
    </Section>
    <Section key="select" title="Selected Text Options">
      <Item key="cut">Cut</Item>
      <Item key="copy">Copy</Item>
      <Item key="paste">Paste</Item>
    </Section>
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    Edit
  </ActionButton>
  <Menu>
    <Section
      key="rollback"
      title="Rollback Options">
      <Item key="undo">
        Undo
      </Item>
      <Item key="redo">
        Redo
      </Item>
    </Section>
    <Section
      key="select"
      title="Selected Text Options">
      <Item key="cut">
        Cut
      </Item>
      <Item key="copy">
        Copy
      </Item>
      <Item key="paste">
        Paste
      </Item>
    </Section>
  </Menu>
</MenuTrigger>

Dynamic Items

Sections should be populated with dynamic Items from a hierarchical data structure. Section takes an array of data using the items prop.

<MenuTrigger>
  <ActionButton>File Types</ActionButton>
  <Menu
    items={[
      {name: 'Docs', children: [{name: 'PDF'}]},
      {
        name: 'Images',
        children: [{name: 'jpeg'}, {name: 'png'}, {name: 'tiff'}]
      }
    ]}>
    {(item) => (
      <Section key={item.name} items={item.children} title={item.name}>
        {(item) => <Item key={item.name}>{item.name}</Item>}
      </Section>
    )}
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>File Types</ActionButton>
  <Menu
    items={[
      {name: 'Docs', children: [{name: 'PDF'}]},
      {
        name: 'Images',
        children: [
          {name: 'jpeg'},
          {name: 'png'},
          {name: 'tiff'}
        ]
      }
    ]}>
    {(item) => (
      <Section
        key={item.name}
        items={item.children}
        title={item.name}>
        {(item) => (
          <Item key={item.name}>{item.name}</Item>
        )}
      </Section>
    )}
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    File Types
  </ActionButton>
  <Menu
    items={[
      {
        name: 'Docs',
        children: [
          {name: 'PDF'}
        ]
      },
      {
        name: 'Images',
        children: [
          {
            name:
              'jpeg'
          },
          {
            name: 'png'
          },
          {
            name:
              'tiff'
          }
        ]
      }
    ]}>
    {(item) => (
      <Section
        key={item.name}
        items={
          item.children
        }
        title={
          item.name
        }>
        {(item) => (
          <Item
            key={
              item.name
            }>
            {item.name}
          </Item>
        )}
      </Section>
    )}
  </Menu>
</MenuTrigger>

Complex Menu Items#

A Menu Item's content may be any renderable node, not just strings.

View guidelines

import {Keyboard, Text} from '@react-spectrum/text';

<MenuTrigger>
  <ActionButton>
      Edit
  </ActionButton>
  <Menu
    items={[
      {name: 'Copy', icon: 'Copy', shortcut: '⌘C'},
      {name: 'Cut', icon: 'Cut', shortcut: '⌘X'},
      {name: 'Paste', icon: 'Paste', shortcut: '⌘V'}
    ]}>
    {item => {
      let iconMap = {
        Copy,
        Cut,
        Paste
      };
      let Icon = iconMap[item.icon];
      return (
        <Item key={item.name} childItems={item.children} textValue={item.name}>
          <Icon size="S" />
          <Text>{item.name}</Text>
          <Keyboard>{item.shortcut}</Keyboard>
        </Item>
      );
    }}
  </Menu>
</MenuTrigger>
import {Keyboard, Text} from '@react-spectrum/text';

<MenuTrigger>
  <ActionButton>Edit</ActionButton>
  <Menu
    items={[
      {name: 'Copy', icon: 'Copy', shortcut: '⌘C'},
      {name: 'Cut', icon: 'Cut', shortcut: '⌘X'},
      {name: 'Paste', icon: 'Paste', shortcut: '⌘V'}
    ]}>
    {(item) => {
      let iconMap = {
        Copy,
        Cut,
        Paste
      };
      let Icon = iconMap[item.icon];
      return (
        <Item
          key={item.name}
          childItems={item.children}
          textValue={item.name}>
          <Icon size="S" />
          <Text>{item.name}</Text>
          <Keyboard>{item.shortcut}</Keyboard>
        </Item>
      );
    }}
  </Menu>
</MenuTrigger>
import {
  Keyboard,
  Text
} from '@react-spectrum/text';

<MenuTrigger>
  <ActionButton>
    Edit
  </ActionButton>
  <Menu
    items={[
      {
        name: 'Copy',
        icon: 'Copy',
        shortcut: '⌘C'
      },
      {
        name: 'Cut',
        icon: 'Cut',
        shortcut: '⌘X'
      },
      {
        name: 'Paste',
        icon: 'Paste',
        shortcut: '⌘V'
      }
    ]}>
    {(item) => {
      let iconMap = {
        Copy,
        Cut,
        Paste
      };
      let Icon =
        iconMap[
          item.icon
        ];
      return (
        <Item
          key={
            item.name
          }
          childItems={
            item.children
          }
          textValue={
            item.name
          }>
          <Icon size="S" />
          <Text>
            {item.name}
          </Text>
          <Keyboard>
            {
              item.shortcut
            }
          </Keyboard>
        </Item>
      );
    }}
  </Menu>
</MenuTrigger>

Internationalization#

To internationalize a Menu, a localized string should be passed to the children prop of each Menu Item or to a Section's title prop. For languages that are read right-to-left (e.g. Hebrew and Arabic), the layout of the Menu is flipped.

Accessibility#

Title-less Menu Sections must be provided with an aria-label for accessibility.

<MenuTrigger>
  <ActionButton>Edit</ActionButton>
  <Menu
    items={[
      {name: 'Rollback Options', children: [{name: 'Undo'}, {name: 'Redo'}]},
      {
        name: 'Selected Text Options',
        children: [{name: 'Cut'}, {name: 'Copy'}, {name: 'Paste'}]
      }
    ]}>
    {(item) => (
      <Section key={item.name} items={item.children} aria-label={item.name}>
        {(item) => <Item key={item.name}>{item.name}</Item>}
      </Section>
    )}
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>Edit</ActionButton>
  <Menu
    items={[
      {
        name: 'Rollback Options',
        children: [{name: 'Undo'}, {name: 'Redo'}]
      },
      {
        name: 'Selected Text Options',
        children: [
          {name: 'Cut'},
          {name: 'Copy'},
          {name: 'Paste'}
        ]
      }
    ]}>
    {(item) => (
      <Section
        key={item.name}
        items={item.children}
        aria-label={item.name}>
        {(item) => (
          <Item key={item.name}>{item.name}</Item>
        )}
      </Section>
    )}
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    Edit
  </ActionButton>
  <Menu
    items={[
      {
        name:
          'Rollback Options',
        children: [
          {
            name:
              'Undo'
          },
          {
            name:
              'Redo'
          }
        ]
      },
      {
        name:
          'Selected Text Options',
        children: [
          {
            name: 'Cut'
          },
          {
            name:
              'Copy'
          },
          {
            name:
              'Paste'
          }
        ]
      }
    ]}>
    {(item) => (
      <Section
        key={item.name}
        items={
          item.children
        }
        aria-label={
          item.name
        }>
        {(item) => (
          <Item
            key={
              item.name
            }>
            {item.name}
          </Item>
        )}
      </Section>
    )}
  </Menu>
</MenuTrigger>

Events#


Menu supports selection via mouse, keyboard, and touch.

onOpenChange#

MenuTrigger accepts an onOpenChange handler which is triggered whenever the Menu is opened or closed.

The example below uses onOpenChange to update a separate span element with the current open state of the Menu.

function Example() {
  let [state, setState] = React.useState(false);

  return (
    <div>
      <MenuTrigger onOpenChange={(isOpen) => setState(isOpen)}>
        <ActionButton>Edit</ActionButton>
        <Menu>
          <Item key="cut">Cut</Item>
          <Item key="copy">Copy</Item>
          <Item key="paste">Paste</Item>
        </Menu>
      </MenuTrigger>
      <span style={{'margin-left': '8px'}}>
        Current open state: {state.toString()}
      </span>
    </div>
  );
}
function Example() {
  let [state, setState] = React.useState(false);

  return (
    <div>
      <MenuTrigger
        onOpenChange={(isOpen) => setState(isOpen)}>
        <ActionButton>Edit</ActionButton>
        <Menu>
          <Item key="cut">Cut</Item>
          <Item key="copy">Copy</Item>
          <Item key="paste">Paste</Item>
        </Menu>
      </MenuTrigger>
      <span style={{'margin-left': '8px'}}>
        Current open state: {state.toString()}
      </span>
    </div>
  );
}
function Example() {
  let [
    state,
    setState
  ] = React.useState(
    false
  );

  return (
    <div>
      <MenuTrigger
        onOpenChange={(
          isOpen
        ) =>
          setState(
            isOpen
          )
        }>
        <ActionButton>
          Edit
        </ActionButton>
        <Menu>
          <Item key="cut">
            Cut
          </Item>
          <Item key="copy">
            Copy
          </Item>
          <Item key="paste">
            Paste
          </Item>
        </Menu>
      </MenuTrigger>
      <span
        style={{
          'margin-left':
            '8px'
        }}>
        Current open
        state:{' '}
        {state.toString()}
      </span>
    </div>
  );
}

onAction#

Menu accepts an onAction handler which is triggered whenever a Menu Item is selected.

The example below uses the onAction to update text beside the MenuTrigger with the last selected Item.

function Example() {
  let [state, setState] = React.useState(false);

  return (
    <div>
      <MenuTrigger>
        <ActionButton>
            Edit
        </ActionButton>
        <Menu onAction={(value) => setState(value)}>
          <Item key="cut">Cut</Item>
          <Item key="copy">Copy</Item>
          <Item key="paste">Paste</Item>
        </Menu>
      </MenuTrigger>
      <span style={{'margin-left': '8px'}}>onAction: {state.toString()}</span>
    </div>
  );
}
function Example() {
  let [state, setState] = React.useState(false);

  return (
    <div>
      <MenuTrigger>
        <ActionButton>Edit</ActionButton>
        <Menu onAction={(value) => setState(value)}>
          <Item key="cut">Cut</Item>
          <Item key="copy">Copy</Item>
          <Item key="paste">Paste</Item>
        </Menu>
      </MenuTrigger>
      <span style={{'margin-left': '8px'}}>
        onAction: {state.toString()}
      </span>
    </div>
  );
}
function Example() {
  let [
    state,
    setState
  ] = React.useState(
    false
  );

  return (
    <div>
      <MenuTrigger>
        <ActionButton>
          Edit
        </ActionButton>
        <Menu
          onAction={(
            value
          ) =>
            setState(
              value
            )
          }>
          <Item key="cut">
            Cut
          </Item>
          <Item key="copy">
            Copy
          </Item>
          <Item key="paste">
            Paste
          </Item>
        </Menu>
      </MenuTrigger>
      <span
        style={{
          'margin-left':
            '8px'
        }}>
        onAction:{' '}
        {state.toString()}
      </span>
    </div>
  );
}

Props#


NameTypeDefaultDescription
childrenReactElement[]The contents of the MenuTrigger, a trigger and a Menu. See the MenuTrigger Content section for more information on what to provide as children.
alignAlignmentWhere the Menu aligns with its trigger.
direction'bottom''top'Where the Menu opens relative to its trigger.
closeOnSelectbooleanWhether the Menu closes when a selection is made.
shouldFlipbooleanWhether the element should flip its orientation when there is insufficient space for it to render within the view.
isOpenbooleanWhether the overlay is open by default (controlled).
defaultOpenbooleanWhether the overlay is open by default (uncontrolled).
Events
NameTypeDefaultDescription
onOpenChange( (isOpen: boolean )) => voidHandler that is called when the overlay's open state changes.
NameTypeDefaultDescription
childrenCollectionChildren<T>The contents of the collection.
autoFocusbooleanFocusStrategyWhere the focus should be set.
shouldFocusWrapbooleanWhether keyboard navigation is circular.
itemsIterable<T>Item objects in the collection.
disabledKeysIterable<Key>The item keys that are disabled. These items cannot be selected, focused, or otherwise interacted with.
selectionModeSelectionModeThe type of selection that is allowed in the collection.
disallowEmptySelectionbooleanWhether the collection allows empty selection.
selectedKeys'all'Iterable<Key>The currently selected keys in the collection (controlled).
defaultSelectedKeys'all'Iterable<Key>The initial selected keys in the collection (uncontrolled).
Events
NameTypeDefaultDescription
onAction( (key: Key )) => voidHandler that is called when an item is selected.
onSelectionChange( (keys: Selection )) => anyHandler that is called when the selection changes.
Layout
NameTypeDefaultDescription
flexstringnumberbooleanWhen used in a flex layout, specifies how the element will grow or shrink to fit the space available. See MDN.
flexGrownumberWhen used in a flex layout, specifies how the element will grow to fit the space available. See MDN.
flexShrinknumberWhen used in a flex layout, specifies how the element will shrink to fit the space available. See MDN.
flexBasisnumberstringWhen used in a flex layout, specifies the initial main size of the element. See MDN.
alignSelf'auto''normal''start''end''center''flex-start''flex-end''self-start''self-end''stretch'Overrides the alignItems property of a flex or grid container. See MDN.
justifySelf'auto''normal''start''end''flex-start''flex-end''self-start''self-end''center''left''right''stretch'Specifies how the element is justified inside a flex or grid container. See MDN.
ordernumberThe layout order for the element within a flex or grid container. See MDN.
gridAreastringWhen used in a grid layout, specifies the named grid area that the element should be placed in within the grid. See MDN.
gridColumnstringWhen used in a grid layout, specifies the column the element should be placed in within the grid. See MDN.
gridRowstringWhen used in a grid layout, specifies the row the element should be placed in within the grid. See MDN.
gridColumnStartstringWhen used in a grid layout, specifies the starting column to span within the grid. See MDN.
gridColumnEndstringWhen used in a grid layout, specifies the ending column to span within the grid. See MDN.
gridRowStartstringWhen used in a grid layout, specifies the starting row to span within the grid. See MDN.
gridRowEndstringWhen used in a grid layout, specifies the ending row to span within the grid. See MDN.
Spacing
NameTypeDefaultDescription
marginDimensionValueThe margin for all four sides of the element. See MDN.
marginTopDimensionValueThe margin for the top side of the element. See MDN.
marginBottomDimensionValueThe margin for the bottom side of the element. See MDN.
marginStartDimensionValueThe margin for the logical start side of the element, depending on layout direction. See MDN.
marginEndDimensionValueThe margin for the logical end side of an element, depending on layout direction. See MDN.
marginXDimensionValueThe margin for both the left and right sides of the element. See MDN.
marginYDimensionValueThe margin for both the top and bottom sides of the element. See MDN.
Sizing
NameTypeDefaultDescription
widthDimensionValueThe width of the element. See MDN.
minWidthDimensionValueThe minimum width of the element. See MDN.
maxWidthDimensionValueThe maximum width of the element. See MDN.
heightDimensionValueThe height of the element. See MDN.
minHeightDimensionValueThe minimum height of the element. See MDN.
maxHeightDimensionValueThe maximum height of the element. See MDN.
Positioning
NameTypeDefaultDescription
position'static''relative''absolute''fixed''sticky'Specifies how the element is positioned. See MDN.
topDimensionValueThe top position for the element. See MDN.
bottomDimensionValueThe bottom position for the element. See MDN.
leftDimensionValueThe left position for the element. See MDN. Consider using start instead for RTL support.
rightDimensionValueThe right position for the element. See MDN. Consider using start instead for RTL support.
startDimensionValueThe logical start position for the element, depending on layout direction. See MDN.
endDimensionValueThe logical end position for the element, depending on layout direction. See MDN.
zIndexnumberThe stacking order for the element. See MDN.
isHiddenbooleanHides the element.
Accessibility
NameTypeDefaultDescription
idstringThe element's unique identifier.
aria-labelstringDefines a string value that labels the current element.
aria-labelledbystringIdentifies the element (or elements) that labels the current element.
aria-describedbystringIdentifies the element (or elements) that describes the object.
aria-detailsstringIdentifies the element (or elements) that provide a detailed, extended description for the object.
Advanced
NameTypeDefaultDescription
UNSAFE_classNamestringSets the CSS className for the element. Only use as a last resort. Use style props instead.
UNSAFE_styleCSSPropertiesSets inline style for the element. Only use as a last resort. Use style props instead.

Behavioral Options#


Align (MenuTrigger)#

View guidelines

<MenuTrigger align="start">
  <ActionButton>
    placement align=start
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger align="end">
  <ActionButton>
    placement align=end
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger align="start">
  <ActionButton>
    placement align=start
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger align="end">
  <ActionButton>
    placement align=end
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger align="start">
  <ActionButton>
    placement
    align=start
  </ActionButton>
  <Menu>
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>
<MenuTrigger align="end">
  <ActionButton>
    placement align=end
  </ActionButton>
  <Menu>
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>

Direction (MenuTrigger)#

View guidelines

<MenuTrigger direction="bottom" shouldFlip={false}>
  <ActionButton>
    placement direction=bottom
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger direction="top" shouldFlip={false}>
  <ActionButton>
    placement direction=top
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger direction="bottom" shouldFlip={false}>
  <ActionButton>
    placement direction=bottom
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger direction="top" shouldFlip={false}>
  <ActionButton>
    placement direction=top
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger
  direction="bottom"
  shouldFlip={false}>
  <ActionButton>
    placement
    direction=bottom
  </ActionButton>
  <Menu>
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>
<MenuTrigger
  direction="top"
  shouldFlip={false}>
  <ActionButton>
    placement
    direction=top
  </ActionButton>
  <Menu>
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>

Autofocus (Menu)#

Applying autoFocus to the Menu of the MenuTrigger sets focus to a Menu Item within the Menu upon opening.

This example demonstrates how to use autoFocus to automatically focus the selected Menu Item when the Menu is opened.

<MenuTrigger>
  <ActionButton>
    autoFocus
  </ActionButton>
  <Menu
    selectionMode="single"
    selectedKeys={['copy']}
    autoFocus>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    autoFocus
  </ActionButton>
  <Menu
    selectionMode="single"
    selectedKeys={['copy']}
    autoFocus>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    autoFocus
  </ActionButton>
  <Menu
    selectionMode="single"
    selectedKeys={[
      'copy'
    ]}
    autoFocus>
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>

These examples demonstrate how to use autoFocus to set whether or not the first Menu Item or last Menu Item is focused when the Menu is opened.

<MenuTrigger>
  <ActionButton>
      autofocus=first
  </ActionButton>
  <Menu autoFocus="first">
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    autofocus=last
  </ActionButton>
  <Menu autoFocus="last">
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
      autofocus=first
  </ActionButton>
  <Menu autoFocus="first">
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    autofocus=last
  </ActionButton>
  <Menu autoFocus="last">
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    autofocus=first
  </ActionButton>
  <Menu autoFocus="first">
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    autofocus=last
  </ActionButton>
  <Menu autoFocus="last">
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>

Closes on Selection (MenuTrigger)#

The closeOnSelect MenuTrigger prop closes the Menu when an MenuItem is selected (default). Setting the closeOnSelect prop to false would be useful for a Menu listing filtering options where the user would make multiple selections at once.

<MenuTrigger closeOnSelect>
  <ActionButton>
    closeOnSelect=true
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect={false}>
  <ActionButton>
    closeOnSelect=false
  </ActionButton>
  <Menu selectionMode="multiple">
    <Item key="jpg">jpg</Item>
    <Item key="png">png</Item>
    <Item key="tiff">tiff</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect>
  <ActionButton>
    closeOnSelect=true
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger closeOnSelect={false}>
  <ActionButton>
    closeOnSelect=false
  </ActionButton>
  <Menu selectionMode="multiple">
    <Item key="jpg">jpg</Item>
    <Item key="png">png</Item>
    <Item key="tiff">tiff</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger
  closeOnSelect>
  <ActionButton>
    closeOnSelect=true
  </ActionButton>
  <Menu>
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>
<MenuTrigger
  closeOnSelect={
    false
  }>
  <ActionButton>
    closeOnSelect=false
  </ActionButton>
  <Menu selectionMode="multiple">
    <Item key="jpg">
      jpg
    </Item>
    <Item key="png">
      png
    </Item>
    <Item key="tiff">
      tiff
    </Item>
  </Menu>
</MenuTrigger>

Disabled Menu Items (Menu)#

<MenuTrigger>
  <ActionButton>
    Filter
  </ActionButton>
  <Menu
    items={[
      {name: 'tiff', dataId: 'a1b2c3'},
      {name: 'png', dataId: 'g5h1j9'},
      {name: 'jpg', dataId: 'p8k3i4'},
      {name: 'PDF', dataId: 'j7i3a0'}
    ]}
    disabledKeys={['a1b2c3', 'p8k3i4']}>
    {item => <Item key={item.dataId}>{item.name}</Item>}
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    Filter
  </ActionButton>
  <Menu
    items={[
      {name: 'tiff', dataId: 'a1b2c3'},
      {name: 'png', dataId: 'g5h1j9'},
      {name: 'jpg', dataId: 'p8k3i4'},
      {name: 'PDF', dataId: 'j7i3a0'}
    ]}
    disabledKeys={['a1b2c3', 'p8k3i4']}>
    {item => <Item key={item.dataId}>{item.name}</Item>}
  </Menu>
</MenuTrigger>
<MenuTrigger>
  <ActionButton>
    Filter
  </ActionButton>
  <Menu
    items={[
      {
        name: 'tiff',
        dataId:
          'a1b2c3'
      },
      {
        name: 'png',
        dataId:
          'g5h1j9'
      },
      {
        name: 'jpg',
        dataId:
          'p8k3i4'
      },
      {
        name: 'PDF',
        dataId:
          'j7i3a0'
      }
    ]}
    disabledKeys={[
      'a1b2c3',
      'p8k3i4'
    ]}>
    {(item) => (
      <Item
        key={
          item.dataId
        }>
        {item.name}
      </Item>
    )}
  </Menu>
</MenuTrigger>

Flipping (MenuTrigger)#

Applying shouldFlip to the MenuTrigger makes the Menu attempt to flip on its main axis in situations where the original placement would cause it to render out of view.

<MenuTrigger shouldFlip>
  <ActionButton>
    shouldFlip=true
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger shouldFlip={false}>
  <ActionButton>
    shouldFlip=false
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger shouldFlip>
  <ActionButton>
    shouldFlip=true
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger shouldFlip={false}>
  <ActionButton>
    shouldFlip=false
  </ActionButton>
  <Menu>
    <Item key="cut">Cut</Item>
    <Item key="copy">Copy</Item>
    <Item key="paste">Paste</Item>
  </Menu>
</MenuTrigger>
<MenuTrigger
  shouldFlip>
  <ActionButton>
    shouldFlip=true
  </ActionButton>
  <Menu>
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>
<MenuTrigger
  shouldFlip={false}>
  <ActionButton>
    shouldFlip=false
  </ActionButton>
  <Menu>
    <Item key="cut">
      Cut
    </Item>
    <Item key="copy">
      Copy
    </Item>
    <Item key="paste">
      Paste
    </Item>
  </Menu>
</MenuTrigger>

Open (MenuTrigger)#

The isOpen and defaultOpen props control whether the MenuTrigger is open by default. They apply controlled and uncontrolled behavior on the MenuTrigger respectively.