LabelNavigation Menu
Get Started
Introduction
Components
Accordion
Badge
Button
Card
Checkbox
Command
Dialog
Dropdown Menu
Input
Select
Switch
Table
Tabs
Toast
Tooltip
Forms
Controlled Input
Field Arrays
Submit
Validation

A visually persistent menu common in desktop applications.

#Installation

bunx --bun barefoot add menubar

#Usage

1import {2  Menubar,3  MenubarMenu,4  MenubarTrigger,5  MenubarContent,6  MenubarItem,7  MenubarSeparator,8  MenubarShortcut,9} from '@/components/ui/menubar'

#Examples

#Basic

1"use client"23import {4  Menubar,5  MenubarMenu,6  MenubarTrigger,7  MenubarContent,8  MenubarItem,9  MenubarSeparator,10  MenubarShortcut,11} from '@/components/ui/menubar'1213function BasicMenubar() {14  return (15    <Menubar>16      <MenubarMenu value="file">17        <MenubarTrigger>File</MenubarTrigger>18        <MenubarContent>19          <MenubarItem>20            <span>New Tab</span>21            <MenubarShortcut>⌘T</MenubarShortcut>22          </MenubarItem>23          <MenubarItem>24            <span>New Window</span>25          </MenubarItem>26          <MenubarSeparator />27          <MenubarItem>28            <span>Print</span>29            <MenubarShortcut>⌘P</MenubarShortcut>30          </MenubarItem>31        </MenubarContent>32      </MenubarMenu>33      <MenubarMenu value="edit">34        <MenubarTrigger>Edit</MenubarTrigger>35        <MenubarContent>36          <MenubarItem>37            <span>Undo</span>38            <MenubarShortcut>⌘Z</MenubarShortcut>39          </MenubarItem>40          <MenubarItem>41            <span>Redo</span>42            <MenubarShortcut>⇧⌘Z</MenubarShortcut>43          </MenubarItem>44          <MenubarSeparator />45          <MenubarItem><span>Cut</span></MenubarItem>46          <MenubarItem><span>Copy</span></MenubarItem>47          <MenubarItem><span>Paste</span></MenubarItem>48        </MenubarContent>49      </MenubarMenu>50    </Menubar>51  )52}

#Application

1"use client"23import { createSignal } from '@barefootjs/dom'4import {5  Menubar,6  MenubarMenu,7  MenubarTrigger,8  MenubarContent,9  MenubarItem,10  MenubarCheckboxItem,11  MenubarRadioGroup,12  MenubarRadioItem,13  MenubarSub,14  MenubarSubTrigger,15  MenubarSubContent,16  MenubarSeparator,17  MenubarShortcut,18} from '@/components/ui/menubar'1920function AppMenubar() {21  const [showBookmarks, setShowBookmarks] = createSignal(true)22  const [showFullUrls, setShowFullUrls] = createSignal(false)23  const [profile, setProfile] = createSignal('benoit')2425  return (26    <Menubar>27      <MenubarMenu value="file">28        <MenubarTrigger>File</MenubarTrigger>29        <MenubarContent>30          <MenubarItem>31            <span>New Tab</span>32            <MenubarShortcut>⌘T</MenubarShortcut>33          </MenubarItem>34          <MenubarItem>35            <span>New Window</span>36            <MenubarShortcut>⌘N</MenubarShortcut>37          </MenubarItem>38          <MenubarItem disabled={true}>39            <span>New Incognito Window</span>40          </MenubarItem>41          <MenubarSeparator />42          <MenubarSub>43            <MenubarSubTrigger>44              <span>Share</span>45            </MenubarSubTrigger>46            <MenubarSubContent>47              <MenubarItem><span>Email</span></MenubarItem>48              <MenubarItem><span>Messages</span></MenubarItem>49              <MenubarItem><span>Notes</span></MenubarItem>50            </MenubarSubContent>51          </MenubarSub>52          <MenubarSeparator />53          <MenubarItem>54            <span>Print...</span>55            <MenubarShortcut>⌘P</MenubarShortcut>56          </MenubarItem>57        </MenubarContent>58      </MenubarMenu>5960      <MenubarMenu value="view">61        <MenubarTrigger>View</MenubarTrigger>62        <MenubarContent>63          <MenubarCheckboxItem64            checked={showBookmarks()}65            onCheckedChange={setShowBookmarks}66          >67            <span>Always Show Bookmarks Bar</span>68          </MenubarCheckboxItem>69          <MenubarCheckboxItem70            checked={showFullUrls()}71            onCheckedChange={setShowFullUrls}72          >73            <span>Always Show Full URLs</span>74          </MenubarCheckboxItem>75        </MenubarContent>76      </MenubarMenu>7778      <MenubarMenu value="profiles">79        <MenubarTrigger>Profiles</MenubarTrigger>80        <MenubarContent>81          <MenubarRadioGroup82            value={profile()}83            onValueChange={setProfile}84          >85            <MenubarRadioItem value="andy">86              <span>Andy</span>87            </MenubarRadioItem>88            <MenubarRadioItem value="benoit">89              <span>Benoit</span>90            </MenubarRadioItem>91            <MenubarRadioItem value="luis">92              <span>Luis</span>93            </MenubarRadioItem>94          </MenubarRadioGroup>95        </MenubarContent>96      </MenubarMenu>97    </Menubar>98  )99}

#Accessibility

  • Roving Hover - When one menu is open, hovering another trigger opens it
  • Keyboard Navigation - ArrowLeft/Right navigates between menus, ArrowDown/Up within menus
  • Submenu Support - Nested submenus with hover and keyboard navigation
  • ARIA - Triggers use aria-haspopup, aria-expanded; Items use appropriate roles (menuitem, menuitemcheckbox, menuitemradio)
  • Disabled State - aria-disabled on disabled items, skipped in keyboard navigation

#API Reference

Menubar

PropTypeDefaultDescription
classstring-Additional CSS classes for the menubar container.

MenubarMenu

PropTypeDefaultDescription
valuestring-Unique identifier for this menu. Auto-generated if not provided.

MenubarTrigger

PropTypeDefaultDescription
childrenChild-Trigger label text.

MenubarContent

PropTypeDefaultDescription
align'start' | 'end''start'Alignment relative to the trigger element.

MenubarItem

PropTypeDefaultDescription
disabledbooleanfalseWhether the item is disabled.
onSelect() => void-Callback when the item is selected. Menu auto-closes after selection.
variant'default' | 'destructive''default'Visual variant. Use "destructive" for dangerous actions.

MenubarCheckboxItem

PropTypeDefaultDescription
checkedbooleanfalseWhether the checkbox is checked.
onCheckedChange(checked: boolean) => void-Callback when checked state changes. Menu stays open.
disabledbooleanfalseWhether the item is disabled.

MenubarRadioGroup

PropTypeDefaultDescription
valuestring-Currently selected value.
onValueChange(value: string) => void-Callback when value changes.

MenubarRadioItem

PropTypeDefaultDescription
valuestring-Value for this radio item.
disabledbooleanfalseWhether the item is disabled.

MenubarSub

Submenu container. Manages sub-open state internally. Wrap SubTrigger and SubContent.

MenubarSubTrigger

PropTypeDefaultDescription
disabledbooleanfalseWhether the sub trigger is disabled.

MenubarSubContent

Content container for submenu items. Positioned to the right of the trigger.

MenubarLabel

Section label inside the menu.

MenubarSeparator

Visual separator between menu item groups.

MenubarShortcut

PropTypeDefaultDescription
childrenChild-The keyboard shortcut text (e.g., "⌘T").