UNPKG

modern-hotkeys

Version:

<p align="center"> <img src="https://img.shields.io/npm/l/modern-hotkeys"> <img src="https://img.shields.io/npm/dt/modern-hotkeys"> <img src="https://img.shields.io/npm/v/modern-hotkeys"> <img src="https://img.shields.io/github/stars/pato12/modern-hotkeys

2 lines (1 loc) 11.3 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const e=Object.freeze({option:"alt",command:"meta",control:"ctrl",capslock:"caps",cmd:"meta","⇧":"shift","⌥":"alt","⌃":"ctrl","⌘":"meta","↩︎":"enter"}),a={caps:1,ctrl:2,meta:3,shift:4,alt:5};function u(u,l="+"){return(u=(u=u.replace(/\s/g,"")).toLowerCase()).split(l).map((a=>e[a]||a)).sort(((e,u)=>{var l,t;const v=null!==(l=a[e])&&void 0!==l?l:-1,o=null!==(t=a[u])&&void 0!==t?t:-1;return v>-1&&o>-1?v-o:v>-1?-1:o>-1?1:e.localeCompare(u)})).join(l)}const l=Object.freeze(["input","textarea","select"]);function t(e){const a=e.target;if(a instanceof HTMLElement){const e=a.tagName.toLowerCase();if(a.isContentEditable||l.includes(e))return!1}return!0}const v={"en-us":{Backspace:{value:"backspace"},Tab:{value:"tab"},NumLock:{value:"NumLock"},Enter:{value:"enter"},ShiftLeft:{value:"shift"},ShiftRight:{value:"shift"},ControlLeft:{value:"ctrl"},AltLeft:{value:"alt"},Escape:{value:"escape"},Space:{value:"space"},ArrowLeft:{value:"left"},ArrowUp:{value:"up"},ArrowRight:{value:"right"},ArrowDown:{value:"down"},Digit0:{value:"0"},Digit1:{value:"1"},Digit2:{value:"2"},Digit3:{value:"3"},Digit4:{value:"4"},Digit5:{value:"5"},Digit6:{value:"6"},Digit7:{value:"7"},Digit8:{value:"8"},Digit9:{value:"9"},Semicolon:{value:";"},Backquote:{value:"`"},Equal:{value:"="},Minus:{value:"-"},KeyA:{value:"a"},KeyB:{value:"b"},KeyC:{value:"c"},KeyD:{value:"d"},KeyE:{value:"e"},KeyF:{value:"f"},KeyG:{value:"g"},KeyH:{value:"h"},KeyI:{value:"i"},KeyJ:{value:"j"},KeyK:{value:"k"},KeyL:{value:"l"},KeyM:{value:"m"},KeyN:{value:"n"},KeyO:{value:"o"},KeyP:{value:"p"},KeyQ:{value:"q"},KeyR:{value:"r"},KeyS:{value:"s"},KeyT:{value:"t"},KeyU:{value:"u"},KeyV:{value:"v"},KeyW:{value:"w"},KeyX:{value:"x"},KeyY:{value:"y"},KeyZ:{value:"z"},MetaLeft:{value:"meta"},MetaRight:{value:"meta"},Numpad0:{value:"0"},Numpad1:{value:"1"},Numpad2:{value:"2"},Numpad3:{value:"3"},Numpad4:{value:"4"},Numpad5:{value:"5"},Numpad6:{value:"6"},Numpad7:{value:"7"},Numpad8:{value:"8"},Numpad9:{value:"9"},F1:{value:"F1"},F2:{value:"F2"},F3:{value:"F3"},F4:{value:"F4"},F5:{value:"F5"},F6:{value:"F6"},F7:{value:"F7"},F8:{value:"F8"},F9:{value:"F9"},F10:{value:"F10"},F11:{value:"F11"},F12:{value:"F12"},F13:{value:"F13"},F14:{value:"F14"},F15:{value:"F15"},F16:{value:"F16"},F17:{value:"F17"},F18:{value:"F18"},F19:{value:"F19"},F20:{value:"F20"},F21:{value:"F21"},F22:{value:"F22"},F23:{value:"F23"},F24:{value:"F24"},F25:{value:"F25"},F26:{value:"F26"},F27:{value:"F27"},F28:{value:"F28"},F29:{value:"F29"},F30:{value:"F30"},F31:{value:"F31"},F32:{value:"F32"},BracketLeft:{value:"["},BracketRight:{value:"]"},Backslash:{value:"\\"},Quote:{value:"'"},Comma:{value:","},Period:{value:"."},Slash:{value:"/"},IntlRo:{value:"/"},OSLeft:{value:"meta"},AltRight:{value:"alt"},IntlBackslash:{value:"\\"},CapsLock:{value:"caps"}},"es-es":{Backspace:{value:"backspace"},Tab:{value:"tab"},NumLock:{value:"NumLock"},Enter:{value:"enter"},ShiftLeft:{value:"shift"},ShiftRight:{value:"shift"},ControlLeft:{value:"ctrl"},AltLeft:{value:"alt"},Escape:{value:"escape"},Space:{value:"space"},ArrowLeft:{value:"left"},ArrowUp:{value:"up"},ArrowRight:{value:"right"},ArrowDown:{value:"down"},Digit0:{value:"0"},Digit1:{value:"1"},Digit2:{value:"2"},Digit3:{value:"3"},Digit4:{value:"4"},Digit5:{value:"5"},Digit6:{value:"6"},Digit7:{value:"7"},Digit8:{value:"8"},Digit9:{value:"9"},Semicolon:{value:"ñ"},Backquote:{value:"<"},Equal:{value:"¡"},Minus:{value:"'"},KeyA:{value:"a"},KeyB:{value:"b"},KeyC:{value:"c"},KeyD:{value:"d"},KeyE:{value:"e"},KeyF:{value:"f"},KeyG:{value:"g"},KeyH:{value:"h"},KeyI:{value:"i"},KeyJ:{value:"j"},KeyK:{value:"k"},KeyL:{value:"l"},KeyM:{value:"m"},KeyN:{value:"n"},KeyO:{value:"o"},KeyP:{value:"p"},KeyQ:{value:"q"},KeyR:{value:"r"},KeyS:{value:"s"},KeyT:{value:"t"},KeyU:{value:"u"},KeyV:{value:"v"},KeyW:{value:"w"},KeyX:{value:"x"},KeyY:{value:"y"},KeyZ:{value:"z"},MetaLeft:{value:"meta"},MetaRight:{value:"meta"},Numpad0:{value:"0"},Numpad1:{value:"1"},Numpad2:{value:"2"},Numpad3:{value:"3"},Numpad4:{value:"4"},Numpad5:{value:"5"},Numpad6:{value:"6"},Numpad7:{value:"7"},Numpad8:{value:"8"},Numpad9:{value:"9"},F1:{value:"F1"},F2:{value:"F2"},F3:{value:"F3"},F4:{value:"F4"},F5:{value:"F5"},F6:{value:"F6"},F7:{value:"F7"},F8:{value:"F8"},F9:{value:"F9"},F10:{value:"F10"},F11:{value:"F11"},F12:{value:"F12"},F13:{value:"F13"},F14:{value:"F14"},F15:{value:"F15"},F16:{value:"F16"},F17:{value:"F17"},F18:{value:"F18"},F19:{value:"F19"},F20:{value:"F20"},F21:{value:"F21"},F22:{value:"F22"},F23:{value:"F23"},F24:{value:"F24"},F25:{value:"F25"},F26:{value:"F26"},F27:{value:"F27"},F28:{value:"F28"},F29:{value:"F29"},F30:{value:"F30"},F31:{value:"F31"},F32:{value:"F32"},BracketLeft:{value:"`"},BracketRight:{value:"+"},Backslash:{value:"ç"},Quote:{value:"´"},Comma:{value:","},Period:{value:"."},Slash:{value:"-"},IntlRo:{value:"/"},OSLeft:{value:"meta"},AltRight:{value:"alt"},IntlBackslash:{value:"ç"},CapsLock:{value:"caps"}},"es-la":{Backspace:{value:"backspace"},Tab:{value:"tab"},NumLock:{value:"NumLock"},Enter:{value:"enter"},ShiftLeft:{value:"shift"},ShiftRight:{value:"shift"},ControlLeft:{value:"ctrl"},AltLeft:{value:"alt"},Escape:{value:"escape"},Space:{value:"space"},ArrowLeft:{value:"left"},ArrowUp:{value:"up"},ArrowRight:{value:"right"},ArrowDown:{value:"down"},Digit0:{value:"0"},Digit1:{value:"1"},Digit2:{value:"2"},Digit3:{value:"3"},Digit4:{value:"4"},Digit5:{value:"5"},Digit6:{value:"6"},Digit7:{value:"7"},Digit8:{value:"8"},Digit9:{value:"9"},Semicolon:{value:"ñ"},Backquote:{value:"|"},Equal:{value:"¿"},Minus:{value:"'"},KeyA:{value:"a"},KeyB:{value:"b"},KeyC:{value:"c"},KeyD:{value:"d"},KeyE:{value:"e"},KeyF:{value:"f"},KeyG:{value:"g"},KeyH:{value:"h"},KeyI:{value:"i"},KeyJ:{value:"j"},KeyK:{value:"k"},KeyL:{value:"l"},KeyM:{value:"m"},KeyN:{value:"n"},KeyO:{value:"o"},KeyP:{value:"p"},KeyQ:{value:"q"},KeyR:{value:"r"},KeyS:{value:"s"},KeyT:{value:"t"},KeyU:{value:"u"},KeyV:{value:"v"},KeyW:{value:"w"},KeyX:{value:"x"},KeyY:{value:"y"},KeyZ:{value:"z"},MetaLeft:{value:"meta"},MetaRight:{value:"meta"},Numpad0:{value:"0"},Numpad1:{value:"1"},Numpad2:{value:"2"},Numpad3:{value:"3"},Numpad4:{value:"4"},Numpad5:{value:"5"},Numpad6:{value:"6"},Numpad7:{value:"7"},Numpad8:{value:"8"},Numpad9:{value:"9"},F1:{value:"F1"},F2:{value:"F2"},F3:{value:"F3"},F4:{value:"F4"},F5:{value:"F5"},F6:{value:"F6"},F7:{value:"F7"},F8:{value:"F8"},F9:{value:"F9"},F10:{value:"F10"},F11:{value:"F11"},F12:{value:"F12"},F13:{value:"F13"},F14:{value:"F14"},F15:{value:"F15"},F16:{value:"F16"},F17:{value:"F17"},F18:{value:"F18"},F19:{value:"F19"},F20:{value:"F20"},F21:{value:"F21"},F22:{value:"F22"},F23:{value:"F23"},F24:{value:"F24"},F25:{value:"F25"},F26:{value:"F26"},F27:{value:"F27"},F28:{value:"F28"},F29:{value:"F29"},F30:{value:"F30"},F31:{value:"F31"},F32:{value:"F32"},BracketLeft:{value:"`"},BracketRight:{value:"+"},Backslash:{value:"ç"},Quote:{value:"´"},Comma:{value:","},Period:{value:"."},Slash:{value:"-"},IntlRo:{value:"/"},OSLeft:{value:"meta"},AltRight:{value:"alt"},IntlBackslash:{value:"<"},CapsLock:{value:"caps"}}};const o="default";function n({element:e,keyboard:a,autoWatchKeys:l=!0,watchCaps:n=!1,autoPreventDefault:r=!0}){const i=function(e){let a=!1;return{setVerbose:function(e){a=e},debug:function(...u){a&&console.debug(`%c[${e}]`,"font-weight:bold;color:white;",...u)}}}("hotkeys"),s=new Set,F=new Map;let c,d=null!=a?a:v["en-us"],y=t,g=o;function p(){if(c)return c;i.debug("Watching keys");const a=[],l=e=>{if(!y(e))return!1;const l=d[e.code];if(!l)return void i.debug("No layout key for",e.code);const t=u(l.value);("caps"!==t||n)&&(s.has("meta")&&a.push(t),"meta"===t&&a.push(...s),s.add(t),f("keydown",e))},t=e=>{if(!y(e))return!1;const l=d[e.code];if(!l)return void i.debug("No layout key for",e.code);f("keyup",e);const t=u(l.value);s.delete(t),"meta"===t&&a.length>0&&(i.debug("Releasing keys after meta key up",a.slice()),a.forEach((e=>s.delete(e))),a.length=0)},v=()=>{s.clear(),i.debug("Cleared keys on window focus")};e.addEventListener("keydown",l),e.addEventListener("keyup",t),window.addEventListener("focus",v);const o=()=>{s.clear(),e.removeEventListener("keydown",l),e.removeEventListener("keyup",t),window.removeEventListener("focus",v),c=void 0};return c=o,o}function f(e,a){var l,t;const v=u([...s].join("+")),o=[...null!==(l=F.get(v))&&void 0!==l?l:[],...null!==(t=F.get("*"))&&void 0!==t?t:[]];i.debug("Triggering handler for key",v+" ("+e+") in scope "+g);for(const u of o){let l=!1;if(u.event===e&&u.scope===g&&(r&&a.preventDefault(),u.action(a,{key:u.key,stopPropagation:()=>l=!0}),i.debug("Triggered handler for key",v+" ("+e+") in scope "+g),l))break}}function K(){F.clear(),i.debug("Unbinded all handlers")}return{hotkeys:function(e,a,t){var v,n,r;const s=function(e,a=","){return function(e,a){const u=e.split(a);let l=u.lastIndexOf("");for(;l>-1;)u[l-1]+=a,u.splice(l,1),l=u.lastIndexOf("");return u}(e=e.replace(/\s/g,""),a)}(Array.isArray(e)?e.join(","):e);let c,d,y=0,g="keydown",f=o;return"string"==typeof a?f=a:"function"==typeof a?c=a:d=a,"function"==typeof t?c=t:"object"==typeof t&&(d=t),f=null!==(v=null==d?void 0:d.scope)&&void 0!==v?v:f,y=null!==(n=null==d?void 0:d.order)&&void 0!==n?n:y,g=null!==(r=null==d?void 0:d.event)&&void 0!==r?r:g,s.forEach((e=>{var a;const l=u(e),t=null!==(a=F.get(l))&&void 0!==a?a:[];if(!c)throw new Error("No action provided");const v={action:c,order:y,event:g,scope:f,key:e};F.set(l,[...t,v].sort(((e,a)=>e.order-a.order))),i.debug("Registered handler for key",l+" in scope "+f+" with order "+y+". Event: "+g)})),l&&p(),{unbind:()=>{s.forEach((e=>{const a=u(e),l=F.get(a);l&&(F.set(a,l.filter((e=>e.action!==c))),i.debug("Unregistered handler for key",a))}))}}},watchKeys:p,unbindAll:K,unbind:function(e,a=o){var l;if(!e)return void K();const t=u(e),v=null!==(l=F.get(t))&&void 0!==l?l:[];F.set(t,v.filter((e=>e.scope!==a))),i.debug("Unbinded handlers for key",t,` in scope ${a}`)},getScope:function(){return g},setScope:function(e){g=e,i.debug("Scope set to",e)},getKeysDown:function(){return s},getKeyboardLayout:function(){return d},setKeyboardLayout:function(e){d=e,i.debug("Keyboard layout set to",e)},setVerbose:function(e){i.setVerbose(e)},setEventFilter:function(e){y=e,i.debug("Event filter changed")},getPressedKeyStrings:function(){return[...s]},trigger:function(e,a=o){var l;const t=u(e),v=null!==(l=F.get(t))&&void 0!==l?l:[];i.debug("Triggering handler for key",t+" in scope "+a);const n=new KeyboardEvent("keydown",{bubbles:!0,cancelable:!0});Object.defineProperty(n,"message",{writable:!1,value:"Event triggered by user"});for(const e of v)e.scope===a&&(e.action(n,{key:e.key,stopPropagation:()=>{}}),i.debug("Triggered handler for key",t+" in scope "+a))},isPressed:function(e){const a=u(e);return s.has(a)}}}const r=n({element:document.body}),i=Object.assign(r.hotkeys,{getScope:r.getScope,setScope:r.setScope,getKeysDown:r.getKeysDown,isPressed:r.isPressed,setKeyboardLayout:r.setKeyboardLayout,getKeyboardLayout:r.getKeyboardLayout,unbind:r.unbind,setEventFilter:r.setEventFilter,setVerbose:r.setVerbose,getPressedKeyStrings:r.getPressedKeyStrings,trigger:r.trigger,unbindAll:r.unbindAll,watchKeys:r.watchKeys});exports.Layouts=v,exports.createHotkeys=n,exports.default=i,exports.hotkeys=i;