デスクトップアプリケーションで一般的に使用される、一貫したコマンドセットへの迅速なアクセスを提供する、視覚的に持続するメニュー。
import React from 'react';import * as Menubar from '@radix-ui/react-menubar';import { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons';import './styles.css';const RADIO_ITEMS = ['Andy', 'Benoît', 'Luis'];const CHECK_ITEMS = ['Always Show Bookmarks Bar', 'Always Show Full URLs'];const MenubarDemo = () => {const [checkedSelection, setCheckedSelection] = React.useState([CHECK_ITEMS[1]]);const [radioSelection, setRadioSelection] = React.useState(RADIO_ITEMS[2]);return (<Menubar.Root className="MenubarRoot"><Menubar.Menu><Menubar.Trigger className="MenubarTrigger">File</Menubar.Trigger><Menubar.Portal><Menubar.Content className="MenubarContent" align="start" sideOffset={5} alignOffset={-3}><Menubar.Item className="MenubarItem">New Tab <div className="RightSlot">⌘ T</div></Menubar.Item><Menubar.Item className="MenubarItem">New Window <div className="RightSlot">⌘ N</div></Menubar.Item><Menubar.Item className="MenubarItem" disabled>New Incognito Window</Menubar.Item><Menubar.Separator className="MenubarSeparator" /><Menubar.Sub><Menubar.SubTrigger className="MenubarSubTrigger">Share<div className="RightSlot"><ChevronRightIcon /></div></Menubar.SubTrigger><Menubar.Portal><Menubar.SubContent className="MenubarSubContent" alignOffset={-5}><Menubar.Item className="MenubarItem">Email Link</Menubar.Item><Menubar.Item className="MenubarItem">Messages</Menubar.Item><Menubar.Item className="MenubarItem">Notes</Menubar.Item></Menubar.SubContent></Menubar.Portal></Menubar.Sub><Menubar.Separator className="MenubarSeparator" /><Menubar.Item className="MenubarItem">Print… <div className="RightSlot">⌘ P</div></Menubar.Item></Menubar.Content></Menubar.Portal></Menubar.Menu><Menubar.Menu><Menubar.Trigger className="MenubarTrigger">Edit</Menubar.Trigger><Menubar.Portal><Menubar.Content className="MenubarContent" align="start" sideOffset={5} alignOffset={-3}><Menubar.Item className="MenubarItem">Undo <div className="RightSlot">⌘ Z</div></Menubar.Item><Menubar.Item className="MenubarItem">Redo <div className="RightSlot">⇧ ⌘ Z</div></Menubar.Item><Menubar.Separator className="MenubarSeparator" /><Menubar.Sub><Menubar.SubTrigger className="MenubarSubTrigger">Find<div className="RightSlot"><ChevronRightIcon /></div></Menubar.SubTrigger><Menubar.Portal><Menubar.SubContent className="MenubarSubContent" alignOffset={-5}><Menubar.Item className="MenubarItem">Search the web…</Menubar.Item><Menubar.Separator className="MenubarSeparator" /><Menubar.Item className="MenubarItem">Find…</Menubar.Item><Menubar.Item className="MenubarItem">Find Next</Menubar.Item><Menubar.Item className="MenubarItem">Find Previous</Menubar.Item></Menubar.SubContent></Menubar.Portal></Menubar.Sub><Menubar.Separator className="MenubarSeparator" /><Menubar.Item className="MenubarItem">Cut</Menubar.Item><Menubar.Item className="MenubarItem">Copy</Menubar.Item><Menubar.Item className="MenubarItem">Paste</Menubar.Item></Menubar.Content></Menubar.Portal></Menubar.Menu><Menubar.Menu><Menubar.Trigger className="MenubarTrigger">View</Menubar.Trigger><Menubar.Portal><Menubar.Content className="MenubarContent" align="start" sideOffset={5} alignOffset={-14} >{CHECK_ITEMS.map((item) => (<Menubar.CheckboxItem className="MenubarCheckboxItem inset" key={item} checked={checkedSelection.includes(item)} onCheckedChange={() => setCheckedSelection((current) => current.includes(item) ? current.filter((el) => el !== item) : current.concat(item) ) } ><Menubar.ItemIndicator className="MenubarItemIndicator"><CheckIcon /></Menubar.ItemIndicator>{item}</Menubar.CheckboxItem>))}<Menubar.Separator className="MenubarSeparator" /><Menubar.Item className="MenubarItem inset">Reload <div className="RightSlot">⌘ R</div></Menubar.Item><Menubar.Item className="MenubarItem inset" disabled>Force Reload <div className="RightSlot">⇧ ⌘ R</div></Menubar.Item><Menubar.Separator className="MenubarSeparator" /><Menubar.Item className="MenubarItem inset">Toggle Fullscreen</Menubar.Item><Menubar.Separator className="MenubarSeparator" /><Menubar.Item className="MenubarItem inset">Hide Sidebar</Menubar.Item></Menubar.Content></Menubar.Portal></Menubar.Menu><Menubar.Menu><Menubar.Trigger className="MenubarTrigger">Profiles</Menubar.Trigger><Menubar.Portal><Menubar.Content className="MenubarContent" align="start" sideOffset={5} alignOffset={-14} ><Menubar.RadioGroup value={radioSelection} onValueChange={setRadioSelection}>{RADIO_ITEMS.map((item) => (<Menubar.RadioItem className="MenubarRadioItem inset" key={item} value={item}><Menubar.ItemIndicator className="MenubarItemIndicator"><DotFilledIcon /></Menubar.ItemIndicator>{item}</Menubar.RadioItem>))}<Menubar.Separator className="MenubarSeparator" /><Menubar.Item className="MenubarItem inset">Edit…</Menubar.Item><Menubar.Separator className="MenubarSeparator" /><Menubar.Item className="MenubarItem inset">Add Profile…</Menubar.Item></Menubar.RadioGroup></Menubar.Content></Menubar.Portal></Menubar.Menu></Menubar.Root>);};export default MenubarDemo;
制御可能または非制御可能です。
設定可能な読み取り方向を持つサブメニューをサポートします。
アイテム、ラベル、アイテムのグループをサポートします。
チェック可能なアイテム(シングルまたは複数)をサポートします。
サイド、配置、オフセット、衝突処理をカスタマイズできます。
オプションで指し示す矢印を表示できます。
フォーカスは完全に管理されています。
完全なキーボードナビゲーション。
タイプヘッドサポート。
コマンドラインからコンポーネントをインストールします。
すべての部品をインポートして組み立てる。
メニューバーのすべての部品を含みます。
トップレベルのメニューアイテム。トリガーとコンテンツの組み合わせを含みます。
コンテンツを切り替えるボタン。デフォルトでは、Menubar.Content
はトリガーに対して配置されます。
使用する場合、コンテンツ部分をbody
にポータルします。
メニューが開いているときに表示されるコンポーネント。
メニューバーメニューとともに表示するためのオプションの矢印要素。これは、トリガーとMenubar.Content
を視覚的にリンクするのに役立ちます。Menubar.Content
内にレンダリングする必要があります。
メニューバー項目を含むコンポーネント。
複数のMenubar.Item
をグループ化するために使用されます。
ラベルをレンダリングするために使用されます。矢印キーを使用してフォーカスすることはできません。
チェックボックスのように制御およびレンダリングできる項目。
複数のMenubar.RadioItem
をグループ化するために使用されます。
ラジオのように制御およびレンダリングできる項目。
親のMenubar.CheckboxItem
またはMenubar.RadioItem
がチェックされている場合にレンダリングされます。この要素を直接スタイル設定したり、アイコンを入れるためのラッパーとして使用したり、その両方を使用したりできます。
メニューバーメニューの項目を視覚的に区切るために使用されます。
サブメニューのすべての部分を包含します。
サブメニューを開く項目。Menubar.Sub
内にレンダリングする必要があります。
サブメニューが開いているときに表示されるコンポーネント。Menubar.Sub
内にレンダリングする必要があります。
Menubar.Sub
とそのパーツを組み合わせてサブメニューを作成できます。
data-disabled
属性を使用して、無効な項目に特別なスタイルを追加できます。
Separator
パーツを使用して、項目間にセパレーターを追加します。
Label
パーツを使用して、セクションにラベルを付けます。
CheckboxItem
パーツを使用して、チェックできる項目を追加します。
RadioGroup
とRadioItem
パーツを使用して、他の項目の中からチェックできる項目を追加します。
Item
パーツに画像などの追加の装飾要素を追加できます。
コンテンツ(またはサブコンテンツ)の幅をトリガー(またはサブトリガー)の幅に合わせるように制限したい場合があります。また、ビューポートを超えないように高さを制限することもできます。
これをサポートするために、--radix-menubar-trigger-width
や--radix-menubar-content-available-height
などのいくつかのCSSカスタムプロパティを公開しています。これらを使用して、コンテンツの寸法を制限します。
CSSカスタムプロパティ--radix-menubar-content-transform-origin
を公開しています。side
、sideOffset
、align
、alignOffset
、および衝突に基づいて計算された起点からコンテンツをアニメーション化するために使用します。
data-side
属性とdata-align
属性を公開しています。これらの値は、ランタイム時に変更され、衝突を反映します。これらを使用して、衝突と方向を考慮したアニメーションを作成します。
メニューボタンWAI-ARIAデザインパターンに準拠し、ロービングtabIndexを使用して、メニュー項目間のフォーカス移動を管理します。