--- name: tanstack-hotkeys description: Guide for implementing keyboard shortcuts in React using @tanstack/react-hotkeys. Use when building hotkey/shortcut features, registering keyboard shortcuts, handling key sequences, recording custom shortcuts, tracking held keys, or formatting hotkeys for display in React applications. --- # TanStack Hotkeys (React) Type-safe keyboard shortcut management for React. Package: `@tanstack/react-hotkeys`. All framework packages re-export everything from `@tanstack/hotkeys` core — no separate install needed. ## Quick Start ```tsx import { useHotkey } from '@tanstack/react-hotkeys' function App() { useHotkey('Mod+S', () => saveDocument()) return
Press Cmd+S (Mac) or Ctrl+S (Windows) to save
} ``` `Mod` resolves to `Meta` (Cmd) on macOS, `Control` on Windows/Linux. ## Core Hooks ### `useHotkey(hotkey, callback, options?)` Primary hook. Accepts string (`'Mod+S'`) or `RawHotkey` object (`{ key: 'S', mod: true }`). Callback receives `(event: KeyboardEvent, context: { hotkey, parsedHotkey })`. Auto-syncs callback every render (no stale closures). Auto-cleans up on unmount. ```tsx // String form useHotkey('Mod+S', () => save()) // Object form useHotkey({ key: 'S', mod: true }, () => save()) // Conditional useHotkey('Escape', () => onClose(), { enabled: isOpen }) // Scoped to element (must be focusable — add tabIndex) const ref = useRef(null) useHotkey('Escape', () => close(), { target: ref }) ``` **Default options:** | Option | Default | Notes | |---|---|---| | `enabled` | `true` | | | `preventDefault` | `true` | Overrides browser defaults like Cmd+S | | `stopPropagation` | `true` | | | `eventType` | `'keydown'` | Also supports `'keyup'` | | `requireReset` | `false` | When true, fires once until all keys released | | `ignoreInputs` | smart | `false` for Ctrl/Meta combos & Escape; `true` for single keys & Shift/Alt combos | | `target` | `document` | Accepts DOM element, `window`, or React ref | | `conflictBehavior` | `'warn'` | `'error'`, `'replace'`, `'allow'` | ### `useHotkeySequence(sequence, callback, options?)` Vim-style multi-key sequences. Keys pressed in order within timeout. ```tsx useHotkeySequence(['G', 'G'], () => scrollToTop()) useHotkeySequence(['D', 'I', 'W'], () => deleteInnerWord(), { timeout: 500 }) // With modifiers useHotkeySequence(['Mod+K', 'Mod+C'], () => commentSelection()) ``` Options: `timeout` (default 1000ms), `enabled` (default true). Overlapping prefixes work — manager tracks each independently. ### `useHotkeyRecorder(options)` Record custom shortcuts. Returns `{ isRecording, recordedHotkey, startRecording, stopRecording, cancelRecording }`. - Escape cancels recording - Backspace/Delete clears recorded hotkey - Auto-converts to portable `Mod` format (Meta+S becomes Mod+S) ```tsx const recorder = useHotkeyRecorder({ onRecord: (hotkey) => setShortcut(hotkey), onCancel: () => console.log('cancelled'), onClear: () => console.log('cleared'), }) ``` ### Key State Tracking ```tsx // All held keys const heldKeys = useHeldKeys() // string[] // Single key check (optimized — only re-renders when this key changes) const isShiftHeld = useKeyHold('Shift') // boolean // Key-to-code mapping (distinguish left/right modifiers) const codes = useHeldKeyCodes() // Record ``` ## Display Formatting ```tsx import { formatForDisplay, formatWithLabels } from '@tanstack/react-hotkeys' // Platform-aware symbols formatForDisplay('Mod+S') // Mac: "⌘S" | Windows: "Ctrl+S" formatForDisplay('Mod+Shift+Z') // Mac: "⇧⌘Z" | Windows: "Ctrl+Shift+Z" // Text labels formatWithLabels('Mod+S') // Mac: "Cmd+S" | Windows: "Ctrl+S" ``` Use in UI: ```tsx ``` ## `HotkeysProvider` Set global defaults for all hooks. Per-hook options override. ```tsx import { HotkeysProvider } from '@tanstack/react-hotkeys' console.log('cancelled') }, }}> ``` ## Devtools ```sh npm install @tanstack/react-devtools @tanstack/react-hotkeys-devtools ``` ```tsx import { TanStackDevtools } from '@tanstack/react-devtools' import { hotkeysDevtoolsPlugin } from '@tanstack/react-hotkeys-devtools' ``` Auto-excluded from production builds. Use `@tanstack/react-hotkeys-devtools/production` import to include in prod. ## Key Patterns - **Scoped hotkeys**: Pass `target: ref` + ensure element has `tabIndex` - **Conditional**: Use `enabled` option tied to state - **Multiple hotkeys**: Each `useHotkey` call is independent - **Shortcut settings UI**: Combine `useHotkeyRecorder` + `useHotkey` with dynamic bindings + `formatForDisplay` - **Hold-to-reveal UI**: Use `useKeyHold` to conditionally render elements - **Shortcut hints overlay**: Show overlay when modifier held via `useKeyHold` ## API Reference For complete API details including all interfaces, types, utility functions, and core classes, see [references/react-api.md](references/react-api.md).