Menubar
Une barre de menus façon bureau, avec une seule surbrillance qui glisse entre les menus ouverts et un changement instantané quand vous balayez la barre.
pnpm dlx shadcn@latest add https://hextaui.com/r/menubar.jsonAjoute le composant, les tokens de thème HextaUI et les composants HextaUI dont il dépend.
Ajoutez les tokens de thème à votre CSS global, si ce n’est pas déjà fait.
Installez les dépendances.
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cnCopiez et collez le code suivant dans votre projet.
components/ui/menubar.tsx components/ui/dropdown-menu.tsx lib/motion.ts Mettez à jour les chemins d’import selon la configuration de votre projet.
Chaque <MenubarMenu /> est un Dropdown menu : éléments, cases à cocher, boutons radio, sous-menus, labels et raccourcis fonctionnent et s'affichent exactement de la même façon. Ouvrez un menu, puis déplacez le pointeur ou appuyez sur les flèches pour balayer la barre.
Icônes de déclencheur
Placez une icône avant le label d'un déclencheur, ou utilisez une icône seule avec un aria-label. Les déclencheurs réduits à une icône sont carrés.
Icônes
Placez une icône avant le label. Utilisez variant="destructive" sur les éléments qui suppriment ou qui sont irréversibles.
Désactivé
Désactivez un seul menu avec disabled sur <MenubarMenu />, ou toute la barre sur <Menubar />. Les flèches sautent les menus désactivés.
Vertical
orientation="vertical" empile les menus et fait passer la navigation aux flèches haut et bas. Ouvrez les menus sur le côté avec side="inline-end".
De droite à gauche
Les menus, sous-menus et flèches suivent le sens de lecture. Les raccourcis restent dans l'ordre du clavier.
| Touche | Action |
|---|---|
| Tab | Place le focus dans la barre de menus, puis l'en fait sortir. |
| ←→ | Se déplace entre les menus. Avec un menu ouvert, ouvre le suivant. |
| EnterSpace↓ | Ouvre le menu qui a le focus. |
| ↑↓ | Se déplace entre les éléments d'un menu ouvert. |
| → | Ouvre un sous-menu depuis son déclencheur. |
| Esc | Ferme le menu ouvert et rend le focus à son déclencheur. |
- Donnez un nom à la barre de menus avec
aria-label. Elle rendrole="menubar"et chaque déclencheur est un élément de menu, si bien que les lecteurs d'écran l'annoncent comme un menu d'application. - La barre n'est qu'un seul arrêt de tabulation. Les flèches se déplacent entre les menus, ce qui garde l'ordre de tabulation de la page court.
- La surbrillance glissante est décorative. Avec la réduction des animations, elle apparaît simplement sur le menu ouvert.
Les parties du menu acceptent les mêmes props que leurs équivalents du Dropdown menu.
| Prop | Type | Par défaut |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
loopFocusRevient du dernier menu au premier. | boolean | true |
modalBloque le défilement de la page et les clics extérieurs tant qu'un menu est ouvert. | boolean | true |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| Attribut | Description |
|---|---|
data-slot="menubar" | Cible la barre en CSS. |
data-orientation | L’orientation. |
data-has-submenu-open | Présent tant qu'un menu de la barre est ouvert. |
data-slot="menubar-highlight" | L'arrière-plan glissant derrière le déclencheur ouvert, avec data-visible. |
--menubar-radius | Rayon des coins de la barre. Les déclencheurs et la surbrillance en dérivent le leur. |
| Prop | Type | Par défaut |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
disabled | boolean | false |
| Attribut | Description |
|---|---|
data-slot="menubar-trigger" | Ciblez les déclencheurs en CSS. |
data-popup-open | Présent tant que son menu est ouvert. |
data-disabled | Présent lorsque l’élément est désactivé. |
| Prop | Type | Par défaut |
|---|---|---|
side | "top" | "bottom" | "left" | "right" | "inline-start" | "inline-end" | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 8 |
alignOffsetAligne les éléments du menu sur le label du déclencheur. | number | -4 |
| Attribut | Description |
|---|---|
data-slot="menubar-content" | Cible les menus en CSS. |
data-instant="group" | Présent quand le menu s'est ouvert en balayant depuis un autre. Il change sans animation. |
MenubarItem, MenubarCheckboxItem, MenubarRadioGroup, MenubarRadioItem, MenubarGroup, MenubarLabel, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubTrigger et MenubarSubContent sont les parties du Dropdown menu avec des slots menubar-*. Consultez l'API du Dropdown menu pour leurs props.
- Dropdown menuUn menu d’actions et d’options derrière un bouton, avec groupes, sous-menus, éléments case à cocher et radio, et raccourcis.
- MotionLes courbes d’easing, les durées et la vérification de réduction des animations utilisées par chaque composant, ainsi que des hooks pour les morphs de taille et les surlignages glissants.
- Alert dialogUne boîte de dialogue de confirmation pour les actions destructrices ou importantes, qui attend le travail asynchrone et devient une bottom sheet sur mobile.
- CommandUne liste d’actions recherchable, intégrée ou en palette ⌘K, avec pages, raccourcis et correspondances surlignées.
- Context menuUn menu d’actions au clic droit ou à l’appui long, avec sous-menus, éléments case à cocher et radio, et retour visuel de maintien au toucher.
- DialogUne fenêtre au-dessus de la page pour les formulaires et les tâches ciblées, avec en-tête et pied de page épinglés, imbrication, et une bottom sheet balayable sur mobile.