From 70c22ce153e7d401ce841a26133599a8f5e3458e Mon Sep 17 00:00:00 2001
From: Zaki <18zaki18@gmail.com>
Date: Sat, 9 May 2026 21:03:32 +0100
Subject: [PATCH] Change shortcuts: Alt+N for new entry, Alt+T for toggle trash
Ctrl+N and Ctrl+T cannot be intercepted by Chrome (browser-level shortcuts). Replaced with Alt+N and Alt+T which work reliably. Updated keyboard shortcuts help.
---
js/app.js | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/js/app.js b/js/app.js
index 75b9f61..89a3071 100644
--- a/js/app.js
+++ b/js/app.js
@@ -1244,7 +1244,7 @@ function highlightText(text, query) {
function showShortcutsHelp() {
const overlay = document.createElement('div');
overlay.className = 'custom-modal-overlay show';
- overlay.innerHTML = `
⌨️ Keyboard Shortcuts
Ctrl+NNew entryCtrl+ASelect allCtrl+FSearchCtrl+TToggle trashCtrl+LLock vaultCtrl+SSave entryDelDelete selectedEscClose modal / deselect◀ ▶Detail view nav?Show this help
💡 Click any entry to select, Shift+click for range, Ctrl+click to toggle
`;
+ overlay.innerHTML = `⌨️ Keyboard Shortcuts
Alt+NNew entryCtrl+ASelect allCtrl+FSearchAlt+TToggle trashCtrl+LLock vaultCtrl+SSave entryDelDelete selectedEscClose modal / deselect◀ ▶Detail view nav?Show this help
💡 Click any entry to select, Shift+click for range, Ctrl+click to toggle
`;
document.body.appendChild(overlay);
overlay.addEventListener('click', e => { if (e.target === overlay) overlay.remove(); });
}
@@ -1374,7 +1374,6 @@ 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 ====================
-// Prevent browser Ctrl+N/T — use capture on documentElement + fallback on document for reliability
document.addEventListener('keydown', function(e) {
const tag = document.activeElement?.tagName;
const isInput = tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';
@@ -1418,15 +1417,15 @@ document.addEventListener('keydown', function(e) {
return;
}
- // Ctrl+N — New entry (before generic guard to prevent browser new window)
- if (e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey && (e.key === 'n' || e.key === 'N') && !isInput && !document.getElementById('addModal').classList.contains('show') && document.getElementById('authSection').classList.contains('hidden')) {
+ // Alt+N — New entry (Ctrl+N intercepted by browser)
+ if (e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey && (e.key === 'n' || e.key === 'N') && !isInput && !document.getElementById('addModal').classList.contains('show') && document.getElementById('authSection').classList.contains('hidden')) {
e.preventDefault();
openAdd();
return;
}
- // Ctrl+T — Toggle trash (before generic guard to prevent browser new tab)
- if (e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey && (e.key === 't' || e.key === 'T') && !isInput && document.getElementById('authSection').classList.contains('hidden')) {
+ // Alt+T — Toggle trash (Ctrl+T intercepted by browser)
+ if (e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey && (e.key === 't' || e.key === 'T') && !isInput && document.getElementById('authSection').classList.contains('hidden')) {
e.preventDefault();
toggleTrash();
return;