Theme: neutral dark gray, card shadows, accent-rgb vars. Fix: arrows skip when modals open. Fix: detail view respects folder filter.

Dark theme: neutral dark grays (#0e1015 bg, #6b7280 accent). Light theme: white cards, better contrast. Cards now have subtle shadows for separation. All hardcoded rgba(59,130,246) replaced with rgba(var(--accent-rgb), ...). Arrow key handler skips when add/edit modal is open. Detail view now uses getFilteredEntries() instead of getFilteredEntries(true) to respect folder selection.
This commit is contained in:
2026-05-12 13:51:41 +01:00
parent dfcbc3f568
commit b51e9c3a73
2 changed files with 27 additions and 25 deletions
+23 -21
View File
@@ -1,13 +1,15 @@
:root { :root {
--bg: #0d1117; --bg2: #161b22; --text: #e6edf3; --text2: #8b949e; --bg: #0e1015; --bg2: #161920; --text: #e2e6ea; --text2: #7f8a98;
--accent: #3b82f6; --danger: #ef4444; --success: #22c55e; --warning: #f59e0b; --accent: #6b7280; --accent-rgb: 107,114,128;
--border: rgba(255,255,255,0.08); --card: rgba(28,37,51,0.9); --danger: #ef4444; --success: #22c55e; --warning: #f59e0b;
--input: #0d1117; --vault-bg: rgba(255,255,255,0.035); --border: rgba(255,255,255,0.08); --card: #1a1d26;
--input: #11141a; --vault-bg: rgba(255,255,255,0.04);
} }
.light { .light {
--bg: #f0f2f5; --bg2: #e4e7ec; --text: #1a1f2e; --text2: #5a6475; --bg: #eef0f4; --bg2: #e2e5eb; --text: #161b24; --text2: #5f6a7a;
--accent: #6b7280; --accent-rgb: 107,114,128;
--card: #ffffff; --input: #ffffff; --card: #ffffff; --input: #ffffff;
--border: rgba(0,0,0,0.1); --vault-bg: rgba(255,255,255,0.6); --border: rgba(0,0,0,0.1); --vault-bg: rgba(255,255,255,0.7);
} }
* { margin:0; padding:0; box-sizing:border-box; } * { margin:0; padding:0; box-sizing:border-box; }
@@ -49,7 +51,7 @@ input, select, textarea {
input:focus, select:focus { border-color:var(--accent); } input:focus, select:focus { border-color:var(--accent); }
.btn { .btn {
background:linear-gradient(135deg, #2563eb, #1d4ed8); border:none; color:#fff; background:linear-gradient(135deg, #6b7280, #4b5563); border:none; color:#fff;
font-weight:600; padding:0.65rem 1.3rem; border-radius:2rem; cursor:pointer; font-weight:600; padding:0.65rem 1.3rem; border-radius:2rem; cursor:pointer;
font-size:0.85rem; transition:0.2s; white-space:nowrap; font-size:0.85rem; transition:0.2s; white-space:nowrap;
} }
@@ -119,7 +121,7 @@ input:focus, select:focus { border-color:var(--accent); }
.folder-chip { background:var(--bg2); border:1px solid var(--border); color:var(--text2); padding:0.3rem 0.8rem; border-radius:2rem; cursor:pointer; font-size:0.78rem; transition:0.2s; white-space:nowrap; } .folder-chip { background:var(--bg2); border:1px solid var(--border); color:var(--text2); padding:0.3rem 0.8rem; border-radius:2rem; cursor:pointer; font-size:0.78rem; transition:0.2s; white-space:nowrap; }
.folder-chip:hover { background:var(--chip-color, var(--accent)); color:#fff; border-color:var(--chip-color, var(--accent)); } .folder-chip:hover { background:var(--chip-color, var(--accent)); color:#fff; border-color:var(--chip-color, var(--accent)); }
.folder-chip.active { background:var(--chip-color, var(--accent)); color:#fff; border-color:var(--chip-color, var(--accent)); } .folder-chip.active { background:var(--chip-color, var(--accent)); color:#fff; border-color:var(--chip-color, var(--accent)); }
.folder-chip.drag-over { border-color:var(--accent)!important; box-shadow:0 0 12px rgba(59,130,246,0.5); transform:scale(1.05); } .folder-chip.drag-over { border-color:var(--accent)!important; box-shadow:0 0 12px rgba(var(--accent-rgb),0.5); transform:scale(1.05); }
.pw-display.pw-hover { cursor:pointer; } .pw-display.pw-hover { cursor:pointer; }
.folder-count { background:rgba(0,0,0,0.3); padding:0.1rem 0.4rem; border-radius:1rem; margin-left:0.3rem; font-size:0.7rem; } .folder-count { background:rgba(0,0,0,0.3); padding:0.1rem 0.4rem; border-radius:1rem; margin-left:0.3rem; font-size:0.7rem; }
.folder-delete-btn { background:transparent; border:none; color:var(--danger); cursor:pointer; font-size:0.7rem; margin-left:0.2rem; opacity:0.7; } .folder-delete-btn { background:transparent; border:none; color:var(--danger); cursor:pointer; font-size:0.7rem; margin-left:0.2rem; opacity:0.7; }
@@ -127,6 +129,7 @@ input:focus, select:focus { border-color:var(--accent); }
.folder-add-btn { background:transparent; border:1px dashed #475569; color:var(--text2); padding:0.3rem 0.6rem; border-radius:2rem; cursor:pointer; font-size:0.75rem; transition:0.2s; } .folder-add-btn { background:transparent; border:1px dashed #475569; color:var(--text2); padding:0.3rem 0.6rem; border-radius:2rem; cursor:pointer; font-size:0.75rem; transition:0.2s; }
.folder-add-btn:hover { border-color:var(--accent); color:var(--accent); } .folder-add-btn:hover { border-color:var(--accent); color:var(--accent); }
.light .entry-card, .light .entry-row, .light .entry-compact { box-shadow:0 1px 4px rgba(0,0,0,0.08); }
#addFolderSelect { min-width:110px; max-width:150px; background:var(--input); border:1px solid #2d3748; color:var(--text); padding:0.5rem 0.8rem; border-radius:2rem; font-size:0.8rem; cursor:pointer; } #addFolderSelect { min-width:110px; max-width:150px; background:var(--input); border:1px solid #2d3748; color:var(--text); padding:0.5rem 0.8rem; border-radius:2rem; font-size:0.8rem; cursor:pointer; }
/* Entries */ /* Entries */
@@ -140,23 +143,22 @@ input:focus, select:focus { border-color:var(--accent); }
#entriesContainer.table-view td { padding:0.4rem 0.6rem; font-size:0.8rem; border-bottom:1px solid rgba(255,255,255,0.03); } #entriesContainer.table-view td { padding:0.4rem 0.6rem; font-size:0.8rem; border-bottom:1px solid rgba(255,255,255,0.03); }
.entry-card, .entry-row, .entry-compact, .table-row-drag { cursor:pointer; user-select:none; } .entry-card, .entry-row, .entry-compact, .table-row-drag { cursor:pointer; user-select:none; }
.entry-card.drag-over, .entry-row.drag-over, .entry-compact.drag-over, .table-row-drag.drag-over { border-color:var(--accent)!important; box-shadow:0 0 15px rgba(59,130,246,0.3); } .entry-card.drag-over, .entry-row.drag-over, .entry-compact.drag-over, .table-row-drag.drag-over { border-color:var(--accent)!important; box-shadow:0 0 15px rgba(var(--accent-rgb),0.3); }
.entry-card.drag-dim, .entry-row.drag-dim, .entry-compact.drag-dim, .table-row-drag.drag-dim { opacity:0.3!important; filter:grayscale(0.6); } .entry-card.selected { border-color:var(--accent)!important; box-shadow:0 0 0 2px var(--accent),0 0 18px rgba(var(--accent-rgb),0.35); background:rgba(var(--accent-rgb),0.18); }
.entry-card.selected { border-color:var(--accent)!important; box-shadow:0 0 0 2px var(--accent),0 0 18px rgba(59,130,246,0.35); background:rgba(59,130,246,0.18); } .entry-row.selected, .entry-compact.selected { border-color:var(--accent)!important; box-shadow:0 0 0 2px var(--accent),0 0 18px rgba(var(--accent-rgb),0.35); background:rgba(var(--accent-rgb),0.14); border-left:3px solid var(--accent); }
.entry-row.selected, .entry-compact.selected { border-color:var(--accent)!important; box-shadow:0 0 0 2px var(--accent),0 0 18px rgba(59,130,246,0.35); background:rgba(59,130,246,0.14); border-left:3px solid var(--accent); } .table-row-drag.selected td { background:rgba(var(--accent-rgb),0.14)!important; box-shadow:inset 0 0 0 1px var(--accent); border-bottom:1px solid var(--accent); }
.table-row-drag.selected td { background:rgba(59,130,246,0.14)!important; box-shadow:inset 0 0 0 1px var(--accent); border-bottom:1px solid var(--accent); } .entry-card { background:var(--card); border:1px solid var(--border); border-radius:0.8rem; padding:0.9rem 2.8rem 0.9rem 0.9rem; transition:0.2s; position:relative; word-break:break-word; box-shadow:0 2px 6px rgba(0,0,0,0.2); }
.entry-card { background:var(--card); border:1px solid var(--border); border-radius:0.8rem; padding:0.9rem 2.8rem 0.9rem 0.9rem; transition:0.2s; position:relative; word-break:break-word; } .entry-card:hover { border-color:rgba(255,255,255,0.15); transform:translateY(-2px); box-shadow:0 4px 12px rgba(0,0,0,0.3); }
.entry-card:hover { border-color:var(--accent); transform:translateY(-2px); }
.card-site { font-weight:700; font-size:0.9rem; color:var(--text); margin-bottom:0.2rem; } .card-site { font-weight:700; font-size:0.9rem; color:var(--text); margin-bottom:0.2rem; }
.card-user { color:var(--text2); font-size:0.75rem; margin-bottom:0.3rem; } .card-user { color:var(--text2); font-size:0.75rem; margin-bottom:0.3rem; }
.card-folder { font-size:0.65rem; color:var(--accent); margin-bottom:0.3rem; background:rgba(59,130,246,0.15); display:inline-block; padding:0.1rem 0.5rem; border-radius:1rem; } .card-folder { font-size:0.65rem; color:var(--accent); margin-bottom:0.3rem; background:rgba(var(--accent-rgb),0.15); display:inline-block; padding:0.1rem 0.5rem; border-radius:1rem; }
.card-password { background:var(--bg2); padding:0.3rem 0.5rem; border-radius:0.6rem; display:flex; align-items:center; justify-content:space-between; font-family:monospace; font-size:0.75rem; gap:0.2rem; } .card-password { background:var(--bg2); padding:0.3rem 0.5rem; border-radius:0.6rem; display:flex; align-items:center; justify-content:space-between; font-family:monospace; font-size:0.75rem; gap:0.2rem; }
#entriesContainer.card-view .entry-card { padding:1.2rem 3rem 1.2rem 1.2rem; } #entriesContainer.card-view .entry-card { padding:1.2rem 3rem 1.2rem 1.2rem; }
#entriesContainer.card-view .card-site { font-size:1.05rem; } #entriesContainer.card-view .card-site { font-size:1.05rem; }
#entriesContainer.card-view .card-password { font-size:0.9rem; } #entriesContainer.card-view .card-password { font-size:0.9rem; }
#entriesContainer.card-view .entry-card:hover { transform:translateY(-3px); } #entriesContainer.card-view .entry-card:hover { transform:translateY(-3px); }
.entry-row { background:var(--card); border:1px solid var(--border); border-radius:0.8rem; padding:0.7rem 2.8rem 0.7rem 0.9rem; display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:0.4rem; position:relative; } .entry-row { background:var(--card); border:1px solid var(--border); border-radius:0.8rem; padding:0.7rem 2.8rem 0.7rem 0.9rem; display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:0.4rem; position:relative; box-shadow:0 2px 6px rgba(0,0,0,0.15); }
.entry-compact { display:flex; align-items:center; gap:0.5rem; padding:0.35rem 2.8rem 0.35rem 0.7rem; background:var(--card); border-radius:0.5rem; border:1px solid var(--border); font-size:0.8rem; position:relative; } .entry-compact { display:flex; align-items:center; gap:0.5rem; padding:0.35rem 2.8rem 0.35rem 0.7rem; background:var(--card); border-radius:0.5rem; border:1px solid var(--border); font-size:0.8rem; position:relative; box-shadow:0 1px 4px rgba(0,0,0,0.12); }
.action-btns { position:absolute; top:4px; right:6px; display:flex; gap:4px; z-index:1; } .action-btns { position:absolute; top:4px; right:6px; display:flex; gap:4px; z-index:1; }
.delete-btn { width:20px; height:20px; background:transparent; color:var(--danger); border:none; cursor:pointer; font-size:0.9rem; font-weight:700; display:flex; align-items:center; justify-content:center; } .delete-btn { width:20px; height:20px; background:transparent; color:var(--danger); border:none; cursor:pointer; font-size:0.9rem; font-weight:700; display:flex; align-items:center; justify-content:center; }
.delete-btn:hover { color:#fff; transform:scale(1.2); } .delete-btn:hover { color:#fff; transform:scale(1.2); }
@@ -199,11 +201,11 @@ input:focus, select:focus { border-color:var(--accent); }
.entry-info { display:flex; gap:0.5rem; align-items:center; flex-wrap:wrap; flex:1; } .entry-info { display:flex; gap:0.5rem; align-items:center; flex-wrap:wrap; flex:1; }
.entry-site { font-weight:700; color:var(--text); } .entry-site { font-weight:700; color:var(--text); }
.entry-user { color:var(--text2); } .entry-user { color:var(--text2); }
.entry-folder { font-size:0.7rem; color:var(--accent); background:rgba(59,130,246,0.15); padding:0.1rem 0.5rem; border-radius:1rem; } .entry-folder { font-size:0.7rem; color:var(--accent); background:rgba(var(--accent-rgb),0.15); padding:0.1rem 0.5rem; border-radius:1rem; }
.password-field { display:flex; align-items:center; gap:0.3rem; background:var(--bg2); padding:0.2rem 0.5rem; border-radius:2rem; } .password-field { display:flex; align-items:center; gap:0.3rem; background:var(--bg2); padding:0.2rem 0.5rem; border-radius:2rem; }
.password-text { font-family:monospace; color:var(--text2); font-size:0.8rem; } .password-text { font-family:monospace; color:var(--text2); font-size:0.8rem; }
.icon-btn { background:none; border:1px solid #475569; color:var(--text2); border-radius:2rem; padding:0.2rem 0.5rem; font-size:0.65rem; cursor:pointer; } .icon-btn { background:none; border:1px solid #475569; color:var(--text2); border-radius:2rem; padding:0.2rem 0.5rem; font-size:0.65rem; cursor:pointer; }
.icon-btn:hover { background:#334155; } .icon-btn:hover { background:rgba(var(--accent-rgb),0.2); }
/* Settings Dropdown */ /* Settings Dropdown */
.settings-dropdown { position:relative; display:inline-block; } .settings-dropdown { position:relative; display:inline-block; }
@@ -324,7 +326,7 @@ input:focus, select:focus { border-color:var(--accent); }
#rectSelect { #rectSelect {
position:fixed; pointer-events:none; z-index:999; position:fixed; pointer-events:none; z-index:999;
border:1px solid var(--accent); border:1px solid var(--accent);
background:rgba(59,130,246,0.1); background:rgba(var(--accent-rgb),0.1);
display:none; display:none;
} }
#trashBtn.drag-over { #trashBtn.drag-over {
+4 -4
View File
@@ -721,7 +721,7 @@ function render() {
} else if (view === 'grouped') { } else if (view === 'grouped') {
c.innerHTML = groupedC(getFilteredEntries(true)); c.innerHTML = groupedC(getFilteredEntries(true));
} else if (view === 'detail') { } else if (view === 'detail') {
c.innerHTML = detailC(getFilteredEntries()); c.innerHTML = detailC(getFilteredEntries(view === 'grouped'));
} else { } else {
c.innerHTML = filtered.map(e => { c.innerHTML = filtered.map(e => {
if (view === 'grid' || view === 'card') return gridC(e); if (view === 'grid' || view === 'card') return gridC(e);
@@ -1392,7 +1392,7 @@ document.addEventListener('mouseup', function(e) {
} }
} }
}); });
document.addEventListener('keydown', e => { if (e.key === 'Enter' && !e.ctrlKey && !e.altKey && !e.metaKey) { const a = document.activeElement; if (!a || a.tagName === 'BUTTON') return; e.preventDefault(); if (document.getElementById('editModal').classList.contains('show') && a.closest('#editModal')) saveEdit(); else if (document.getElementById('addModal').classList.contains('show') && a.closest('#addModal')) addEntry(); else if (!document.getElementById('authSection').classList.contains('hidden')) { if (a.id === 'loginUsername' || a.id === 'loginPassword') login(); else if (a.id === 'regPassword') register(); } } }); document.addEventListener('keydown', e => { if (e.key === 'Enter' && !e.ctrlKey && !e.altKey && !e.metaKey) { const a = document.activeElement; if (!a || a.tagName === 'BUTTON') return; e.preventDefault(); if (document.getElementById('editModal').classList.contains('show') && a.closest('.edit-box')) saveEdit(); else if (document.getElementById('addModal').classList.contains('show') && a.closest('.modal-box')) addEntry(); else if (!document.getElementById('authSection').classList.contains('hidden')) { if (a.id === 'loginUsername' || a.id === 'loginPassword') login(); else if (a.id === 'regPassword') register(); } } });
document.getElementById('genModal').addEventListener('click', e => { if (e.target === e.currentTarget) closeGen(); }); document.getElementById('genModal').addEventListener('click', e => { if (e.target === e.currentTarget) closeGen(); });
document.getElementById('editModal').addEventListener('click', e => { if (e.target === e.currentTarget) closeEdit(); }); document.getElementById('editModal').addEventListener('click', e => { if (e.target === e.currentTarget) closeEdit(); });
// ==================== KEYBOARD SHORTCUTS ==================== // ==================== KEYBOARD SHORTCUTS ====================
@@ -1424,7 +1424,7 @@ document.addEventListener('keydown', function(e) {
} }
// Arrow keys — navigate entries in vault // 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') && view !== 'detail' && !document.querySelector('.edit-modal.show,.modal-overlay.show')) { if ((e.key === 'ArrowUp' || e.key === 'ArrowDown' || e.key === 'ArrowLeft' || e.key === 'ArrowRight') && !isInput && document.getElementById('authSection').classList.contains('hidden') && view !== 'detail' && !document.getElementById('addModal').classList.contains('show') && !document.getElementById('editModal').classList.contains('show')) {
e.preventDefault(); e.preventDefault();
const filtered = getFilteredEntries(); const filtered = getFilteredEntries();
if (!filtered.length) return; if (!filtered.length) return;
@@ -1505,7 +1505,7 @@ document.addEventListener('keydown', function(e) {
if (e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey && (e.key === 'a' || e.key === 'A') && !isInput && document.getElementById('authSection').classList.contains('hidden')) { if (e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey && (e.key === 'a' || e.key === 'A') && !isInput && document.getElementById('authSection').classList.contains('hidden')) {
e.preventDefault(); e.preventDefault();
getFilteredEntries(view === 'grouped').forEach(e => selectedIds.add(e.id)); getFilteredEntries(view === 'grouped' || view === 'detail').forEach(e => selectedIds.add(e.id));
updateBatchBar(); updateBatchBar();
render(); render();
playSound('click'); playSound('click');