Skip to content

Commit 93e974b

Browse files
committed
add event.code fallbacks for a-z and 0-9
1 parent da6ddd3 commit 93e974b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+826
-547
lines changed

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Type-safe keyboard shortcuts for the web. Template strings, parsed objects, cros
4141
> [!NOTE]
4242
> TanStack Keys is pre-alpha (prototyping phase). We are actively developing the library and are open to feedback and contributions.
4343
44-
## Goals
44+
## Features
4545

4646
- **Key Bindings**
4747
- Template strings as the primary syntax: `Mod+Shift+S`, `Control+Shift+A`, `Escape`
@@ -67,11 +67,15 @@ Type-safe keyboard shortcuts for the web. Template strings, parsed objects, cros
6767
- `SequenceManager`, `createSequenceMatcher` for Vim-style multi-key shortcuts (e.g. `['G','G']`, `['D','I','W']`)
6868
- **Key State**
6969
- `KeyStateTracker`, `getKeyStateTracker` for held-key tracking
70+
- **Hotkey Recorder**
71+
- `HotkeyRecorder` class for capturing keyboard shortcuts interactively
72+
- Supports live preview, cancellation, and clearing during recording
7073
- **React Hooks**
7174
- `useHotkey` – register a keyboard shortcut (global, via singleton manager)
7275
- `useHotkeySequence` – detect keys pressed in order within a timeout
7376
- `useHeldKeys` – reactive list of currently held keys
7477
- `useKeyHold` – reactive boolean for whether a given key is held
78+
- `useHotkeyRecorder` – record keyboard shortcuts interactively with live preview
7579
- **Devtools**
7680
- Devtools are a core focus: visibility into all registered hotkeys, scopes, and options
7781
- `@tanstack/keys-devtools` and `@tanstack/react-keys-devtools` (in active development)
@@ -121,7 +125,7 @@ function Editor() {
121125
## Packages
122126

123127
- **`@tanstack/keys`** – Core: parse, format, match, validate, manager, sequence, key-state
124-
- **`@tanstack/react-keys`** – React: `useHotkey`, `useHotkeySequence`, `useHeldKeys`, `useKeyHold`
128+
- **`@tanstack/react-keys`** – React: `useHotkey`, `useHotkeySequence`, `useHeldKeys`, `useKeyHold`, `useHotkeyRecorder`
125129
- **`@tanstack/keys-devtools`** – Base devtools (in development)
126130
- **`@tanstack/react-keys-devtools`** – React devtools (in development)
127131

docs/framework/react/reference/functions/useHotkeyRecorder.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ title: useHotkeyRecorder
99
function useHotkeyRecorder(options): ReactHotkeyRecorder;
1010
```
1111

12-
Defined in: [useHotkeyRecorder.ts:60](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L60)
12+
Defined in: [useHotkeyRecorder.ts:57](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L57)
1313

1414
React hook for recording keyboard shortcuts.
1515

docs/framework/react/reference/interfaces/ReactHotkeyRecorder.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ title: ReactHotkeyRecorder
55

66
# Interface: ReactHotkeyRecorder
77

8-
Defined in: [useHotkeyRecorder.ts:9](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L9)
8+
Defined in: [useHotkeyRecorder.ts:6](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L6)
99

1010
## Properties
1111

@@ -15,7 +15,7 @@ Defined in: [useHotkeyRecorder.ts:9](https://github.com/TanStack/keys/blob/main/
1515
cancelRecording: () => void;
1616
```
1717

18-
Defined in: [useHotkeyRecorder.ts:19](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L19)
18+
Defined in: [useHotkeyRecorder.ts:16](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L16)
1919

2020
Cancel recording without saving
2121

@@ -31,7 +31,7 @@ Cancel recording without saving
3131
isRecording: boolean;
3232
```
3333

34-
Defined in: [useHotkeyRecorder.ts:11](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L11)
34+
Defined in: [useHotkeyRecorder.ts:8](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L8)
3535

3636
Whether recording is currently active
3737

@@ -43,7 +43,7 @@ Whether recording is currently active
4343
recordedHotkey: Hotkey | null;
4444
```
4545

46-
Defined in: [useHotkeyRecorder.ts:13](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L13)
46+
Defined in: [useHotkeyRecorder.ts:10](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L10)
4747

4848
The currently recorded hotkey (for live preview)
4949

@@ -55,7 +55,7 @@ The currently recorded hotkey (for live preview)
5555
startRecording: () => void;
5656
```
5757

58-
Defined in: [useHotkeyRecorder.ts:15](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L15)
58+
Defined in: [useHotkeyRecorder.ts:12](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L12)
5959

6060
Start recording a new hotkey
6161

@@ -71,7 +71,7 @@ Start recording a new hotkey
7171
stopRecording: () => void;
7272
```
7373

74-
Defined in: [useHotkeyRecorder.ts:17](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L17)
74+
Defined in: [useHotkeyRecorder.ts:14](https://github.com/TanStack/keys/blob/main/packages/react-keys/src/useHotkeyRecorder.ts#L14)
7575

7676
Stop recording (same as cancel)
7777

docs/reference/classes/HotkeyManager.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ title: HotkeyManager
55

66
# Class: HotkeyManager
77

8-
Defined in: [manager.ts:56](https://github.com/TanStack/keys/blob/main/packages/keys/src/manager.ts#L56)
8+
Defined in: [hotkey-manager.ts:145](https://github.com/TanStack/keys/blob/main/packages/keys/src/hotkey-manager.ts#L145)
99

1010
Singleton manager for hotkey registrations.
1111

@@ -34,7 +34,7 @@ unregister()
3434
destroy(): void;
3535
```
3636

37-
Defined in: [manager.ts:526](https://github.com/TanStack/keys/blob/main/packages/keys/src/manager.ts#L526)
37+
Defined in: [hotkey-manager.ts:609](https://github.com/TanStack/keys/blob/main/packages/keys/src/hotkey-manager.ts#L609)
3838

3939
Destroys the manager and removes all listeners.
4040

@@ -50,7 +50,7 @@ Destroys the manager and removes all listeners.
5050
getRegistrationCount(): number;
5151
```
5252

53-
Defined in: [manager.ts:497](https://github.com/TanStack/keys/blob/main/packages/keys/src/manager.ts#L497)
53+
Defined in: [hotkey-manager.ts:580](https://github.com/TanStack/keys/blob/main/packages/keys/src/hotkey-manager.ts#L580)
5454

5555
Gets the number of registered hotkeys.
5656

@@ -66,7 +66,7 @@ Gets the number of registered hotkeys.
6666
isRegistered(hotkey, target?): boolean;
6767
```
6868
69-
Defined in: [manager.ts:508](https://github.com/TanStack/keys/blob/main/packages/keys/src/manager.ts#L508)
69+
Defined in: [hotkey-manager.ts:591](https://github.com/TanStack/keys/blob/main/packages/keys/src/hotkey-manager.ts#L591)
7070
7171
Checks if a specific hotkey is registered.
7272
@@ -82,7 +82,7 @@ The hotkey string to check
8282
8383
Optional target element to match (if provided, both hotkey and target must match)
8484
85-
`HTMLElement` | `Document` | `Window`
85+
`Document` | `Window` | `HTMLElement`
8686
8787
#### Returns
8888
@@ -101,7 +101,7 @@ register(
101101
options): HotkeyRegistrationHandle;
102102
```
103103
104-
Defined in: [manager.ts:122](https://github.com/TanStack/keys/blob/main/packages/keys/src/manager.ts#L122)
104+
Defined in: [hotkey-manager.ts:209](https://github.com/TanStack/keys/blob/main/packages/keys/src/hotkey-manager.ts#L209)
105105
106106
Registers a hotkey handler and returns a handle for updating the registration.
107107
@@ -157,7 +157,7 @@ handle.unregister()
157157
static getInstance(): HotkeyManager;
158158
```
159159
160-
Defined in: [manager.ts:80](https://github.com/TanStack/keys/blob/main/packages/keys/src/manager.ts#L80)
160+
Defined in: [hotkey-manager.ts:167](https://github.com/TanStack/keys/blob/main/packages/keys/src/hotkey-manager.ts#L167)
161161
162162
Gets the singleton instance of HotkeyManager.
163163
@@ -173,7 +173,7 @@ Gets the singleton instance of HotkeyManager.
173173
static resetInstance(): void;
174174
```
175175
176-
Defined in: [manager.ts:90](https://github.com/TanStack/keys/blob/main/packages/keys/src/manager.ts#L90)
176+
Defined in: [hotkey-manager.ts:177](https://github.com/TanStack/keys/blob/main/packages/keys/src/hotkey-manager.ts#L177)
177177
178178
Resets the singleton instance. Useful for testing.
179179

docs/reference/classes/HotkeyRecorder.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ Use this to subscribe to state changes or access current state.
8787
cancel(): void;
8888
```
8989

90-
Defined in: [recorder.ts:212](https://github.com/TanStack/keys/blob/main/packages/keys/src/recorder.ts#L212)
90+
Defined in: [recorder.ts:214](https://github.com/TanStack/keys/blob/main/packages/keys/src/recorder.ts#L214)
9191

9292
Cancel recording without saving.
9393

@@ -106,7 +106,7 @@ the onCancel callback if provided.
106106
destroy(): void;
107107
```
108108

109-
Defined in: [recorder.ts:257](https://github.com/TanStack/keys/blob/main/packages/keys/src/recorder.ts#L257)
109+
Defined in: [recorder.ts:259](https://github.com/TanStack/keys/blob/main/packages/keys/src/recorder.ts#L259)
110110

111111
Clean up event listeners and reset state.
112112

@@ -168,7 +168,7 @@ a valid hotkey is recorded, Escape is pressed, or stop/cancel is called.
168168
stop(): void;
169169
```
170170

171-
Defined in: [recorder.ts:192](https://github.com/TanStack/keys/blob/main/packages/keys/src/recorder.ts#L192)
171+
Defined in: [recorder.ts:194](https://github.com/TanStack/keys/blob/main/packages/keys/src/recorder.ts#L194)
172172

173173
Stop recording (same as cancel, but doesn't call onCancel).
174174

docs/reference/classes/KeyStateTracker.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ title: KeyStateTracker
55

66
# Class: KeyStateTracker
77

8-
Defined in: [key-state.ts:63](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state.ts#L63)
8+
Defined in: [key-state-tracker.ts:63](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state-tracker.ts#L63)
99

1010
Singleton tracker for currently held keyboard keys.
1111

@@ -49,7 +49,7 @@ unsubscribe()
4949
readonly store: Store<KeyStateTrackerState>;
5050
```
5151

52-
Defined in: [key-state.ts:70](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state.ts#L70)
52+
Defined in: [key-state-tracker.ts:70](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state-tracker.ts#L70)
5353

5454
The TanStack Store instance containing the tracker state.
5555
Use this to subscribe to state changes or access current state.
@@ -62,7 +62,7 @@ Use this to subscribe to state changes or access current state.
6262
areAllKeysHeld(keys): boolean;
6363
```
6464

65-
Defined in: [key-state.ts:209](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state.ts#L209)
65+
Defined in: [key-state-tracker.ts:209](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state-tracker.ts#L209)
6666

6767
Checks if all of the given keys are currently held.
6868

@@ -88,7 +88,7 @@ True if all of the keys are currently held
8888
destroy(): void;
8989
```
9090

91-
Defined in: [key-state.ts:233](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state.ts#L233)
91+
Defined in: [key-state-tracker.ts:233](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state-tracker.ts#L233)
9292

9393
Destroys the tracker and removes all listeners.
9494

@@ -104,7 +104,7 @@ Destroys the tracker and removes all listeners.
104104
getHeldKeys(): string[];
105105
```
106106

107-
Defined in: [key-state.ts:178](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state.ts#L178)
107+
Defined in: [key-state-tracker.ts:178](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state-tracker.ts#L178)
108108

109109
Gets an array of currently held key names.
110110

@@ -122,7 +122,7 @@ Array of key names currently being pressed
122122
isAnyKeyHeld(keys): boolean;
123123
```
124124

125-
Defined in: [key-state.ts:199](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state.ts#L199)
125+
Defined in: [key-state-tracker.ts:199](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state-tracker.ts#L199)
126126

127127
Checks if any of the given keys are currently held.
128128

@@ -148,7 +148,7 @@ True if any of the keys are currently held
148148
isKeyHeld(key): boolean;
149149
```
150150

151-
Defined in: [key-state.ts:188](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state.ts#L188)
151+
Defined in: [key-state-tracker.ts:188](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state-tracker.ts#L188)
152152

153153
Checks if a specific key is currently being held.
154154

@@ -174,7 +174,7 @@ True if the key is currently held
174174
subscribe(listener): () => void;
175175
```
176176

177-
Defined in: [key-state.ts:220](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state.ts#L220)
177+
Defined in: [key-state-tracker.ts:220](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state-tracker.ts#L220)
178178

179179
Subscribes to key state changes.
180180

@@ -210,7 +210,7 @@ Use `tracker.store.subscribe()` or `useStore()` from `@tanstack/react-store` ins
210210
static getInstance(): KeyStateTracker;
211211
```
212212
213-
Defined in: [key-state.ts:86](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state.ts#L86)
213+
Defined in: [key-state-tracker.ts:86](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state-tracker.ts#L86)
214214
215215
Gets the singleton instance of KeyStateTracker.
216216
@@ -226,7 +226,7 @@ Gets the singleton instance of KeyStateTracker.
226226
static resetInstance(): void;
227227
```
228228
229-
Defined in: [key-state.ts:96](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state.ts#L96)
229+
Defined in: [key-state-tracker.ts:96](https://github.com/TanStack/keys/blob/main/packages/keys/src/key-state-tracker.ts#L96)
230230
231231
Resets the singleton instance. Useful for testing.
232232

docs/reference/classes/SequenceManager.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ title: SequenceManager
55

66
# Class: SequenceManager
77

8-
Defined in: [sequence.ts:60](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L60)
8+
Defined in: [sequence.ts:79](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L79)
99

1010
Manages keyboard sequence matching for Vim-style shortcuts.
1111

@@ -35,7 +35,7 @@ unregister()
3535
destroy(): void;
3636
```
3737

38-
Defined in: [sequence.ts:281](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L281)
38+
Defined in: [sequence.ts:300](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L300)
3939

4040
Destroys the manager and removes all listeners.
4141

@@ -51,7 +51,7 @@ Destroys the manager and removes all listeners.
5151
getRegistrationCount(): number;
5252
```
5353

54-
Defined in: [sequence.ts:274](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L274)
54+
Defined in: [sequence.ts:293](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L293)
5555

5656
Gets the number of registered sequences.
5757

@@ -70,7 +70,7 @@ register(
7070
options): () => void;
7171
```
7272

73-
Defined in: [sequence.ts:99](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L99)
73+
Defined in: [sequence.ts:118](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L118)
7474

7575
Registers a hotkey sequence handler.
7676

@@ -114,7 +114,7 @@ A function to unregister the sequence
114114
resetAll(): void;
115115
```
116116
117-
Defined in: [sequence.ts:264](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L264)
117+
Defined in: [sequence.ts:283](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L283)
118118
119119
Resets all sequence progress.
120120
@@ -130,7 +130,7 @@ Resets all sequence progress.
130130
static getInstance(): SequenceManager;
131131
```
132132
133-
Defined in: [sequence.ts:74](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L74)
133+
Defined in: [sequence.ts:93](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L93)
134134
135135
Gets the singleton instance of SequenceManager.
136136
@@ -146,7 +146,7 @@ Gets the singleton instance of SequenceManager.
146146
static resetInstance(): void;
147147
```
148148
149-
Defined in: [sequence.ts:84](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L84)
149+
Defined in: [sequence.ts:103](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L103)
150150
151151
Resets the singleton instance. Useful for testing.
152152

docs/reference/functions/createHotkeyHandler.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ function createHotkeyHandler(
1212
options): (event) => void;
1313
```
1414

15-
Defined in: [match.ts:96](https://github.com/TanStack/keys/blob/main/packages/keys/src/match.ts#L96)
15+
Defined in: [match.ts:122](https://github.com/TanStack/keys/blob/main/packages/keys/src/match.ts#L122)
1616

1717
Creates a keyboard event handler that calls the callback when the hotkey matches.
1818

docs/reference/functions/createMultiHotkeyHandler.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ title: createMultiHotkeyHandler
99
function createMultiHotkeyHandler(handlers, options): (event) => void;
1010
```
1111

12-
Defined in: [match.ts:147](https://github.com/TanStack/keys/blob/main/packages/keys/src/match.ts#L147)
12+
Defined in: [match.ts:173](https://github.com/TanStack/keys/blob/main/packages/keys/src/match.ts#L173)
1313

1414
Creates a handler that matches multiple hotkeys.
1515

docs/reference/functions/createSequenceMatcher.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ title: createSequenceMatcher
99
function createSequenceMatcher(sequence, options): object;
1010
```
1111

12-
Defined in: [sequence.ts:313](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L313)
12+
Defined in: [sequence.ts:332](https://github.com/TanStack/keys/blob/main/packages/keys/src/sequence.ts#L332)
1313

1414
Creates a simple sequence matcher for one-off use.
1515

0 commit comments

Comments
 (0)