@ngrdt/shortcuts 0.0.6

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/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @ngrdt/shortcuts
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Running unit tests
6
+
7
+ Run `nx test @ngrdt/shortcuts` to execute the unit tests.
@@ -0,0 +1,5 @@
1
+ export * from './lib/shortcuts/rdt-shortcut';
2
+ export * from './lib/shortcuts/rdt-shortcut.models';
3
+ export * from './lib/shortcuts/providers/rdt-shortcut.service';
4
+ export * from './lib/shortcuts/directives/rdt-key-listener.directive';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9AbmdyZHQvc2hvcnRjdXRzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMscUNBQXFDLENBQUM7QUFFcEQsY0FBYyxnREFBZ0QsQ0FBQztBQUMvRCxjQUFjLHVEQUF1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvc2hvcnRjdXRzL3JkdC1zaG9ydGN1dCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Nob3J0Y3V0cy9yZHQtc2hvcnRjdXQubW9kZWxzJztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Nob3J0Y3V0cy9wcm92aWRlcnMvcmR0LXNob3J0Y3V0LnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zaG9ydGN1dHMvZGlyZWN0aXZlcy9yZHQta2V5LWxpc3RlbmVyLmRpcmVjdGl2ZSc7XHJcbiJdfQ==
@@ -0,0 +1,53 @@
1
+ import { Directive, EventEmitter, HostListener, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ // Outputs keydown event if only one key was pressed at once
4
+ export class RdtKeyListenerDirective {
5
+ keysPressed = new Set();
6
+ pressedAtOnce = new Set();
7
+ output = new EventEmitter();
8
+ onKeyDown(event) {
9
+ if (!this.pressedAtOnce.has(event.key)) {
10
+ this.keysPressed.add(event.key);
11
+ this.pressedAtOnce.add(event.key);
12
+ if (this.pressedAtOnce.size === 1) {
13
+ this.output.emit(event);
14
+ }
15
+ }
16
+ }
17
+ onKeyUp(event) {
18
+ this.keysPressed.delete(event.key);
19
+ this.pressedAtOnce.delete(event.key);
20
+ if (this.keysPressed.size === 0) {
21
+ this.pressedAtOnce.clear();
22
+ }
23
+ }
24
+ onWindowFocus() {
25
+ this.pressedAtOnce.clear();
26
+ this.keysPressed.clear();
27
+ }
28
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtKeyListenerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
29
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: RdtKeyListenerDirective, isStandalone: true, selector: "[rdtKeyListener]", outputs: { output: "rdtKeyListener" }, host: { listeners: { "keydown": "onKeyDown($event)", "window:keyup": "onKeyUp($event)", "keyup": "onKeyUp($event)", "window:focus": "onWindowFocus()" } }, ngImport: i0 });
30
+ }
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtKeyListenerDirective, decorators: [{
32
+ type: Directive,
33
+ args: [{
34
+ selector: '[rdtKeyListener]',
35
+ standalone: true,
36
+ }]
37
+ }], propDecorators: { output: [{
38
+ type: Output,
39
+ args: ['rdtKeyListener']
40
+ }], onKeyDown: [{
41
+ type: HostListener,
42
+ args: ['keydown', ['$event']]
43
+ }], onKeyUp: [{
44
+ type: HostListener,
45
+ args: ['window:keyup', ['$event']]
46
+ }, {
47
+ type: HostListener,
48
+ args: ['keyup', ['$event']]
49
+ }], onWindowFocus: [{
50
+ type: HostListener,
51
+ args: ['window:focus']
52
+ }] } });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LWtleS1saXN0ZW5lci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvc2hvcnRjdXRzL3NyYy9saWIvc2hvcnRjdXRzL2RpcmVjdGl2ZXMvcmR0LWtleS1saXN0ZW5lci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFOUUsNERBQTREO0FBSzVELE1BQU0sT0FBTyx1QkFBdUI7SUFDMUIsV0FBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDaEMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFHMUMsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO0lBR25DLFNBQVMsQ0FBQyxLQUFvQjtRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVsQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFJTyxPQUFPLENBQUMsS0FBb0I7UUFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFHTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO3VHQWpDVSx1QkFBdUI7MkZBQXZCLHVCQUF1Qjs7MkZBQXZCLHVCQUF1QjtrQkFKbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7OEJBTUMsTUFBTTtzQkFETCxNQUFNO3VCQUFDLGdCQUFnQjtnQkFJaEIsU0FBUztzQkFEaEIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBYzNCLE9BQU87c0JBRmQsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUN2QyxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVekIsYUFBYTtzQkFEcEIsWUFBWTt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vLyBPdXRwdXRzIGtleWRvd24gZXZlbnQgaWYgb25seSBvbmUga2V5IHdhcyBwcmVzc2VkIGF0IG9uY2VcclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbcmR0S2V5TGlzdGVuZXJdJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmR0S2V5TGlzdGVuZXJEaXJlY3RpdmUge1xyXG4gIHByaXZhdGUga2V5c1ByZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICBwcml2YXRlIHByZXNzZWRBdE9uY2UgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbiAgQE91dHB1dCgncmR0S2V5TGlzdGVuZXInKVxyXG4gIG91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgcHJpdmF0ZSBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5wcmVzc2VkQXRPbmNlLmhhcyhldmVudC5rZXkpKSB7XHJcbiAgICAgIHRoaXMua2V5c1ByZXNzZWQuYWRkKGV2ZW50LmtleSk7XHJcbiAgICAgIHRoaXMucHJlc3NlZEF0T25jZS5hZGQoZXZlbnQua2V5KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnByZXNzZWRBdE9uY2Uuc2l6ZSA9PT0gMSkge1xyXG4gICAgICAgIHRoaXMub3V0cHV0LmVtaXQoZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAnLCBbJyRldmVudCddKVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2tleXVwJywgWyckZXZlbnQnXSlcclxuICBwcml2YXRlIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIHRoaXMua2V5c1ByZXNzZWQuZGVsZXRlKGV2ZW50LmtleSk7XHJcbiAgICB0aGlzLnByZXNzZWRBdE9uY2UuZGVsZXRlKGV2ZW50LmtleSk7XHJcbiAgICBpZiAodGhpcy5rZXlzUHJlc3NlZC5zaXplID09PSAwKSB7XHJcbiAgICAgIHRoaXMucHJlc3NlZEF0T25jZS5jbGVhcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmZvY3VzJylcclxuICBwcml2YXRlIG9uV2luZG93Rm9jdXMoKSB7XHJcbiAgICB0aGlzLnByZXNzZWRBdE9uY2UuY2xlYXIoKTtcclxuICAgIHRoaXMua2V5c1ByZXNzZWQuY2xlYXIoKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,125 @@
1
+ import { Injectable } from '@angular/core';
2
+ import hotkeys from 'hotkeys-js';
3
+ import { filter, Observable, Subject } from 'rxjs';
4
+ import { DEFAULT_SHORTCUT_CONFIG, IGNORED_KEYCODES, SHORTCUT_SPLIT_KEY, ShortcutSrcElement, } from '../rdt-shortcut.models';
5
+ import * as i0 from "@angular/core";
6
+ export class RdtShortcutService {
7
+ bound = new Map();
8
+ subject$ = new Subject();
9
+ observable$ = this.subject$.asObservable();
10
+ constructor() {
11
+ // Enables hotkeys on input elements
12
+ // Enables hotkeys on input elements
13
+ hotkeys.filter = function (event) {
14
+ if (IGNORED_KEYCODES.includes(event.code)) {
15
+ return false;
16
+ }
17
+ const tagName = event.target.tagName;
18
+ const isInputEl = /^(INPUT|TEXTAREA|SELECT)$/.test(tagName);
19
+ const scope = isInputEl
20
+ ? ShortcutSrcElement.INPUT
21
+ : ShortcutSrcElement.OTHER;
22
+ hotkeys.setScope(scope);
23
+ return true;
24
+ };
25
+ }
26
+ listen(shortcut, config) {
27
+ const patchedConfig = {
28
+ ...DEFAULT_SHORTCUT_CONFIG,
29
+ ...config,
30
+ };
31
+ if (Array.isArray(shortcut)) {
32
+ return this.listenArray(shortcut, patchedConfig);
33
+ }
34
+ else {
35
+ return this.listenSingle(shortcut, patchedConfig);
36
+ }
37
+ }
38
+ listenArray(shortcuts, config) {
39
+ return new Observable((subscriber) => {
40
+ const set = new Set(shortcuts);
41
+ try {
42
+ shortcuts.forEach((s) => this.bind(s, config));
43
+ }
44
+ catch (ex) {
45
+ subscriber.error(ex);
46
+ }
47
+ const sub = this.observable$
48
+ .pipe(filter((evt) => set.has(evt.shortcut)))
49
+ .subscribe(subscriber);
50
+ return () => {
51
+ sub.unsubscribe();
52
+ shortcuts.forEach((s) => this.unbind(s, config));
53
+ };
54
+ });
55
+ }
56
+ listenSingle(shortcut, config) {
57
+ return new Observable((subscriber) => {
58
+ try {
59
+ this.bind(shortcut, config);
60
+ }
61
+ catch (ex) {
62
+ subscriber.error(ex);
63
+ }
64
+ const sub = this.observable$
65
+ .pipe(filter((evt) => evt.shortcut === shortcut))
66
+ .subscribe(subscriber);
67
+ return () => {
68
+ sub.unsubscribe();
69
+ this.unbind(shortcut, config);
70
+ };
71
+ });
72
+ }
73
+ bind(shortcut, config) {
74
+ const options = {
75
+ element: config.element,
76
+ splitKey: SHORTCUT_SPLIT_KEY,
77
+ };
78
+ if (this.bound.get(config.element)?.[shortcut.hotkeysValue]) {
79
+ throw new Error(`Shortcut ${shortcut} is already binded!`);
80
+ }
81
+ if (!this.bound.has(config.element)) {
82
+ const newObj = {
83
+ [shortcut.hotkeysValue]: shortcut,
84
+ };
85
+ this.bound.set(config.element, newObj);
86
+ }
87
+ else {
88
+ this.bound.get(config.element)[shortcut.hotkeysValue] = shortcut;
89
+ }
90
+ hotkeys(shortcut.hotkeysValue, options, this.keyHandlerFactory(config));
91
+ }
92
+ unbind(shortcut, config) {
93
+ const obj = this.bound.get(config.element);
94
+ if (obj?.[shortcut.hotkeysValue]) {
95
+ obj[shortcut.hotkeysValue] = undefined;
96
+ if (Object.keys(obj).every((key) => obj[key] === undefined)) {
97
+ this.bound.delete(config.element);
98
+ }
99
+ hotkeys.unbind(shortcut.hotkeysValue);
100
+ }
101
+ }
102
+ keyHandlerFactory(config) {
103
+ return (keyboardEvent, hotkeysEvent) => {
104
+ if (config.preventDefault) {
105
+ keyboardEvent.preventDefault();
106
+ }
107
+ const evt = {
108
+ shortcut: this.bound.get(config.element)[hotkeysEvent.shortcut],
109
+ src: hotkeysEvent.scope,
110
+ originalEvent: keyboardEvent,
111
+ };
112
+ this.subject$.next(evt);
113
+ return !config.preventDefault;
114
+ };
115
+ }
116
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
117
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, providedIn: 'root' });
118
+ }
119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, decorators: [{
120
+ type: Injectable,
121
+ args: [{
122
+ providedIn: 'root',
123
+ }]
124
+ }], ctorParameters: () => [] });
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXNob3J0Y3V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvc2hvcnRjdXRzL3NyYy9saWIvc2hvcnRjdXRzL3Byb3ZpZGVycy9yZHQtc2hvcnRjdXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sT0FBcUMsTUFBTSxZQUFZLENBQUM7QUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUVsQixrQkFBa0IsR0FDbkIsTUFBTSx3QkFBd0IsQ0FBQzs7QUFjaEMsTUFBTSxPQUFPLGtCQUFrQjtJQUNyQixLQUFLLEdBQ1gsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNKLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBb0IsQ0FBQztJQUMzQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUVuRDtRQUNFLG9DQUFvQztRQUNwQyxvQ0FBb0M7UUFDcEMsT0FBTyxDQUFDLE1BQU0sR0FBRyxVQUFVLEtBQW9CO1lBQzdDLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMxQyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBSSxLQUFLLENBQUMsTUFBc0IsQ0FBQyxPQUFPLENBQUM7WUFDdEQsTUFBTSxTQUFTLEdBQUcsMkJBQTJCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVELE1BQU0sS0FBSyxHQUFHLFNBQVM7Z0JBQ3JCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLO2dCQUMxQixDQUFDLENB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QUMsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUM1RCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENBQUMsTUFBbUM7UUFDM0QsT0FBTyxDQUFDLGFBQTRCLEVBQUUsWUFBMEIsRUFBRSxFQUFFO1lBQ2xFLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMxQixhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDakMsQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFxQjtnQkFDNUIsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUNoRSxHQUFHLEVBQUUsWUFBWSxDQUFDLEtBQTJCO2dCQUM3QyxhQUFhLEVBQUUsYUFBYTthQUM3QixDQUFDO1lBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDaEMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzt1R0E5SFUsa0JBQWtCOzJHQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7MkZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGhvdGtleXMsIHsgSG90a2V5c0V2ZW50LCBLZXlIYW5kbGVyIH0gZnJvbSAnaG90a2V5cy1qcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSZHRTaG9ydGN1dCB9IGZyb20gJy4uL3JkdC1zaG9ydGN1dCc7XHJcbmltcG9ydCB7XHJcbiAgREVGQVVMVF9TSE9SVENVVF9DT05GSUcsXHJcbiAgUmR0U2hvcnRjdXRDb25maWcsXHJcbiAgSUdOT1JFRF9LRVlDT0RFUyxcclxuICBTSE9SVENVVF9TUExJVF9LRVksXHJcbiAgUmR0U2hvcnRjdXRFdmVudCxcclxuICBTaG9ydGN1dFNyY0VsZW1lbnQsXHJcbn0gZnJvbSAnLi4vcmR0LXNob3J0Y3V0Lm1vZGVscyc7XHJcblxyXG5pbnRlcmZhY2UgSG90a2V5c09wdGlvbnMge1xyXG4gIHNjb3BlPzogc3RyaW5nO1xyXG4gIGVsZW1lbnQ/OiBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAga2V5dXA/OiBib29sZWFuIHwgbnVsbDtcclxuICBrZXlkb3duPzogYm9vbGVhbiB8IG51bGw7XHJcbiAgY2FwdHVyZT86IGJvb2xlYW47XHJcbiAgc3BsaXRLZXk/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZHRTaG9ydGN1dFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgYm91bmQ6IE1hcDxIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCwgUmVjb3JkPHN0cmluZywgUmR0U2hvcnRjdXQ+PiA9XHJcbiAgICBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBzdWJqZWN0JCA9IG5ldyBTdWJqZWN0PFJkdFNob3J0Y3V0RXZlbnQ+KCk7XHJcbiAgcHJpdmF0ZSBvYnNlcnZhYmxlJCA9IHRoaXMuc3ViamVjdCQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgLy8gRW5hYmxlcyBob3RrZXlzIG9uIGlucHV0IGVsZW1lbnRzXHJcbiAgICAvLyBFbmFibGVzIGhvdGtleXMgb24gaW5wdXQgZWxlbWVudHNcclxuICAgIGhvdGtleXMuZmlsdGVyID0gZnVuY3Rpb24gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgIGlmIChJR05PUkVEX0tFWUNPREVTLmluY2x1ZGVzKGV2ZW50LmNvZGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRhZ05hbWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS50YWdOYW1lO1xyXG4gICAgICBjb25zdCBpc0lucHV0RWwgPSAvXihJTlBVVHxURVhUQVJFQXxTRUxFQ1QpJC8udGVzdCh0YWdOYW1lKTtcclxuICAgICAgY29uc3Qgc2NvcGUgPSBpc0lucHV0RWxcclxuICAgICAgICA/IFNob3J0Y3V0U3JjRWxlbWVudC5JTlBVVFxyXG4gICAgICAgIDogU2hvcnRjdXRTcmNFbGVtZW50Lk9USEVSO1xyXG4gICAgICBob3RrZXlzLnNldFNjb3BlKHNjb3BlKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgbGlzdGVuKHNob3J0Y3V0OiBSZHRTaG9ydGN1dCB8IFJkdFNob3J0Y3V0W10sIGNvbmZpZz86IFJkdFNob3J0Y3V0Q29uZmlnKSB7XHJcbiAgICBjb25zdCBwYXRjaGVkQ29uZmlnID0ge1xyXG4gICAgICAuLi5ERUZBVUxUX1NIT1JUQ1VUX0NPTkZJRyxcclxuICAgICAgLi4uY29uZmlnLFxyXG4gICAgfSBhcyBSZXF1aXJlZDxSZHRTaG9ydGN1dENvbmZpZz47XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzaG9ydGN1dCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuQXJyYXkoc2hvcnRjdXQsIHBhdGNoZWRDb25maWcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuU2luZ2xlKHNob3J0Y3V0LCBwYXRjaGVkQ29uZmlnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbGlzdGVuQXJyYXkoXHJcbiAgICBzaG9ydGN1dHM6IFJkdFNob3J0Y3V0W10sXHJcbiAgICBjb25maWc6IFJlcXVpcmVkPFJkdFNob3J0Y3V0Q29uZmlnPlxyXG4gICkge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFJkdFNob3J0Y3V0RXZlbnQ+KChzdWJzY3JpYmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoc2hvcnRjdXRzKTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgc2hvcnRjdXRzLmZvckVhY2goKHMpID0+IHRoaXMuYmluZChzLCBjb25maWcpKTtcclxuICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGV4KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc3ViID0gdGhpcy5vYnNlcnZhYmxlJFxyXG4gICAgICAgIC5waXBlKGZpbHRlcigoZXZ0KSA9PiBzZXQuaGFzKGV2dC5zaG9ydGN1dCkpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XHJcblxyXG4gICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHNob3J0Y3V0cy5mb3JFYWNoKChzKSA9PiB0aGlzLnVuYmluZChzLCBjb25maWcpKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsaXN0ZW5TaW5nbGUoXHJcbiAgICBzaG9ydGN1dDogUmR0U2hvcnRjdXQsXHJcbiAgICBjb25maWc6IFJlcXVpcmVkPFJkdFNob3J0Y3V0Q29uZmlnPlxyXG4gICkge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFJkdFNob3J0Y3V0RXZlbnQ+KChzdWJzY3JpYmVyKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5iaW5kKHNob3J0Y3V0LCBjb25maWcpO1xyXG4gICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzdWIgPSB0aGlzLm9ic2VydmFibGUkXHJcbiAgICAgICAgLnBpcGUoZmlsdGVyKChldnQpID0+IGV2dC5zaG9ydGN1dCA9PT0gc2hvcnRjdXQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XHJcblxyXG4gICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMudW5iaW5kKHNob3J0Y3V0LCBjb25maWcpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJpbmQoc2hvcnRjdXQ6IFJkdFNob3J0Y3V0LCBjb25maWc6IFJlcXVpcmVkPFJkdFNob3J0Y3V0Q29uZmlnPikge1xyXG4gICAgY29uc3Qgb3B0aW9uczogSG90a2V5c09wdGlvbnMgPSB7XHJcbiAgICAgIGVsZW1lbnQ6IGNvbmZpZy5lbGVtZW50LFxyXG4gICAgICBzcGxpdEtleTogU0hPUlRDVVRfU1BMSVRfS0VZLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5ib3VuZC5nZXQoY29uZmlnLmVsZW1lbnQpPy5bc2hvcnRjdXQuaG90a2V5c1ZhbHVlXSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNob3J0Y3V0ICR7c2hvcnRjdXR9IGlzIGFscmVhZHkgYmluZGVkIWApO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmJvdW5kLmhhcyhjb25maWcuZWxlbWVudCkpIHtcclxuICAgICAgY29uc3QgbmV3T2JqID0ge1xyXG4gICAgICAgIFtzaG9ydGN1dC5ob3RrZXlzVmFsdWVdOiBzaG9ydGN1dCxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5ib3VuZC5zZXQoY29uZmlnLmVsZW1lbnQsIG5ld09iaik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmJvdW5kLmdldChjb25maWcuZWxlbWVudCkhW3Nob3J0Y3V0LmhvdGtleXNWYWx1ZV0gPSBzaG9ydGN1dDtcclxuICAgIH1cclxuXHJcbiAgICBob3RrZXlzKHNob3J0Y3V0LmhvdGtleXNWYWx1ZSwgb3B0aW9ucywgdGhpcy5rZXlIYW5kbGVyRmFjdG9yeShjb25maWcpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5iaW5kKHNob3J0Y3V0OiBSZHRTaG9ydGN1dCwgY29uZmlnOiBSZHRTaG9ydGN1dENvbmZpZykge1xyXG4gICAgY29uc3Qgb2JqID0gdGhpcy5ib3VuZC5nZXQoY29uZmlnLmVsZW1lbnQpO1xyXG4gICAgaWYgKG9iaj8uW3Nob3J0Y3V0LmhvdGtleXNWYWx1ZV0pIHtcclxuICAgICAgb2JqW3Nob3J0Y3V0LmhvdGtleXNWYWx1ZV0gPSB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBSZHRTaG9ydGN1dDtcclxuICAgICAgaWYgKE9iamVjdC5rZXlzKG9iaikuZXZlcnkoKGtleSkgPT4gb2JqW2tleV0gPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICB0aGlzLmJvdW5kLmRlbGV0ZShjb25maWcuZWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgICAgaG90a2V5cy51bmJpbmQoc2hvcnRjdXQuaG90a2V5c1ZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUga2V5SGFuZGxlckZhY3RvcnkoY29uZmlnOiBSZXF1aXJlZDxSZHRTaG9ydGN1dENvbmZpZz4pOiBLZXlIYW5kbGVyIHtcclxuICAgIHJldHVybiAoa2V5Ym9hcmRFdmVudDogS2V5Ym9hcmRFdmVudCwgaG90a2V5c0V2ZW50OiBIb3RrZXlzRXZlbnQpID0+IHtcclxuICAgICAgaWYgKGNvbmZpZy5wcmV2ZW50RGVmYXVsdCkge1xyXG4gICAgICAgIGtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBldnQ6IFJkdFNob3J0Y3V0RXZlbnQgPSB7XHJcbiAgICAgICAgc2hvcnRjdXQ6IHRoaXMuYm91bmQuZ2V0KGNvbmZpZy5lbGVtZW50KSFbaG90a2V5c0V2ZW50LnNob3J0Y3V0XSxcclxuICAgICAgICBzcmM6IGhvdGtleXNFdmVudC5zY29wZSBhcyBTaG9ydGN1dFNyY0VsZW1lbnQsXHJcbiAgICAgICAgb3JpZ2luYWxFdmVudDoga2V5Ym9hcmRFdmVudCxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5zdWJqZWN0JC5uZXh0KGV2dCk7XHJcbiAgICAgIHJldHVybiAhY29uZmlnLnByZXZlbnREZWZhdWx0O1xyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,32 @@
1
+ import { isBrowserShortcut } from './utils';
2
+ import { SHORTCUT_SPLIT_KEY } from './rdt-shortcut.models';
3
+ import { RdtStringUtils } from '@ngrdt/utils';
4
+ export class RdtShortcut {
5
+ hotkeysValue;
6
+ keys;
7
+ label;
8
+ get lastKey() {
9
+ return this.keys[this.keys.length - 1];
10
+ }
11
+ constructor(keys) {
12
+ this.keys = keys;
13
+ this.hotkeysValue = RdtShortcut.joinKeys(keys);
14
+ this.label = RdtShortcut.makeLabel(keys);
15
+ }
16
+ static joinKeys(keys) {
17
+ return keys.join(SHORTCUT_SPLIT_KEY);
18
+ }
19
+ static makeLabel(keys) {
20
+ return keys.map(RdtStringUtils.capitalize).join('+');
21
+ }
22
+ static create(...keys) {
23
+ if (isBrowserShortcut(keys)) {
24
+ throw new Error(`Shortcut ${RdtShortcut.joinKeys(keys)} is a browser shortcut!`);
25
+ }
26
+ return new RdtShortcut(keys);
27
+ }
28
+ static createUnsafe(...keys) {
29
+ return new RdtShortcut(keys);
30
+ }
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXNob3J0Y3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vQG5ncmR0L3Nob3J0Y3V0cy9zcmMvbGliL3Nob3J0Y3V0cy9yZHQtc2hvcnRjdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUMsTUFBTSxPQUFPLFdBQVc7SUFDYixZQUFZLENBQVM7SUFDckIsSUFBSSxDQUFXO0lBQ2YsS0FBSyxDQUFTO0lBRXZCLElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsWUFBb0IsSUFBYztRQUNoQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQWM7UUFDcEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBYztRQUNyQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQWM7UUFDN0IsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ2IsWUFBWSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FDaEUsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBYztRQUNuQyxPQUFPLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQnJvd3NlclNob3J0Y3V0IH0gZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCB7IFNIT1JUQ1VUX1NQTElUX0tFWSB9IGZyb20gJy4vcmR0LXNob3J0Y3V0Lm1vZGVscyc7XHJcbmltcG9ydCB7IFJkdFN0cmluZ1V0aWxzIH0gZnJvbSAnQG5ncmR0L3V0aWxzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBSZHRTaG9ydGN1dCB7XHJcbiAgcmVhZG9ubHkgaG90a2V5c1ZhbHVlOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkga2V5czogc3RyaW5nW107XHJcbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcclxuXHJcbiAgZ2V0IGxhc3RLZXkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5rZXlzW3RoaXMua2V5cy5sZW5ndGggLSAxXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioa2V5czogc3RyaW5nW10pIHtcclxuICAgIHRoaXMua2V5cyA9IGtleXM7XHJcbiAgICB0aGlzLmhvdGtleXNWYWx1ZSA9IFJkdFNob3J0Y3V0LmpvaW5LZXlzKGtleXMpO1xyXG4gICAgdGhpcy5sYWJlbCA9IFJkdFNob3J0Y3V0Lm1ha2VMYWJlbChrZXlzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGpvaW5LZXlzKGtleXM6IHN0cmluZ1tdKSB7XHJcbiAgICByZXR1cm4ga2V5cy5qb2luKFNIT1JUQ1VUX1NQTElUX0tFWSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBtYWtlTGFiZWwoa2V5czogc3RyaW5nW10pIHtcclxuICAgIHJldHVybiBrZXlzLm1hcChSZHRTdHJpbmdVdGlscy5jYXBpdGFsaXplKS5qb2luKCcrJyk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlKC4uLmtleXM6IHN0cmluZ1tdKSB7XHJcbiAgICBpZiAoaXNCcm93c2VyU2hvcnRjdXQoa2V5cykpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgIGBTaG9ydGN1dCAke1JkdFNob3J0Y3V0LmpvaW5LZXlzKGtleXMpfSBpcyBhIGJyb3dzZXIgc2hvcnRjdXQhYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBSZHRTaG9ydGN1dChrZXlzKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGVVbnNhZmUoLi4ua2V5czogc3RyaW5nW10pIHtcclxuICAgIHJldHVybiBuZXcgUmR0U2hvcnRjdXQoa2V5cyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,13 @@
1
+ export const SHORTCUT_SPLIT_KEY = ':';
2
+ // Fn key on Thinkpad is emitted as event.code === 'WakeUp' so F1-12 shortcuts won't work
3
+ export const IGNORED_KEYCODES = ['WakeUp'];
4
+ export var ShortcutSrcElement;
5
+ (function (ShortcutSrcElement) {
6
+ ShortcutSrcElement["INPUT"] = "input";
7
+ ShortcutSrcElement["OTHER"] = "other";
8
+ })(ShortcutSrcElement || (ShortcutSrcElement = {}));
9
+ export const DEFAULT_SHORTCUT_CONFIG = {
10
+ preventDefault: true,
11
+ element: undefined,
12
+ };
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXNob3J0Y3V0Lm1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL0BuZ3JkdC9zaG9ydGN1dHMvc3JjL2xpYi9zaG9ydGN1dHMvcmR0LXNob3J0Y3V0Lm1vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFFdEMseUZBQXlGO0FBQ3pGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFM0MsTUFBTSxDQUFOLElBQVksa0JBR1g7QUFIRCxXQUFZLGtCQUFrQjtJQUM1QixxQ0FBZSxDQUFBO0lBQ2YscUNBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUc3QjtBQWFELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFzQjtJQUN4RCxjQUFjLEVBQUUsSUFBSTtJQUNwQixPQUFPLEVBQUUsU0FBUztDQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmR0U2hvcnRjdXQgfSBmcm9tICcuL3JkdC1zaG9ydGN1dCc7XHJcblxyXG5leHBvcnQgY29uc3QgU0hPUlRDVVRfU1BMSVRfS0VZID0gJzonO1xyXG5cclxuLy8gRm4ga2V5IG9uIFRoaW5rcGFkIGlzIGVtaXR0ZWQgYXMgZXZlbnQuY29kZSA9PT0gJ1dha2VVcCcgc28gRjEtMTIgc2hvcnRjdXRzIHdvbid0IHdvcmtcclxuZXhwb3J0IGNvbnN0IElHTk9SRURfS0VZQ09ERVMgPSBbJ1dha2VVcCddO1xyXG5cclxuZXhwb3J0IGVudW0gU2hvcnRjdXRTcmNFbGVtZW50IHtcclxuICBJTlBVVCA9ICdpbnB1dCcsXHJcbiAgT1RIRVIgPSAnb3RoZXInLFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJkdFNob3J0Y3V0RXZlbnQge1xyXG4gIHNob3J0Y3V0OiBSZHRTaG9ydGN1dDtcclxuICBzcmM6IFNob3J0Y3V0U3JjRWxlbWVudDtcclxuICBvcmlnaW5hbEV2ZW50OiBLZXlib2FyZEV2ZW50O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJkdFNob3J0Y3V0Q29uZmlnIHtcclxuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XHJcbiAgZWxlbWVudD86IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9TSE9SVENVVF9DT05GSUc6IFJkdFNob3J0Y3V0Q29uZmlnID0ge1xyXG4gIHByZXZlbnREZWZhdWx0OiB0cnVlLFxyXG4gIGVsZW1lbnQ6IHVuZGVmaW5lZCxcclxufTtcclxuIl19
@@ -0,0 +1,19 @@
1
+ // https://support.google.com/chrome/answer/157179
2
+ import { SHORTCUT_SPLIT_KEY } from './rdt-shortcut.models';
3
+ import { WINDOWS_BROWSER_SHORCUTS } from './windows-browser-shortcuts';
4
+ function sortAndBuildShortcut(shortcut) {
5
+ const cpy = [...shortcut];
6
+ cpy.sort();
7
+ return shortcut.join(SHORTCUT_SPLIT_KEY);
8
+ }
9
+ function buildShortcutSet(shortcuts) {
10
+ const set = new Set();
11
+ shortcuts.forEach((s) => set.add(sortAndBuildShortcut(s)));
12
+ return set;
13
+ }
14
+ const BROWSER_SHORTCUT_SET = buildShortcutSet(WINDOWS_BROWSER_SHORCUTS);
15
+ export function isBrowserShortcut(keys) {
16
+ const sorted = sortAndBuildShortcut(keys);
17
+ return BROWSER_SHORTCUT_SET.has(sorted);
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvc2hvcnRjdXRzL3NyYy9saWIvc2hvcnRjdXRzL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUFrRDtBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV2RSxTQUFTLG9CQUFvQixDQUFDLFFBQWtCO0lBQzlDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztJQUMxQixHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDWCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxTQUFxQjtJQUM3QyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzlCLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sb0JBQW9CLEdBQUcsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUV4RSxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBYztJQUM5QyxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxPQUFPLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vY2hyb21lL2Fuc3dlci8xNTcxNzlcclxuaW1wb3J0IHsgU0hPUlRDVVRfU1BMSVRfS0VZIH0gZnJvbSAnLi9yZHQtc2hvcnRjdXQubW9kZWxzJztcclxuaW1wb3J0IHsgV0lORE9XU19CUk9XU0VSX1NIT1JDVVRTIH0gZnJvbSAnLi93aW5kb3dzLWJyb3dzZXItc2hvcnRjdXRzJztcclxuXHJcbmZ1bmN0aW9uIHNvcnRBbmRCdWlsZFNob3J0Y3V0KHNob3J0Y3V0OiBzdHJpbmdbXSkge1xyXG4gIGNvbnN0IGNweSA9IFsuLi5zaG9ydGN1dF07XHJcbiAgY3B5LnNvcnQoKTtcclxuICByZXR1cm4gc2hvcnRjdXQuam9pbihTSE9SVENVVF9TUExJVF9LRVkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZFNob3J0Y3V0U2V0KHNob3J0Y3V0czogc3RyaW5nW11bXSkge1xyXG4gIGNvbnN0IHNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gIHNob3J0Y3V0cy5mb3JFYWNoKChzKSA9PiBzZXQuYWRkKHNvcnRBbmRCdWlsZFNob3J0Y3V0KHMpKSk7XHJcbiAgcmV0dXJuIHNldDtcclxufVxyXG5cclxuY29uc3QgQlJPV1NFUl9TSE9SVENVVF9TRVQgPSBidWlsZFNob3J0Y3V0U2V0KFdJTkRPV1NfQlJPV1NFUl9TSE9SQ1VUUyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2VyU2hvcnRjdXQoa2V5czogc3RyaW5nW10pIHtcclxuICBjb25zdCBzb3J0ZWQgPSBzb3J0QW5kQnVpbGRTaG9ydGN1dChrZXlzKTtcclxuICByZXR1cm4gQlJPV1NFUl9TSE9SVENVVF9TRVQuaGFzKHNvcnRlZCk7XHJcbn1cclxuIl19
@@ -0,0 +1,79 @@
1
+ export const WINDOWS_BROWSER_SHORCUTS = [
2
+ ['ctrl', 'n'],
3
+ ['ctrl', 'shift', 'n'],
4
+ ['ctrl', 't'],
5
+ ['ctrl', 'shift', 't'],
6
+ ['ctrl', 'tab'],
7
+ ['ctrl', 'pagedown'],
8
+ ['ctrl', 'shift', 'tab'],
9
+ ['ctrl', 'pageup'],
10
+ ...[...Array(9).keys()].map(num => ['ctrl', String(num + 1)]), // ctrl + 1-9
11
+ ['alt', 'home'],
12
+ ['alt', 'left'],
13
+ ['alt', 'right'],
14
+ ['ctrl', 'w'],
15
+ ['ctrl', 'f4'],
16
+ ['ctrl', 'shift', 'w'],
17
+ ['alt', 'f4'],
18
+ ['alt', 'space', 'n'],
19
+ ['alt', 'space', 'x'],
20
+ ['alt', 'f', 'x'],
21
+ ['ctrl', 'shift', 'pageup'],
22
+ ['ctrl', 'shift', 'pagedown'],
23
+ ['alt', 'f'],
24
+ ['alt', 'e'],
25
+ ['ctrl', 'shift', 'b'],
26
+ ['ctrl', 'shift', 'o'],
27
+ ['ctrl', 'h'],
28
+ ['ctrl', 'j'],
29
+ ['shift', 'esc'],
30
+ ['shift', 'alt', 't'],
31
+ ['f10'],
32
+ ['f6'],
33
+ ['ctrl', 'f'],
34
+ ['f3'],
35
+ ['ctrl', 'g'],
36
+ ['ctrl', 'shift', 'g'],
37
+ ['ctrl', 'shift', 'j'],
38
+ ['f12'],
39
+ ['ctrl', 'shift', 'del'],
40
+ ['f1'],
41
+ ['ctrl', 'shift', 'm'],
42
+ ['alt', 'shift', 'i'],
43
+ ['f7'],
44
+ ['ctrl', 'f6'],
45
+ ['alt', 'shift', 'a'],
46
+ ['ctrl', 'l'],
47
+ ['alt', 'd'],
48
+ ['f6'],
49
+ ['ctrl', 'k'],
50
+ ['ctrl', 'e'],
51
+ ['ctrl', 'p'],
52
+ ['ctrl', 's'],
53
+ ['f5'],
54
+ ['ctrl', 'r'],
55
+ ['shift', 'f5'],
56
+ ['ctrl', 'shift', 'r'],
57
+ ['esc'],
58
+ ['tab'],
59
+ ['shift', 'tab'],
60
+ ['ctrl', 'o'],
61
+ ['ctrl', 'u'],
62
+ ['ctrl', 'd'],
63
+ ['ctrl', 'shift', 'd'],
64
+ ['f11'],
65
+ ['ctrl', '+'],
66
+ ['ctrl', '-'],
67
+ ['ctrl', '0'],
68
+ ['space'],
69
+ ['pagedown'],
70
+ ['shift', 'space'],
71
+ ['pageup'],
72
+ ['home'],
73
+ ['end'],
74
+ ['ctrl', 'left'],
75
+ ['ctrl', 'right'],
76
+ ['ctrl', 'backspace'],
77
+ ['alt', 'home'],
78
+ ];
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93cy1icm93c2VyLXNob3J0Y3V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL0BuZ3JkdC9zaG9ydGN1dHMvc3JjL2xpYi9zaG9ydGN1dHMvd2luZG93cy1icm93c2VyLXNob3J0Y3V0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRztJQUN0QyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7SUFDYixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDO0lBQ3RCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztJQUNiLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7SUFDdEIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO0lBQ2YsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO0lBQ3BCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUM7SUFDeEIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWE7SUFDNUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ2YsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ2YsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO0lBQ2hCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztJQUNiLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztJQUNkLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7SUFDdEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO0lBQ2IsQ0FBQyxLQUFLLEVBQUUsT0FB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QUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFdJTkRPV1NfQlJPV1NFUl9TSE9SQ1VUUyA9IFtcclxuICBbJ2N0cmwnLCAnbiddLFxyXG4gIFsnY3RybCcsICdzaGlmdCcsICduJ10sXHJcbiAgWydjdHJsJywgJ3QnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAndCddLFxyXG4gIFsnY3RybCcsICd0YWInXSxcclxuICBbJ2N0cmwnLCAncGFnZWRvd24nXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAndGFiJ10sXHJcbiAgWydjdHJsJywgJ3BhZ2V1cCddLFxyXG4gIC4uLlsuLi5BcnJheSg5KS5rZXlzKCldLm1hcChudW0gPT4gWydjdHJsJywgU3RyaW5nKG51bSArIDEpXSksIC8vIGN0cmwgKyAxLTlcclxuICBbJ2FsdCcsICdob21lJ10sXHJcbiAgWydhbHQnLCAnbGVmdCddLFxyXG4gIFsnYWx0JywgJ3JpZ2h0J10sXHJcbiAgWydjdHJsJywgJ3cnXSxcclxuICBbJ2N0cmwnLCAnZjQnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAndyddLFxyXG4gIFsnYWx0JywgJ2Y0J10sXHJcbiAgWydhbHQnLCAnc3BhY2UnLCAnbiddLFxyXG4gIFsnYWx0JywgJ3NwYWNlJywgJ3gnXSxcclxuICBbJ2FsdCcsICdmJywgJ3gnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAncGFnZXVwJ10sXHJcbiAgWydjdHJsJywgJ3NoaWZ0JywgJ3BhZ2Vkb3duJ10sXHJcbiAgWydhbHQnLCAnZiddLFxyXG4gIFsnYWx0JywgJ2UnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAnYiddLFxyXG4gIFsnY3RybCcsICdzaGlmdCcsICdvJ10sXHJcbiAgWydjdHJsJywgJ2gnXSxcclxuICBbJ2N0cmwnLCAnaiddLFxyXG4gIFsnc2hpZnQnLCAnZXNjJ10sXHJcbiAgWydzaGlmdCcsICdhbHQnLCAndCddLFxyXG4gIFsnZjEwJ10sXHJcbiAgWydmNiddLFxyXG4gIFsnY3RybCcsICdmJ10sXHJcbiAgWydmMyddLFxyXG4gIFsnY3RybCcsICdnJ10sXHJcbiAgWydjdHJsJywgJ3NoaWZ0JywgJ2cnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAnaiddLFxyXG4gIFsnZjEyJ10sXHJcbiAgWydjdHJsJywgJ3NoaWZ0JywgJ2RlbCddLFxyXG4gIFsnZjEnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAnbSddLFxyXG4gIFsnYWx0JywgJ3NoaWZ0JywgJ2knXSxcclxuICBbJ2Y3J10sXHJcbiAgWydjdHJsJywgJ2Y2J10sXHJcbiAgWydhbHQnLCAnc2hpZnQnLCAnYSddLFxyXG4gIFsnY3RybCcsICdsJ10sXHJcbiAgWydhbHQnLCAnZCddLFxyXG4gIFsnZjYnXSxcclxuICBbJ2N0cmwnLCAnayddLFxyXG4gIFsnY3RybCcsICdlJ10sXHJcbiAgWydjdHJsJywgJ3AnXSxcclxuICBbJ2N0cmwnLCAncyddLFxyXG4gIFsnZjUnXSxcclxuICBbJ2N0cmwnLCAnciddLFxyXG4gIFsnc2hpZnQnLCAnZjUnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAnciddLFxyXG4gIFsnZXNjJ10sXHJcbiAgWyd0YWInXSxcclxuICBbJ3NoaWZ0JywgJ3RhYiddLFxyXG4gIFsnY3RybCcsICdvJ10sXHJcbiAgWydjdHJsJywgJ3UnXSxcclxuICBbJ2N0cmwnLCAnZCddLFxyXG4gIFsnY3RybCcsICdzaGlmdCcsICdkJ10sXHJcbiAgWydmMTEnXSxcclxuICBbJ2N0cmwnLCAnKyddLFxyXG4gIFsnY3RybCcsICctJ10sXHJcbiAgWydjdHJsJywgJzAnXSxcclxuICBbJ3NwYWNlJ10sXHJcbiAgWydwYWdlZG93biddLFxyXG4gIFsnc2hpZnQnLCAnc3BhY2UnXSxcclxuICBbJ3BhZ2V1cCddLFxyXG4gIFsnaG9tZSddLFxyXG4gIFsnZW5kJ10sXHJcbiAgWydjdHJsJywgJ2xlZnQnXSxcclxuICBbJ2N0cmwnLCAncmlnaHQnXSxcclxuICBbJ2N0cmwnLCAnYmFja3NwYWNlJ10sXHJcbiAgWydhbHQnLCAnaG9tZSddLFxyXG5dO1xyXG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdyZHQtc2hvcnRjdXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vQG5ncmR0L3Nob3J0Y3V0cy9zcmMvbmdyZHQtc2hvcnRjdXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
@@ -0,0 +1,321 @@
1
+ import { RdtStringUtils } from '@ngrdt/utils';
2
+ import * as i0 from '@angular/core';
3
+ import { Injectable, EventEmitter, Directive, Output, HostListener } from '@angular/core';
4
+ import hotkeys from 'hotkeys-js';
5
+ import { Subject, Observable, filter } from 'rxjs';
6
+
7
+ const SHORTCUT_SPLIT_KEY = ':';
8
+ // Fn key on Thinkpad is emitted as event.code === 'WakeUp' so F1-12 shortcuts won't work
9
+ const IGNORED_KEYCODES = ['WakeUp'];
10
+ var ShortcutSrcElement;
11
+ (function (ShortcutSrcElement) {
12
+ ShortcutSrcElement["INPUT"] = "input";
13
+ ShortcutSrcElement["OTHER"] = "other";
14
+ })(ShortcutSrcElement || (ShortcutSrcElement = {}));
15
+ const DEFAULT_SHORTCUT_CONFIG = {
16
+ preventDefault: true,
17
+ element: undefined,
18
+ };
19
+
20
+ const WINDOWS_BROWSER_SHORCUTS = [
21
+ ['ctrl', 'n'],
22
+ ['ctrl', 'shift', 'n'],
23
+ ['ctrl', 't'],
24
+ ['ctrl', 'shift', 't'],
25
+ ['ctrl', 'tab'],
26
+ ['ctrl', 'pagedown'],
27
+ ['ctrl', 'shift', 'tab'],
28
+ ['ctrl', 'pageup'],
29
+ ...[...Array(9).keys()].map(num => ['ctrl', String(num + 1)]), // ctrl + 1-9
30
+ ['alt', 'home'],
31
+ ['alt', 'left'],
32
+ ['alt', 'right'],
33
+ ['ctrl', 'w'],
34
+ ['ctrl', 'f4'],
35
+ ['ctrl', 'shift', 'w'],
36
+ ['alt', 'f4'],
37
+ ['alt', 'space', 'n'],
38
+ ['alt', 'space', 'x'],
39
+ ['alt', 'f', 'x'],
40
+ ['ctrl', 'shift', 'pageup'],
41
+ ['ctrl', 'shift', 'pagedown'],
42
+ ['alt', 'f'],
43
+ ['alt', 'e'],
44
+ ['ctrl', 'shift', 'b'],
45
+ ['ctrl', 'shift', 'o'],
46
+ ['ctrl', 'h'],
47
+ ['ctrl', 'j'],
48
+ ['shift', 'esc'],
49
+ ['shift', 'alt', 't'],
50
+ ['f10'],
51
+ ['f6'],
52
+ ['ctrl', 'f'],
53
+ ['f3'],
54
+ ['ctrl', 'g'],
55
+ ['ctrl', 'shift', 'g'],
56
+ ['ctrl', 'shift', 'j'],
57
+ ['f12'],
58
+ ['ctrl', 'shift', 'del'],
59
+ ['f1'],
60
+ ['ctrl', 'shift', 'm'],
61
+ ['alt', 'shift', 'i'],
62
+ ['f7'],
63
+ ['ctrl', 'f6'],
64
+ ['alt', 'shift', 'a'],
65
+ ['ctrl', 'l'],
66
+ ['alt', 'd'],
67
+ ['f6'],
68
+ ['ctrl', 'k'],
69
+ ['ctrl', 'e'],
70
+ ['ctrl', 'p'],
71
+ ['ctrl', 's'],
72
+ ['f5'],
73
+ ['ctrl', 'r'],
74
+ ['shift', 'f5'],
75
+ ['ctrl', 'shift', 'r'],
76
+ ['esc'],
77
+ ['tab'],
78
+ ['shift', 'tab'],
79
+ ['ctrl', 'o'],
80
+ ['ctrl', 'u'],
81
+ ['ctrl', 'd'],
82
+ ['ctrl', 'shift', 'd'],
83
+ ['f11'],
84
+ ['ctrl', '+'],
85
+ ['ctrl', '-'],
86
+ ['ctrl', '0'],
87
+ ['space'],
88
+ ['pagedown'],
89
+ ['shift', 'space'],
90
+ ['pageup'],
91
+ ['home'],
92
+ ['end'],
93
+ ['ctrl', 'left'],
94
+ ['ctrl', 'right'],
95
+ ['ctrl', 'backspace'],
96
+ ['alt', 'home'],
97
+ ];
98
+
99
+ // https://support.google.com/chrome/answer/157179
100
+ function sortAndBuildShortcut(shortcut) {
101
+ const cpy = [...shortcut];
102
+ cpy.sort();
103
+ return shortcut.join(SHORTCUT_SPLIT_KEY);
104
+ }
105
+ function buildShortcutSet(shortcuts) {
106
+ const set = new Set();
107
+ shortcuts.forEach((s) => set.add(sortAndBuildShortcut(s)));
108
+ return set;
109
+ }
110
+ const BROWSER_SHORTCUT_SET = buildShortcutSet(WINDOWS_BROWSER_SHORCUTS);
111
+ function isBrowserShortcut(keys) {
112
+ const sorted = sortAndBuildShortcut(keys);
113
+ return BROWSER_SHORTCUT_SET.has(sorted);
114
+ }
115
+
116
+ class RdtShortcut {
117
+ hotkeysValue;
118
+ keys;
119
+ label;
120
+ get lastKey() {
121
+ return this.keys[this.keys.length - 1];
122
+ }
123
+ constructor(keys) {
124
+ this.keys = keys;
125
+ this.hotkeysValue = RdtShortcut.joinKeys(keys);
126
+ this.label = RdtShortcut.makeLabel(keys);
127
+ }
128
+ static joinKeys(keys) {
129
+ return keys.join(SHORTCUT_SPLIT_KEY);
130
+ }
131
+ static makeLabel(keys) {
132
+ return keys.map(RdtStringUtils.capitalize).join('+');
133
+ }
134
+ static create(...keys) {
135
+ if (isBrowserShortcut(keys)) {
136
+ throw new Error(`Shortcut ${RdtShortcut.joinKeys(keys)} is a browser shortcut!`);
137
+ }
138
+ return new RdtShortcut(keys);
139
+ }
140
+ static createUnsafe(...keys) {
141
+ return new RdtShortcut(keys);
142
+ }
143
+ }
144
+
145
+ class RdtShortcutService {
146
+ bound = new Map();
147
+ subject$ = new Subject();
148
+ observable$ = this.subject$.asObservable();
149
+ constructor() {
150
+ // Enables hotkeys on input elements
151
+ // Enables hotkeys on input elements
152
+ hotkeys.filter = function (event) {
153
+ if (IGNORED_KEYCODES.includes(event.code)) {
154
+ return false;
155
+ }
156
+ const tagName = event.target.tagName;
157
+ const isInputEl = /^(INPUT|TEXTAREA|SELECT)$/.test(tagName);
158
+ const scope = isInputEl
159
+ ? ShortcutSrcElement.INPUT
160
+ : ShortcutSrcElement.OTHER;
161
+ hotkeys.setScope(scope);
162
+ return true;
163
+ };
164
+ }
165
+ listen(shortcut, config) {
166
+ const patchedConfig = {
167
+ ...DEFAULT_SHORTCUT_CONFIG,
168
+ ...config,
169
+ };
170
+ if (Array.isArray(shortcut)) {
171
+ return this.listenArray(shortcut, patchedConfig);
172
+ }
173
+ else {
174
+ return this.listenSingle(shortcut, patchedConfig);
175
+ }
176
+ }
177
+ listenArray(shortcuts, config) {
178
+ return new Observable((subscriber) => {
179
+ const set = new Set(shortcuts);
180
+ try {
181
+ shortcuts.forEach((s) => this.bind(s, config));
182
+ }
183
+ catch (ex) {
184
+ subscriber.error(ex);
185
+ }
186
+ const sub = this.observable$
187
+ .pipe(filter((evt) => set.has(evt.shortcut)))
188
+ .subscribe(subscriber);
189
+ return () => {
190
+ sub.unsubscribe();
191
+ shortcuts.forEach((s) => this.unbind(s, config));
192
+ };
193
+ });
194
+ }
195
+ listenSingle(shortcut, config) {
196
+ return new Observable((subscriber) => {
197
+ try {
198
+ this.bind(shortcut, config);
199
+ }
200
+ catch (ex) {
201
+ subscriber.error(ex);
202
+ }
203
+ const sub = this.observable$
204
+ .pipe(filter((evt) => evt.shortcut === shortcut))
205
+ .subscribe(subscriber);
206
+ return () => {
207
+ sub.unsubscribe();
208
+ this.unbind(shortcut, config);
209
+ };
210
+ });
211
+ }
212
+ bind(shortcut, config) {
213
+ const options = {
214
+ element: config.element,
215
+ splitKey: SHORTCUT_SPLIT_KEY,
216
+ };
217
+ if (this.bound.get(config.element)?.[shortcut.hotkeysValue]) {
218
+ throw new Error(`Shortcut ${shortcut} is already binded!`);
219
+ }
220
+ if (!this.bound.has(config.element)) {
221
+ const newObj = {
222
+ [shortcut.hotkeysValue]: shortcut,
223
+ };
224
+ this.bound.set(config.element, newObj);
225
+ }
226
+ else {
227
+ this.bound.get(config.element)[shortcut.hotkeysValue] = shortcut;
228
+ }
229
+ hotkeys(shortcut.hotkeysValue, options, this.keyHandlerFactory(config));
230
+ }
231
+ unbind(shortcut, config) {
232
+ const obj = this.bound.get(config.element);
233
+ if (obj?.[shortcut.hotkeysValue]) {
234
+ obj[shortcut.hotkeysValue] = undefined;
235
+ if (Object.keys(obj).every((key) => obj[key] === undefined)) {
236
+ this.bound.delete(config.element);
237
+ }
238
+ hotkeys.unbind(shortcut.hotkeysValue);
239
+ }
240
+ }
241
+ keyHandlerFactory(config) {
242
+ return (keyboardEvent, hotkeysEvent) => {
243
+ if (config.preventDefault) {
244
+ keyboardEvent.preventDefault();
245
+ }
246
+ const evt = {
247
+ shortcut: this.bound.get(config.element)[hotkeysEvent.shortcut],
248
+ src: hotkeysEvent.scope,
249
+ originalEvent: keyboardEvent,
250
+ };
251
+ this.subject$.next(evt);
252
+ return !config.preventDefault;
253
+ };
254
+ }
255
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
256
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, providedIn: 'root' });
257
+ }
258
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, decorators: [{
259
+ type: Injectable,
260
+ args: [{
261
+ providedIn: 'root',
262
+ }]
263
+ }], ctorParameters: () => [] });
264
+
265
+ // Outputs keydown event if only one key was pressed at once
266
+ class RdtKeyListenerDirective {
267
+ keysPressed = new Set();
268
+ pressedAtOnce = new Set();
269
+ output = new EventEmitter();
270
+ onKeyDown(event) {
271
+ if (!this.pressedAtOnce.has(event.key)) {
272
+ this.keysPressed.add(event.key);
273
+ this.pressedAtOnce.add(event.key);
274
+ if (this.pressedAtOnce.size === 1) {
275
+ this.output.emit(event);
276
+ }
277
+ }
278
+ }
279
+ onKeyUp(event) {
280
+ this.keysPressed.delete(event.key);
281
+ this.pressedAtOnce.delete(event.key);
282
+ if (this.keysPressed.size === 0) {
283
+ this.pressedAtOnce.clear();
284
+ }
285
+ }
286
+ onWindowFocus() {
287
+ this.pressedAtOnce.clear();
288
+ this.keysPressed.clear();
289
+ }
290
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtKeyListenerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
291
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: RdtKeyListenerDirective, isStandalone: true, selector: "[rdtKeyListener]", outputs: { output: "rdtKeyListener" }, host: { listeners: { "keydown": "onKeyDown($event)", "window:keyup": "onKeyUp($event)", "keyup": "onKeyUp($event)", "window:focus": "onWindowFocus()" } }, ngImport: i0 });
292
+ }
293
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtKeyListenerDirective, decorators: [{
294
+ type: Directive,
295
+ args: [{
296
+ selector: '[rdtKeyListener]',
297
+ standalone: true,
298
+ }]
299
+ }], propDecorators: { output: [{
300
+ type: Output,
301
+ args: ['rdtKeyListener']
302
+ }], onKeyDown: [{
303
+ type: HostListener,
304
+ args: ['keydown', ['$event']]
305
+ }], onKeyUp: [{
306
+ type: HostListener,
307
+ args: ['window:keyup', ['$event']]
308
+ }, {
309
+ type: HostListener,
310
+ args: ['keyup', ['$event']]
311
+ }], onWindowFocus: [{
312
+ type: HostListener,
313
+ args: ['window:focus']
314
+ }] } });
315
+
316
+ /**
317
+ * Generated bundle index. Do not edit.
318
+ */
319
+
320
+ export { DEFAULT_SHORTCUT_CONFIG, IGNORED_KEYCODES, RdtKeyListenerDirective, RdtShortcut, RdtShortcutService, SHORTCUT_SPLIT_KEY, ShortcutSrcElement };
321
+ //# sourceMappingURL=ngrdt-shortcuts.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngrdt-shortcuts.mjs","sources":["../../../../@ngrdt/shortcuts/src/lib/shortcuts/rdt-shortcut.models.ts","../../../../@ngrdt/shortcuts/src/lib/shortcuts/windows-browser-shortcuts.ts","../../../../@ngrdt/shortcuts/src/lib/shortcuts/utils.ts","../../../../@ngrdt/shortcuts/src/lib/shortcuts/rdt-shortcut.ts","../../../../@ngrdt/shortcuts/src/lib/shortcuts/providers/rdt-shortcut.service.ts","../../../../@ngrdt/shortcuts/src/lib/shortcuts/directives/rdt-key-listener.directive.ts","../../../../@ngrdt/shortcuts/src/ngrdt-shortcuts.ts"],"sourcesContent":["import { RdtShortcut } from './rdt-shortcut';\r\n\r\nexport const SHORTCUT_SPLIT_KEY = ':';\r\n\r\n// Fn key on Thinkpad is emitted as event.code === 'WakeUp' so F1-12 shortcuts won't work\r\nexport const IGNORED_KEYCODES = ['WakeUp'];\r\n\r\nexport enum ShortcutSrcElement {\r\n INPUT = 'input',\r\n OTHER = 'other',\r\n}\r\n\r\nexport interface RdtShortcutEvent {\r\n shortcut: RdtShortcut;\r\n src: ShortcutSrcElement;\r\n originalEvent: KeyboardEvent;\r\n}\r\n\r\nexport interface RdtShortcutConfig {\r\n preventDefault?: boolean;\r\n element?: HTMLElement | undefined;\r\n}\r\n\r\nexport const DEFAULT_SHORTCUT_CONFIG: RdtShortcutConfig = {\r\n preventDefault: true,\r\n element: undefined,\r\n};\r\n","export const WINDOWS_BROWSER_SHORCUTS = [\r\n ['ctrl', 'n'],\r\n ['ctrl', 'shift', 'n'],\r\n ['ctrl', 't'],\r\n ['ctrl', 'shift', 't'],\r\n ['ctrl', 'tab'],\r\n ['ctrl', 'pagedown'],\r\n ['ctrl', 'shift', 'tab'],\r\n ['ctrl', 'pageup'],\r\n ...[...Array(9).keys()].map(num => ['ctrl', String(num + 1)]), // ctrl + 1-9\r\n ['alt', 'home'],\r\n ['alt', 'left'],\r\n ['alt', 'right'],\r\n ['ctrl', 'w'],\r\n ['ctrl', 'f4'],\r\n ['ctrl', 'shift', 'w'],\r\n ['alt', 'f4'],\r\n ['alt', 'space', 'n'],\r\n ['alt', 'space', 'x'],\r\n ['alt', 'f', 'x'],\r\n ['ctrl', 'shift', 'pageup'],\r\n ['ctrl', 'shift', 'pagedown'],\r\n ['alt', 'f'],\r\n ['alt', 'e'],\r\n ['ctrl', 'shift', 'b'],\r\n ['ctrl', 'shift', 'o'],\r\n ['ctrl', 'h'],\r\n ['ctrl', 'j'],\r\n ['shift', 'esc'],\r\n ['shift', 'alt', 't'],\r\n ['f10'],\r\n ['f6'],\r\n ['ctrl', 'f'],\r\n ['f3'],\r\n ['ctrl', 'g'],\r\n ['ctrl', 'shift', 'g'],\r\n ['ctrl', 'shift', 'j'],\r\n ['f12'],\r\n ['ctrl', 'shift', 'del'],\r\n ['f1'],\r\n ['ctrl', 'shift', 'm'],\r\n ['alt', 'shift', 'i'],\r\n ['f7'],\r\n ['ctrl', 'f6'],\r\n ['alt', 'shift', 'a'],\r\n ['ctrl', 'l'],\r\n ['alt', 'd'],\r\n ['f6'],\r\n ['ctrl', 'k'],\r\n ['ctrl', 'e'],\r\n ['ctrl', 'p'],\r\n ['ctrl', 's'],\r\n ['f5'],\r\n ['ctrl', 'r'],\r\n ['shift', 'f5'],\r\n ['ctrl', 'shift', 'r'],\r\n ['esc'],\r\n ['tab'],\r\n ['shift', 'tab'],\r\n ['ctrl', 'o'],\r\n ['ctrl', 'u'],\r\n ['ctrl', 'd'],\r\n ['ctrl', 'shift', 'd'],\r\n ['f11'],\r\n ['ctrl', '+'],\r\n ['ctrl', '-'],\r\n ['ctrl', '0'],\r\n ['space'],\r\n ['pagedown'],\r\n ['shift', 'space'],\r\n ['pageup'],\r\n ['home'],\r\n ['end'],\r\n ['ctrl', 'left'],\r\n ['ctrl', 'right'],\r\n ['ctrl', 'backspace'],\r\n ['alt', 'home'],\r\n];\r\n","// https://support.google.com/chrome/answer/157179\r\nimport { SHORTCUT_SPLIT_KEY } from './rdt-shortcut.models';\r\nimport { WINDOWS_BROWSER_SHORCUTS } from './windows-browser-shortcuts';\r\n\r\nfunction sortAndBuildShortcut(shortcut: string[]) {\r\n const cpy = [...shortcut];\r\n cpy.sort();\r\n return shortcut.join(SHORTCUT_SPLIT_KEY);\r\n}\r\n\r\nfunction buildShortcutSet(shortcuts: string[][]) {\r\n const set = new Set<string>();\r\n shortcuts.forEach((s) => set.add(sortAndBuildShortcut(s)));\r\n return set;\r\n}\r\n\r\nconst BROWSER_SHORTCUT_SET = buildShortcutSet(WINDOWS_BROWSER_SHORCUTS);\r\n\r\nexport function isBrowserShortcut(keys: string[]) {\r\n const sorted = sortAndBuildShortcut(keys);\r\n return BROWSER_SHORTCUT_SET.has(sorted);\r\n}\r\n","import { isBrowserShortcut } from './utils';\r\nimport { SHORTCUT_SPLIT_KEY } from './rdt-shortcut.models';\r\nimport { RdtStringUtils } from '@ngrdt/utils';\r\n\r\nexport class RdtShortcut {\r\n readonly hotkeysValue: string;\r\n readonly keys: string[];\r\n readonly label: string;\r\n\r\n get lastKey() {\r\n return this.keys[this.keys.length - 1];\r\n }\r\n\r\n private constructor(keys: string[]) {\r\n this.keys = keys;\r\n this.hotkeysValue = RdtShortcut.joinKeys(keys);\r\n this.label = RdtShortcut.makeLabel(keys);\r\n }\r\n\r\n private static joinKeys(keys: string[]) {\r\n return keys.join(SHORTCUT_SPLIT_KEY);\r\n }\r\n\r\n private static makeLabel(keys: string[]) {\r\n return keys.map(RdtStringUtils.capitalize).join('+');\r\n }\r\n\r\n static create(...keys: string[]) {\r\n if (isBrowserShortcut(keys)) {\r\n throw new Error(\r\n `Shortcut ${RdtShortcut.joinKeys(keys)} is a browser shortcut!`\r\n );\r\n }\r\n return new RdtShortcut(keys);\r\n }\r\n\r\n static createUnsafe(...keys: string[]) {\r\n return new RdtShortcut(keys);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport hotkeys, { HotkeysEvent, KeyHandler } from 'hotkeys-js';\r\nimport { filter, Observable, Subject } from 'rxjs';\r\nimport { RdtShortcut } from '../rdt-shortcut';\r\nimport {\r\n DEFAULT_SHORTCUT_CONFIG,\r\n RdtShortcutConfig,\r\n IGNORED_KEYCODES,\r\n SHORTCUT_SPLIT_KEY,\r\n RdtShortcutEvent,\r\n ShortcutSrcElement,\r\n} from '../rdt-shortcut.models';\r\n\r\ninterface HotkeysOptions {\r\n scope?: string;\r\n element?: HTMLElement | null;\r\n keyup?: boolean | null;\r\n keydown?: boolean | null;\r\n capture?: boolean;\r\n splitKey?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RdtShortcutService {\r\n private bound: Map<HTMLElement | undefined, Record<string, RdtShortcut>> =\r\n new Map();\r\n private subject$ = new Subject<RdtShortcutEvent>();\r\n private observable$ = this.subject$.asObservable();\r\n\r\n constructor() {\r\n // Enables hotkeys on input elements\r\n // Enables hotkeys on input elements\r\n hotkeys.filter = function (event: KeyboardEvent) {\r\n if (IGNORED_KEYCODES.includes(event.code)) {\r\n return false;\r\n }\r\n const tagName = (event.target as HTMLElement).tagName;\r\n const isInputEl = /^(INPUT|TEXTAREA|SELECT)$/.test(tagName);\r\n const scope = isInputEl\r\n ? ShortcutSrcElement.INPUT\r\n : ShortcutSrcElement.OTHER;\r\n hotkeys.setScope(scope);\r\n return true;\r\n };\r\n }\r\n\r\n listen(shortcut: RdtShortcut | RdtShortcut[], config?: RdtShortcutConfig) {\r\n const patchedConfig = {\r\n ...DEFAULT_SHORTCUT_CONFIG,\r\n ...config,\r\n } as Required<RdtShortcutConfig>;\r\n if (Array.isArray(shortcut)) {\r\n return this.listenArray(shortcut, patchedConfig);\r\n } else {\r\n return this.listenSingle(shortcut, patchedConfig);\r\n }\r\n }\r\n\r\n private listenArray(\r\n shortcuts: RdtShortcut[],\r\n config: Required<RdtShortcutConfig>\r\n ) {\r\n return new Observable<RdtShortcutEvent>((subscriber) => {\r\n const set = new Set(shortcuts);\r\n\r\n try {\r\n shortcuts.forEach((s) => this.bind(s, config));\r\n } catch (ex) {\r\n subscriber.error(ex);\r\n }\r\n\r\n const sub = this.observable$\r\n .pipe(filter((evt) => set.has(evt.shortcut)))\r\n .subscribe(subscriber);\r\n\r\n return () => {\r\n sub.unsubscribe();\r\n shortcuts.forEach((s) => this.unbind(s, config));\r\n };\r\n });\r\n }\r\n\r\n private listenSingle(\r\n shortcut: RdtShortcut,\r\n config: Required<RdtShortcutConfig>\r\n ) {\r\n return new Observable<RdtShortcutEvent>((subscriber) => {\r\n try {\r\n this.bind(shortcut, config);\r\n } catch (ex) {\r\n subscriber.error(ex);\r\n }\r\n\r\n const sub = this.observable$\r\n .pipe(filter((evt) => evt.shortcut === shortcut))\r\n .subscribe(subscriber);\r\n\r\n return () => {\r\n sub.unsubscribe();\r\n this.unbind(shortcut, config);\r\n };\r\n });\r\n }\r\n\r\n private bind(shortcut: RdtShortcut, config: Required<RdtShortcutConfig>) {\r\n const options: HotkeysOptions = {\r\n element: config.element,\r\n splitKey: SHORTCUT_SPLIT_KEY,\r\n };\r\n\r\n if (this.bound.get(config.element)?.[shortcut.hotkeysValue]) {\r\n throw new Error(`Shortcut ${shortcut} is already binded!`);\r\n }\r\n if (!this.bound.has(config.element)) {\r\n const newObj = {\r\n [shortcut.hotkeysValue]: shortcut,\r\n };\r\n this.bound.set(config.element, newObj);\r\n } else {\r\n this.bound.get(config.element)![shortcut.hotkeysValue] = shortcut;\r\n }\r\n\r\n hotkeys(shortcut.hotkeysValue, options, this.keyHandlerFactory(config));\r\n }\r\n\r\n private unbind(shortcut: RdtShortcut, config: RdtShortcutConfig) {\r\n const obj = this.bound.get(config.element);\r\n if (obj?.[shortcut.hotkeysValue]) {\r\n obj[shortcut.hotkeysValue] = undefined as unknown as RdtShortcut;\r\n if (Object.keys(obj).every((key) => obj[key] === undefined)) {\r\n this.bound.delete(config.element);\r\n }\r\n hotkeys.unbind(shortcut.hotkeysValue);\r\n }\r\n }\r\n\r\n private keyHandlerFactory(config: Required<RdtShortcutConfig>): KeyHandler {\r\n return (keyboardEvent: KeyboardEvent, hotkeysEvent: HotkeysEvent) => {\r\n if (config.preventDefault) {\r\n keyboardEvent.preventDefault();\r\n }\r\n const evt: RdtShortcutEvent = {\r\n shortcut: this.bound.get(config.element)![hotkeysEvent.shortcut],\r\n src: hotkeysEvent.scope as ShortcutSrcElement,\r\n originalEvent: keyboardEvent,\r\n };\r\n this.subject$.next(evt);\r\n return !config.preventDefault;\r\n };\r\n }\r\n}\r\n","import { Directive, EventEmitter, HostListener, Output } from '@angular/core';\r\n\r\n// Outputs keydown event if only one key was pressed at once\r\n@Directive({\r\n selector: '[rdtKeyListener]',\r\n standalone: true,\r\n})\r\nexport class RdtKeyListenerDirective {\r\n private keysPressed = new Set<string>();\r\n private pressedAtOnce = new Set<string>();\r\n\r\n @Output('rdtKeyListener')\r\n output = new EventEmitter<KeyboardEvent>();\r\n\r\n @HostListener('keydown', ['$event'])\r\n private onKeyDown(event: KeyboardEvent) {\r\n if (!this.pressedAtOnce.has(event.key)) {\r\n this.keysPressed.add(event.key);\r\n this.pressedAtOnce.add(event.key);\r\n\r\n if (this.pressedAtOnce.size === 1) {\r\n this.output.emit(event);\r\n }\r\n }\r\n }\r\n\r\n @HostListener('window:keyup', ['$event'])\r\n @HostListener('keyup', ['$event'])\r\n private onKeyUp(event: KeyboardEvent) {\r\n this.keysPressed.delete(event.key);\r\n this.pressedAtOnce.delete(event.key);\r\n if (this.keysPressed.size === 0) {\r\n this.pressedAtOnce.clear();\r\n }\r\n }\r\n\r\n @HostListener('window:focus')\r\n private onWindowFocus() {\r\n this.pressedAtOnce.clear();\r\n this.keysPressed.clear();\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from './lib/shortcuts/rdt-shortcut';
2
+ export * from './lib/shortcuts/rdt-shortcut.models';
3
+ export * from './lib/shortcuts/providers/rdt-shortcut.service';
4
+ export * from './lib/shortcuts/directives/rdt-key-listener.directive';
@@ -0,0 +1,12 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class RdtKeyListenerDirective {
4
+ private keysPressed;
5
+ private pressedAtOnce;
6
+ output: EventEmitter<KeyboardEvent>;
7
+ private onKeyDown;
8
+ private onKeyUp;
9
+ private onWindowFocus;
10
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdtKeyListenerDirective, never>;
11
+ static ɵdir: i0.ɵɵDirectiveDeclaration<RdtKeyListenerDirective, "[rdtKeyListener]", never, {}, { "output": "rdtKeyListener"; }, never, never, true, never>;
12
+ }
@@ -0,0 +1,18 @@
1
+ import { Observable } from 'rxjs';
2
+ import { RdtShortcut } from '../rdt-shortcut';
3
+ import { RdtShortcutConfig, RdtShortcutEvent } from '../rdt-shortcut.models';
4
+ import * as i0 from "@angular/core";
5
+ export declare class RdtShortcutService {
6
+ private bound;
7
+ private subject$;
8
+ private observable$;
9
+ constructor();
10
+ listen(shortcut: RdtShortcut | RdtShortcut[], config?: RdtShortcutConfig): Observable<RdtShortcutEvent>;
11
+ private listenArray;
12
+ private listenSingle;
13
+ private bind;
14
+ private unbind;
15
+ private keyHandlerFactory;
16
+ static ɵfac: i0.ɵɵFactoryDeclaration<RdtShortcutService, never>;
17
+ static ɵprov: i0.ɵɵInjectableDeclaration<RdtShortcutService>;
18
+ }
@@ -0,0 +1,11 @@
1
+ export declare class RdtShortcut {
2
+ readonly hotkeysValue: string;
3
+ readonly keys: string[];
4
+ readonly label: string;
5
+ get lastKey(): string;
6
+ private constructor();
7
+ private static joinKeys;
8
+ private static makeLabel;
9
+ static create(...keys: string[]): RdtShortcut;
10
+ static createUnsafe(...keys: string[]): RdtShortcut;
11
+ }
@@ -0,0 +1,17 @@
1
+ import { RdtShortcut } from './rdt-shortcut';
2
+ export declare const SHORTCUT_SPLIT_KEY = ":";
3
+ export declare const IGNORED_KEYCODES: string[];
4
+ export declare enum ShortcutSrcElement {
5
+ INPUT = "input",
6
+ OTHER = "other"
7
+ }
8
+ export interface RdtShortcutEvent {
9
+ shortcut: RdtShortcut;
10
+ src: ShortcutSrcElement;
11
+ originalEvent: KeyboardEvent;
12
+ }
13
+ export interface RdtShortcutConfig {
14
+ preventDefault?: boolean;
15
+ element?: HTMLElement | undefined;
16
+ }
17
+ export declare const DEFAULT_SHORTCUT_CONFIG: RdtShortcutConfig;
@@ -0,0 +1 @@
1
+ export declare function isBrowserShortcut(keys: string[]): boolean;
@@ -0,0 +1 @@
1
+ export declare const WINDOWS_BROWSER_SHORCUTS: string[][];
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@ngrdt/shortcuts",
3
+ "version": "0.0.6",
4
+ "peerDependencies": {
5
+ "@angular/common": "^18.2.0",
6
+ "@angular/core": "^18.2.0",
7
+ "hotkeys-js": ">=3.10.0",
8
+ "@ngrdt/utils": ">=0.0.4",
9
+ "rxjs": ">=7.0.0"
10
+ },
11
+ "sideEffects": false,
12
+ "module": "fesm2022/ngrdt-shortcuts.mjs",
13
+ "typings": "index.d.ts",
14
+ "exports": {
15
+ "./package.json": {
16
+ "default": "./package.json"
17
+ },
18
+ ".": {
19
+ "types": "./index.d.ts",
20
+ "esm2022": "./esm2022/ngrdt-shortcuts.mjs",
21
+ "esm": "./esm2022/ngrdt-shortcuts.mjs",
22
+ "default": "./fesm2022/ngrdt-shortcuts.mjs"
23
+ }
24
+ },
25
+ "dependencies": {
26
+ "tslib": "^2.3.0"
27
+ }
28
+ }