Menubar
A visually persistent menu common in desktop applications that provides quick access to a consistent set of commands.
Kobalte
The Menubar component is built on top of Kobalte Menubar, which provides accessible menu, keyboard, and focus behavior.
import { createSignal } from "solid-js";import { Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarMenu, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger,} from "~/components/ui/menubar";
export default function MenubarDemo() { const [showBookmarksBar, setShowBookmarksBar] = createSignal(false); const [showFullUrls, setShowFullUrls] = createSignal(true);
return ( <Menubar class="w-72"> <MenubarMenu> <MenubarTrigger>File</MenubarTrigger> <MenubarContent> <MenubarGroup> <MenubarItem> New Tab <MenubarShortcut>⌘T</MenubarShortcut> </MenubarItem> <MenubarItem> New Window <MenubarShortcut>⌘N</MenubarShortcut> </MenubarItem> <MenubarItem disabled>New Incognito Window</MenubarItem> </MenubarGroup> <MenubarSeparator /> <MenubarGroup> <MenubarSub> <MenubarSubTrigger>Share</MenubarSubTrigger> <MenubarSubContent> <MenubarGroup> <MenubarItem>Email link</MenubarItem> <MenubarItem>Messages</MenubarItem> <MenubarItem>Notes</MenubarItem> </MenubarGroup> </MenubarSubContent> </MenubarSub> </MenubarGroup> <MenubarSeparator /> <MenubarGroup> <MenubarItem> Print... <MenubarShortcut>⌘P</MenubarShortcut> </MenubarItem> </MenubarGroup> </MenubarContent> </MenubarMenu> <MenubarMenu> <MenubarTrigger>Edit</MenubarTrigger> <MenubarContent> <MenubarGroup> <MenubarItem> Undo <MenubarShortcut>⌘Z</MenubarShortcut> </MenubarItem> <MenubarItem> Redo <MenubarShortcut>⇧⌘Z</MenubarShortcut> </MenubarItem> </MenubarGroup> <MenubarSeparator /> <MenubarGroup> <MenubarSub> <MenubarSubTrigger>Find</MenubarSubTrigger> <MenubarSubContent> <MenubarGroup> <MenubarItem>Search the web</MenubarItem> </MenubarGroup> <MenubarSeparator /> <MenubarGroup> <MenubarItem>Find...</MenubarItem> <MenubarItem>Find Next</MenubarItem> <MenubarItem>Find Previous</MenubarItem> </MenubarGroup> </MenubarSubContent> </MenubarSub> </MenubarGroup> <MenubarSeparator /> <MenubarGroup> <MenubarItem>Cut</MenubarItem> <MenubarItem>Copy</MenubarItem> <MenubarItem>Paste</MenubarItem> </MenubarGroup> </MenubarContent> </MenubarMenu> <MenubarMenu> <MenubarTrigger>View</MenubarTrigger> <MenubarContent class="w-44"> <MenubarGroup> <MenubarCheckboxItem checked={showBookmarksBar()} onChange={setShowBookmarksBar}> Bookmarks Bar </MenubarCheckboxItem> <MenubarCheckboxItem checked={showFullUrls()} onChange={setShowFullUrls}> Full URLs </MenubarCheckboxItem> </MenubarGroup> <MenubarSeparator /> <MenubarGroup> <MenubarItem inset> Reload <MenubarShortcut>⌘R</MenubarShortcut> </MenubarItem> <MenubarItem disabled inset> Force Reload <MenubarShortcut>⇧⌘R</MenubarShortcut> </MenubarItem> </MenubarGroup> <MenubarSeparator /> <MenubarGroup> <MenubarItem inset>Toggle Fullscreen</MenubarItem> </MenubarGroup> <MenubarSeparator /> <MenubarGroup> <MenubarItem inset>Hide Sidebar</MenubarItem> </MenubarGroup> </MenubarContent> </MenubarMenu> <MenubarMenu> <MenubarTrigger>Profiles</MenubarTrigger> <MenubarContent> <MenubarRadioGroup defaultValue="benoit"> <MenubarRadioItem value="andy">Andy</MenubarRadioItem> <MenubarRadioItem value="benoit">Benoit</MenubarRadioItem> <MenubarRadioItem value="luis">Luis</MenubarRadioItem> </MenubarRadioGroup> <MenubarSeparator /> <MenubarGroup> <MenubarItem inset>Edit...</MenubarItem> </MenubarGroup> <MenubarSeparator /> <MenubarGroup> <MenubarItem inset>Add Profile...</MenubarItem> </MenubarGroup> </MenubarContent> </MenubarMenu> </Menubar> );}Installation
Usage
import { Menubar, MenubarContent, MenubarGroup, MenubarItem, MenubarMenu, MenubarSeparator, MenubarShortcut, MenubarTrigger,} from "~/components/ui/menubar";<Menubar> <MenubarMenu> <MenubarTrigger>File</MenubarTrigger> <MenubarContent> <MenubarGroup> <MenubarItem> New Tab <MenubarShortcut>⌘T</MenubarShortcut> </MenubarItem> <MenubarItem>New Window</MenubarItem> </MenubarGroup> <MenubarSeparator /> <MenubarGroup> <MenubarItem>Share</MenubarItem> <MenubarItem>Print</MenubarItem> </MenubarGroup> </MenubarContent> </MenubarMenu></Menubar>See the Kobalte Menubar documentation for primitive-level options, accessibility, and keyboard behavior.
Composition
Use the following composition to build a Menubar:
Menubar├── MenubarMenu│ ├── MenubarTrigger│ └── MenubarContent│ ├── MenubarGroup│ │ ├── MenubarLabel│ │ ├── MenubarItem│ │ └── MenubarItem│ ├── MenubarSeparator│ ├── MenubarGroup│ │ ├── MenubarLabel│ │ ├── MenubarCheckboxItem│ │ └── MenubarCheckboxItem│ ├── MenubarSeparator│ ├── MenubarGroup│ │ ├── MenubarLabel│ │ └── MenubarRadioGroup│ │ ├── MenubarRadioItem│ │ └── MenubarRadioItem│ └── MenubarSub│ ├── MenubarSubTrigger│ └── MenubarSubContent│ └── MenubarGroup│ ├── MenubarLabel│ ├── MenubarItem│ └── MenubarItem└── MenubarMenu ├── MenubarTrigger └── MenubarContent └── MenubarGroup ├── MenubarLabel ├── MenubarItem └── MenubarItemCheckbox
Use MenubarCheckboxItem for toggleable options.
import { createSignal } from "solid-js";import { Menubar, MenubarCheckboxItem, MenubarContent, MenubarItem, MenubarMenu, MenubarSeparator, MenubarShortcut, MenubarTrigger,} from "~/components/ui/menubar";
export default function MenubarCheckbox() { const [showBookmarksBar, setShowBookmarksBar] = createSignal(false); const [showFullUrls, setShowFullUrls] = createSignal(true); const [strikethrough, setStrikethrough] = createSignal(true); const [code, setCode] = createSignal(false); const [superscript, setSuperscript] = createSignal(false);
return ( <Menubar class="w-72"> <MenubarMenu> <MenubarTrigger>View</MenubarTrigger> <MenubarContent class="w-64"> <MenubarCheckboxItem checked={showBookmarksBar()} onChange={setShowBookmarksBar}> Always Show Bookmarks Bar </MenubarCheckboxItem> <MenubarCheckboxItem checked={showFullUrls()} onChange={setShowFullUrls}> Always Show Full URLs </MenubarCheckboxItem> <MenubarSeparator /> <MenubarItem inset> Reload <MenubarShortcut>⌘R</MenubarShortcut> </MenubarItem> <MenubarItem disabled inset> Force Reload <MenubarShortcut>⇧⌘R</MenubarShortcut> </MenubarItem> </MenubarContent> </MenubarMenu> <MenubarMenu> <MenubarTrigger>Format</MenubarTrigger> <MenubarContent> <MenubarCheckboxItem checked={strikethrough()} onChange={setStrikethrough}> Strikethrough </MenubarCheckboxItem> <MenubarCheckboxItem checked={code()} onChange={setCode}> Code </MenubarCheckboxItem> <MenubarCheckboxItem checked={superscript()} onChange={setSuperscript}> Superscript </MenubarCheckboxItem> </MenubarContent> </MenubarMenu> </Menubar> );}Radio
Use MenubarRadioGroup and MenubarRadioItem for single-select options.
import { createSignal } from "solid-js";import { Menubar, MenubarContent, MenubarItem, MenubarMenu, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarTrigger,} from "~/components/ui/menubar";
export default function MenubarRadio() { const [selectedProfile, setSelectedProfile] = createSignal("benoit"); const [theme, setTheme] = createSignal("system");
return ( <Menubar class="w-72"> <MenubarMenu> <MenubarTrigger>Profiles</MenubarTrigger> <MenubarContent> <MenubarRadioGroup value={selectedProfile()} onChange={setSelectedProfile}> <MenubarRadioItem value="andy">Andy</MenubarRadioItem> <MenubarRadioItem value="benoit">Benoit</MenubarRadioItem> <MenubarRadioItem value="luis">Luis</MenubarRadioItem> </MenubarRadioGroup> <MenubarSeparator /> <MenubarItem inset>Edit...</MenubarItem> <MenubarItem inset>Add Profile...</MenubarItem> </MenubarContent> </MenubarMenu> <MenubarMenu> <MenubarTrigger>Theme</MenubarTrigger> <MenubarContent> <MenubarRadioGroup value={theme()} onChange={setTheme}> <MenubarRadioItem value="light">Light</MenubarRadioItem> <MenubarRadioItem value="dark">Dark</MenubarRadioItem> <MenubarRadioItem value="system">System</MenubarRadioItem> </MenubarRadioGroup> </MenubarContent> </MenubarMenu> </Menubar> );}Submenu
Use MenubarSub, MenubarSubTrigger, and MenubarSubContent for nested menus.
import { Menubar, MenubarContent, MenubarItem, MenubarMenu, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger,} from "~/components/ui/menubar";
export default function MenubarSubmenu() { return ( <Menubar class="w-72"> <MenubarMenu> <MenubarTrigger>File</MenubarTrigger> <MenubarContent> <MenubarSub> <MenubarSubTrigger>Share</MenubarSubTrigger> <MenubarSubContent> <MenubarItem>Email link</MenubarItem> <MenubarItem>Messages</MenubarItem> <MenubarItem>Notes</MenubarItem> </MenubarSubContent> </MenubarSub> <MenubarSeparator /> <MenubarItem> Print... <MenubarShortcut>⌘P</MenubarShortcut> </MenubarItem> </MenubarContent> </MenubarMenu> <MenubarMenu> <MenubarTrigger>Edit</MenubarTrigger> <MenubarContent> <MenubarItem> Undo <MenubarShortcut>⌘Z</MenubarShortcut> </MenubarItem> <MenubarItem> Redo <MenubarShortcut>⇧⌘Z</MenubarShortcut> </MenubarItem> <MenubarSeparator /> <MenubarSub> <MenubarSubTrigger>Find</MenubarSubTrigger> <MenubarSubContent> <MenubarItem>Find...</MenubarItem> <MenubarItem>Find Next</MenubarItem> <MenubarItem>Find Previous</MenubarItem> </MenubarSubContent> </MenubarSub> <MenubarSeparator /> <MenubarItem>Cut</MenubarItem> <MenubarItem>Copy</MenubarItem> <MenubarItem>Paste</MenubarItem> </MenubarContent> </MenubarMenu> </Menubar> );}With Icons
import { FileIcon, FolderIcon, HelpCircleIcon, SaveIcon, SettingsIcon, TrashIcon,} from "lucide-solid";import { Menubar, MenubarContent, MenubarGroup, MenubarItem, MenubarMenu, MenubarSeparator, MenubarShortcut, MenubarTrigger,} from "~/components/ui/menubar";
export default function MenubarIcons() { return ( <Menubar class="w-72"> <MenubarMenu> <MenubarTrigger>File</MenubarTrigger> <MenubarContent> <MenubarItem> <FileIcon /> New File <MenubarShortcut>⌘N</MenubarShortcut> </MenubarItem> <MenubarItem> <FolderIcon /> Open Folder </MenubarItem> <MenubarSeparator /> <MenubarItem> <SaveIcon /> Save <MenubarShortcut>⌘S</MenubarShortcut> </MenubarItem> </MenubarContent> </MenubarMenu> <MenubarMenu> <MenubarTrigger>More</MenubarTrigger> <MenubarContent> <MenubarGroup> <MenubarItem> <SettingsIcon /> Settings </MenubarItem> <MenubarItem> <HelpCircleIcon /> Help </MenubarItem> <MenubarSeparator /> <MenubarItem variant="destructive"> <TrashIcon /> Delete </MenubarItem> </MenubarGroup> </MenubarContent> </MenubarMenu> </Menubar> );}API Reference
See the Kobalte Menubar API reference for primitive props, keyboard behavior, and accessibility details.