UNPKG

keyboard-manager

Version:

Small keyboard shortcut management for DOM-based applications

115 lines 3.06 kB
/** * Source: https://github.com/madrobby/keymaster/blob/3b1f2afabf1569848dea8b697ac418f19b601a30/keymaster.js */ export const KEY_MAP = new Map([ ["option", "alt"], ["ctrl", "control"], ["os", "meta"], ["cmd", "meta"], ["command", "meta"], ["caps", "capslock"], ["return", "enter"], ["esc", "escape"], ["space", " "], ["spacebar", " "], ["left", "arrowleft"], ["up", "arrowup"], ["right", "arrowright"], ["down", "arrowdown"], ["scroll", "scrolllock"], ["del", "delete"], ["apps", "contextmenu"], ]); /** * Continue propagating the event to older listeners. */ export const SHOULD_PROPAGATE = true; /** * Normalize a key value to standard format. */ export function normalizeKey(key) { const value = String(key).toLocaleLowerCase(); return KEY_MAP.get(value) || value; } /** * Stringify a keyboard event. */ export function keyboardEventCombo(e) { const keys = new Set([e.key]); if (e.shiftKey) keys.add("shift"); if (e.ctrlKey) keys.add("control"); if (e.altKey) keys.add("alt"); if (e.metaKey) keys.add("meta"); return stringifyKey(...keys); } /** * Map keys to string. */ export function stringifyKey(...keys) { return keys.map(normalizeKey).sort().join(" "); } /** * Create a listener function from shortcuts. */ export function createShortcuts(shortcuts, returnValue = SHOULD_PROPAGATE) { return (event, combo) => { return shortcuts[combo] ? shortcuts[combo](event, combo) : returnValue; }; } /** * Check if a keyboard event originated from an input. */ export function isInputEvent(event) { const { target } = event; return (!!target && "tagName" in target && (target.tagName === "INPUT" || target.tagName === "SELECT" || target.tagName === "TEXTAREA" || target.isContentEditable)); } /** * Function to wrap listener by filtering input events. */ export function filterInputEvent(listener) { return (event, combo) => { return isInputEvent(event) ? SHOULD_PROPAGATE : listener(event, combo); }; } /** * Keyboard manager library for mapping key events. */ export class Keyboard { constructor() { this.listeners = new Set(); } addListener(callback) { this.listeners.add(callback); } removeListener(callback) { this.listeners.delete(callback); } getHandler() { const listener = this.getListener(); return (event) => { listener(event, keyboardEventCombo(event)); }; } getListener(returnValue = SHOULD_PROPAGATE) { return (event, combo) => { const listeners = Array.from(this.listeners); let length = listeners.length; while (length--) { const result = listeners[length](event, combo); if (result !== SHOULD_PROPAGATE) return; } return returnValue; }; } } //# sourceMappingURL=index.js.map