Overlay

Menubar

A pill rail of menus with hover-switching and full keyboard navigation.

Show code
"use client";

import { useState } from "react";

import {
  Menubar,
  MenubarCheckboxItem,
  MenubarContent,
  MenubarItem,
  MenubarMenu,
  MenubarSeparator,
  MenubarSub,
  MenubarSubTrigger,
  MenubarTrigger,
} from "@/registry/lilt/ui/menubar";

export default function MenubarDemo() {
  const [showGrid, setShowGrid] = useState(true);
  return (
    <Menubar>
      <MenubarMenu>
        <MenubarTrigger>File</MenubarTrigger>
        <MenubarContent>
          <MenubarItem>New</MenubarItem>
          <MenubarItem>Open</MenubarItem>
          <MenubarSeparator />
          <MenubarItem variant="danger">Delete project</MenubarItem>
        </MenubarContent>
      </MenubarMenu>
      <MenubarMenu>
        <MenubarTrigger>Edit</MenubarTrigger>
        <MenubarContent>
          <MenubarItem>Undo</MenubarItem>
          <MenubarItem>Redo</MenubarItem>
          <MenubarSeparator />
          <MenubarItem>Find &amp; replace</MenubarItem>
        </MenubarContent>
      </MenubarMenu>
      <MenubarMenu>
        <MenubarTrigger>View</MenubarTrigger>
        <MenubarContent>
          <MenubarCheckboxItem checked={showGrid} onCheckedChange={setShowGrid}>
            Show grid
          </MenubarCheckboxItem>
          <MenubarSub>
            <MenubarSubTrigger>Sort by</MenubarSubTrigger>
            <MenubarContent>
              <MenubarItem>Name</MenubarItem>
              <MenubarItem>Last edited</MenubarItem>
            </MenubarContent>
          </MenubarSub>
        </MenubarContent>
      </MenubarMenu>
    </Menubar>
  );
}

Installation

npx shadcn@latest add @lilt/menubar

Accessibility

  • One tab stop for the whole bar; arrows move across menus, Escape backs out level by level.
  • Triggers expose aria-haspopup and aria-expanded automatically.