UNPKG

just-hotkeys

Version:

A declarative keyboard shortcut manager for JavaScript and TypeScript - framework agnostic with React support

2 lines (1 loc) 2.4 kB
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b={space:" ",enter:"Enter",return:"Enter",tab:"Tab",esc:"Escape",escape:"Escape",backspace:"Backspace",delete:"Delete",del:"Delete",up:"ArrowUp",down:"ArrowDown",left:"ArrowLeft",right:"ArrowRight",f1:"F1",f2:"F2",f3:"F3",f4:"F4",f5:"F5",f6:"F6",f7:"F7",f8:"F8",f9:"F9",f10:"F10",f11:"F11",f12:"F12",0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9"},g={cmd:"meta",command:"meta",win:"meta",windows:"meta",option:"alt",opt:"alt",control:"ctrl"};function l(r){const t=r.toLowerCase().split("+").map(o=>o.trim()),e={key:"",ctrl:!1,meta:!1,alt:!1,shift:!1};for(const o of t){const a=g[o]||o;switch(a){case"ctrl":e.ctrl=!0;break;case"meta":e.meta=!0;break;case"alt":e.alt=!0;break;case"shift":e.shift=!0;break;default:e.key=b[a]||a.toUpperCase();break}}return e}function u(r,t){const e=r.metaKey,o=r.ctrlKey;if(t.meta!==e||t.ctrl!==o||t.alt!==r.altKey||t.shift!==r.shiftKey)return!1;const a=r.key===" "?" ":r.key;return a.toLowerCase()===t.key.toLowerCase()||a===t.key}function f(r){const t=l(r),e=[];return t.ctrl&&e.push("ctrl"),t.meta&&e.push("cmd"),t.alt&&e.push("alt"),t.shift&&e.push("shift"),e.push(t.key.toLowerCase()),e.join("+")}const w={target:globalThis.document||globalThis,preventDefault:!0,stopPropagation:!1,enableInInputs:!1};function S(r){if(!r||typeof r.tagName!="string")return!1;const t=r,e=t.tagName.toLowerCase();return e==="input"||e==="textarea"||e==="select"||t.contentEditable==="true"}function p(r,t={}){const e=t.target||globalThis.document||globalThis,o={...w,...t,target:e},a=new Map;for(const[s,n]of Object.entries(r)){const c=f(s);a.set(c,{parsed:l(s),callback:n})}function i(s){if(!(!o.enableInInputs&&S(s.target))){for(const[,{parsed:n,callback:c}]of a)if(u(s,n)){o.preventDefault&&s.preventDefault(),o.stopPropagation&&s.stopPropagation(),c(s);break}}}o.target.addEventListener("keydown",i);function m(s){for(const[n,c]of Object.entries(s)){const k=f(n);a.set(k,{parsed:l(n),callback:c})}}function h(s){for(const n of s){const c=f(n);a.delete(c)}}function d(){o.target.removeEventListener("keydown",i),a.clear()}function y(){return Array.from(a.keys())}return{add:m,remove:h,destroy:d,getActiveShortcuts:y}}function F(r,t){return p(r,t).destroy}exports.createShortcuts=p;exports.matchesShortcut=u;exports.normalizeShortcut=f;exports.parseShortcut=l;exports.shortcuts=F;