Skip to Content
⭐️ Leave a star →
ComponentsMenuBar

Menu Bar

Application menu bar (File / Edit / View). Click a trigger to open its menu, then hover other triggers to switch instantly between them.

Features

Click to open, hover between triggers to switch.
Only one menu open at a time (controlled by Root’s value).
Closes on outside click or Escape.
Items, separators, and per-item disabled state.
Controlled or uncontrolled open menu.

Example

import { MenuBar } from '@wire-ui/react' <MenuBar.Root> <MenuBar.Menu value="file"> <MenuBar.Trigger>File</MenuBar.Trigger> <MenuBar.Content> <MenuBar.Item onSelect={() => {}}>New</MenuBar.Item> <MenuBar.Item onSelect={() => {}}>Open</MenuBar.Item> <MenuBar.Separator /> <MenuBar.Item onSelect={() => {}}>Quit</MenuBar.Item> </MenuBar.Content> </MenuBar.Menu> <MenuBar.Menu value="edit"> <MenuBar.Trigger>Edit</MenuBar.Trigger> <MenuBar.Content> <MenuBar.Item>Undo</MenuBar.Item> <MenuBar.Item>Redo</MenuBar.Item> </MenuBar.Content> </MenuBar.Menu> </MenuBar.Root>

Styling

Both Menu and Trigger expose data-state. Use it to highlight the open trigger and animate the open menu.

<MenuBar.Trigger className=" data-[state=open]:bg-[#f5f5f5] data-[focus-visible]:ring-2 data-[focus-visible]:ring-black "> File </MenuBar.Trigger>

Using data attributes

[data-state="open"] { background: #f5f5f5; } [data-state="closed"] { /* default */ } [data-disabled] { opacity: 0.4; cursor: not-allowed; }

Root props

PropTypeDefaultDescription
valuestring | nullControlled open menu id
defaultValuestring | nullnullInitial open menu (uncontrolled)
onValueChange(value: string | null) => voidCalled when the open menu changes
PropTypeDescription
valuestringUnique id matching Root’s value

Trigger props

PropTypeDefaultDescription
disabledbooleanfalseDisables this trigger

Item props

PropTypeDefaultDescription
disabledbooleanfalseDisables this item
onSelect() => voidCalled when the item is selected (also closes the menu)

Data attributes

AttributeElementValues
data-stateMenu, Trigger, Content"open" / "closed"
data-disabledTrigger, ItemPresent when disabled
data-hover / data-active / data-focus-visibleTrigger, ItemStandard interactive states

Root sets role="menubar". Trigger sets aria-haspopup="menu" and aria-expanded. Content sets role="menu". Items set role="menuitem". Separator sets role="separator".

Accessibility

  • Hovering a trigger while another menu is open switches to that menu — matches native application menu behaviour.
  • Outside click or Escape closes the open menu.
  • Items are keyboard-activatable via Enter or Space.

Keyboard Interactions

KeyDescription
EnterActivates the focused trigger or item.
SpaceActivates the focused trigger or item.
TabMoves focus to the next trigger or item.
EscapeCloses the open menu.
Last updated on

MIT License © 2026 wire-ui

Menu Bar – Wire UI