Menubar
Eine Menüleiste im Desktop-Stil mit einem Highlight, das zwischen offenen Menüs gleitet, und sofortigem Wechsel, wenn du darüberfährst.
pnpm dlx shadcn@latest add https://hextaui.com/r/menubar.jsonFügt die Komponente, die HextaUI-Theme-Tokens und alle HextaUI-Komponenten hinzu, von denen sie abhängt.
Füge die Theme-Tokens zu deinem globalen CSS hinzu, falls du das noch nicht getan hast.
Installiere die Abhängigkeiten.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnKopiere den folgenden Code und füge ihn in dein Projekt ein.
components/ui/menubar.tsx components/ui/dropdown-menu.tsx lib/motion.ts Passe die Importpfade an dein Projekt-Setup an.
Jedes <MenubarMenu /> ist ein Dropdown menu, daher funktionieren Items, Checkbox- und Radio-Items, Untermenüs, Labels und Tastenkürzel und sehen genau gleich aus. Öffne ein Menü und bewege dann den Zeiger oder drücke die Pfeiltasten, um über die Leiste zu streichen.
Trigger-Icons
Setze ein Icon vor das Label eines Triggers oder verwende ein Icon allein mit einem aria-label. Trigger nur mit Icon erhalten eine quadratische Form.
Icons
Setze ein Icon vor das Label. Verwende variant="destructive" bei Items, die löschen oder nicht rückgängig zu machen sind.
Deaktiviert
Deaktiviere ein einzelnes Menü mit disabled an <MenubarMenu /> oder die ganze Leiste an <Menubar />. Pfeiltasten überspringen deaktivierte Menüs.
Vertikal
orientation="vertical" stapelt die Menüs und schaltet die Navigation auf die Pfeiltasten nach oben und unten um. Öffne die Menüs zur Seite mit side="inline-end".
Rechts nach links
Menüs, Untermenüs und Pfeiltasten folgen der Leserichtung. Tastenkürzel behalten die Tastaturreihenfolge.
| Taste | Aktion |
|---|---|
| Tab | Setzt den Fokus in die Menubar und wieder hinaus. |
| ←→ | Wechselt zwischen Menüs. Bei offenem Menü wird stattdessen das nächste geöffnet. |
| EnterSpace↓ | Öffnet das fokussierte Menü. |
| ↑↓ | Wechselt zwischen Items in einem offenen Menü. |
| → | Öffnet ein Untermenü von seinem Trigger aus. |
| Esc | Schließt das offene Menü und gibt den Fokus an seinen Trigger zurück. |
- Gib der Menubar mit
aria-labeleinen Namen. Sie rendertrole="menubar", und jeder Trigger ist ein Menüeintrag, sodass Screenreader sie als Anwendungsmenü ansagen. - Die Leiste ist ein einziger Tab-Stopp. Pfeiltasten wechseln zwischen Menüs, sodass die Tab-Reihenfolge der Seite kurz bleibt.
- Das gleitende Highlight ist Dekoration. Bei reduzierter Bewegung erscheint es einfach am offenen Menü.
Menüteile akzeptieren dieselben Props wie ihre Gegenstücke im Dropdown menu.
| Prop | Typ | Standard |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
loopFocusVom letzten Menü zurück zum ersten springen. | boolean | true |
modalBlockiere das Scrollen der Seite und Klicks außerhalb, solange ein Menü offen ist. | boolean | true |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Beschreibung |
|---|---|
data-slot="menubar" | Die Leiste per CSS ansprechen. |
data-orientation | Die Ausrichtung. |
data-has-submenu-open | Vorhanden, solange ein beliebiges Menü der Leiste offen ist. |
data-slot="menubar-highlight" | Der gleitende Hintergrund hinter dem offenen Trigger, mit data-visible. |
--menubar-radius | Eckenradius der Leiste. Trigger und Highlight leiten ihren davon ab. |
| Prop | Typ | Standard |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
disabled | boolean | false |
| Attribut | Beschreibung |
|---|---|
data-slot="menubar-trigger" | Trigger in CSS ansprechen. |
data-popup-open | Vorhanden, solange das Menü geöffnet ist. |
data-disabled | Vorhanden, wenn deaktiviert. |
| Prop | Typ | Standard |
|---|---|---|
side | "top" | "bottom" | "left" | "right" | "inline-start" | "inline-end" | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 8 |
alignOffsetRichtet die Items des Menüs am Label des Triggers aus. | number | -4 |
| Attribut | Beschreibung |
|---|---|
data-slot="menubar-content" | Menüs per CSS ansprechen. |
data-instant="group" | Vorhanden, wenn das Menü durch Überstreichen von einem anderen aus geöffnet wurde. Es wechselt ohne Animation. |
MenubarItem, MenubarCheckboxItem, MenubarRadioGroup, MenubarRadioItem, MenubarGroup, MenubarLabel, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubTrigger und MenubarSubContent sind die Teile des Dropdown menu mit menubar-*-Slots. Ihre Props findest du in der API des Dropdown menu.
- Dropdown menuEin Menü mit Aktionen und Optionen hinter einem Button, mit Gruppen, Untermenüs, Checkbox- und Radio-Einträgen sowie Tastenkürzeln.
- MotionDie Easing-Kurven, Dauern und der Reduced-Motion-Check, mit denen jede Komponente animiert, plus Hooks für Größen-Morphs und gleitende Hervorhebungen.
- Alert dialogEin Bestätigungsdialog für destruktive oder wichtige Aktionen, der auf asynchrone Arbeit wartet und auf Smartphones zum Bottom Sheet wird.
- CommandEine durchsuchbare Liste von Aktionen, inline oder als ⌘K-Palette, mit Seiten, Tastenkürzeln und hervorgehobenen Treffern.
- Context menuEin Menü mit Aktionen per Rechtsklick oder langem Drücken, mit Untermenüs, Checkbox- und Radio-Einträgen sowie Halte-Feedback auf Touch-Geräten.
- DialogEin Fenster über der Seite für Formulare und fokussierte Aufgaben, mit fixiertem Header und Footer, Verschachtelung und einem wischbaren Bottom Sheet auf Smartphones.