@gen-epix/ui-core 3.6.1 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,11 @@
1
- declare const MODIFIER_KEYS: readonly ["Accel", "Alt", "AltGraph", "CapsLock", "Control", "Fn", "FnLock", "Hyper", "Meta", "NumLock", "OS", "ScrollLock", "Shift", "Super", "Symbol", "SymbolLock"];
1
+ declare const MODIFIER_KEYS: readonly ["Alt", "AltGraph", "Control", "Meta", "Shift"];
2
2
  type KeyboardModifier = typeof MODIFIER_KEYS[number];
3
3
  type KeyboardShortcutConfig = {
4
4
  callback: (event: KeyboardEvent) => void;
5
5
  code?: string;
6
+ element?: HTMLElement;
6
7
  key?: string;
7
- modifier?: KeyboardModifier[];
8
+ modifiers?: KeyboardModifier[][];
8
9
  };
9
10
  export declare class KeyboardShortcutService {
10
11
  private static __instance;
@@ -12,7 +13,9 @@ export declare class KeyboardShortcutService {
12
13
  private constructor();
13
14
  static getInstance(): KeyboardShortcutService;
14
15
  private static shouldIgnoreShortcut;
15
- registerShortcut({ callback, code, key, modifier }: KeyboardShortcutConfig): () => void;
16
- private handleKeyDown;
16
+ registerShortcut({ callback, code, element, key, modifiers }: KeyboardShortcutConfig): () => void;
17
+ private readonly handleElementKeyDown;
18
+ private readonly handleKeyDown;
19
+ private readonly handleWindowKeyDown;
17
20
  }
18
21
  export {};
@@ -14,60 +14,59 @@ var t = [
14
14
  "option",
15
15
  "optgroup"
16
16
  ], n = [
17
- "Accel",
18
17
  "Alt",
19
18
  "AltGraph",
20
- "CapsLock",
21
19
  "Control",
22
- "Fn",
23
- "FnLock",
24
- "Hyper",
25
20
  "Meta",
26
- "NumLock",
27
- "OS",
28
- "ScrollLock",
29
- "Shift",
30
- "Super",
31
- "Symbol",
32
- "SymbolLock"
21
+ "Shift"
33
22
  ], r = class r {
34
23
  static __instance;
35
24
  configs = [];
36
25
  constructor() {
37
- window.addEventListener("keydown", this.handleKeyDown.bind(this));
26
+ window.addEventListener("keydown", this.handleWindowKeyDown);
38
27
  }
39
28
  static getInstance() {
40
29
  return r.__instance = e.getHmrSingleton("keyboardShortcutService", r.__instance, () => new r()), r.__instance;
41
30
  }
42
- static shouldIgnoreShortcut() {
43
- let e = document.activeElement;
44
- for (; e;) {
45
- if (t.includes(e.tagName.toLowerCase())) return !0;
46
- e = e.parentElement;
31
+ static shouldIgnoreShortcut(e) {
32
+ let n = document.activeElement;
33
+ if (e?.contains(n)) return !1;
34
+ let r = n;
35
+ for (; r;) {
36
+ if (t.includes(r.tagName.toLowerCase())) return !0;
37
+ r = r.parentElement;
47
38
  }
48
39
  return !1;
49
40
  }
50
- registerShortcut({ callback: e, code: t, key: n, modifier: r }) {
51
- let i = {
41
+ registerShortcut({ callback: e, code: t, element: n, key: r, modifiers: i }) {
42
+ let a = {
52
43
  callback: e,
53
44
  code: t,
54
- key: n,
55
- modifier: r
45
+ element: n,
46
+ key: r,
47
+ modifiers: i
56
48
  };
57
- return this.configs.push(i), () => {
58
- this.configs.splice(this.configs.indexOf(i), 1);
49
+ return this.configs.push(a), (n ?? window).addEventListener("keydown", n ? this.handleElementKeyDown : this.handleWindowKeyDown), () => {
50
+ let e = this.configs.indexOf(a);
51
+ e !== -1 && (this.configs.splice(e, 1), this.configs.some((e) => e.element === n) || (n ?? window).removeEventListener("keydown", n ? this.handleElementKeyDown : this.handleWindowKeyDown));
59
52
  };
60
53
  }
61
- handleKeyDown(e) {
62
- for (let t of this.configs) {
63
- let { callback: i, code: a, key: o, modifier: s } = t;
64
- if (!(o && e.key !== o || a && e.code !== a) && (!s?.length || s.some((t) => e.getModifierState(t))) && (s?.length || !n.some((t) => e.getModifierState(t)))) {
65
- if (r.shouldIgnoreShortcut()) return;
66
- i(e);
54
+ handleElementKeyDown = (e) => {
55
+ this.handleKeyDown(e, e.currentTarget);
56
+ };
57
+ handleKeyDown = (e, t) => {
58
+ for (let i of this.configs) {
59
+ let { callback: a, code: o, key: s, modifiers: c } = i;
60
+ if (t === i.element && !(s && e.key !== s || o && e.code !== o) && (c?.length ? c : [[]]).some((t) => n.every((n) => t.includes(n) === e.getModifierState(n)))) {
61
+ if (r.shouldIgnoreShortcut(t)) return;
62
+ a(e);
67
63
  return;
68
64
  }
69
65
  }
70
- }
66
+ };
67
+ handleWindowKeyDown = (e) => {
68
+ this.handleKeyDown(e, void 0);
69
+ };
71
70
  };
72
71
  //#endregion
73
72
  export { r as KeyboardShortcutService };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/classes/services/KeyboardShortcutService/KeyboardShortcutService.ts"],"sourcesContent":["import { HmrUtil } from '../../../utils/HmrUtil';\n\nconst FORM_ELEMENT_TAG_NAMES = [\n 'form',\n 'input',\n 'label',\n 'select',\n 'textarea',\n 'button',\n 'fieldset',\n 'legend',\n 'datalist',\n 'output',\n 'option',\n 'optgroup',\n];\n\nconst MODIFIER_KEYS = [\n 'Accel',\n 'Alt',\n 'AltGraph',\n 'CapsLock',\n 'Control',\n 'Fn',\n 'FnLock',\n 'Hyper',\n 'Meta',\n 'NumLock',\n 'OS',\n 'ScrollLock',\n 'Shift',\n 'Super',\n 'Symbol',\n 'SymbolLock',\n] as const;\n\ntype KeyboardModifier = typeof MODIFIER_KEYS[number];\n\ntype KeyboardShortcutConfig = {\n callback: (event: KeyboardEvent) => void;\n code?: string;\n key?: string;\n modifier?: KeyboardModifier[];\n};\n\nexport class KeyboardShortcutService {\n private static __instance: KeyboardShortcutService;\n\n private readonly configs: KeyboardShortcutConfig[] = [];\n\n private constructor() {\n window.addEventListener('keydown', this.handleKeyDown.bind(this));\n }\n\n public static getInstance(): KeyboardShortcutService {\n KeyboardShortcutService.__instance = HmrUtil.getHmrSingleton('keyboardShortcutService', KeyboardShortcutService.__instance, () => new KeyboardShortcutService());\n return KeyboardShortcutService.__instance;\n }\n\n private static shouldIgnoreShortcut(): boolean {\n let activeElement = document.activeElement as HTMLElement;\n while (activeElement) {\n if (FORM_ELEMENT_TAG_NAMES.includes(activeElement.tagName.toLowerCase())) {\n return true; // ignore all shortcuts when typing in form elements\n }\n activeElement = activeElement.parentElement;\n }\n return false;\n }\n\n public registerShortcut({ callback, code, key, modifier }: KeyboardShortcutConfig): () => void {\n const config: KeyboardShortcutConfig = { callback, code, key, modifier };\n this.configs.push(config);\n\n return () => {\n this.configs.splice(this.configs.indexOf(config), 1);\n };\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n for (const config of this.configs) {\n const { callback, code, key, modifier } = config;\n if ((key && event.key !== key) || (code && event.code !== code)) {\n continue;\n }\n if (modifier?.length && !modifier.some((modifierKey) => event.getModifierState(modifierKey))) {\n continue;\n }\n if (!modifier?.length && MODIFIER_KEYS.some((modifierKey) => event.getModifierState(modifierKey))) {\n continue;\n }\n\n if (KeyboardShortcutService.shouldIgnoreShortcut()) {\n return;\n }\n callback(event);\n return; // only one callback per shortcut\n }\n }\n}\n"],"mappings":";;AAEA,IAAM,IAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAEM,IAAgB;CACpB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAWa,IAAb,MAAa,EAAwB;CACnC,OAAe;CAEf,UAAqD,CAAC;CAEtD,cAAsB;EACpB,OAAO,iBAAiB,WAAW,KAAK,cAAc,KAAK,IAAI,CAAC;CAClE;CAEA,OAAc,cAAuC;EAEnD,OADA,EAAwB,aAAa,EAAQ,gBAAgB,2BAA2B,EAAwB,kBAAkB,IAAI,EAAwB,CAAC,GACxJ,EAAwB;CACjC;CAEA,OAAe,uBAAgC;EAC7C,IAAI,IAAgB,SAAS;EAC7B,OAAO,IAAe;GACpB,IAAI,EAAuB,SAAS,EAAc,QAAQ,YAAY,CAAC,GACrE,OAAO;GAET,IAAgB,EAAc;EAChC;EACA,OAAO;CACT;CAEA,iBAAwB,EAAE,aAAU,SAAM,QAAK,eAAgD;EAC7F,IAAM,IAAiC;GAAE;GAAU;GAAM;GAAK;EAAS;EAGvE,OAFA,KAAK,QAAQ,KAAK,CAAM,SAEX;GACX,KAAK,QAAQ,OAAO,KAAK,QAAQ,QAAQ,CAAM,GAAG,CAAC;EACrD;CACF;CAEA,cAAsB,GAA4B;EAChD,KAAK,IAAM,KAAU,KAAK,SAAS;GACjC,IAAM,EAAE,aAAU,SAAM,QAAK,gBAAa;GACrC,WAAO,EAAM,QAAQ,KAAS,KAAQ,EAAM,SAAS,OAGtD,IAAU,UAAW,EAAS,MAAM,MAAgB,EAAM,iBAAiB,CAAW,CAAC,OAGtF,GAAU,UAAU,GAAc,MAAM,MAAgB,EAAM,iBAAiB,CAAW,CAAC,IAIhG;QAAI,EAAwB,qBAAqB,GAC/C;IAEF,EAAS,CAAK;IACd;GAHE;EAIJ;CACF;AACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/classes/services/KeyboardShortcutService/KeyboardShortcutService.ts"],"sourcesContent":["import { HmrUtil } from '../../../utils/HmrUtil';\n\nconst FORM_ELEMENT_TAG_NAMES = [\n 'form',\n 'input',\n 'label',\n 'select',\n 'textarea',\n 'button',\n 'fieldset',\n 'legend',\n 'datalist',\n 'output',\n 'option',\n 'optgroup',\n];\n\n// Lock keys (CapsLock, NumLock, ...) and browser-specific aliases (Accel, OS, ...) are excluded: they are reported as active in states that are not part of the shortcut.\nconst MODIFIER_KEYS = [\n 'Alt',\n 'AltGraph',\n 'Control',\n 'Meta',\n 'Shift',\n] as const;\n\ntype KeyboardModifier = typeof MODIFIER_KEYS[number];\n\ntype KeyboardShortcutConfig = {\n callback: (event: KeyboardEvent) => void;\n code?: string;\n element?: HTMLElement;\n key?: string;\n modifiers?: KeyboardModifier[][];\n};\n\nexport class KeyboardShortcutService {\n private static __instance: KeyboardShortcutService;\n\n private readonly configs: KeyboardShortcutConfig[] = [];\n\n private constructor() {\n window.addEventListener('keydown', this.handleWindowKeyDown);\n }\n\n public static getInstance(): KeyboardShortcutService {\n KeyboardShortcutService.__instance = HmrUtil.getHmrSingleton('keyboardShortcutService', KeyboardShortcutService.__instance, () => new KeyboardShortcutService());\n return KeyboardShortcutService.__instance;\n }\n\n private static shouldIgnoreShortcut(element?: HTMLElement): boolean {\n const activeElement = document.activeElement as HTMLElement;\n if (element?.contains(activeElement)) {\n return false;\n }\n\n let elementToCheck: HTMLElement | null = activeElement;\n while (elementToCheck) {\n if (FORM_ELEMENT_TAG_NAMES.includes(elementToCheck.tagName.toLowerCase())) {\n return true; // ignore all shortcuts when typing in form elements\n }\n elementToCheck = elementToCheck.parentElement;\n }\n return false;\n }\n\n public registerShortcut({ callback, code, element, key, modifiers }: KeyboardShortcutConfig): () => void {\n const config: KeyboardShortcutConfig = { callback, code, element, key, modifiers };\n this.configs.push(config);\n (element ?? window).addEventListener('keydown', element ? this.handleElementKeyDown : this.handleWindowKeyDown);\n\n return () => {\n const configIndex = this.configs.indexOf(config);\n if (configIndex === -1) {\n return;\n }\n this.configs.splice(configIndex, 1);\n if (!this.configs.some((registeredConfig) => registeredConfig.element === element)) {\n (element ?? window).removeEventListener('keydown', element ? this.handleElementKeyDown : this.handleWindowKeyDown);\n }\n };\n }\n\n private readonly handleElementKeyDown = (event: Event): void => {\n this.handleKeyDown(event as KeyboardEvent, event.currentTarget as HTMLElement);\n };\n\n private readonly handleKeyDown = (event: KeyboardEvent, element: HTMLElement | undefined): void => {\n for (const config of this.configs) {\n const { callback, code, key, modifiers } = config;\n if (element !== config.element) {\n continue;\n }\n if ((key && event.key !== key) || (code && event.code !== code)) {\n continue;\n }\n // Groups are OR-ed; within a group the active modifiers must match exactly. No modifiers means no modifier may be active.\n const modifierGroups = modifiers?.length ? modifiers : [[]];\n const hasMatchingModifierGroup = modifierGroups.some((modifierGroup) => MODIFIER_KEYS.every((modifierKey) => modifierGroup.includes(modifierKey) === event.getModifierState(modifierKey)));\n if (!hasMatchingModifierGroup) {\n continue;\n }\n\n if (KeyboardShortcutService.shouldIgnoreShortcut(element)) {\n return;\n }\n callback(event);\n return; // only one callback per shortcut\n }\n };\n\n private readonly handleWindowKeyDown = (event: Event): void => {\n this.handleKeyDown(event as KeyboardEvent, undefined);\n };\n}\n"],"mappings":";;AAEA,IAAM,IAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAGM,IAAgB;CACpB;CACA;CACA;CACA;CACA;AACF,GAYa,IAAb,MAAa,EAAwB;CACnC,OAAe;CAEf,UAAqD,CAAC;CAEtD,cAAsB;EACpB,OAAO,iBAAiB,WAAW,KAAK,mBAAmB;CAC7D;CAEA,OAAc,cAAuC;EAEnD,OADA,EAAwB,aAAa,EAAQ,gBAAgB,2BAA2B,EAAwB,kBAAkB,IAAI,EAAwB,CAAC,GACxJ,EAAwB;CACjC;CAEA,OAAe,qBAAqB,GAAgC;EAClE,IAAM,IAAgB,SAAS;EAC/B,IAAI,GAAS,SAAS,CAAa,GACjC,OAAO;EAGT,IAAI,IAAqC;EACzC,OAAO,IAAgB;GACrB,IAAI,EAAuB,SAAS,EAAe,QAAQ,YAAY,CAAC,GACtE,OAAO;GAET,IAAiB,EAAe;EAClC;EACA,OAAO;CACT;CAEA,iBAAwB,EAAE,aAAU,SAAM,YAAS,QAAK,gBAAiD;EACvG,IAAM,IAAiC;GAAE;GAAU;GAAM;GAAS;GAAK;EAAU;EAIjF,OAHA,KAAK,QAAQ,KAAK,CAAM,IACvB,KAAW,OAAA,CAAQ,iBAAiB,WAAW,IAAU,KAAK,uBAAuB,KAAK,mBAAmB,SAEjG;GACX,IAAM,IAAc,KAAK,QAAQ,QAAQ,CAAM;GAC3C,MAAgB,OAGpB,KAAK,QAAQ,OAAO,GAAa,CAAC,GAC7B,KAAK,QAAQ,MAAM,MAAqB,EAAiB,YAAY,CAAO,MAC9E,KAAW,OAAA,CAAQ,oBAAoB,WAAW,IAAU,KAAK,uBAAuB,KAAK,mBAAmB;EAErH;CACF;CAEA,wBAAyC,MAAuB;EAC9D,KAAK,cAAc,GAAwB,EAAM,aAA4B;CAC/E;CAEA,iBAAkC,GAAsB,MAA2C;EACjG,KAAK,IAAM,KAAU,KAAK,SAAS;GACjC,IAAM,EAAE,aAAU,SAAM,QAAK,iBAAc;GACvC,UAAY,EAAO,WAGlB,OAAO,EAAM,QAAQ,KAAS,KAAQ,EAAM,SAAS,OAInC,GAAW,SAAS,IAAY,CAAC,CAAC,CAAC,EAAA,CACV,MAAM,MAAkB,EAAc,OAAO,MAAgB,EAAc,SAAS,CAAW,MAAM,EAAM,iBAAiB,CAAW,CAAC,CACnL,GAIL;QAAI,EAAwB,qBAAqB,CAAO,GACtD;IAEF,EAAS,CAAK;IACd;GAHE;EAIJ;CACF;CAEA,uBAAwC,MAAuB;EAC7D,KAAK,cAAc,GAAwB,KAAA,CAAS;CACtD;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gen-epix/ui-core",
3
- "version": "3.6.1",
3
+ "version": "3.8.0",
4
4
  "homepage": "https://github.com/RIVM-bioinformatics/gen-epix",
5
5
  "repository": {
6
6
  "type": "git",