@tanstack/preact-hotkeys 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/HotkeysProvider.d.ts +4 -2
- package/dist/HotkeysProvider.js +9 -2
- package/dist/useHotkey.d.ts +4 -3
- package/dist/useHotkeyHint.d.ts +3 -2
- package/dist/useHotkeyHint.js +2 -1
- package/dist/useHotkeyRecorder.js +2 -4
- package/dist/utils.js +3 -3
- package/package.json +2 -2
- package/skills/preact-hotkeys/SKILL.md +1 -1
|
@@ -27,8 +27,10 @@ export interface HotkeysProviderProps<T extends AppHotkeys = AppHotkeys> extends
|
|
|
27
27
|
*/
|
|
28
28
|
appHotkeys?: T;
|
|
29
29
|
/**
|
|
30
|
-
*
|
|
31
|
-
* the
|
|
30
|
+
* The user's saved custom hotkeys. When the value changes, such as after
|
|
31
|
+
* saved data loads or the user signs in, it replaces the current custom
|
|
32
|
+
* hotkeys. `undefined` leaves them unchanged; `null` clears them. Invalid
|
|
33
|
+
* entries are ignored with a warning.
|
|
32
34
|
*/
|
|
33
35
|
customHotkeys?: CustomHotkeys<T> | null;
|
|
34
36
|
/** Called with the custom hotkeys after every change, ready to save. */
|
package/dist/HotkeysProvider.js
CHANGED
|
@@ -60,8 +60,15 @@ function HotkeysProvider({ children, appHotkeys, customHotkeys, onCustomHotkeysC
|
|
|
60
60
|
return scopeKey ? activateHotkeysProviderScope(scopeKey) : void 0;
|
|
61
61
|
}, [scopeKey]);
|
|
62
62
|
useEffect(() => {
|
|
63
|
-
store?.setOptions({
|
|
64
|
-
|
|
63
|
+
store?.setOptions({
|
|
64
|
+
customHotkeys,
|
|
65
|
+
onCustomHotkeysChange
|
|
66
|
+
});
|
|
67
|
+
}, [
|
|
68
|
+
store,
|
|
69
|
+
customHotkeys,
|
|
70
|
+
onCustomHotkeysChange
|
|
71
|
+
]);
|
|
65
72
|
useEffect(() => {
|
|
66
73
|
if (appHotkeys) store?.setAppHotkeys(appHotkeys);
|
|
67
74
|
}, [store, appHotkeys]);
|
package/dist/useHotkey.d.ts
CHANGED
|
@@ -38,7 +38,8 @@ export type UseAppHotkeyOptions<T extends AppHotkey = AppHotkey> = AdapterAppHot
|
|
|
38
38
|
* Options merge in this order: provider defaults, app hotkey declaration,
|
|
39
39
|
* call-site options.
|
|
40
40
|
*
|
|
41
|
-
* @param hotkey - A chord string, RawHotkeyChord object, sequence, or app hotkey
|
|
41
|
+
* @param hotkey - A chord string, RawHotkeyChord object, sequence, or app hotkey.
|
|
42
|
+
* `undefined`, `null`, or `''` registers nothing, for an optional shortcut.
|
|
42
43
|
* @param callback - The function to call when the hotkey is pressed
|
|
43
44
|
* @param options - Options for the hotkey behavior
|
|
44
45
|
*
|
|
@@ -61,6 +62,6 @@ export type UseAppHotkeyOptions<T extends AppHotkey = AppHotkey> = AdapterAppHot
|
|
|
61
62
|
* }
|
|
62
63
|
* ```
|
|
63
64
|
*/
|
|
64
|
-
export declare function useHotkey<T extends AppHotkey>(hotkey: T, callback: HotkeyCallback, options?: UseAppHotkeyOptions<T>): void;
|
|
65
|
-
export declare function useHotkey<const T extends RegisterableHotkey>(hotkey: T, callback: HotkeyCallback<HotkeyCallbackContextFor<T>>, options?: UseHotkeyOptionsFor<T>): void;
|
|
65
|
+
export declare function useHotkey<T extends AppHotkey>(hotkey: T | null | undefined, callback: HotkeyCallback, options?: UseAppHotkeyOptions<T>): void;
|
|
66
|
+
export declare function useHotkey<const T extends RegisterableHotkey>(hotkey: T | null | undefined, callback: HotkeyCallback<HotkeyCallbackContextFor<T>>, options?: UseHotkeyOptionsFor<T>): void;
|
|
66
67
|
//#endregion
|
package/dist/useHotkeyHint.d.ts
CHANGED
|
@@ -4,10 +4,11 @@ import { AppHotkey, HeldModifierOptions, RegisterableHotkey } from "@tanstack/ho
|
|
|
4
4
|
* Returns a boolean indicating whether held modifiers reveal this shortcut.
|
|
5
5
|
* The hint shows only while the hotkey can fire: some registration of it is
|
|
6
6
|
* enabled and in an active scope. An app hotkey matches its registrations by
|
|
7
|
-
* id and uses its effective hotkey (false while unbound).
|
|
7
|
+
* id and uses its effective hotkey (false while unbound). No hotkey
|
|
8
|
+
* (`undefined`, `null`, or `''`) returns false.
|
|
8
9
|
* Uses the nonempty-subset/AltGr rules of `matchesHeldModifiers`; `exact`
|
|
9
10
|
* requires every modifier. A sequence reveals its hint from its first step.
|
|
10
11
|
* Only visibility changes cause a rerender. This helper does not register a shortcut. A hotkey on an element counts only while focus is inside it.
|
|
11
12
|
*/
|
|
12
|
-
export declare function useHotkeyHint(hotkey: RegisterableHotkey | AppHotkey, options?: HeldModifierOptions): boolean;
|
|
13
|
+
export declare function useHotkeyHint(hotkey: RegisterableHotkey | AppHotkey | null | undefined, options?: HeldModifierOptions): boolean;
|
|
13
14
|
//#endregion
|
package/dist/useHotkeyHint.js
CHANGED
|
@@ -7,7 +7,8 @@ import { getHotkeyManager, getKeyStateTracker, isAppHotkey, matchesHeldModifiers
|
|
|
7
7
|
* Returns a boolean indicating whether held modifiers reveal this shortcut.
|
|
8
8
|
* The hint shows only while the hotkey can fire: some registration of it is
|
|
9
9
|
* enabled and in an active scope. An app hotkey matches its registrations by
|
|
10
|
-
* id and uses its effective hotkey (false while unbound).
|
|
10
|
+
* id and uses its effective hotkey (false while unbound). No hotkey
|
|
11
|
+
* (`undefined`, `null`, or `''`) returns false.
|
|
11
12
|
* Uses the nonempty-subset/AltGr rules of `matchesHeldModifiers`; `exact`
|
|
12
13
|
* requires every modifier. A sequence reveals its hint from its first step.
|
|
13
14
|
* Only visibility changes cause a rerender. This helper does not register a shortcut. A hotkey on an element counts only while focus is inside it.
|
|
@@ -2,13 +2,11 @@ import { useDefaultHotkeysOptions } from "./HotkeysProvider.js";
|
|
|
2
2
|
import { useSelector } from "./_useSelector.js";
|
|
3
3
|
import { HotkeyRecorder } from "@tanstack/hotkeys";
|
|
4
4
|
import { useEffect, useRef } from "preact/hooks";
|
|
5
|
+
import { withDefaults } from "@tanstack/hotkeys/adapter";
|
|
5
6
|
|
|
6
7
|
//#region src/useHotkeyRecorder.ts
|
|
7
8
|
function useHotkeyRecorder(options) {
|
|
8
|
-
const mergedOptions =
|
|
9
|
-
...useDefaultHotkeysOptions().hotkeyRecorder,
|
|
10
|
-
...options
|
|
11
|
-
};
|
|
9
|
+
const mergedOptions = withDefaults(useDefaultHotkeysOptions().hotkeyRecorder, options);
|
|
12
10
|
const recorderRef = useRef(null);
|
|
13
11
|
if (!recorderRef.current) recorderRef.current = new HotkeyRecorder(mergedOptions);
|
|
14
12
|
recorderRef.current.setOptions(mergedOptions);
|
package/dist/utils.js
CHANGED
|
@@ -6,11 +6,11 @@ function isRef(value) {
|
|
|
6
6
|
return value !== null && typeof value === "object" && "current" in value;
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
|
-
* Resolves a hook target. A ref that is still null skips
|
|
10
|
-
*
|
|
9
|
+
* Resolves a hook target. A null target, or a ref that is still null, skips
|
|
10
|
+
* registration. Omit the target to listen on the document.
|
|
11
11
|
*/
|
|
12
12
|
function resolveTarget(target) {
|
|
13
|
-
return isRef(target) ? target.current : target
|
|
13
|
+
return isRef(target) ? target.current : target;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
//#endregion
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/preact-hotkeys",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "Preact adapter for TanStack Hotkeys",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"skills"
|
|
36
36
|
],
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@tanstack/hotkeys": "0.
|
|
38
|
+
"@tanstack/hotkeys": "0.21.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"@preact/preset-vite": "^2.10.6",
|
|
@@ -101,7 +101,7 @@ A hook uses the nearest `HotkeysProvider` above its component. Registering `Esca
|
|
|
101
101
|
|
|
102
102
|
## Pitfalls
|
|
103
103
|
|
|
104
|
-
- **Pass the ref, not `ref.current`.** `target: listRef.current` is `null` on the first render, and a `null` target
|
|
104
|
+
- **Pass the ref, not `ref.current`.** `target: listRef.current` is `null` on the first render, and a `null` target registers nothing, so the hotkey doesn't work until the component renders again. Pass `target: listRef`; a ref that is still empty waits for its element.
|
|
105
105
|
- **No dependency arrays or `useCallback`.** The hooks read the hotkey, callback, and options on every render, so inline callbacks always see current state.
|
|
106
106
|
- **Call the hooks directly.** A `useShortcut(keys: string)` wrapper has to cast strings to hotkeys, which turns off type checking and drops sequences, options, app hotkeys, and the typed callback context.
|
|
107
107
|
- **In tests,** set `<HotkeysProvider defaultOptions={{ hotkey: { platform: 'mac' } }}>`.
|