From 4a70c0ea083306cb79d0fa325d331ffa4333154a Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Wed, 29 Apr 2026 20:19:34 +0300 Subject: feat: create web PWA frontend --- web/js/keyboard.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 web/js/keyboard.js (limited to 'web/js/keyboard.js') diff --git a/web/js/keyboard.js b/web/js/keyboard.js new file mode 100644 index 0000000..58ba0f3 --- /dev/null +++ b/web/js/keyboard.js @@ -0,0 +1,28 @@ +export function initKeyboard(handlers) { + document.addEventListener('keydown', (e) => { + const tag = e.target.tagName; + const editing = tag === 'INPUT' || tag === 'TEXTAREA' || e.target.isContentEditable; + if (editing) { + if (e.key === 'Escape') { + e.target.blur(); + handlers.escape?.(e); + } + return; + } + switch (e.key) { + case 'ArrowUp': e.preventDefault(); handlers.navUp?.(e); break; + case 'ArrowDown': e.preventDefault(); handlers.navDown?.(e); break; + case 'ArrowLeft': handlers.navLeft?.(e); break; + case 'ArrowRight': handlers.navRight?.(e); break; + case 'Enter': handlers.enter?.(e); break; + case ' ': e.preventDefault(); handlers.playPause?.(e); break; + case 'p': handlers.playPause?.(e); break; + case 'f': handlers.fullscreen?.(e); break; + case 'Escape': handlers.escape?.(e); break; + case 'r': handlers.shuffle?.(e); break; + case 's': handlers.share?.(e); break; + case '/': e.preventDefault(); handlers.search?.(e); break; + case 'n': handlers.notes?.(e); break; + } + }); +} -- cgit v1.2.3