Menubar
デスクトップ風のメニューバー。開いているメニュー間をスライドする1つのハイライトがあり、端から端へ動かすと即座に切り替わります。
pnpm dlx shadcn@latest add https://hextaui.com/r/menubar.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react @tabler/icons-react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/menubar.tsx components/ui/dropdown-menu.tsx lib/motion.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
各 <MenubarMenu /> は Dropdown menu なので、項目、チェックボックスとラジオ項目、サブメニュー、ラベル、ショートカットがまったく同じ見た目と動作で使えます。メニューを開いてから、ポインターを動かすか矢印キーを押すと、バー全体を移動できます。
トリガーのアイコン
トリガーのラベルの前にアイコンを置くか、aria-label を付けてアイコンだけを使います。アイコンだけのトリガーは正方形になります。
アイコン
ラベルの前にアイコンを置きます。削除する項目や取り消せない項目には variant="destructive" を使います。
無効
1つのメニューを無効にするには <MenubarMenu /> に disabled を指定し、バー全体なら <Menubar /> に指定します。矢印キーは無効なメニューをスキップします。
垂直
orientation="vertical" はメニューを縦に並べ、ナビゲーションを上下の矢印キーに切り替えます。side="inline-end" でメニューを横に開きます。
右から左
メニュー、サブメニュー、矢印キーは文字の読み方向に従います。ショートカットはキーボードの順序のままです。
| キー | アクション |
|---|---|
| Tab | フォーカスをメニューバーの中へ、次にその外へ移動します。 |
| ←→ | メニュー間を移動します。メニューが開いているときは、代わりに次のメニューを開きます。 |
| EnterSpace↓ | フォーカスされているメニューを開きます。 |
| ↑↓ | 開いているメニュー内で項目間を移動します。 |
| → | トリガーからサブメニューを開きます。 |
| Esc | 開いているメニューを閉じ、トリガーにフォーカスを戻します。 |
aria-labelでメニューバーに名前を付けます。role="menubar"を描画し、各トリガーは menu item になるため、スクリーンリーダーはアプリケーションメニューとして読み上げます。- バーはタブストップが1つだけです。矢印キーでメニュー間を移動するため、ページのタブ順が短く保たれます。
- スライドするハイライトは装飾です。視差効果の軽減が有効な場合は、開いているメニューにそのまま表示されます。
メニューのパーツは、対応する Dropdown menu のパーツと同じ props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
orientation | "horizontal" | "vertical" | "horizontal" |
loopFocus最後のメニューから最初のメニューへ循環します。 | boolean | true |
modalメニューが開いている間、ページのスクロールと外側のクリックをブロックします。 | boolean | true |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="menubar" | CSS でバーを指定します。 |
data-orientation | 向き。 |
data-has-submenu-open | バー内のいずれかのメニューが開いている間付きます。 |
data-slot="menubar-highlight" | 開いているトリガーの背後でスライドする背景。data-visible を持ちます。 |
--menubar-radius | バーの角丸。トリガーとハイライトの角丸はここから導かれます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
disabled | boolean | false |
| 属性 | 説明 |
|---|---|
data-slot="menubar-trigger" | CSSでトリガーを指定します。 |
data-popup-open | メニューが開いている間存在します。 |
data-disabled | 無効のときに存在します。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
side | "top" | "bottom" | "left" | "right" | "inline-start" | "inline-end" | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 8 |
alignOffsetメニューの項目をトリガーのラベルに揃えます。 | number | -4 |
| 属性 | 説明 |
|---|---|
data-slot="menubar-content" | CSS でメニューを指定します。 |
data-instant="group" | 別のメニューから移動してメニューが開いたときに付きます。アニメーションなしで切り替わります。 |
MenubarItem、MenubarCheckboxItem、MenubarRadioGroup、MenubarRadioItem、MenubarGroup、MenubarLabel、MenubarSeparator、MenubarShortcut、MenubarSub、MenubarSubTrigger、MenubarSubContent は、menubar-* スロットを持つ Dropdown menu のパーツです。props は Dropdown menu の API を参照してください。
- Dropdown menuボタンの背後に、操作とオプションをまとめたメニューです。グループ、サブメニュー、チェックボックス項目、ラジオ項目、ショートカットに対応します。
- Motionすべてのコンポーネントがアニメーションに使うイージングカーブ、継続時間、モーション軽減のチェックと、サイズのモーフィングやスライドするハイライト用のフックです。
- Alert dialog破壊的または重要な操作のための確認ダイアログです。非同期処理を待ち、スマートフォンではボトムシートになります。
- Commandインラインまたは⌘Kパレットとして使える、検索可能な操作リストです。ページ、ショートカット、一致箇所のハイライトに対応します。
- Context menu右クリックまたは長押しで開く操作メニューです。サブメニュー、チェックボックス項目、ラジオ項目に対応し、タッチでは長押しのフィードバックを返します。
- Dialogフォームや集中して行う作業のための、ページ上のウィンドウです。固定のヘッダーとフッター、入れ子に対応し、スマートフォンではスワイプできるボトムシートになります。