@ngrdt/shortcuts 0.0.99 → 0.1.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.
@@ -1,321 +1 @@
1
- import { RdtStringUtils } from '@ngrdt/utils';
2
- import * as i0 from '@angular/core';
3
- import { Injectable, EventEmitter, HostListener, Output, Directive } 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: "21.1.2", ngImport: i0, type: RdtShortcutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
256
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: RdtShortcutService, providedIn: 'root' });
257
- }
258
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", 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: "21.1.2", ngImport: i0, type: RdtKeyListenerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
291
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.2", 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: "21.1.2", 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
1
+ import{RdtStringUtils as t}from"@ngrdt/utils";import*as e from"@angular/core";import{Injectable as n,EventEmitter as r,HostListener as s,Output as o,Directive as a}from"@angular/core";import c from"hotkeys-js";import{Subject as i,Observable as l,filter as m}from"rxjs";const d=":",h=["WakeUp"];var p;!function(t){t.INPUT="input",t.OTHER="other"}(p||(p={}));const u={preventDefault:!0,element:void 0},f=[["command","n"],["command","shift","n"],["command","t"],["command","shift","t"],["command","option","right"],["ctrl","tab"],["command","option","left"],["ctrl","shift","tab"],...[...Array(9).keys()].map(t=>["command",String(t+1)]),["command","shift","["],["command","shift","]"],["command","m"],["command","h"],["command","q"],["command","w"],["command","shift","w"],["command","["],["command","]"],["command","shift","b"],["command","option","b"],["command",","],["command","y"],["command","shift","j"],["command","option","l"],["command","shift","del"],["command","f"],["command","g"],["command","shift","g"],["command","e"],["command","option","f"],["command","l"],["command","option","i"],["command","option","j"],["f12"],["command","u"],["command","shift","m"],["command","p"],["command","s"],["command","r"],["command","shift","r"],["esc"],["command","="],["command","-"],["command","0"],["command","ctrl","f"],["space"],["shift","space"],["command","up"],["command","down"],["command","left"],["command","right"],["tab"],["shift","tab"],["command","o"],["command","d"],["command","shift","d"],["command","k"]],y=[["ctrl","n"],["ctrl","shift","n"],["ctrl","t"],["ctrl","shift","t"],["ctrl","tab"],["ctrl","pagedown"],["ctrl","shift","tab"],["ctrl","pageup"],...[...Array(9).keys()].map(t=>["ctrl",String(t+1)]),["alt","home"],["alt","left"],["alt","right"],["ctrl","w"],["ctrl","f4"],["ctrl","shift","w"],["alt","f4"],["alt","space","n"],["alt","space","x"],["alt","f","x"],["ctrl","shift","pageup"],["ctrl","shift","pagedown"],["alt","f"],["alt","e"],["ctrl","shift","b"],["ctrl","shift","o"],["ctrl","h"],["ctrl","j"],["shift","esc"],["shift","alt","t"],["f10"],["f6"],["ctrl","f"],["f3"],["ctrl","g"],["ctrl","shift","g"],["ctrl","shift","j"],["f12"],["ctrl","shift","del"],["f1"],["ctrl","shift","m"],["alt","shift","i"],["f7"],["ctrl","f6"],["alt","shift","a"],["ctrl","l"],["alt","d"],["f6"],["ctrl","k"],["ctrl","e"],["ctrl","p"],["ctrl","s"],["f5"],["ctrl","r"],["shift","f5"],["ctrl","shift","r"],["esc"],["tab"],["shift","tab"],["ctrl","o"],["ctrl","u"],["ctrl","d"],["ctrl","shift","d"],["f11"],["ctrl","+"],["ctrl","-"],["ctrl","0"],["space"],["pagedown"],["shift","space"],["pageup"],["home"],["end"],["ctrl","left"],["ctrl","right"],["ctrl","backspace"],["alt","home"]];function b(t){return[...t].sort(),t.join(d)}const g=function(t){const e=new Set;return t.forEach(t=>e.add(b(t))),e}("undefined"!=typeof navigator&&/Mac/i.test(navigator.platform)?f:y);class k{hotkeysValue;keys;label;get lastKey(){return this.keys[this.keys.length-1]}constructor(t){this.keys=t,this.hotkeysValue=k.joinKeys(t),this.label=k.makeLabel(t)}static joinKeys(t){return t.join(d)}static makeLabel(e){return e.map(t.capitalize).join("+")}static create(...t){if(function(t){const e=b(t);return g.has(e)}(t))throw new Error(`Shortcut ${k.joinKeys(t)} is a browser shortcut!`);return new k(t)}static createUnsafe(...t){return new k(t)}}class w{bound=new Map;subject$=new i;observable$=this.subject$.asObservable();constructor(){c.filter=function(t){if(h.includes(t.code))return!1;const e=t.target.tagName,n=/^(INPUT|TEXTAREA|SELECT)$/.test(e)?p.INPUT:p.OTHER;return c.setScope(n),!0}}listen(t,e){const n={...u,...e};return Array.isArray(t)?this.listenArray(t,n):this.listenSingle(t,n)}listenArray(t,e){return new l(n=>{const r=new Set(t);try{t.forEach(t=>this.bind(t,e))}catch(t){n.error(t)}const s=this.observable$.pipe(m(t=>r.has(t.shortcut))).subscribe(n);return()=>{s.unsubscribe(),t.forEach(t=>this.unbind(t,e))}})}listenSingle(t,e){return new l(n=>{try{this.bind(t,e)}catch(t){n.error(t)}const r=this.observable$.pipe(m(e=>e.shortcut===t)).subscribe(n);return()=>{r.unsubscribe(),this.unbind(t,e)}})}bind(t,e){const n={element:e.element,splitKey:d};if(this.bound.get(e.element)?.[t.hotkeysValue])throw new Error(`Shortcut ${t} is already binded!`);if(this.bound.has(e.element))this.bound.get(e.element)[t.hotkeysValue]=t;else{const n={[t.hotkeysValue]:t};this.bound.set(e.element,n)}c(t.hotkeysValue,n,this.keyHandlerFactory(e))}unbind(t,e){const n=this.bound.get(e.element);n?.[t.hotkeysValue]&&(n[t.hotkeysValue]=void 0,Object.keys(n).every(t=>void 0===n[t])&&this.bound.delete(e.element),c.unbind(t.hotkeysValue))}keyHandlerFactory(t){return(e,n)=>{t.preventDefault&&e.preventDefault();const r={shortcut:this.bound.get(t.element)[n.shortcut],src:n.scope,originalEvent:e};return this.subject$.next(r),!t.preventDefault}}static"ɵfac"=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.2",ngImport:e,type:w,deps:[],target:e.ɵɵFactoryTarget.Injectable});static"ɵprov"=e.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"21.1.2",ngImport:e,type:w,providedIn:"root"})}e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.2",ngImport:e,type:w,decorators:[{type:n,args:[{providedIn:"root"}]}],ctorParameters:()=>[]});class v{keysPressed=new Set;pressedAtOnce=new Set;output=new r;onKeyDown(t){this.pressedAtOnce.has(t.key)||(this.keysPressed.add(t.key),this.pressedAtOnce.add(t.key),1===this.pressedAtOnce.size&&this.output.emit(t))}onKeyUp(t){this.keysPressed.delete(t.key),this.pressedAtOnce.delete(t.key),0===this.keysPressed.size&&this.pressedAtOnce.clear()}onWindowFocus(){this.pressedAtOnce.clear(),this.keysPressed.clear()}static"ɵfac"=e.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"21.1.2",ngImport:e,type:v,deps:[],target:e.ɵɵFactoryTarget.Directive});static"ɵdir"=e.ɵɵngDeclareDirective({minVersion:"14.0.0",version:"21.1.2",type:v,isStandalone:!0,selector:"[rdtKeyListener]",outputs:{output:"rdtKeyListener"},host:{listeners:{keydown:"onKeyDown($event)","window:keyup":"onKeyUp($event)",keyup:"onKeyUp($event)","window:focus":"onWindowFocus()"}},ngImport:e})}e.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"21.1.2",ngImport:e,type:v,decorators:[{type:a,args:[{selector:"[rdtKeyListener]",standalone:!0}]}],propDecorators:{output:[{type:o,args:["rdtKeyListener"]}],onKeyDown:[{type:s,args:["keydown",["$event"]]}],onKeyUp:[{type:s,args:["window:keyup",["$event"]]},{type:s,args:["keyup",["$event"]]}],onWindowFocus:[{type:s,args:["window:focus"]}]}});export{u as DEFAULT_SHORTCUT_CONFIG,h as IGNORED_KEYCODES,v as RdtKeyListenerDirective,k as RdtShortcut,w as RdtShortcutService,d as SHORTCUT_SPLIT_KEY,p as ShortcutSrcElement};
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@ngrdt/shortcuts",
3
- "version": "0.0.99",
3
+ "version": "0.1.1",
4
4
  "peerDependencies": {
5
5
  "@angular/core": ">=21.0.0",
6
6
  "rxjs": ">=7.0.0",
7
7
  "hotkeys-js": ">=3.10.0",
8
- "@ngrdt/router": "^0.0.99"
8
+ "@ngrdt/utils": "^0.1.1"
9
9
  },
10
10
  "sideEffects": false,
11
11
  "module": "fesm2022/ngrdt-shortcuts.mjs",
package/README.md DELETED
@@ -1,7 +0,0 @@
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.
@@ -1 +0,0 @@
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 public 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 public 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 public 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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"}