CommandPalette

コマンドパレット

プレビュー

コマンドパレットはモーダルオーバーレイとして表示されます。

Cmd+K などのキーボードショートカットで開くのが一般的です。

使いどころ

使う場面

  • アプリ内の移動や操作を、キーボードで検索して実行する。操作が多いアプリの上級者向け
  • commands に { id, label, group, keywords, onSelect } を渡す。group で見出し付きに分かれ、keywords で別名や英語名でも見つかる
  • open と onOpenChange で制御する。開くショートカット(⌘K など)は呼び出し側で用意する

使わない場面

  • 初めての利用者が見つける必要のある主要な操作。ふつうの画面上のボタンやメニューにも置く
  • 選択肢から値を選ぶこと。Select か Combobox を使う
  • フォームの入力やコンテンツの検索。Search を使う
  • 操作が 5 個以下のアプリ。Dropdown で足りる

使い方

<CommandPalette
  open={isOpen}
  onOpenChange={setOpen}
  commands={[
    { id: "1", label: "ホーム", onSelect: () => navigate("/") },
    { id: "2", label: "設定", group: "一般", onSelect: () => navigate("/settings") },
  ]}
/>

プロパティ

名前型デフォルト説明
open必須booleanなし表示状態
onOpenChange必須(open: boolean) => voidなし表示状態変更時のコールバック
commands必須Command[]なしコマンドの配列 { id, label, icon?, group?, onSelect }
placeholderstring"コマンドを検索..."検索入力のプレースホルダー
searchLabelstringなしAccessible label for the search input (default: "コマンド検索")
labelstringなしAccessible label for the dialog (default: "コマンドパレット")
emptyMessagestringなしMessage shown when no commands match (default: "該当するコマンドが見つかりません")
filter(command: Command, query: string) => booleanなし絞り込みの差し替え。既定は label と keywords を、全角半角・ひらがなカタカナ・大文字小文字を区別せずに照合する

型と必須かどうかはソースの型定義から自動で生成しています。表にない HTML 標準の属性(className や aria-* など)も、ルート要素にそのまま渡せます。

キーボード操作

キー動作
文字入力label と keywords で絞り込む(全角・半角、ひらがな・カタカナ、大文字・小文字を区別しない)
↓ / ↑候補を次 / 前に移す。端では反対側に回る。フォーカスは入力欄に残る
Enter選択中のコマンドを実行して閉じる
Escape閉じる(背後の Dialog などは閉じない)
Tab / Shift + Tabパレット内でフォーカスを回す。外には出ない

アクセシビリティ

  • role="dialog"(aria-modal)の中に、combobox の入力欄と listbox の候補が入る。選択中の候補は aria-activedescendant で伝わる
  • 候補にフォーカスは移らず、入力欄に残る。日本語入力の変換中のキーは IME に任せ、パレットは反応しない
  • 該当なしのときは emptyMessage が role="status" で伝わる
  • dialog の名前は label(既定「コマンドパレット」)。背景は inert にならず、スクロールだけ止まる

文言

  • label は動詞を含む操作名か、移動先の名前にする(「プロジェクトを作成」「設定を開く」)
  • keywords に略称、英語名、読みを入れて、探す人の言葉で見つかるようにする

関連するコンポーネント