Hotkey
キーボードショートカットの解析、ラベル付け、読み上げ、一致判定を行います。Appleプラットフォームでは⌘、それ以外ではCtrlを使います。
- Apple
- ⇧⌘K
- Windows and Linux
- Shift+Ctrl+K
- Screen readers
- Shift Command K
- parseHotkey
- [["shift","mod","k"]]
Click outside the field and press Shift Command Kmatched 0×
pnpm dlx shadcn@latest add https://hextaui.com/r/hotkey.jsonユーティリティと、それが依存するすべてをプロジェクトに追加します。
次のコードをコピーしてプロジェクトに貼り付けてください。
lib/hotkey.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
各ショートカットを文字列として一度だけ書き、その同じ文字列を使って表示、読み上げ、照合を行います。mod は、Apple のプラットフォームでは ⌘、それ以外では Ctrl を意味します。Mac で Ctrl+K、Windows で ⌘K は違和感があるため、ほとんどの場合、これが望ましい動作です。
キーは + で区切り、大文字小文字は区別されません。名前付きキーは、enter、tab、pageup、f5 のように、小文字の KeyboardEvent.key の値を使います。スペースバーには space を使います。
parseHotkey は、エイリアスを解決し、修飾キーを Apple の順序(Control、Option、Shift、Command)に並べ替えた、コードごとの配列を返します。そこから作られるラベルはすべて、ユーザーが見慣れた順序で表示されます。
Apple のプラットフォームでは、メニューの表示と同様に、区切りなしの記号を使います。Windows と Linux では、+ でつないだ単語を使います。記号は読み上げが難しいため、spokenKey でスクリーンリーダーが読み上げるべき名前を指定します。<Kbd keys> は記号を表示し、読み上げ用の名前を視覚的に非表示のテキストに入れます。
useIsApple() はプラットフォームを判定します。サーバー上とハイドレーション中は true を返し、その後に実際の結果を返すため、Windows のユーザーはハイドレーションエラーではなく、Ctrl の前に一瞬 ⌘ を目にします。
ショートカットのリスナー
matchesHotkey は、keydown イベントをホットキーと照合します。修飾キーは厳密に一致する必要があるため、mod+b は mod+shift+b では発火しません。
- 文字と数字は物理キーでも一致するため、Option+K で
˚が入力される Mac でもalt+kが動作します。 - Shift を押した文字にも一致します:
shift+kは、Shift で生成されるKに一致します。 - 1 つのコードに一致します。
g iのようなシーケンスでは、直前のコードを自分で追跡してください。 - フォーカスがテキスト入力欄にある間は、修飾キーのないショートカットをスキップします。これにより、文字を入力してもコマンドが発火することはありません。
| エクスポート | 説明 |
|---|---|
parseHotkey(hotkey) | string[][]: エイリアスが解決され、修飾キーが並べ替えられた、コードごとの配列。 |
formatHotkey(hotkey, apple) | ⇧⌘K や Shift+Ctrl+K など、1 つのコードのラベル。 |
keyLabel(key, apple) | 1 つのキー名の表示用ラベル。 |
spokenKey(key, apple) | 1 つのキーについて、スクリーンリーダーが読み上げるべき名前。 |
matchesHotkey(event, hotkey) | KeyboardEvent が、修飾キーを厳密に一致させて 1 つのコードに一致するかどうか。 |
isApplePlatform() | navigator.platform を読み取ります。サーバーでは true です。 |
useIsApple() | ハイドレーションに安全なフックとしての isApplePlatform。 |
Kbd と Command。