diff --git a/js/app.js b/js/app.js index 9fa70ce..db16b52 100644 --- a/js/app.js +++ b/js/app.js @@ -1409,19 +1409,30 @@ document.addEventListener('keydown', function(e) { return; } - // Arrow up/down — navigate entries in vault - if ((e.key === 'ArrowUp' || e.key === 'ArrowDown') && !isInput && document.getElementById('authSection').classList.contains('hidden')) { + // Arrow keys — navigate entries in vault + if ((e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') && !isInput && document.getElementById('authSection').classList.contains('hidden')) { e.preventDefault(); const filtered = getFilteredEntries(); if (!filtered.length) return; + const isNext = e.key === 'ArrowDown' || e.key === 'ArrowRight'; let idx = -1; if (selectedIds.size > 0) { const firstId = [...selectedIds][0]; idx = filtered.findIndex(e => e.id == firstId); } - if (e.key === 'ArrowDown') idx = idx < filtered.length - 1 ? idx + 1 : 0; + if (isNext) idx = idx < filtered.length - 1 ? idx + 1 : 0; else idx = idx > 0 ? idx - 1 : filtered.length - 1; - selectedIds.clear(); selectedIds.add(filtered[idx].id); + if (e.shiftKey) { + const anchorId = lastSelectedId !== null ? lastSelectedId : filtered[idx].id; + const anchor = filtered.findIndex(e => e.id == anchorId); + const start = Math.min(anchor, idx), end = Math.max(anchor, idx); + selectedIds.clear(); + for (let i = start; i <= end; i++) selectedIds.add(filtered[i].id); + } else { + selectedIds.clear(); + selectedIds.add(filtered[idx].id); + lastSelectedId = filtered[idx].id; + } updateBatchBar(); render(); playSound('click'); return; }