UNPKG

@realsee/dnalogel

Version:
385 lines (384 loc) 10.6 kB
const j = typeof navigator != "undefined" ? navigator.userAgent.toLowerCase().indexOf("firefox") > 0 : !1; function A(e, t, s, n) { e.addEventListener ? e.addEventListener(t, s, n) : e.attachEvent && e.attachEvent("on".concat(t), s); } function E(e, t, s, n) { e.removeEventListener ? e.removeEventListener(t, s, n) : e.detachEvent && e.detachEvent("on".concat(t), s); } function B(e, t) { const s = t.slice(0, t.length - 1); for (let n = 0; n < s.length; n++) s[n] = e[s[n].toLowerCase()]; return s; } function D(e) { typeof e != "string" && (e = ""), e = e.replace(/\s/g, ""); const t = e.split(","); let s = t.lastIndexOf(""); for (; s >= 0; ) t[s - 1] += ",", t.splice(s, 1), s = t.lastIndexOf(""); return t; } function H(e, t) { const s = e.length >= t.length ? e : t, n = e.length >= t.length ? t : e; let i = !0; for (let r = 0; r < s.length; r++) n.indexOf(s[r]) === -1 && (i = !1); return i; } const x = { backspace: 8, "⌫": 8, tab: 9, clear: 12, enter: 13, "↩": 13, return: 13, esc: 27, escape: 27, space: 32, left: 37, up: 38, right: 39, down: 40, /// https://w3c.github.io/uievents/#events-keyboard-key-location arrowup: 38, arrowdown: 40, arrowleft: 37, arrowright: 39, del: 46, delete: 46, ins: 45, insert: 45, home: 36, end: 35, pageup: 33, pagedown: 34, capslock: 20, num_0: 96, num_1: 97, num_2: 98, num_3: 99, num_4: 100, num_5: 101, num_6: 102, num_7: 103, num_8: 104, num_9: 105, num_multiply: 106, num_add: 107, num_enter: 108, num_subtract: 109, num_decimal: 110, num_divide: 111, "⇪": 20, ",": 188, ".": 190, "/": 191, "`": 192, "-": j ? 173 : 189, "=": j ? 61 : 187, ";": j ? 59 : 186, "'": 222, "{": 219, "}": 221, "[": 219, "]": 221, "\\": 220 }, y = { // shiftKey "⇧": 16, shift: 16, // altKey "⌥": 18, alt: 18, option: 18, // ctrlKey "⌃": 17, ctrl: 17, control: 17, // metaKey "⌘": 91, cmd: 91, meta: 91, command: 91 }, b = { 16: "shiftKey", 18: "altKey", 17: "ctrlKey", 91: "metaKey", shiftKey: 16, ctrlKey: 17, altKey: 18, metaKey: 91 }, a = { 16: !1, 18: !1, 17: !1, 91: !1 }, c = {}; for (let e = 1; e < 20; e++) x["f".concat(e)] = 111 + e; let f = [], L = null, z = "all"; const w = /* @__PURE__ */ new Map(), O = (e) => x[e.toLowerCase()] || y[e.toLowerCase()] || e.toUpperCase().charCodeAt(0), I = (e) => Object.keys(x).find((t) => x[t] === e), R = (e) => Object.keys(y).find((t) => y[t] === e); function F(e) { z = e || "all"; } function _() { return z || "all"; } function V() { return f.slice(0); } function X() { return f.map((e) => I(e) || R(e) || String.fromCharCode(e)); } function q() { const e = []; return Object.keys(c).forEach((t) => { c[t].forEach((s) => { let { key: n, scope: i, mods: r, shortcut: l } = s; e.push({ scope: i, shortcut: l, mods: r, keys: n.split("+").map((o) => O(o)) }); }); }), e; } function J(e) { const t = e.target || e.srcElement, { tagName: s } = t; let n = !0; const i = s === "INPUT" && !["checkbox", "radio", "range", "button", "file", "reset", "submit", "color"].includes(t.type); return (t.isContentEditable || (i || s === "TEXTAREA" || s === "SELECT") && !t.readOnly) && (n = !1), n; } function Q(e) { return typeof e == "string" && (e = O(e)), f.indexOf(e) !== -1; } function W(e, t) { let s, n; e || (e = _()); for (const i in c) if (Object.prototype.hasOwnProperty.call(c, i)) for (s = c[i], n = 0; n < s.length; ) s[n].scope === e ? s.splice(n, 1).forEach((l) => { let { element: o } = l; return S(o); }) : n++; _() === e && F(t || "all"); } function Y(e) { let t = e.keyCode || e.which || e.charCode; e.key && e.key.toLowerCase() === "capslock" && (t = O(e.key)); const s = f.indexOf(t); if (s >= 0 && f.splice(s, 1), e.key && e.key.toLowerCase() === "meta" && f.splice(0, f.length), (t === 93 || t === 224) && (t = 91), t in a) { a[t] = !1; for (const n in y) y[n] === t && (k[n] = !1); } } function G(e) { if (typeof e == "undefined") Object.keys(c).forEach((i) => { Array.isArray(c[i]) && c[i].forEach((r) => C(r)), delete c[i]; }), S(null); else if (Array.isArray(e)) e.forEach((i) => { i.key && C(i); }); else if (typeof e == "object") e.key && C(e); else if (typeof e == "string") { for (var t = arguments.length, s = new Array(t > 1 ? t - 1 : 0), n = 1; n < t; n++) s[n - 1] = arguments[n]; let [i, r] = s; typeof i == "function" && (r = i, i = ""), C({ key: e, scope: i, method: r, splitKey: "+" }); } } const C = (e) => { let { key: t, scope: s, method: n, splitKey: i = "+" } = e; D(t).forEach((l) => { const o = l.split(i), u = o.length, h = o[u - 1], g = h === "*" ? "*" : O(h); if (!c[g]) return; s || (s = _()); const p = u > 1 ? B(y, o) : [], m = []; c[g] = c[g].filter((d) => { const K = (n ? d.method === n : !0) && d.scope === s && H(d.mods, p); return K && m.push(d.element), !K; }), m.forEach((d) => S(d)); }); }; function T(e, t, s, n) { if (t.element !== n) return; let i; if (t.scope === s || t.scope === "all") { i = t.mods.length > 0; for (const r in a) Object.prototype.hasOwnProperty.call(a, r) && (!a[r] && t.mods.indexOf(+r) > -1 || a[r] && t.mods.indexOf(+r) === -1) && (i = !1); (t.mods.length === 0 && !a[16] && !a[18] && !a[17] && !a[91] || i || t.shortcut === "*") && (t.keys = [], t.keys = t.keys.concat(f), t.method(e, t) === !1 && (e.preventDefault ? e.preventDefault() : e.returnValue = !1, e.stopPropagation && e.stopPropagation(), e.cancelBubble && (e.cancelBubble = !0))); } } function U(e, t) { const s = c["*"]; let n = e.keyCode || e.which || e.charCode; if (e.key && e.key.toLowerCase() === "capslock" || !k.filter.call(this, e)) return; if ((n === 93 || n === 224) && (n = 91), f.indexOf(n) === -1 && n !== 229 && f.push(n), ["metaKey", "ctrlKey", "altKey", "shiftKey"].forEach((o) => { const u = b[o]; e[o] && f.indexOf(u) === -1 ? f.push(u) : !e[o] && f.indexOf(u) > -1 ? f.splice(f.indexOf(u), 1) : o === "metaKey" && e[o] && (f = f.filter((h) => h in b || h === n)); }), n in a) { a[n] = !0; for (const o in y) if (Object.prototype.hasOwnProperty.call(y, o)) { const u = b[y[o]]; k[o] = e[u]; } if (!s) return; } for (const o in a) Object.prototype.hasOwnProperty.call(a, o) && (a[o] = e[b[o]]); e.getModifierState && !(e.altKey && !e.ctrlKey) && e.getModifierState("AltGraph") && (f.indexOf(17) === -1 && f.push(17), f.indexOf(18) === -1 && f.push(18), a[17] = !0, a[18] = !0); const i = _(); if (s) for (let o = 0; o < s.length; o++) s[o].scope === i && (e.type === "keydown" && s[o].keydown || e.type === "keyup" && s[o].keyup) && T(e, s[o], i, t); if (!(n in c)) return; const r = c[n], l = r.length; for (let o = 0; o < l; o++) if ((e.type === "keydown" && r[o].keydown || e.type === "keyup" && r[o].keyup) && r[o].key) { const u = r[o], { splitKey: h } = u, g = u.key.split(h), p = []; for (let m = 0; m < g.length; m++) p.push(O(g[m])); p.sort().join("") === f.sort().join("") && T(e, u, i, t); } } function k(e, t, s) { f = []; const n = D(e); let i = [], r = "all", l = document, o = 0, u = !1, h = !0, g = "+", p = !1, m = !1; for (s === void 0 && typeof t == "function" && (s = t), Object.prototype.toString.call(t) === "[object Object]" && (t.scope && (r = t.scope), t.element && (l = t.element), t.keyup && (u = t.keyup), t.keydown !== void 0 && (h = t.keydown), t.capture !== void 0 && (p = t.capture), typeof t.splitKey == "string" && (g = t.splitKey), t.single === !0 && (m = !0)), typeof t == "string" && (r = t), m && G(e, r); o < n.length; o++) e = n[o].split(g), i = [], e.length > 1 && (i = B(y, e)), e = e[e.length - 1], e = e === "*" ? "*" : O(e), e in c || (c[e] = []), c[e].push({ keyup: u, keydown: h, scope: r, mods: i, shortcut: n[o], method: s, key: n[o], splitKey: g, element: l }); if (typeof l != "undefined" && window) { if (!w.has(l)) { const d = function() { let K = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : window.event; return U(K, l); }, M = function() { let K = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : window.event; U(K, l), Y(K); }; w.set(l, { keydownListener: d, keyupListenr: M, capture: p }), A(l, "keydown", d, p), A(l, "keyup", M, p); } if (!L) { const d = () => { f = []; }; L = { listener: d, capture: p }, A(window, "focus", d, p); } } } function Z(e) { let t = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "all"; Object.keys(c).forEach((s) => { c[s].filter((i) => i.scope === t && i.shortcut === e).forEach((i) => { i && i.method && i.method(); }); }); } function S(e) { const t = Object.values(c).flat(); if (t.findIndex((n) => { let { element: i } = n; return i === e; }) < 0) { const { keydownListener: n, keyupListenr: i, capture: r } = w.get(e) || {}; n && i && (E(e, "keyup", i, r), E(e, "keydown", n, r), w.delete(e)); } if ((t.length <= 0 || w.size <= 0) && (Object.keys(w).forEach((i) => { const { keydownListener: r, keyupListenr: l, capture: o } = w.get(i) || {}; r && l && (E(i, "keyup", l, o), E(i, "keydown", r, o), w.delete(i)); }), w.clear(), Object.keys(c).forEach((i) => delete c[i]), L)) { const { listener: i, capture: r } = L; E(window, "focus", i, r), L = null; } } const P = { getPressedKeyString: X, setScope: F, getScope: _, deleteScope: W, getPressedKeyCodes: V, getAllKeyCodes: q, isPressed: Q, filter: J, trigger: Z, unbind: G, keyMap: x, modifier: y, modifierMap: b }; for (const e in P) Object.prototype.hasOwnProperty.call(P, e) && (k[e] = P[e]); if (typeof window != "undefined") { const e = window.hotkeys; k.noConflict = (t) => (t && window.hotkeys === k && (window.hotkeys = e), k), window.hotkeys = k; } export { k as hotkeys };