react-hotkeys-hook 5.0.0-0 → 5.0.0-1
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/isHotkeyPressed.d.ts +1 -1
- package/dist/parseHotkeys.d.ts +2 -2
- package/dist/react-hotkeys-hook.cjs.development.js +54 -43
- package/dist/react-hotkeys-hook.cjs.development.js.map +1 -1
- package/dist/react-hotkeys-hook.cjs.production.min.js +1 -1
- package/dist/react-hotkeys-hook.cjs.production.min.js.map +1 -1
- package/dist/react-hotkeys-hook.esm.js +54 -43
- package/dist/react-hotkeys-hook.esm.js.map +1 -1
- package/dist/types.d.ts +3 -1
- package/dist/useRecordHotkeys.d.ts +1 -0
- package/package.json +2 -2
- package/src/isHotkeyPressed.ts +6 -8
- package/src/parseHotkeys.ts +6 -6
- package/src/types.ts +29 -13
- package/src/useHotkeys.ts +15 -11
- package/src/useRecordHotkeys.ts +7 -3
- package/src/validators.ts +16 -11
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare function isReadonlyArray(value: unknown): value is readonly unknown[];
|
|
2
|
-
export declare function isHotkeyPressed(key: string | readonly string[],
|
|
2
|
+
export declare function isHotkeyPressed(key: string | readonly string[], delimiter?: string): boolean;
|
|
3
3
|
export declare function pushToCurrentlyPressedKeys(key: string | string[]): void;
|
|
4
4
|
export declare function removeFromCurrentlyPressedKeys(key: string | string[]): void;
|
package/dist/parseHotkeys.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Hotkey } from './types';
|
|
2
2
|
export declare function mapKey(key: string): string;
|
|
3
3
|
export declare function isHotkeyModifier(key: string): boolean;
|
|
4
|
-
export declare function parseKeysHookInput(keys: string,
|
|
5
|
-
export declare function parseHotkey(hotkey: string,
|
|
4
|
+
export declare function parseKeysHookInput(keys: string, delimiter?: string): string[];
|
|
5
|
+
export declare function parseHotkey(hotkey: string, splitKey?: string, useKey?: boolean, description?: string): Hotkey;
|
|
@@ -18,7 +18,7 @@ function _extends() {
|
|
|
18
18
|
return _extends.apply(this, arguments);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
var reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl'];
|
|
21
|
+
var reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl', 'control'];
|
|
22
22
|
var mappedKeys = {
|
|
23
23
|
esc: 'escape',
|
|
24
24
|
"return": 'enter',
|
|
@@ -26,7 +26,6 @@ var mappedKeys = {
|
|
|
26
26
|
right: 'arrowright',
|
|
27
27
|
up: 'arrowup',
|
|
28
28
|
down: 'arrowdown',
|
|
29
|
-
space: ' ',
|
|
30
29
|
ShiftLeft: 'shift',
|
|
31
30
|
ShiftRight: 'shift',
|
|
32
31
|
AltLeft: 'alt',
|
|
@@ -44,17 +43,20 @@ function mapKey(key) {
|
|
|
44
43
|
function isHotkeyModifier(key) {
|
|
45
44
|
return reservedModifierKeywords.includes(key);
|
|
46
45
|
}
|
|
47
|
-
function parseKeysHookInput(keys,
|
|
48
|
-
if (
|
|
49
|
-
|
|
46
|
+
function parseKeysHookInput(keys, delimiter) {
|
|
47
|
+
if (delimiter === void 0) {
|
|
48
|
+
delimiter = ',';
|
|
50
49
|
}
|
|
51
|
-
return keys.split(
|
|
50
|
+
return keys.toLowerCase().split(delimiter);
|
|
52
51
|
}
|
|
53
|
-
function parseHotkey(hotkey,
|
|
54
|
-
if (
|
|
55
|
-
|
|
52
|
+
function parseHotkey(hotkey, splitKey, useKey, description) {
|
|
53
|
+
if (splitKey === void 0) {
|
|
54
|
+
splitKey = '+';
|
|
56
55
|
}
|
|
57
|
-
|
|
56
|
+
if (useKey === void 0) {
|
|
57
|
+
useKey = false;
|
|
58
|
+
}
|
|
59
|
+
var keys = hotkey.toLocaleLowerCase().split(splitKey).map(function (k) {
|
|
58
60
|
return mapKey(k);
|
|
59
61
|
});
|
|
60
62
|
var modifiers = {
|
|
@@ -62,7 +64,8 @@ function parseHotkey(hotkey, combinationKey, description) {
|
|
|
62
64
|
ctrl: keys.includes('ctrl') || keys.includes('control'),
|
|
63
65
|
shift: keys.includes('shift'),
|
|
64
66
|
meta: keys.includes('meta'),
|
|
65
|
-
mod: keys.includes('mod')
|
|
67
|
+
mod: keys.includes('mod'),
|
|
68
|
+
useKey: useKey
|
|
66
69
|
};
|
|
67
70
|
var singleCharKeys = keys.filter(function (k) {
|
|
68
71
|
return !reservedModifierKeywords.includes(k);
|
|
@@ -76,19 +79,18 @@ function parseHotkey(hotkey, combinationKey, description) {
|
|
|
76
79
|
(function () {
|
|
77
80
|
if (typeof document !== 'undefined') {
|
|
78
81
|
document.addEventListener('keydown', function (e) {
|
|
79
|
-
if (e.
|
|
82
|
+
if (e.code === undefined) {
|
|
80
83
|
// Synthetic event (e.g., Chrome autofill). Ignore.
|
|
81
84
|
return;
|
|
82
85
|
}
|
|
83
|
-
|
|
84
|
-
pushToCurrentlyPressedKeys([mapKey(e.key)]);
|
|
86
|
+
pushToCurrentlyPressedKeys([mapKey(e.code)]);
|
|
85
87
|
});
|
|
86
88
|
document.addEventListener('keyup', function (e) {
|
|
87
|
-
if (e.
|
|
89
|
+
if (e.code === undefined) {
|
|
88
90
|
// Synthetic event (e.g., Chrome autofill). Ignore.
|
|
89
91
|
return;
|
|
90
92
|
}
|
|
91
|
-
removeFromCurrentlyPressedKeys([mapKey(e.
|
|
93
|
+
removeFromCurrentlyPressedKeys([mapKey(e.code)]);
|
|
92
94
|
});
|
|
93
95
|
}
|
|
94
96
|
if (typeof window !== 'undefined') {
|
|
@@ -102,11 +104,11 @@ var currentlyPressedKeys = /*#__PURE__*/new Set();
|
|
|
102
104
|
function isReadonlyArray(value) {
|
|
103
105
|
return Array.isArray(value);
|
|
104
106
|
}
|
|
105
|
-
function isHotkeyPressed(key,
|
|
106
|
-
if (
|
|
107
|
-
|
|
107
|
+
function isHotkeyPressed(key, delimiter) {
|
|
108
|
+
if (delimiter === void 0) {
|
|
109
|
+
delimiter = ',';
|
|
108
110
|
}
|
|
109
|
-
var hotkeyArray = isReadonlyArray(key) ? key : key.split(
|
|
111
|
+
var hotkeyArray = isReadonlyArray(key) ? key : key.split(delimiter);
|
|
110
112
|
return hotkeyArray.every(function (hotkey) {
|
|
111
113
|
return currentlyPressedKeys.has(hotkey.trim().toLowerCase());
|
|
112
114
|
});
|
|
@@ -168,7 +170,7 @@ function isHotkeyEnabledOnTag(_ref, enabledOnTags) {
|
|
|
168
170
|
return tag.toLowerCase() === targetTagName.toLowerCase();
|
|
169
171
|
}));
|
|
170
172
|
}
|
|
171
|
-
return Boolean(targetTagName && enabledOnTags && enabledOnTags
|
|
173
|
+
return Boolean(targetTagName && enabledOnTags && enabledOnTags);
|
|
172
174
|
}
|
|
173
175
|
function isScopeActive(activeScopes, scopes) {
|
|
174
176
|
if (activeScopes.length === 0 && scopes) {
|
|
@@ -191,22 +193,27 @@ var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, ho
|
|
|
191
193
|
mod = hotkey.mod,
|
|
192
194
|
shift = hotkey.shift,
|
|
193
195
|
ctrl = hotkey.ctrl,
|
|
194
|
-
keys = hotkey.keys
|
|
195
|
-
|
|
196
|
+
keys = hotkey.keys,
|
|
197
|
+
useKey = hotkey.useKey;
|
|
198
|
+
var code = e.code,
|
|
199
|
+
producedKey = e.key,
|
|
196
200
|
ctrlKey = e.ctrlKey,
|
|
197
201
|
metaKey = e.metaKey,
|
|
198
202
|
shiftKey = e.shiftKey,
|
|
199
203
|
altKey = e.altKey;
|
|
200
|
-
var
|
|
201
|
-
if (
|
|
204
|
+
var mappedCode = mapKey(code);
|
|
205
|
+
if (useKey && (keys == null ? void 0 : keys.length) === 1 && keys.includes(producedKey)) {
|
|
206
|
+
return true;
|
|
207
|
+
}
|
|
208
|
+
if (!(keys != null && keys.includes(mappedCode)) && !['ctrl', 'control', 'unknown', 'meta', 'alt', 'shift', 'os'].includes(mappedCode)) {
|
|
202
209
|
return false;
|
|
203
210
|
}
|
|
204
211
|
if (!ignoreModifiers) {
|
|
205
212
|
// We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.
|
|
206
|
-
if (alt
|
|
213
|
+
if (alt !== altKey && mappedCode !== 'alt') {
|
|
207
214
|
return false;
|
|
208
215
|
}
|
|
209
|
-
if (shift
|
|
216
|
+
if (shift !== shiftKey && mappedCode !== 'shift') {
|
|
210
217
|
return false;
|
|
211
218
|
}
|
|
212
219
|
// Mod is a special key name that is checking for meta on macOS and ctrl on other platforms
|
|
@@ -215,17 +222,17 @@ var isHotkeyMatchingKeyboardEvent = function isHotkeyMatchingKeyboardEvent(e, ho
|
|
|
215
222
|
return false;
|
|
216
223
|
}
|
|
217
224
|
} else {
|
|
218
|
-
if (meta
|
|
225
|
+
if (meta !== metaKey && mappedCode !== 'meta' && mappedCode !== 'os') {
|
|
219
226
|
return false;
|
|
220
227
|
}
|
|
221
|
-
if (ctrl
|
|
228
|
+
if (ctrl !== ctrlKey && mappedCode !== 'ctrl' && mappedCode !== 'control') {
|
|
222
229
|
return false;
|
|
223
230
|
}
|
|
224
231
|
}
|
|
225
232
|
}
|
|
226
233
|
// All modifiers are correct, now check the key
|
|
227
234
|
// If the key is set, we check for the key
|
|
228
|
-
if (keys && keys.length === 1 && keys.includes(
|
|
235
|
+
if (keys && keys.length === 1 && keys.includes(mappedCode)) {
|
|
229
236
|
return true;
|
|
230
237
|
} else if (keys) {
|
|
231
238
|
// Check if all keys are present in pressedDownKeys set
|
|
@@ -359,7 +366,7 @@ function useHotkeys(keys, callback, options, dependencies) {
|
|
|
359
366
|
var ref = react.useRef(null);
|
|
360
367
|
var hasTriggeredRef = react.useRef(false);
|
|
361
368
|
var _options = !(options instanceof Array) ? options : !(dependencies instanceof Array) ? dependencies : undefined;
|
|
362
|
-
var _keys = isReadonlyArray(keys) ? keys.join(_options == null ? void 0 : _options.
|
|
369
|
+
var _keys = isReadonlyArray(keys) ? keys.join(_options == null ? void 0 : _options.delimiter) : keys;
|
|
363
370
|
var _deps = options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined;
|
|
364
371
|
var memoisedCB = react.useCallback(callback, _deps != null ? _deps : []);
|
|
365
372
|
var cbRef = react.useRef(memoisedCB);
|
|
@@ -396,9 +403,9 @@ function useHotkeys(keys, callback, options, dependencies) {
|
|
|
396
403
|
if ((_e$target = e.target) != null && _e$target.isContentEditable && !(memoisedOptions != null && memoisedOptions.enableOnContentEditable)) {
|
|
397
404
|
return;
|
|
398
405
|
}
|
|
399
|
-
parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.
|
|
406
|
+
parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.delimiter).forEach(function (key) {
|
|
400
407
|
var _hotkey$keys;
|
|
401
|
-
var hotkey = parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.
|
|
408
|
+
var hotkey = parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.splitKey, memoisedOptions == null ? void 0 : memoisedOptions.useKey);
|
|
402
409
|
if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions == null ? void 0 : memoisedOptions.ignoreModifiers) || (_hotkey$keys = hotkey.keys) != null && _hotkey$keys.includes('*')) {
|
|
403
410
|
if (memoisedOptions != null && memoisedOptions.ignoreEventWhen != null && memoisedOptions.ignoreEventWhen(e)) {
|
|
404
411
|
return;
|
|
@@ -420,21 +427,21 @@ function useHotkeys(keys, callback, options, dependencies) {
|
|
|
420
427
|
});
|
|
421
428
|
};
|
|
422
429
|
var handleKeyDown = function handleKeyDown(event) {
|
|
423
|
-
if (event.
|
|
430
|
+
if (event.code === undefined) {
|
|
424
431
|
// Synthetic event (e.g., Chrome autofill). Ignore.
|
|
425
432
|
return;
|
|
426
433
|
}
|
|
427
|
-
pushToCurrentlyPressedKeys(mapKey(event.
|
|
434
|
+
pushToCurrentlyPressedKeys(mapKey(event.code));
|
|
428
435
|
if ((memoisedOptions == null ? void 0 : memoisedOptions.keydown) === undefined && (memoisedOptions == null ? void 0 : memoisedOptions.keyup) !== true || memoisedOptions != null && memoisedOptions.keydown) {
|
|
429
436
|
listener(event);
|
|
430
437
|
}
|
|
431
438
|
};
|
|
432
439
|
var handleKeyUp = function handleKeyUp(event) {
|
|
433
|
-
if (event.
|
|
440
|
+
if (event.code === undefined) {
|
|
434
441
|
// Synthetic event (e.g., Chrome autofill). Ignore.
|
|
435
442
|
return;
|
|
436
443
|
}
|
|
437
|
-
removeFromCurrentlyPressedKeys(mapKey(event.
|
|
444
|
+
removeFromCurrentlyPressedKeys(mapKey(event.code));
|
|
438
445
|
hasTriggeredRef.current = false;
|
|
439
446
|
if (memoisedOptions != null && memoisedOptions.keyup) {
|
|
440
447
|
listener(event, true);
|
|
@@ -446,8 +453,8 @@ function useHotkeys(keys, callback, options, dependencies) {
|
|
|
446
453
|
// @ts-ignore
|
|
447
454
|
domNode.addEventListener('keydown', handleKeyDown);
|
|
448
455
|
if (proxy) {
|
|
449
|
-
parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.
|
|
450
|
-
return proxy.addHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.
|
|
456
|
+
parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.delimiter).forEach(function (key) {
|
|
457
|
+
return proxy.addHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.splitKey, memoisedOptions == null ? void 0 : memoisedOptions.useKey, memoisedOptions == null ? void 0 : memoisedOptions.description));
|
|
451
458
|
});
|
|
452
459
|
}
|
|
453
460
|
return function () {
|
|
@@ -456,8 +463,8 @@ function useHotkeys(keys, callback, options, dependencies) {
|
|
|
456
463
|
// @ts-ignore
|
|
457
464
|
domNode.removeEventListener('keydown', handleKeyDown);
|
|
458
465
|
if (proxy) {
|
|
459
|
-
parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.
|
|
460
|
-
return proxy.removeHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.
|
|
466
|
+
parseKeysHookInput(_keys, memoisedOptions == null ? void 0 : memoisedOptions.delimiter).forEach(function (key) {
|
|
467
|
+
return proxy.removeHotkey(parseHotkey(key, memoisedOptions == null ? void 0 : memoisedOptions.splitKey, memoisedOptions == null ? void 0 : memoisedOptions.useKey, memoisedOptions == null ? void 0 : memoisedOptions.description));
|
|
461
468
|
});
|
|
462
469
|
}
|
|
463
470
|
};
|
|
@@ -473,7 +480,7 @@ function useRecordHotkeys() {
|
|
|
473
480
|
isRecording = _useState2[0],
|
|
474
481
|
setIsRecording = _useState2[1];
|
|
475
482
|
var handler = react.useCallback(function (event) {
|
|
476
|
-
if (event.
|
|
483
|
+
if (event.code === undefined) {
|
|
477
484
|
// Synthetic event (e.g., Chrome autofill). Ignore.
|
|
478
485
|
return;
|
|
479
486
|
}
|
|
@@ -481,7 +488,7 @@ function useRecordHotkeys() {
|
|
|
481
488
|
event.stopPropagation();
|
|
482
489
|
setKeys(function (prev) {
|
|
483
490
|
var newKeys = new Set(prev);
|
|
484
|
-
newKeys.add(mapKey(event.
|
|
491
|
+
newKeys.add(mapKey(event.code));
|
|
485
492
|
return newKeys;
|
|
486
493
|
});
|
|
487
494
|
}, []);
|
|
@@ -499,9 +506,13 @@ function useRecordHotkeys() {
|
|
|
499
506
|
setIsRecording(true);
|
|
500
507
|
}
|
|
501
508
|
}, [handler, stop]);
|
|
509
|
+
var resetKeys = react.useCallback(function () {
|
|
510
|
+
setKeys(new Set());
|
|
511
|
+
}, []);
|
|
502
512
|
return [keys, {
|
|
503
513
|
start: start,
|
|
504
514
|
stop: stop,
|
|
515
|
+
resetKeys: resetKeys,
|
|
505
516
|
isRecording: isRecording
|
|
506
517
|
}];
|
|
507
518
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-hotkeys-hook.cjs.development.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n left: 'arrowleft',\n right: 'arrowright',\n up: 'arrowup',\n down: 'arrowdown',\n space: ' ',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: 'meta',\n ControlLeft: 'ctrl',\n ControlRight: 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key.trim()] || key.trim()).toLowerCase().replace(/key|digit|numpad/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+', description?: string): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map((k) => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl') || keys.includes('control'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n description,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n console.log('keydown', e.key, mapKey(e.key), e.key.length)\n\n pushToCurrentlyPressedKeys([mapKey(e.key)])\n })\n\n document.addEventListener('keyup', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\n// https://github.com/microsoft/TypeScript/issues/17002\nexport function isReadonlyArray(value: unknown): value is readonly unknown[] {\n return Array.isArray(value)\n}\n\nexport function isHotkeyPressed(key: string | readonly string[], splitKey = ','): boolean {\n const hotkeyArray = isReadonlyArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach((key) => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed, isReadonlyArray } from './isHotkeyPressed'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag(\n { target }: KeyboardEvent,\n enabledOnTags: readonly FormTags[] | boolean = false\n): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (isReadonlyArray(enabledOnTags)) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some((scope) => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (\n !keys?.includes(pressedKey) &&\n !['ctrl', 'control', 'unknown', 'meta', 'alt', 'shift', 'os'].includes(pressedKey)\n ) {\n return false\n }\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && keys.includes(pressedKey)) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.Provider>\n )\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return x && y && typeof x === 'object' && typeof y === 'object'\n ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), true)\n : x === y\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n activeScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n activeScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({ initiallyActiveScopes = ['*'], children }: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes)\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([])\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n return prev.filter((s) => s !== scope)\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n return prev.filter((s) => s !== scope)\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter((h) => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider\n value={{ activeScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { isReadonlyArray, pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = isReadonlyArray(keys) ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { activeScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(activeScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null) {\n const rootNode = ref.current.getRootNode()\n\n if (\n (rootNode instanceof Document || rootNode instanceof ShadowRoot) &&\n rootNode.activeElement !== ref.current &&\n !ref.current.contains(rootNode.activeElement)\n ) {\n stopPropagation(e)\n return\n }\n }\n\n if ((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable) {\n return\n }\n\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (memoisedOptions?.ignoreEventWhen?.(e)) {\n return\n }\n\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.key))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.key))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n }\n }, [_keys, memoisedOptions, activeScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.key))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n return [keys, { start, stop, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","left","right","up","down","space","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","description","toLocaleLowerCase","map","k","modifiers","alt","ctrl","shift","meta","mod","singleCharKeys","filter","_extends","document","addEventListener","e","undefined","console","log","length","pushToCurrentlyPressedKeys","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isReadonlyArray","value","Array","isArray","isHotkeyPressed","hotkeyArray","every","has","forEach","add","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","_ref","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","pressedKey","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","Provider","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","_ref$initiallyActiveS","_useState","useState","internalActiveScopes","setInternalActiveScopes","_useState2","boundHotkeys","setBoundHotkeys","useCallback","prev","from","concat","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","cbRef","memoisedOptions","_useHotkeysContext","proxy","listener","isKeyUp","enableOnFormTags","rootNode","getRootNode","Document","ShadowRoot","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","_hotkey$keys","ignoreEventWhen","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start"],"mappings":";;;;;;;;;;;;;;;;;;;;AAEA,IAAMA,wBAAwB,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC;AAExE,IAAMC,UAAU,GAA2B;EACzCC,GAAG,EAAE,QAAQ;EACb,UAAQ,OAAO;EACfC,IAAI,EAAE,WAAW;EACjBC,KAAK,EAAE,YAAY;EACnBC,EAAE,EAAE,SAAS;EACbC,IAAI,EAAE,WAAW;EACjBC,KAAK,EAAE,GAAG;EACVC,SAAS,EAAE,OAAO;EAClBC,UAAU,EAAE,OAAO;EACnBC,OAAO,EAAE,KAAK;EACdC,QAAQ,EAAE,KAAK;EACfC,QAAQ,EAAE,MAAM;EAChBC,SAAS,EAAE,MAAM;EACjBC,MAAM,EAAE,MAAM;EACdC,OAAO,EAAE,MAAM;EACfC,WAAW,EAAE,MAAM;EACnBC,YAAY,EAAE;CACf;SAEeC,MAAMA,CAACC,GAAW;EAChC,OAAO,CAAClB,UAAU,CAACkB,GAAG,CAACC,IAAI,EAAE,CAAC,IAAID,GAAG,CAACC,IAAI,EAAE,EAAEC,WAAW,EAAE,CAACC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;AAC7F;SAEgBC,gBAAgBA,CAACJ,GAAW;EAC1C,OAAOnB,wBAAwB,CAACwB,QAAQ,CAACL,GAAG,CAAC;AAC/C;SAEgBM,kBAAkBA,CAACC,IAAY,EAAEC,QAAQ;MAARA,QAAQ;IAARA,QAAQ,GAAG,GAAG;;EAC7D,OAAOD,IAAI,CAACE,KAAK,CAACD,QAAQ,CAAC;AAC7B;SAEgBE,WAAWA,CAACC,MAAc,EAAEC,cAAc,EAAQC,WAAoB;MAA1CD,cAAc;IAAdA,cAAc,GAAG,GAAG;;EAC9D,IAAML,IAAI,GAAGI,MAAM,CAChBG,iBAAiB,EAAE,CACnBL,KAAK,CAACG,cAAc,CAAC,CACrBG,GAAG,CAAC,UAACC,CAAC;IAAA,OAAKjB,MAAM,CAACiB,CAAC,CAAC;IAAC;EAExB,IAAMC,SAAS,GAAsB;IACnCC,GAAG,EAAEX,IAAI,CAACF,QAAQ,CAAC,KAAK,CAAC;IACzBc,IAAI,EAAEZ,IAAI,CAACF,QAAQ,CAAC,MAAM,CAAC,IAAIE,IAAI,CAACF,QAAQ,CAAC,SAAS,CAAC;IACvDe,KAAK,EAAEb,IAAI,CAACF,QAAQ,CAAC,OAAO,CAAC;IAC7BgB,IAAI,EAAEd,IAAI,CAACF,QAAQ,CAAC,MAAM,CAAC;IAC3BiB,GAAG,EAAEf,IAAI,CAACF,QAAQ,CAAC,KAAK;GACzB;EAED,IAAMkB,cAAc,GAAGhB,IAAI,CAACiB,MAAM,CAAC,UAACR,CAAC;IAAA,OAAK,CAACnC,wBAAwB,CAACwB,QAAQ,CAACW,CAAC,CAAC;IAAC;EAEhF,OAAAS,QAAA,KACKR,SAAS;IACZV,IAAI,EAAEgB,cAAc;IACpBV,WAAW,EAAXA;;AAEJ;;ACxDC,CAAC;EACA,IAAI,OAAOa,QAAQ,KAAK,WAAW,EAAE;IACnCA,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAE,UAACC,CAAC;MACrC,IAAIA,CAAC,CAAC5B,GAAG,KAAK6B,SAAS,EAAE;;QAEvB;;MAGFC,OAAO,CAACC,GAAG,CAAC,SAAS,EAAEH,CAAC,CAAC5B,GAAG,EAAED,MAAM,CAAC6B,CAAC,CAAC5B,GAAG,CAAC,EAAE4B,CAAC,CAAC5B,GAAG,CAACgC,MAAM,CAAC;MAE1DC,0BAA0B,CAAC,CAAClC,MAAM,CAAC6B,CAAC,CAAC5B,GAAG,CAAC,CAAC,CAAC;KAC5C,CAAC;IAEF0B,QAAQ,CAACC,gBAAgB,CAAC,OAAO,EAAE,UAACC,CAAC;MACnC,IAAIA,CAAC,CAAC5B,GAAG,KAAK6B,SAAS,EAAE;;QAEvB;;MAGFK,8BAA8B,CAAC,CAACnC,MAAM,CAAC6B,CAAC,CAAC5B,GAAG,CAAC,CAAC,CAAC;KAChD,CAAC;;EAGJ,IAAI,OAAOmC,MAAM,KAAK,WAAW,EAAE;IACjCA,MAAM,CAACR,gBAAgB,CAAC,MAAM,EAAE;MAC9BS,oBAAoB,CAACC,KAAK,EAAE;KAC7B,CAAC;;AAEN,CAAC,GAAG;AAEJ,IAAMD,oBAAoB,gBAAgB,IAAIE,GAAG,EAAU;AAE3D;AACA,SAAgBC,eAAeA,CAACC,KAAc;EAC5C,OAAOC,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC;AAC7B;AAEA,SAAgBG,eAAeA,CAAC3C,GAA+B,EAAEQ,QAAQ;MAARA,QAAQ;IAARA,QAAQ,GAAG,GAAG;;EAC7E,IAAMoC,WAAW,GAAGL,eAAe,CAACvC,GAAG,CAAC,GAAGA,GAAG,GAAGA,GAAG,CAACS,KAAK,CAACD,QAAQ,CAAC;EAEpE,OAAOoC,WAAW,CAACC,KAAK,CAAC,UAAClC,MAAM;IAAA,OAAKyB,oBAAoB,CAACU,GAAG,CAACnC,MAAM,CAACV,IAAI,EAAE,CAACC,WAAW,EAAE,CAAC;IAAC;AAC7F;AAEA,SAAgB+B,0BAA0BA,CAACjC,GAAsB;EAC/D,IAAM4C,WAAW,GAAGH,KAAK,CAACC,OAAO,CAAC1C,GAAG,CAAC,GAAGA,GAAG,GAAG,CAACA,GAAG,CAAC;;;;;;EAOpD,IAAIoC,oBAAoB,CAACU,GAAG,CAAC,MAAM,CAAC,EAAE;IACpCV,oBAAoB,CAACW,OAAO,CAAC,UAAC/C,GAAG;MAAA,OAAK,CAACI,gBAAgB,CAACJ,GAAG,CAAC,IAAIoC,oBAAoB,UAAO,CAACpC,GAAG,CAACE,WAAW,EAAE,CAAC;MAAC;;EAGjH0C,WAAW,CAACG,OAAO,CAAC,UAACpC,MAAM;IAAA,OAAKyB,oBAAoB,CAACY,GAAG,CAACrC,MAAM,CAACT,WAAW,EAAE,CAAC;IAAC;AACjF;AAEA,SAAgBgC,8BAA8BA,CAAClC,GAAsB;EACnE,IAAM4C,WAAW,GAAGH,KAAK,CAACC,OAAO,CAAC1C,GAAG,CAAC,GAAGA,GAAG,GAAG,CAACA,GAAG,CAAC;;;;;;EAOpD,IAAIA,GAAG,KAAK,MAAM,EAAE;IAClBoC,oBAAoB,CAACC,KAAK,EAAE;GAC7B,MAAM;IACLO,WAAW,CAACG,OAAO,CAAC,UAACpC,MAAM;MAAA,OAAKyB,oBAAoB,UAAO,CAACzB,MAAM,CAACT,WAAW,EAAE,CAAC;MAAC;;AAEtF;;SCrEgB+C,mBAAmBA,CAACrB,CAAgB,EAAEjB,MAAc,EAAEuC,cAAwB;EAC5F,IAAK,OAAOA,cAAc,KAAK,UAAU,IAAIA,cAAc,CAACtB,CAAC,EAAEjB,MAAM,CAAC,IAAKuC,cAAc,KAAK,IAAI,EAAE;IAClGtB,CAAC,CAACsB,cAAc,EAAE;;AAEtB;AAEA,SAAgBC,eAAeA,CAACvB,CAAgB,EAAEjB,MAAc,EAAEyC,OAAiB;EACjF,IAAI,OAAOA,OAAO,KAAK,UAAU,EAAE;IACjC,OAAOA,OAAO,CAACxB,CAAC,EAAEjB,MAAM,CAAC;;EAG3B,OAAOyC,OAAO,KAAK,IAAI,IAAIA,OAAO,KAAKvB,SAAS;AAClD;AAEA,SAAgBwB,+BAA+BA,CAACC,EAAiB;EAC/D,OAAOC,oBAAoB,CAACD,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAClE;AAEA,SAAgBC,oBAAoBA,CAAAC,IAAA,EAElCC;MADEC,MAAM,GAAAF,IAAA,CAANE,MAAM;EAAA,IACRD;IAAAA,gBAA+C,KAAK;;EAEpD,IAAME,aAAa,GAAGD,MAAM,IAAKA,MAAsB,CAACE,OAAO;EAE/D,IAAIrB,eAAe,CAACkB,aAAa,CAAC,EAAE;IAClC,OAAOI,OAAO,CACZF,aAAa,IAAIF,aAAa,IAAIA,aAAa,CAACK,IAAI,CAAC,UAACC,GAAG;MAAA,OAAKA,GAAG,CAAC7D,WAAW,EAAE,KAAKyD,aAAa,CAACzD,WAAW,EAAE;MAAC,CACjH;;EAGH,OAAO2D,OAAO,CAACF,aAAa,IAAIF,aAAa,IAAIA,aAAa,KAAK,IAAI,CAAC;AAC1E;AAEA,SAAgBO,aAAaA,CAACC,YAAsB,EAAEC,MAAe;EACnE,IAAID,YAAY,CAACjC,MAAM,KAAK,CAAC,IAAIkC,MAAM,EAAE;IACvCpC,OAAO,CAACqC,IAAI,CACV,2KAA2K,CAC5K;IAED,OAAO,IAAI;;EAGb,IAAI,CAACD,MAAM,EAAE;IACX,OAAO,IAAI;;EAGb,OAAOD,YAAY,CAACH,IAAI,CAAC,UAACM,KAAK;IAAA,OAAKF,MAAM,CAAC7D,QAAQ,CAAC+D,KAAK,CAAC;IAAC,IAAIH,YAAY,CAAC5D,QAAQ,CAAC,GAAG,CAAC;AAC3F;AAEA,AAAO,IAAMgE,6BAA6B,GAAG,SAAhCA,6BAA6BA,CAAIzC,CAAgB,EAAEjB,MAAc,EAAE2D,eAAe;MAAfA,eAAe;IAAfA,eAAe,GAAG,KAAK;;EACrG,IAAQpD,GAAG,GAAmCP,MAAM,CAA5CO,GAAG;IAAEG,IAAI,GAA6BV,MAAM,CAAvCU,IAAI;IAAEC,GAAG,GAAwBX,MAAM,CAAjCW,GAAG;IAAEF,KAAK,GAAiBT,MAAM,CAA5BS,KAAK;IAAED,IAAI,GAAWR,MAAM,CAArBQ,IAAI;IAAEZ,IAAI,GAAKI,MAAM,CAAfJ,IAAI;EACzC,IAAagE,mBAAmB,GAAyC3C,CAAC,CAAlE5B,GAAG;IAAuBwE,OAAO,GAAgC5C,CAAC,CAAxC4C,OAAO;IAAEC,OAAO,GAAuB7C,CAAC,CAA/B6C,OAAO;IAAEC,QAAQ,GAAa9C,CAAC,CAAtB8C,QAAQ;IAAEC,MAAM,GAAK/C,CAAC,CAAZ+C,MAAM;EAEpE,IAAMC,UAAU,GAAGL,mBAAmB,CAACrE,WAAW,EAAE;EAEpD,IACE,EAACK,IAAI,YAAJA,IAAI,CAAEF,QAAQ,CAACuE,UAAU,CAAC,KAC3B,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAACvE,QAAQ,CAACuE,UAAU,CAAC,EAClF;IACA,OAAO,KAAK;;EAGd,IAAI,CAACN,eAAe,EAAE;;IAEpB,IAAIpD,GAAG,KAAK,CAACyD,MAAM,IAAIC,UAAU,KAAK,KAAK,EAAE;MAC3C,OAAO,KAAK;;IAGd,IAAIxD,KAAK,KAAK,CAACsD,QAAQ,IAAIE,UAAU,KAAK,OAAO,EAAE;MACjD,OAAO,KAAK;;;IAId,IAAItD,GAAG,EAAE;MACP,IAAI,CAACmD,OAAO,IAAI,CAACD,OAAO,EAAE;QACxB,OAAO,KAAK;;KAEf,MAAM;MACL,IAAInD,IAAI,KAAK,CAACoD,OAAO,IAAIG,UAAU,KAAK,MAAM,IAAIA,UAAU,KAAK,IAAI,EAAE;QACrE,OAAO,KAAK;;MAGd,IAAIzD,IAAI,KAAK,CAACqD,OAAO,IAAII,UAAU,KAAK,MAAM,IAAIA,UAAU,KAAK,SAAS,EAAE;QAC1E,OAAO,KAAK;;;;;;EAOlB,IAAIrE,IAAI,IAAIA,IAAI,CAACyB,MAAM,KAAK,CAAC,IAAIzB,IAAI,CAACF,QAAQ,CAACuE,UAAU,CAAC,EAAE;IAC1D,OAAO,IAAI;GACZ,MAAM,IAAIrE,IAAI,EAAE;;IAEf,OAAOoC,eAAe,CAACpC,IAAI,CAAC;GAC7B,MAAM,IAAI,CAACA,IAAI,EAAE;;IAEhB,OAAO,IAAI;;;EAIb,OAAO,KAAK;AACd,CAAC;;ACjGD,IAAMsE,yBAAyB,gBAAGC,mBAAa,CAA4CjD,SAAS,CAAC;AAErG,AAAO,IAAMkD,oBAAoB,GAAG,SAAvBA,oBAAoBA;EAC/B,OAAOC,gBAAU,CAACH,yBAAyB,CAAC;AAC9C,CAAC;AAQD,SAAwBI,iCAAiCA,CAAAzB,IAAA;MAAG0B,SAAS,GAAA1B,IAAA,CAAT0B,SAAS;IAAEC,YAAY,GAAA3B,IAAA,CAAZ2B,YAAY;IAAEC,QAAQ,GAAA5B,IAAA,CAAR4B,QAAQ;EAC3F,oBACEC,cAAA,CAACR,yBAAyB,CAACS,QAAQ;IAAC9C,KAAK,EAAE;MAAE0C,SAAS,EAATA,SAAS;MAAEC,YAAY,EAAZA;KAAe;IAAAC,QAAA,EACpEA;GACiC,CAAC;AAEzC;;SC1BwBG,SAASA,CAACC,CAAM,EAAEC,CAAM;;EAE9C,OAAOD,CAAC,IAAIC,CAAC,IAAI,OAAOD,CAAC,KAAK,QAAQ,IAAI,OAAOC,CAAC,KAAK,QAAQ,GAC3DC,MAAM,CAACnF,IAAI,CAACiF,CAAC,CAAC,CAACxD,MAAM,KAAK0D,MAAM,CAACnF,IAAI,CAACkF,CAAC,CAAC,CAACzD,MAAM;;EAE7C0D,MAAM,CAACnF,IAAI,CAACiF,CAAC,CAAC,CAACG,MAAM,CAAC,UAACC,OAAO,EAAE5F,GAAG;IAAA,OAAK4F,OAAO,IAAIL,SAAS,CAACC,CAAC,CAACxF,GAAG,CAAC,EAAEyF,CAAC,CAACzF,GAAG,CAAC,CAAC;KAAE,IAAI,CAAC,GACrFwF,CAAC,KAAKC,CAAC;AACb;;ACOA,IAAMI,cAAc,gBAAGf,mBAAa,CAAqB;EACvDgB,OAAO,EAAE,EAAE;EACX7B,YAAY,EAAE,EAAE;EAChB8B,WAAW,EAAE,SAAAA,gBAAQ;EACrBC,WAAW,EAAE,SAAAA,gBAAQ;EACrBC,YAAY,EAAE,SAAAA;CACf,CAAC;AAEF,IAAaC,iBAAiB,GAAG,SAApBA,iBAAiBA;EAC5B,OAAOlB,gBAAU,CAACa,cAAc,CAAC;AACnC,CAAC;AAOD,IAAaM,eAAe,GAAG,SAAlBA,eAAeA,CAAA3C,IAAA;mCAAM4C,qBAAqB;IAArBA,qBAAqB,GAAAC,qBAAA,cAAG,CAAC,GAAG,CAAC,GAAAA,qBAAA;IAAEjB,QAAQ,GAAA5B,IAAA,CAAR4B,QAAQ;EACvE,IAAAkB,SAAA,GAAwDC,cAAQ,CAACH,qBAAqB,CAAC;IAAhFI,oBAAoB,GAAAF,SAAA;IAAEG,uBAAuB,GAAAH,SAAA;EACpD,IAAAI,UAAA,GAAwCH,cAAQ,CAAW,EAAE,CAAC;IAAvDI,YAAY,GAAAD,UAAA;IAAEE,eAAe,GAAAF,UAAA;EAEpC,IAAMV,WAAW,GAAGa,iBAAW,CAAC,UAACzC,KAAa;IAC5CqC,uBAAuB,CAAC,UAACK,IAAI;MAC3B,IAAIA,IAAI,CAACzG,QAAQ,CAAC,GAAG,CAAC,EAAE;QACtB,OAAO,CAAC+D,KAAK,CAAC;;MAEhB,OAAO3B,KAAK,CAACsE,IAAI,CAAC,IAAIzE,GAAG,IAAA0E,MAAA,CAAKF,IAAI,GAAE1C,KAAK,EAAC,CAAC,CAAC;KAC7C,CAAC;GACH,EAAE,EAAE,CAAC;EAEN,IAAM6B,YAAY,GAAGY,iBAAW,CAAC,UAACzC,KAAa;IAC7CqC,uBAAuB,CAAC,UAACK,IAAI;MAC3B,OAAOA,IAAI,CAACtF,MAAM,CAAC,UAACyF,CAAC;QAAA,OAAKA,CAAC,KAAK7C,KAAK;QAAC;KACvC,CAAC;GACH,EAAE,EAAE,CAAC;EAEN,IAAM2B,WAAW,GAAGc,iBAAW,CAAC,UAACzC,KAAa;IAC5CqC,uBAAuB,CAAC,UAACK,IAAI;MAC3B,IAAIA,IAAI,CAACzG,QAAQ,CAAC+D,KAAK,CAAC,EAAE;QACxB,OAAO0C,IAAI,CAACtF,MAAM,CAAC,UAACyF,CAAC;UAAA,OAAKA,CAAC,KAAK7C,KAAK;UAAC;OACvC,MAAM;QACL,IAAI0C,IAAI,CAACzG,QAAQ,CAAC,GAAG,CAAC,EAAE;UACtB,OAAO,CAAC+D,KAAK,CAAC;;QAEhB,OAAO3B,KAAK,CAACsE,IAAI,CAAC,IAAIzE,GAAG,IAAA0E,MAAA,CAAKF,IAAI,GAAE1C,KAAK,EAAC,CAAC,CAAC;;KAE/C,CAAC;GACH,EAAE,EAAE,CAAC;EAEN,IAAM8C,cAAc,GAAGL,iBAAW,CAAC,UAAClG,MAAc;IAChDiG,eAAe,CAAC,UAACE,IAAI;MAAA,UAAAE,MAAA,CAASF,IAAI,GAAEnG,MAAM;KAAC,CAAC;GAC7C,EAAE,EAAE,CAAC;EAEN,IAAMwG,iBAAiB,GAAGN,iBAAW,CAAC,UAAClG,MAAc;IACnDiG,eAAe,CAAC,UAACE,IAAI;MAAA,OAAKA,IAAI,CAACtF,MAAM,CAAC,UAAC4F,CAAC;QAAA,OAAK,CAAC7B,SAAS,CAAC6B,CAAC,EAAEzG,MAAM,CAAC;QAAC;MAAC;GACrE,EAAE,EAAE,CAAC;EAEN,oBACE0E,cAAA,CAACQ,cAAc,CAACP,QAAQ;IACtB9C,KAAK,EAAE;MAAEyB,YAAY,EAAEuC,oBAAoB;MAAEV,OAAO,EAAEa,YAAY;MAAEX,WAAW,EAAXA,WAAW;MAAEC,YAAY,EAAZA,YAAY;MAAEF,WAAW,EAAXA;KAAc;IAAAX,QAAA,eAE7GC,cAAA,CAACJ,iCAAiC;MAACC,SAAS,EAAEgC,cAAe;MAAC/B,YAAY,EAAEgC,iBAAkB;MAAA/B,QAAA,EAC3FA;KACgC;GACZ,CAAC;AAE9B,CAAC;;SC7EuBiC,gBAAgBA,CAAI7E,KAAQ;EAClD,IAAM8E,GAAG,GAAGC,YAAM,CAAgB1F,SAAS,CAAC;EAE5C,IAAI,CAAC0D,SAAS,CAAC+B,GAAG,CAACE,OAAO,EAAEhF,KAAK,CAAC,EAAE;IAClC8E,GAAG,CAACE,OAAO,GAAGhF,KAAK;;EAGrB,OAAO8E,GAAG,CAACE,OAAO;AACpB;;ACKA,IAAMC,eAAe,GAAG,SAAlBA,eAAeA,CAAI7F,CAAgB;EACvCA,CAAC,CAAC6F,eAAe,EAAE;EACnB7F,CAAC,CAACsB,cAAc,EAAE;EAClBtB,CAAC,CAAC8F,wBAAwB,EAAE;AAC9B,CAAC;AAED,IAAMC,mBAAmB,GAAG,OAAOxF,MAAM,KAAK,WAAW,GAAGyF,qBAAe,GAAGC,eAAS;AAEvF,SAAwBC,UAAUA,CAChCvH,IAAU,EACVwH,QAAwB,EACxBC,OAAkC,EAClCC,YAAuC;EAEvC,IAAMX,GAAG,GAAGC,YAAM,CAAa,IAAI,CAAC;EACpC,IAAMW,eAAe,GAAGX,YAAM,CAAC,KAAK,CAAC;EAErC,IAAMY,QAAQ,GAAwB,EAAEH,OAAO,YAAYvF,KAAK,CAAC,GAC5DuF,OAAmB,GACpB,EAAEC,YAAY,YAAYxF,KAAK,CAAC,GAC/BwF,YAAwB,GACzBpG,SAAS;EACb,IAAMuG,KAAK,GAAW7F,eAAe,CAAChC,IAAI,CAAC,GAAGA,IAAI,CAAC8H,IAAI,CAACF,QAAQ,oBAARA,QAAQ,CAAE3H,QAAQ,CAAC,GAAGD,IAAI;EAClF,IAAM+H,KAAK,GACTN,OAAO,YAAYvF,KAAK,GAAGuF,OAAO,GAAGC,YAAY,YAAYxF,KAAK,GAAGwF,YAAY,GAAGpG,SAAS;EAE/F,IAAM0G,UAAU,GAAG1B,iBAAW,CAACkB,QAAQ,EAAEO,KAAK,WAALA,KAAK,GAAI,EAAE,CAAC;EACrD,IAAME,KAAK,GAAGjB,YAAM,CAAiBgB,UAAU,CAAC;EAEhD,IAAID,KAAK,EAAE;IACTE,KAAK,CAAChB,OAAO,GAAGe,UAAU;GAC3B,MAAM;IACLC,KAAK,CAAChB,OAAO,GAAGO,QAAQ;;EAG1B,IAAMU,eAAe,GAAGpB,gBAAgB,CAACc,QAAQ,CAAC;EAElD,IAAAO,kBAAA,GAAyBxC,iBAAiB,EAAE;IAApCjC,YAAY,GAAAyE,kBAAA,CAAZzE,YAAY;EACpB,IAAM0E,KAAK,GAAG5D,oBAAoB,EAAE;EAEpC4C,mBAAmB,CAAC;IAClB,IAAI,CAAAc,eAAe,oBAAfA,eAAe,CAAErF,OAAO,MAAK,KAAK,IAAI,CAACY,aAAa,CAACC,YAAY,EAAEwE,eAAe,oBAAfA,eAAe,CAAEvE,MAAM,CAAC,EAAE;MAC/F;;IAGF,IAAM0E,QAAQ,GAAG,SAAXA,QAAQA,CAAIhH,CAAgB,EAAEiH,OAAO;;UAAPA,OAAO;QAAPA,OAAO,GAAG,KAAK;;MACjD,IAAIxF,+BAA+B,CAACzB,CAAC,CAAC,IAAI,CAAC2B,oBAAoB,CAAC3B,CAAC,EAAE6G,eAAe,oBAAfA,eAAe,CAAEK,gBAAgB,CAAC,EAAE;QACrG;;;;MAKF,IAAIxB,GAAG,CAACE,OAAO,KAAK,IAAI,EAAE;QACxB,IAAMuB,QAAQ,GAAGzB,GAAG,CAACE,OAAO,CAACwB,WAAW,EAAE;QAE1C,IACE,CAACD,QAAQ,YAAYE,QAAQ,IAAIF,QAAQ,YAAYG,UAAU,KAC/DH,QAAQ,CAACI,aAAa,KAAK7B,GAAG,CAACE,OAAO,IACtC,CAACF,GAAG,CAACE,OAAO,CAAC4B,QAAQ,CAACL,QAAQ,CAACI,aAAa,CAAC,EAC7C;UACA1B,eAAe,CAAC7F,CAAC,CAAC;UAClB;;;MAIJ,IAAK,CAAAyH,SAAA,GAAAzH,CAAC,CAAC8B,MAAsB,aAAxB2F,SAAA,CAA0BC,iBAAiB,IAAI,EAACb,eAAe,YAAfA,eAAe,CAAEc,uBAAuB,GAAE;QAC7F;;MAGFjJ,kBAAkB,CAAC8H,KAAK,EAAEK,eAAe,oBAAfA,eAAe,CAAEjI,QAAQ,CAAC,CAACuC,OAAO,CAAC,UAAC/C,GAAG;;QAC/D,IAAMW,MAAM,GAAGD,WAAW,CAACV,GAAG,EAAEyI,eAAe,oBAAfA,eAAe,CAAE7H,cAAc,CAAC;QAEhE,IAAIyD,6BAA6B,CAACzC,CAAC,EAAEjB,MAAM,EAAE8H,eAAe,oBAAfA,eAAe,CAAEnE,eAAe,CAAC,KAAAkF,YAAA,GAAI7I,MAAM,CAACJ,IAAI,aAAXiJ,YAAA,CAAanJ,QAAQ,CAAC,GAAG,CAAC,EAAE;UAC5G,IAAIoI,eAAe,YAAfA,eAAe,CAAEgB,eAAe,YAAhChB,eAAe,CAAEgB,eAAe,CAAG7H,CAAC,CAAC,EAAE;YACzC;;UAGF,IAAIiH,OAAO,IAAIX,eAAe,CAACV,OAAO,EAAE;YACtC;;UAGFvE,mBAAmB,CAACrB,CAAC,EAAEjB,MAAM,EAAE8H,eAAe,oBAAfA,eAAe,CAAEvF,cAAc,CAAC;UAE/D,IAAI,CAACC,eAAe,CAACvB,CAAC,EAAEjB,MAAM,EAAE8H,eAAe,oBAAfA,eAAe,CAAErF,OAAO,CAAC,EAAE;YACzDqE,eAAe,CAAC7F,CAAC,CAAC;YAElB;;;UAIF4G,KAAK,CAAChB,OAAO,CAAC5F,CAAC,EAAEjB,MAAM,CAAC;UAExB,IAAI,CAACkI,OAAO,EAAE;YACZX,eAAe,CAACV,OAAO,GAAG,IAAI;;;OAGnC,CAAC;KACH;IAED,IAAMkC,aAAa,GAAG,SAAhBA,aAAaA,CAAIC,KAAoB;MACzC,IAAIA,KAAK,CAAC3J,GAAG,KAAK6B,SAAS,EAAE;;QAE3B;;MAGFI,0BAA0B,CAAClC,MAAM,CAAC4J,KAAK,CAAC3J,GAAG,CAAC,CAAC;MAE7C,IAAK,CAAAyI,eAAe,oBAAfA,eAAe,CAAEmB,OAAO,MAAK/H,SAAS,IAAI,CAAA4G,eAAe,oBAAfA,eAAe,CAAEoB,KAAK,MAAK,IAAI,IAAKpB,eAAe,YAAfA,eAAe,CAAEmB,OAAO,EAAE;QAC3GhB,QAAQ,CAACe,KAAK,CAAC;;KAElB;IAED,IAAMG,WAAW,GAAG,SAAdA,WAAWA,CAAIH,KAAoB;MACvC,IAAIA,KAAK,CAAC3J,GAAG,KAAK6B,SAAS,EAAE;;QAE3B;;MAGFK,8BAA8B,CAACnC,MAAM,CAAC4J,KAAK,CAAC3J,GAAG,CAAC,CAAC;MAEjDkI,eAAe,CAACV,OAAO,GAAG,KAAK;MAE/B,IAAIiB,eAAe,YAAfA,eAAe,CAAEoB,KAAK,EAAE;QAC1BjB,QAAQ,CAACe,KAAK,EAAE,IAAI,CAAC;;KAExB;IAED,IAAMI,OAAO,GAAGzC,GAAG,CAACE,OAAO,KAAIW,QAAQ,oBAARA,QAAQ,CAAEzG,QAAQ,KAAIA,QAAQ;;IAG7DqI,OAAO,CAACpI,gBAAgB,CAAC,OAAO,EAAEmI,WAAW,CAAC;;IAE9CC,OAAO,CAACpI,gBAAgB,CAAC,SAAS,EAAE+H,aAAa,CAAC;IAElD,IAAIf,KAAK,EAAE;MACTrI,kBAAkB,CAAC8H,KAAK,EAAEK,eAAe,oBAAfA,eAAe,CAAEjI,QAAQ,CAAC,CAACuC,OAAO,CAAC,UAAC/C,GAAG;QAAA,OAC/D2I,KAAK,CAACzD,SAAS,CAACxE,WAAW,CAACV,GAAG,EAAEyI,eAAe,oBAAfA,eAAe,CAAE7H,cAAc,EAAE6H,eAAe,oBAAfA,eAAe,CAAE5H,WAAW,CAAC,CAAC;QACjG;;IAGH,OAAO;;MAELkJ,OAAO,CAACC,mBAAmB,CAAC,OAAO,EAAEF,WAAW,CAAC;;MAEjDC,OAAO,CAACC,mBAAmB,CAAC,SAAS,EAAEN,aAAa,CAAC;MAErD,IAAIf,KAAK,EAAE;QACTrI,kBAAkB,CAAC8H,KAAK,EAAEK,eAAe,oBAAfA,eAAe,CAAEjI,QAAQ,CAAC,CAACuC,OAAO,CAAC,UAAC/C,GAAG;UAAA,OAC/D2I,KAAK,CAACxD,YAAY,CAACzE,WAAW,CAACV,GAAG,EAAEyI,eAAe,oBAAfA,eAAe,CAAE7H,cAAc,EAAE6H,eAAe,oBAAfA,eAAe,CAAE5H,WAAW,CAAC,CAAC;UACpG;;KAEJ;GACF,EAAE,CAACuH,KAAK,EAAEK,eAAe,EAAExE,YAAY,CAAC,CAAC;EAE1C,OAAOqD,GAAG;AACZ;;SCxKwB2C,gBAAgBA;EACtC,IAAA3D,SAAA,GAAwBC,cAAQ,CAAC,IAAIjE,GAAG,EAAU,CAAC;IAA5C/B,IAAI,GAAA+F,SAAA;IAAE4D,OAAO,GAAA5D,SAAA;EACpB,IAAAI,UAAA,GAAsCH,cAAQ,CAAC,KAAK,CAAC;IAA9C4D,WAAW,GAAAzD,UAAA;IAAE0D,cAAc,GAAA1D,UAAA;EAElC,IAAM2D,OAAO,GAAGxD,iBAAW,CAAC,UAAC8C,KAAoB;IAC/C,IAAIA,KAAK,CAAC3J,GAAG,KAAK6B,SAAS,EAAE;;MAE3B;;IAGF8H,KAAK,CAACzG,cAAc,EAAE;IACtByG,KAAK,CAAClC,eAAe,EAAE;IAEvByC,OAAO,CAAC,UAACpD,IAAI;MACX,IAAMwD,OAAO,GAAG,IAAIhI,GAAG,CAACwE,IAAI,CAAC;MAE7BwD,OAAO,CAACtH,GAAG,CAACjD,MAAM,CAAC4J,KAAK,CAAC3J,GAAG,CAAC,CAAC;MAE9B,OAAOsK,OAAO;KACf,CAAC;GACH,EAAE,EAAE,CAAC;EAEN,IAAMC,IAAI,GAAG1D,iBAAW,CAAC;IACvB,IAAI,OAAOnF,QAAQ,KAAK,WAAW,EAAE;MACnCA,QAAQ,CAACsI,mBAAmB,CAAC,SAAS,EAAEK,OAAO,CAAC;MAEhDD,cAAc,CAAC,KAAK,CAAC;;GAExB,EAAE,CAACC,OAAO,CAAC,CAAC;EAEb,IAAMG,KAAK,GAAG3D,iBAAW,CAAC;IACxBqD,OAAO,CAAC,IAAI5H,GAAG,EAAU,CAAC;IAE1B,IAAI,OAAOZ,QAAQ,KAAK,WAAW,EAAE;MACnC6I,IAAI,EAAE;MAEN7I,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAE0I,OAAO,CAAC;MAE7CD,cAAc,CAAC,IAAI,CAAC;;GAEvB,EAAE,CAACC,OAAO,EAAEE,IAAI,CAAC,CAAC;EAEnB,OAAO,CAAChK,IAAI,EAAE;IAAEiK,KAAK,EAALA,KAAK;IAAED,IAAI,EAAJA,IAAI;IAAEJ,WAAW,EAAXA;GAAa,CAAU;AACtD;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"react-hotkeys-hook.cjs.development.js","sources":["../src/parseHotkeys.ts","../src/isHotkeyPressed.ts","../src/validators.ts","../src/BoundHotkeysProxyProvider.tsx","../src/deepEqual.ts","../src/HotkeysProvider.tsx","../src/useDeepEqualMemo.ts","../src/useHotkeys.ts","../src/useRecordHotkeys.ts"],"sourcesContent":["import { Hotkey, KeyboardModifiers } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl', 'control']\n\nconst mappedKeys: Record<string, string> = {\n esc: 'escape',\n return: 'enter',\n left: 'arrowleft',\n right: 'arrowright',\n up: 'arrowup',\n down: 'arrowdown',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: 'meta',\n ControlLeft: 'ctrl',\n ControlRight: 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key.trim()] || key.trim()).toLowerCase().replace(/key|digit|numpad/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, delimiter = ','): string[] {\n return keys.toLowerCase().split(delimiter)\n}\n\nexport function parseHotkey(hotkey: string, splitKey = '+', useKey = false, description?: string): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(splitKey)\n .map((k) => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl') || keys.includes('control'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n useKey,\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n description,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', (e) => {\n if (e.code === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.code)])\n })\n\n document.addEventListener('keyup', (e) => {\n if (e.code === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set<string> = new Set<string>()\n\n// https://github.com/microsoft/TypeScript/issues/17002\nexport function isReadonlyArray(value: unknown): value is readonly unknown[] {\n return Array.isArray(value)\n}\n\nexport function isHotkeyPressed(key: string | readonly string[], delimiter = ','): boolean {\n const hotkeyArray = isReadonlyArray(key) ? key : key.split(delimiter)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach((key) => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed, isReadonlyArray } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag(\n { target }: KeyboardEvent,\n enabledOnTags: readonly FormTags[] | boolean = false\n): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (isReadonlyArray(enabledOnTags)) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some((scope) => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys, useKey } = hotkey\n const { code, key: producedKey, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const mappedCode = mapKey(code)\n\n if (useKey && keys?.length === 1 && keys.includes(producedKey)) {\n return true\n }\n\n if (\n !keys?.includes(mappedCode) &&\n !['ctrl', 'control', 'unknown', 'meta', 'alt', 'shift', 'os'].includes(mappedCode)\n ) {\n return false\n }\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt !== altKey && mappedCode !== 'alt') {\n return false\n }\n\n if (shift !== shiftKey && mappedCode !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (meta !== metaKey && mappedCode !== 'meta' && mappedCode !== 'os') {\n return false\n }\n\n if (ctrl !== ctrlKey && mappedCode !== 'ctrl' && mappedCode !== 'control') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && keys.includes(mappedCode)) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nconst BoundHotkeysProxyProvider = createContext<BoundHotkeysProxyProviderType | undefined>(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return (\n <BoundHotkeysProxyProvider.Provider value={{ addHotkey, removeHotkey }}>\n {children}\n </BoundHotkeysProxyProvider.Provider>\n )\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return x && y && typeof x === 'object' && typeof y === 'object'\n ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), true)\n : x === y\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray<Hotkey>\n activeScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext<HotkeysContextType>({\n hotkeys: [],\n activeScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({ initiallyActiveScopes = ['*'], children }: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(initiallyActiveScopes)\n const [boundHotkeys, setBoundHotkeys] = useState<Hotkey[]>([])\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n return prev.filter((s) => s !== scope)\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n return prev.filter((s) => s !== scope)\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter((h) => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n <HotkeysContext.Provider\n value={{ activeScopes: internalActiveScopes, hotkeys: boundHotkeys, enableScope, disableScope, toggleScope }}\n >\n <BoundHotkeysProxyProviderProvider addHotkey={addBoundHotkey} removeHotkey={removeBoundHotkey}>\n {children}\n </BoundHotkeysProxyProviderProvider>\n </HotkeysContext.Provider>\n )\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo<T>(value: T) {\n const ref = useRef<T | undefined>(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { isReadonlyArray, pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys<T extends HTMLElement>(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray\n) {\n const ref = useRef<RefType<T>>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = isReadonlyArray(keys) ? keys.join(_options?.delimiter) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef<HotkeyCallback>(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { activeScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(activeScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (ref.current !== null) {\n const rootNode = ref.current.getRootNode()\n\n if (\n (rootNode instanceof Document || rootNode instanceof ShadowRoot) &&\n rootNode.activeElement !== ref.current &&\n !ref.current.contains(rootNode.activeElement)\n ) {\n stopPropagation(e)\n return\n }\n }\n\n if ((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable) {\n return\n }\n\n parseKeysHookInput(_keys, memoisedOptions?.delimiter).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.splitKey, memoisedOptions?.useKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (memoisedOptions?.ignoreEventWhen?.(e)) {\n return\n }\n\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.code === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.code === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.delimiter).forEach((key) =>\n proxy.addHotkey(\n parseHotkey(key, memoisedOptions?.splitKey, memoisedOptions?.useKey, memoisedOptions?.description)\n )\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.delimiter).forEach((key) =>\n proxy.removeHotkey(\n parseHotkey(key, memoisedOptions?.splitKey, memoisedOptions?.useKey, memoisedOptions?.description)\n )\n )\n }\n }\n }, [_keys, memoisedOptions, activeScopes])\n\n return ref\n}\n","import { useCallback, useState } from 'react'\nimport { mapKey } from './parseHotkeys'\n\nexport default function useRecordHotkeys() {\n const [keys, setKeys] = useState(new Set<string>())\n const [isRecording, setIsRecording] = useState(false)\n\n const handler = useCallback((event: KeyboardEvent) => {\n if (event.code === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n\n setKeys((prev) => {\n const newKeys = new Set(prev)\n\n newKeys.add(mapKey(event.code))\n\n return newKeys\n })\n }, [])\n\n const stop = useCallback(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('keydown', handler)\n\n setIsRecording(false)\n }\n }, [handler])\n\n const start = useCallback(() => {\n setKeys(new Set<string>())\n\n if (typeof document !== 'undefined') {\n stop()\n\n document.addEventListener('keydown', handler)\n\n setIsRecording(true)\n }\n }, [handler, stop])\n\n const resetKeys = useCallback(() => {\n setKeys(new Set<string>())\n }, [])\n\n return [keys, { start, stop, resetKeys, isRecording }] as const\n}\n"],"names":["reservedModifierKeywords","mappedKeys","esc","left","right","up","down","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","isHotkeyModifier","includes","parseKeysHookInput","keys","delimiter","split","parseHotkey","hotkey","splitKey","useKey","description","toLocaleLowerCase","map","k","modifiers","alt","ctrl","shift","meta","mod","singleCharKeys","filter","_extends","document","addEventListener","e","code","undefined","pushToCurrentlyPressedKeys","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isReadonlyArray","value","Array","isArray","isHotkeyPressed","hotkeyArray","every","has","forEach","add","maybePreventDefault","preventDefault","isHotkeyEnabled","enabled","isKeyboardEventTriggeredByInput","ev","isHotkeyEnabledOnTag","_ref","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isScopeActive","activeScopes","scopes","length","console","warn","scope","isHotkeyMatchingKeyboardEvent","ignoreModifiers","producedKey","ctrlKey","metaKey","shiftKey","altKey","mappedCode","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","BoundHotkeysProxyProviderProvider","addHotkey","removeHotkey","children","_jsx","Provider","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","toggleScope","enableScope","disableScope","useHotkeysContext","HotkeysProvider","initiallyActiveScopes","_ref$initiallyActiveS","_useState","useState","internalActiveScopes","setInternalActiveScopes","_useState2","boundHotkeys","setBoundHotkeys","useCallback","prev","from","concat","s","addBoundHotkey","removeBoundHotkey","h","useDeepEqualMemo","ref","useRef","current","stopPropagation","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","cbRef","memoisedOptions","_useHotkeysContext","proxy","listener","isKeyUp","enableOnFormTags","rootNode","getRootNode","Document","ShadowRoot","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","_hotkey$keys","ignoreEventWhen","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","removeEventListener","useRecordHotkeys","setKeys","isRecording","setIsRecording","handler","newKeys","stop","start","resetKeys"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react"),t=require("react/jsx-runtime");function n(){return(n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}var o=["shift","alt","meta","mod","ctrl"],r={esc:"escape",return:"enter",left:"arrowleft",right:"arrowright",up:"arrowup",down:"arrowdown",
|
|
1
|
+
"use strict";var e=require("react"),t=require("react/jsx-runtime");function n(){return(n=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e}).apply(this,arguments)}var o=["shift","alt","meta","mod","ctrl","control"],r={esc:"escape",return:"enter",left:"arrowleft",right:"arrowright",up:"arrowup",down:"arrowdown",ShiftLeft:"shift",ShiftRight:"shift",AltLeft:"alt",AltRight:"alt",MetaLeft:"meta",MetaRight:"meta",OSLeft:"meta",OSRight:"meta",ControlLeft:"ctrl",ControlRight:"ctrl"};function i(e){return(r[e.trim()]||e.trim()).toLowerCase().replace(/key|digit|numpad/,"")}function u(e,t){return void 0===t&&(t=","),e.toLowerCase().split(t)}function c(e,t,r,u){void 0===t&&(t="+"),void 0===r&&(r=!1);var c=e.toLocaleLowerCase().split(t).map((function(e){return i(e)}));return n({},{alt:c.includes("alt"),ctrl:c.includes("ctrl")||c.includes("control"),shift:c.includes("shift"),meta:c.includes("meta"),mod:c.includes("mod"),useKey:r},{keys:c.filter((function(e){return!o.includes(e)})),description:u})}"undefined"!=typeof document&&(document.addEventListener("keydown",(function(e){void 0!==e.code&&s([i(e.code)])})),document.addEventListener("keyup",(function(e){void 0!==e.code&&f([i(e.code)])}))),"undefined"!=typeof window&&window.addEventListener("blur",(function(){l.clear()}));var l=new Set;function a(e){return Array.isArray(e)}function d(e,t){return void 0===t&&(t=","),(a(e)?e:e.split(t)).every((function(e){return l.has(e.trim().toLowerCase())}))}function s(e){var t=Array.isArray(e)?e:[e];l.has("meta")&&l.forEach((function(e){return!function(e){return o.includes(e)}(e)&&l.delete(e.toLowerCase())})),t.forEach((function(e){return l.add(e.toLowerCase())}))}function f(e){var t=Array.isArray(e)?e:[e];"meta"===e?l.clear():t.forEach((function(e){return l.delete(e.toLowerCase())}))}function v(e,t){var n=e.target;void 0===t&&(t=!1);var o=n&&n.tagName;return a(t)?Boolean(o&&t&&t.some((function(e){return e.toLowerCase()===o.toLowerCase()}))):Boolean(o&&t&&t)}var y=e.createContext(void 0);function p(e){return t.jsx(y.Provider,{value:{addHotkey:e.addHotkey,removeHotkey:e.removeHotkey},children:e.children})}function m(e,t){return e&&t&&"object"==typeof e&&"object"==typeof t?Object.keys(e).length===Object.keys(t).length&&Object.keys(e).reduce((function(n,o){return n&&m(e[o],t[o])}),!0):e===t}var h=e.createContext({hotkeys:[],activeScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),k=function(){return e.useContext(h)},w=function(e){e.stopPropagation(),e.preventDefault(),e.stopImmediatePropagation()},g="undefined"!=typeof window?e.useLayoutEffect:e.useEffect;exports.HotkeysProvider=function(n){var o=n.initiallyActiveScopes,r=n.children,i=e.useState(void 0===o?["*"]:o),u=i[0],c=i[1],l=e.useState([]),a=l[0],d=l[1],s=e.useCallback((function(e){c((function(t){return t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),f=e.useCallback((function(e){c((function(t){return t.filter((function(t){return t!==e}))}))}),[]),v=e.useCallback((function(e){c((function(t){return t.includes(e)?t.filter((function(t){return t!==e})):t.includes("*")?[e]:Array.from(new Set([].concat(t,[e])))}))}),[]),y=e.useCallback((function(e){d((function(t){return[].concat(t,[e])}))}),[]),k=e.useCallback((function(e){d((function(t){return t.filter((function(t){return!m(t,e)}))}))}),[]);return t.jsx(h.Provider,{value:{activeScopes:u,hotkeys:a,enableScope:s,disableScope:f,toggleScope:v},children:t.jsx(p,{addHotkey:y,removeHotkey:k,children:r})})},exports.isHotkeyPressed=d,exports.useHotkeys=function(t,n,o,r){var l=e.useRef(null),p=e.useRef(!1),h=o instanceof Array?r instanceof Array?void 0:r:o,b=a(t)?t.join(null==h?void 0:h.delimiter):t,C=o instanceof Array?o:r instanceof Array?r:void 0,S=e.useCallback(n,null!=C?C:[]),L=e.useRef(S);L.current=C?S:n;var E=function(t){var n=e.useRef(void 0);return m(n.current,t)||(n.current=t),n.current}(h),A=k().activeScopes,x=e.useContext(y);return g((function(){if(!1!==(null==E?void 0:E.enabled)&&function(e,t){return 0===e.length&&t?(console.warn('A hotkey has the "scopes" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a <HotkeysProvider>'),!0):!t||e.some((function(e){return t.includes(e)}))||e.includes("*")}(A,null==E?void 0:E.scopes)){var e=function(e,t){var n;if(void 0===t&&(t=!1),!v(e,["input","textarea","select"])||v(e,null==E?void 0:E.enableOnFormTags)){if(null!==l.current){var o=l.current.getRootNode();if((o instanceof Document||o instanceof ShadowRoot)&&o.activeElement!==l.current&&!l.current.contains(o.activeElement))return void w(e)}(null==(n=e.target)||!n.isContentEditable||null!=E&&E.enableOnContentEditable)&&u(b,null==E?void 0:E.delimiter).forEach((function(n){var o,r=c(n,null==E?void 0:E.splitKey,null==E?void 0:E.useKey);if(function(e,t,n){void 0===n&&(n=!1);var o=t.alt,r=t.meta,u=t.mod,c=t.shift,l=t.ctrl,a=t.keys,s=t.useKey,f=e.key,v=e.ctrlKey,y=e.metaKey,p=e.shiftKey,m=e.altKey,h=i(e.code);if(s&&1===(null==a?void 0:a.length)&&a.includes(f))return!0;if(!(null!=a&&a.includes(h)||["ctrl","control","unknown","meta","alt","shift","os"].includes(h)))return!1;if(!n){if(o!==m&&"alt"!==h)return!1;if(c!==p&&"shift"!==h)return!1;if(u){if(!y&&!v)return!1}else{if(r!==y&&"meta"!==h&&"os"!==h)return!1;if(l!==v&&"ctrl"!==h&&"control"!==h)return!1}}return!(!a||1!==a.length||!a.includes(h))||(a?d(a):!a)}(e,r,null==E?void 0:E.ignoreModifiers)||null!=(o=r.keys)&&o.includes("*")){if(null!=E&&null!=E.ignoreEventWhen&&E.ignoreEventWhen(e))return;if(t&&p.current)return;if(function(e,t,n){("function"==typeof n&&n(e,t)||!0===n)&&e.preventDefault()}(e,r,null==E?void 0:E.preventDefault),!function(e,t,n){return"function"==typeof n?n(e,t):!0===n||void 0===n}(e,r,null==E?void 0:E.enabled))return void w(e);L.current(e,r),t||(p.current=!0)}}))}},t=function(t){void 0!==t.code&&(s(i(t.code)),(void 0===(null==E?void 0:E.keydown)&&!0!==(null==E?void 0:E.keyup)||null!=E&&E.keydown)&&e(t))},n=function(t){void 0!==t.code&&(f(i(t.code)),p.current=!1,null!=E&&E.keyup&&e(t,!0))},o=l.current||(null==h?void 0:h.document)||document;return o.addEventListener("keyup",n),o.addEventListener("keydown",t),x&&u(b,null==E?void 0:E.delimiter).forEach((function(e){return x.addHotkey(c(e,null==E?void 0:E.splitKey,null==E?void 0:E.useKey,null==E?void 0:E.description))})),function(){o.removeEventListener("keyup",n),o.removeEventListener("keydown",t),x&&u(b,null==E?void 0:E.delimiter).forEach((function(e){return x.removeHotkey(c(e,null==E?void 0:E.splitKey,null==E?void 0:E.useKey,null==E?void 0:E.description))}))}}}),[b,E,A]),l},exports.useHotkeysContext=k,exports.useRecordHotkeys=function(){var t=e.useState(new Set),n=t[0],o=t[1],r=e.useState(!1),u=r[0],c=r[1],l=e.useCallback((function(e){void 0!==e.code&&(e.preventDefault(),e.stopPropagation(),o((function(t){var n=new Set(t);return n.add(i(e.code)),n})))}),[]),a=e.useCallback((function(){"undefined"!=typeof document&&(document.removeEventListener("keydown",l),c(!1))}),[l]),d=e.useCallback((function(){o(new Set),"undefined"!=typeof document&&(a(),document.addEventListener("keydown",l),c(!0))}),[l,a]),s=e.useCallback((function(){o(new Set)}),[]);return[n,{start:d,stop:a,resetKeys:s,isRecording:u}]};
|
|
2
2
|
//# sourceMappingURL=react-hotkeys-hook.cjs.production.min.js.map
|