From bfe20d29ecbe7770bb99001fd2d0aa3dc50aaf5b Mon Sep 17 00:00:00 2001 From: Zaki <18zaki18@gmail.com> Date: Sat, 9 May 2026 19:24:36 +0100 Subject: [PATCH] Fix Ctrl+N/T: use window capture phase to intercept before browser chrome document-level keydown bubbling phase is too late for browser-level shortcuts Ctrl+N (new window) and Ctrl+T (new tab). Moved handlers to a window.addEventListener('keydown', ..., true) capture-phase handler that fires before the browser chrome acts. Removed redundant document-level copies. --- js/app.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/js/app.js b/js/app.js index 0d08865..4813702 100644 --- a/js/app.js +++ b/js/app.js @@ -1374,6 +1374,13 @@ document.addEventListener('keypress', e => { if (e.key === 'Enter') { if (docume document.getElementById('genModal').addEventListener('click', e => { if (e.target === e.currentTarget) closeGen(); }); document.getElementById('editModal').addEventListener('click', e => { if (e.target === e.currentTarget) closeEdit(); }); // ==================== KEYBOARD SHORTCUTS ==================== +// Window capture handler for browser-level shortcuts (Ctrl+N/T) that must be intercepted before chrome +window.addEventListener('keydown', function(e) { + if (!e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) return; + const inVault = document.getElementById('authSection').classList.contains('hidden'); + if (e.code === 'KeyN' && inVault) { e.preventDefault(); if (!document.getElementById('addModal').classList.contains('show')) openAdd(); } + if (e.code === 'KeyT' && inVault) { e.preventDefault(); toggleTrash(); } +}, true); document.addEventListener('keydown', function(e) { const tag = document.activeElement?.tagName; const isInput = tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT'; @@ -1433,6 +1440,7 @@ document.addEventListener('keydown', function(e) { // Only handle Ctrl+[key], no Shift/Alt/Meta if (!e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) return; + if (!e.ctrlKey || e.shiftKey || e.altKey || e.metaKey) return; // Prevent browser defaults for ALL our shortcuts BEFORE dispatching const code = e.code;