function createShortcuts() {
const map = new Map();
function parse(combo) {
const parts = combo.toLowerCase().split('+');
return {
key: parts.at(-1),
ctrl: parts.includes('ctrl'),
alt: parts.includes('alt'),
shift: parts.includes('shift'),
meta: parts.includes('meta'),
};
}
function handler(e) {
for (const [combo, fn] of map) {
const p = parse(combo);
if (e.key.toLowerCase() === p.key &&
e.ctrlKey === p.ctrl &&
e.altKey === p.alt &&
e.shiftKey === p.shift &&
e.metaKey === p.meta) {
e.preventDefault();
fn(e);
}
}
}
document.addEventListener('keydown', handler);
return {
on: (combo, fn) => map.set(combo.toLowerCase(), fn),
off: (combo) => map.delete(combo.toLowerCase()),
destroy: () => document.removeEventListener('keydown', handler),
};
}
// Usage
const keys = createShortcuts();
keys.on('ctrl+k', () => document.querySelector('#search').focus());
keys.on('ctrl+shift+p', () => openCommandPalette());
keys.on('escape', () => closeAllModals());
Create a free account and build your private vault. Share publicly whenever you want.