Use this skill when work touches TanStack Hotkeys, especially React keyboard shortcuts, command palettes, shortcut settings UIs, scoped shortcuts, Vim-style sequences, or held-key state.
Workflow
- Inspect the local shortcut stack before changing code:
- Package versions for
@tanstack/react-hotkeys(0.12.x),@tanstack/hotkeys(0.10.x), devtools, React, framework adapter, and test utilities. Code written for core0.8or older may rely on pre-0.9recorder and type behavior. - Shortcut shape: one-off hotkeys, dynamic shortcut lists, element-scoped shortcuts, global defaults, sequences, user-recorded bindings, or shortcut palettes.
- Interaction constraints: focused inputs, modals, command palettes, native browser shortcuts, app modes, disabled state, and accessibility.
- Package versions for
- Refresh current docs and package evidence when behavior or versions matter. Start from source-map.md.
- For installation, ESM/runtime requirements, logical vs physical bindings,
HotkeysProvider,useHotkey,useHotkeys, defaults, options, scoped targets, and registrations, use setup-core.md. - For
useHotkeySequence,useHotkeySequences,useHotkeyRecorder,useHotkeySequenceRecorder, recorder validation/conflicts, held-key hooks,useHotkeyHint, and dynamic user shortcuts, use sequences-recording-state.md. - For display formatting, shortcut palettes, devtools, SSR notes, accessibility, and testing, use display-production.md.
Implementation Judgment
- Prefer
Modfor cross-platform app shortcuts; it maps to Command on macOS and Control on Windows/Linux. - Treat the library as alpha (
0.x). Verify current docs before relying on edge behavior, especially recorder options, binding types, and sequence handling. Packages are ESM-only since core0.10. - Choose logical bindings (
Mod+S) for mnemonic shortcuts and physical bindings (Mod+[KeyS],{ code: 'KeyS', mod: true }) for position-based controls. A binding haskeyorcode, never both. - Use
useHotkeyfor fixed shortcuts anduseHotkeysfor dynamic or variable-length lists. Do not call hooks inside loops to register menu data. - Scope hotkeys with
targetrefs for panels, editors, and modals. Ensure the target can receive focus, usually withtabIndex. - Leave
preventDefaultandstopPropagationintentional. They default totrue, which is right for app shortcuts likeMod+Sbut wrong when native browser behavior should remain. - Respect normal typing. Understand the smart
ignoreInputsdefault before forcing single-key shortcuts to fire in text inputs. - Use
enabledfor mode/state gating. Disabled hotkeys remain registered and visible in devtools; execution is suppressed. - Add
metanames, descriptions, andgroupfor shortcuts that appear in help screens, command palettes, or devtools. - Use recorder hooks only for settings UIs where users customize shortcuts. Recorders default to
recordBy: 'code'(physical strings likeMod+[KeyS]); clearing calls onlyonClear. Usevalidate,detectConflicts, andonRejectinstead of hand-rolled duplicate checks. Persist normalizedHotkeyorHotkeySequencevalues, not display labels.
Verification
Prefer the repo's existing checks. For meaningful TanStack Hotkeys changes, include the relevant subset:
- Typecheck for hotkey strings,
Hotkey/HotkeySequencevalues,RawHotkey/ParsedHotkeyunions, target refs, and adapter imports. - Unit or component tests (synthetic events with both
keyandcode) for callback firing,enabled,ignoreInputs,preventDefault,stopPropagation, target focus, and cleanup on unmount. - Browser smoke for cross-platform display labels, focused input behavior, modal scoping, command palette shortcuts, and sequence timeouts.
- Tests with fake timers for sequence timeout, recorder idle commit, and debounced UI around shortcut capture.
- Devtools inspection for duplicate registrations, disabled registrations, held keys, target scoping, and conflict behavior.