From a0a081e2db91a4b09867b021dde1a8c2e0c9aa1e Mon Sep 17 00:00:00 2001 From: Zaki <18zaki18@gmail.com> Date: Fri, 8 May 2026 17:21:38 +0100 Subject: [PATCH] add clear for search + regroup options in settings btn --- css/style.css | 600 ++++++++++++++------------------------------------ index.html | 200 ++++++++++------- js/app.js | 60 +++-- vault.db | Bin 36864 -> 36864 bytes 4 files changed, 338 insertions(+), 522 deletions(-) diff --git a/css/style.css b/css/style.css index ff86581..80a3e38 100644 --- a/css/style.css +++ b/css/style.css @@ -1,477 +1,217 @@ :root { - --bg: #0a0e17; - --bg2: #131a24; - --text: #e1e8f0; - --text2: #8899aa; - --accent: #3b82f6; - --danger: #ef4444; - --success: #22c55e; - --warning: #f59e0b; - --border: rgba(255,255,255,0.06); - --card: rgba(18,25,35,0.85); - --input: #10161f; - --vault-bg: rgba(255,255,255,0.03); + --bg: #0a0e17; --bg2: #131a24; --text: #e1e8f0; --text2: #8899aa; + --accent: #3b82f6; --danger: #ef4444; --success: #22c55e; --warning: #f59e0b; + --border: rgba(255,255,255,0.06); --card: rgba(18,25,35,0.85); + --input: #10161f; --vault-bg: rgba(255,255,255,0.03); } .light { - --bg: #f4f6f9; - --bg2: #e9ecf1; - --text: #1a1f2e; - --text2: #5a6475; - --card: rgba(255,255,255,0.9); - --input: #ffffff; - --border: rgba(0,0,0,0.08); - --vault-bg: rgba(255,255,255,0.5); + --bg: #f4f6f9; --bg2: #e9ecf1; --text: #1a1f2e; --text2: #5a6475; + --card: rgba(255,255,255,0.9); --input: #ffffff; + --border: rgba(0,0,0,0.08); --vault-bg: rgba(255,255,255,0.5); } * { margin:0; padding:0; box-sizing:border-box; } body { background: linear-gradient(145deg, var(--bg) 0%, var(--bg2) 100%); font-family: 'Segoe UI', system-ui, sans-serif; - min-height: 100vh; - display: flex; - justify-content: center; - align-items: flex-start; - padding: 1.2rem; - color: var(--text); + min-height: 100vh; display: flex; justify-content: center; + align-items: flex-start; padding: 1.2rem; color: var(--text); transition: background 0.3s, color 0.3s; } -.toast-container { - position: fixed; top: 1rem; right: 1rem; z-index: 9999; - display: flex; flex-direction: column; gap: 0.5rem; -} -.toast { - padding: 0.7rem 1.2rem; border-radius: 0.8rem; - font-size: 0.85rem; animation: slideIn 0.3s ease; color: #fff; -} -.toast.error { background: var(--danger); } -.toast.success { background: var(--success); } -@keyframes slideIn { - from { transform: translateX(100%); opacity: 0; } - to { transform: translateX(0); opacity: 1; } -} +.toast-container { position:fixed; top:1rem; right:1rem; z-index:9999; display:flex; flex-direction:column; gap:0.5rem; } +.toast { padding:0.7rem 1.2rem; border-radius:0.8rem; font-size:0.85rem; animation:slideIn 0.3s ease; color:#fff; } +.toast.error { background:var(--danger); } +.toast.success { background:var(--success); } +@keyframes slideIn { from { transform:translateX(100%); opacity:0; } to { transform:translateX(0); opacity:1; } } .vault { - width: 96%; max-width: 1700px; - background: var(--vault-bg); - backdrop-filter: blur(20px); - border: 1px solid var(--border); - border-radius: 2rem; padding: 1.8rem; margin: 0.5rem auto; - box-shadow: 0 30px 50px rgba(0,0,0,0.4); -} -h1 { - font-size: 2rem; margin-bottom: 0.6rem; - display: flex; align-items: center; gap: 0.6rem; flex-wrap: wrap; -} -h1 span { - background: var(--accent); padding: 0.2rem 0.7rem; - border-radius: 3rem; font-size: 0.8rem; color: #fff; + width:96%; max-width:1700px; background:var(--vault-bg); + backdrop-filter:blur(20px); border:1px solid var(--border); + border-radius:2rem; padding:1.8rem; margin:0.5rem auto; + box-shadow:0 30px 50px rgba(0,0,0,0.4); } +h1 { font-size:2rem; margin-bottom:0.6rem; display:flex; align-items:center; gap:0.6rem; flex-wrap:wrap; } +h1 span { background:var(--accent); padding:0.2rem 0.7rem; border-radius:3rem; font-size:0.8rem; color:#fff; } /* Auth */ -.auth-section { - background: rgba(0,0,0,0.25); border-radius: 1.5rem; - padding: 1.3rem; margin-bottom: 1rem; border: 1px solid var(--border); -} -.auth-tabs { display: flex; gap: 1rem; margin-bottom: 0.8rem; } -.auth-tab { - background: none; border: none; color: var(--text2); - padding: 0.4rem 0.8rem; cursor: pointer; - border-bottom: 2px solid transparent; font-size: 0.9rem; -} -.auth-tab.active { color: var(--accent); border-bottom-color: var(--accent); } +.auth-section { background:rgba(0,0,0,0.25); border-radius:1.5rem; padding:1.3rem; margin-bottom:1rem; border:1px solid var(--border); } +.auth-tabs { display:flex; gap:1rem; margin-bottom:0.8rem; } +.auth-tab { background:none; border:none; color:var(--text2); padding:0.4rem 0.8rem; cursor:pointer; border-bottom:2px solid transparent; font-size:0.9rem; } +.auth-tab.active { color:var(--accent); border-bottom-color:var(--accent); } input, select, textarea { - flex: 1; min-width: 130px; background: var(--input); - border: 1px solid #2d3748; padding: 0.65rem 1rem; - border-radius: 2rem; color: var(--text); font-size: 0.85rem; - outline: none; font-family: inherit; + flex:1; min-width:130px; background:var(--input); border:1px solid #2d3748; + padding:0.65rem 1rem; border-radius:2rem; color:var(--text); font-size:0.85rem; + outline:none; font-family:inherit; } -input:focus, select:focus { border-color: var(--accent); } +input:focus, select:focus { border-color:var(--accent); } .btn { - background: linear-gradient(135deg, #2563eb, #1d4ed8); - border: none; color: #fff; font-weight: 600; - padding: 0.65rem 1.3rem; border-radius: 2rem; - cursor: pointer; font-size: 0.85rem; transition: 0.2s; white-space: nowrap; + background:linear-gradient(135deg, #2563eb, #1d4ed8); border:none; color:#fff; + font-weight:600; padding:0.65rem 1.3rem; border-radius:2rem; cursor:pointer; + font-size:0.85rem; transition:0.2s; white-space:nowrap; } -.btn:hover { filter: brightness(1.15); transform: scale(1.02); } -.btn:disabled { opacity: 0.5; cursor: not-allowed; transform: none; } -.btn-outline { background: transparent; border: 1px solid #475569; color: var(--text2); } -.btn-sm { padding: 0.35rem 0.9rem; font-size: 0.75rem; } -.btn-xs { padding: 0.2rem 0.5rem; font-size: 0.7rem; } -.btn-danger { background: var(--danger); } +.btn:hover { filter:brightness(1.15); transform:scale(1.02); } +.btn:disabled { opacity:0.5; cursor:not-allowed; transform:none; } +.btn-outline { background:transparent; border:1px solid #475569; color:var(--text2); } +.btn-sm { padding:0.35rem 0.9rem; font-size:0.75rem; } +.btn-xs { padding:0.2rem 0.5rem; font-size:0.7rem; } +.btn-danger { background:var(--danger); } -.input-group { display: flex; gap: 0.5rem; margin: 0.7rem 0; flex-wrap: wrap; align-items: center; } -.toolbar { - display: flex; - justify-content: space-between; - align-items: center; - flex-wrap: wrap; - gap: 0.5rem; - margin-bottom: 0.7rem; -} -.toolbar-actions { - display: flex; - gap: 0.5rem; - align-items: center; - flex-wrap: wrap; -} -.view-toggle { display: flex; gap: 0.2rem; background: rgba(0,0,0,0.3); padding: 0.2rem; border-radius: 2rem; } -.view-btn { - background: none; border: none; color: var(--text2); - padding: 0.35rem 0.7rem; border-radius: 2rem; cursor: pointer; - font-size: 0.75rem; transition: 0.2s; -} -.view-btn.active { background: var(--accent); color: #fff; } -.view-btn:hover:not(.active) { background: rgba(255,255,255,0.08); } +.input-group { display:flex; gap:0.5rem; margin:0.7rem 0; flex-wrap:wrap; align-items:center; } -.toggles-row { display: flex; gap: 1.2rem; align-items: center; flex-wrap: wrap; } -.toggle-item { display: flex; align-items: center; gap: 0.4rem; font-size: 0.75rem; color: var(--text2); } -.toggle-switch { - position: relative; width: 36px; height: 20px; - background: #334155; border-radius: 10px; cursor: pointer; transition: 0.2s; -} -.toggle-switch.active { background: var(--accent); } -.toggle-switch::after { - content: ''; position: absolute; top: 2px; left: 2px; - width: 16px; height: 16px; background: #fff; border-radius: 50%; transition: 0.2s; -} -.toggle-switch.active::after { left: 18px; } +/* Toolbar */ +.toolbar { display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:0.5rem; margin-bottom:0.7rem; } +.view-toggle { display:flex; gap:0.2rem; background:rgba(0,0,0,0.3); padding:0.2rem; border-radius:2rem; } +.view-btn { background:none; border:none; color:var(--text2); padding:0.35rem 0.7rem; border-radius:2rem; cursor:pointer; font-size:0.75rem; transition:0.2s; } +.view-btn.active { background:var(--accent); color:#fff; } +.view-btn:hover:not(.active) { background:rgba(255,255,255,0.08); } -.status-badge { - background: var(--bg2); padding: 0.25rem 0.8rem; - border-radius: 2rem; font-size: 0.75rem; white-space: nowrap; -} -.hidden { display: none !important; } +.toggles-row { display:flex; gap:1.2rem; align-items:center; flex-wrap:wrap; } +.toggle-item { display:flex; align-items:center; gap:0.4rem; font-size:0.75rem; color:var(--text2); } +.toggle-switch { position:relative; width:36px; height:20px; background:#334155; border-radius:10px; cursor:pointer; transition:0.2s; } +.toggle-switch.active { background:var(--accent); } +.toggle-switch::after { content:''; position:absolute; top:2px; left:2px; width:16px; height:16px; background:#fff; border-radius:50%; transition:0.2s; } +.toggle-switch.active::after { left:18px; } + +.status-badge { background:var(--bg2); padding:0.25rem 0.8rem; border-radius:2rem; font-size:0.75rem; white-space:nowrap; } +.hidden { display:none !important; } /* Strength */ -.strength-bar { height: 4px; border-radius: 2px; transition: 0.3s; margin-top: 0.2rem; } -.s0 { background: var(--danger); width: 20%; } -.s1 { background: var(--warning); width: 40%; } -.s2 { background: #eab308; width: 60%; } -.s3 { background: #84cc16; width: 80%; } -.s4 { background: var(--success); width: 100%; } +.strength-bar { height:4px; border-radius:2px; transition:0.3s; margin-top:0.2rem; } +.s0 { background:var(--danger); width:20%; } +.s1 { background:var(--warning); width:40%; } +.s2 { background:#eab308; width:60%; } +.s3 { background:#84cc16; width:80%; } +.s4 { background:var(--success); width:100%; } + +/* ========== SEARCH BOX WITH CLEAR BUTTON (FIXED) ========== */ +.search-box { + position: relative; + width: 240px; /* fixed width – adjust if needed */ + flex-shrink: 0; +} +.search-box input { + width: 100%; + box-sizing: border-box; + padding-right: 30px; /* space for the ✕ button */ +} +.clear-search-btn { + position: absolute; + right: 6px; + top: 50%; + transform: translateY(-50%); + background: none; + border: none; + color: var(--text2); + cursor: pointer; + font-size: 0.9rem; + line-height: 1; + padding: 6px; + display: none; +} /* Folders */ -.folders-bar { - display: flex; gap: 0.4rem; margin-bottom: 0.8rem; - flex-wrap: wrap; align-items: center; - padding: 0.4rem 0.6rem; background: rgba(0,0,0,0.2); border-radius: 1rem; -} -.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(--accent); color: #fff; border-color: var(--accent); } -.folder-chip.active { background: var(--accent); color: #fff; border-color: var(--accent); } -.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:hover { opacity: 1; } +.folders-bar { display:flex; gap:0.4rem; margin-bottom:0.8rem; flex-wrap:wrap; align-items:center; padding:0.4rem 0.6rem; background:rgba(0,0,0,0.2); border-radius:1rem; } +.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(--accent); color:#fff; border-color:var(--accent); } +.folder-chip.active { background:var(--accent); color:#fff; border-color:var(--accent); } +.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:hover { opacity:1; } +.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 { - 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); } - -/* Add form folder select */ -#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 */ -#entriesContainer.grid-view { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); - gap: 0.6rem; -} -#entriesContainer.list-view { display: flex; flex-direction: column; gap: 0.4rem; } -#entriesContainer.compact-view { display: flex; flex-direction: column; gap: 0.2rem; } -#entriesContainer.table-view { overflow-x: auto; } -#entriesContainer.table-view table { width: 100%; border-collapse: collapse; } -#entriesContainer.table-view th { - text-align: left; padding: 0.4rem 0.6rem; - color: var(--text2); font-size: 0.75rem; border-bottom: 1px solid var(--border); -} -#entriesContainer.table-view td { - padding: 0.4rem 0.6rem; font-size: 0.8rem; - border-bottom: 1px solid rgba(255,255,255,0.03); -} +#entriesContainer.grid-view { display:grid; grid-template-columns: repeat(auto-fill, minmax(180px,1fr)); gap:0.6rem; } +#entriesContainer.list-view { display:flex; flex-direction:column; gap:0.4rem; } +#entriesContainer.compact-view { display:flex; flex-direction:column; gap:0.2rem; } +#entriesContainer.table-view { overflow-x:auto; } +#entriesContainer.table-view table { width:100%; border-collapse:collapse; } +#entriesContainer.table-view th { text-align:left; padding:0.4rem 0.6rem; color:var(--text2); font-size:0.75rem; border-bottom:1px solid var(--border); } +#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: grab; 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, .entry-row, .entry-compact, .table-row-drag { cursor:grab; 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 { 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); } +.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-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-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; } +.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-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; } +.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:hover { color:#fff; transform:scale(1.2); } +.light .delete-btn:hover { color:#000!important; } +.edit-btn { width:20px; height:20px; background:transparent; color:var(--accent); border:none; cursor:pointer; font-size:0.75rem; display:flex; align-items:center; justify-content:center; } +.edit-btn:hover { color:#fff; transform:scale(1.2); } +.light .edit-btn:hover { color:#000!important; } +.entry-info { display:flex; gap:0.5rem; align-items:center; flex-wrap:wrap; flex:1; } +.entry-site { font-weight:700; color:var(--text); } +.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; } +.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; } +.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; } -.entry-card { - background: var(--card); - border: 1px solid rgba(255, 255, 255, 0.1); /* brighter border */ - border-radius: 0.9rem; - padding: 1rem 2.5rem 1rem 1rem; - transition: 0.2s; - position: relative; - word-break: break-word; -} +/* Settings Dropdown */ +.settings-dropdown { position:relative; display:inline-block; } +.settings-menu { position:absolute; top:100%; right:0; background:var(--bg2); border:1px solid var(--border); border-radius:0.8rem; padding:0.5rem; min-width:200px; z-index:1000; box-shadow:0 10px 25px rgba(0,0,0,0.4); } +.settings-item { display:flex; justify-content:space-between; align-items:center; padding:0.4rem 0.6rem; border-radius:0.5rem; font-size:0.8rem; color:var(--text2); cursor:pointer; } +.settings-item:hover { background:rgba(255,255,255,0.05); } +.settings-item select { background:var(--input); border:1px solid #334155; color:var(--text); padding:0.2rem 0.5rem; border-radius:1rem; font-size:0.75rem; } -.entry-card:hover { border-color: rgba(255,255,255,0.15); transform: translateY(-2px); } -.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-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-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; -} -.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-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; -} - -.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:hover { color: #fff; transform: scale(1.2); } -.light .delete-btn:hover { color: #000 !important; } -.edit-btn { - width: 20px; height: 20px; background: transparent; color: var(--accent); - border: none; cursor: pointer; font-size: 0.75rem; - display: flex; align-items: center; justify-content: center; -} -.edit-btn:hover { color: #fff; transform: scale(1.2); } -.light .edit-btn:hover { color: #000 !important; } - -.entry-info { display: flex; gap: 0.5rem; align-items: center; flex-wrap: wrap; flex: 1; } -.entry-site { font-weight: 700; color: var(--text); } -.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; -} -.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; } -.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; } - -.search-box { flex: 1; min-width: 160px; } -.idle-warning { - position: fixed; top: 50%; left: 50%; transform: translate(-50%,-50%); - background: rgba(0,0,0,0.95); color: #fff; padding: 2rem; - border-radius: 2rem; z-index: 10000; text-align: center; display: none; -} -.idle-warning.show { display: block; } +/* Trash */ +.trash-badge { background:var(--danger); color:#fff; padding:0.15rem 0.5rem; border-radius:1rem; font-size:0.65rem; margin-left:0.3rem; } +.trash-info { font-size:0.7rem; color:var(--text2); margin-top:0.2rem; } +.restore-btn { background:var(--success); color:#fff; border:none; padding:0.2rem 0.6rem; border-radius:1.5rem; cursor:pointer; font-size:0.7rem; } +.restore-btn:hover { filter:brightness(1.2); } +.empty-trash-btn { background:var(--danger); color:#fff; border:none; padding:0.3rem 0.8rem; border-radius:1.5rem; cursor:pointer; font-size:0.75rem; } +.empty-trash-btn:hover { filter:brightness(1.2); } /* Edit Modal */ -.edit-modal { - position: fixed; top: 0; left: 0; right: 0; bottom: 0; - background: rgba(0,0,0,0.7); display: flex; justify-content: center; - align-items: center; z-index: 1001; display: none; -} -.edit-modal.show { display: flex; } -.edit-box { - background: var(--bg2); border-radius: 1.5rem; padding: 1.5rem; - min-width: 380px; max-width: 90%; -} -.edit-box h3 { margin-bottom: 1rem; color: var(--text); } -.edit-box label { color: var(--text2); font-size: 0.8rem; display: block; margin-bottom: 0.2rem; } -.edit-box input, .edit-box select { width: 100%; margin-bottom: 0.5rem; } +.edit-modal { position:fixed; top:0; left:0; right:0; bottom:0; background:rgba(0,0,0,0.7); display:none; justify-content:center; align-items:center; z-index:1001; } +.edit-modal.show { display:flex; } +.edit-box { background:var(--bg2); border-radius:1.5rem; padding:1.5rem; min-width:380px; max-width:90%; } +.edit-box h3 { margin-bottom:1rem; color:var(--text); } +.edit-box label { color:var(--text2); font-size:0.8rem; display:block; margin-bottom:0.2rem; } +.edit-box input, .edit-box select { width:100%; margin-bottom:0.5rem; } -/* Custom modals (folder add/delete) */ -.custom-modal-overlay { - position: fixed; top: 0; left: 0; right: 0; bottom: 0; - background: rgba(0,0,0,0.6); display: flex; justify-content: center; - align-items: center; z-index: 10001; display: none; -} -.custom-modal-overlay.show { display: flex; } -.custom-modal { - background: var(--bg2); border: 1px solid var(--border); - border-radius: 1.2rem; padding: 1.5rem; min-width: 300px; max-width: 90%; -} -.custom-modal h3 { margin-bottom: 1rem; color: var(--text); } -.custom-modal input { width: 100%; margin-bottom: 1rem; } -.custom-modal .modal-actions { display: flex; gap: 0.5rem; justify-content: flex-end; } +/* Custom modals */ +.custom-modal-overlay { position:fixed; top:0; left:0; right:0; bottom:0; background:rgba(0,0,0,0.6); display:flex; justify-content:center; align-items:center; z-index:10001; display:none; } +.custom-modal-overlay.show { display:flex; } +.custom-modal { background:var(--bg2); border:1px solid var(--border); border-radius:1.2rem; padding:1.5rem; min-width:300px; max-width:90%; } +.custom-modal h3 { margin-bottom:1rem; color:var(--text); } +.custom-modal input { width:100%; margin-bottom:1rem; } +.custom-modal .modal-actions { display:flex; gap:0.5rem; justify-content:flex-end; } /* Confirm popup near element */ -.custom-confirm { - position: fixed; background: var(--bg2); border: 1px solid var(--accent); - border-radius: 0.8rem; padding: 0.7rem 1rem; z-index: 9999; - box-shadow: 0 10px 30px rgba(0,0,0,0.5); display: none; - font-size: 0.8rem; color: var(--text); white-space: nowrap; -} -.custom-confirm.show { display: block; } -.custom-confirm .confirm-text { margin-bottom: 0.5rem; } -.custom-confirm .confirm-btns { display: flex; gap: 0.4rem; } -.custom-confirm .confirm-yes { - background: var(--danger); color: #fff; border: none; - padding: 0.3rem 0.8rem; border-radius: 1.5rem; cursor: pointer; font-size: 0.75rem; -} -.custom-confirm .confirm-no { - background: #334155; color: #fff; border: none; - padding: 0.3rem 0.8rem; border-radius: 1.5rem; cursor: pointer; font-size: 0.75rem; -} +.custom-confirm { position:fixed; background:var(--bg2); border:1px solid var(--accent); border-radius:0.8rem; padding:0.7rem 1rem; z-index:9999; box-shadow:0 10px 30px rgba(0,0,0,0.5); display:none; font-size:0.8rem; color:var(--text); white-space:nowrap; } +.custom-confirm.show { display:block; } +.custom-confirm .confirm-text { margin-bottom:0.5rem; } +.custom-confirm .confirm-btns { display:flex; gap:0.4rem; } +.custom-confirm .confirm-yes { background:var(--danger); color:#fff; border:none; padding:0.3rem 0.8rem; border-radius:1.5rem; cursor:pointer; font-size:0.75rem; } +.custom-confirm .confirm-no { background:#334155; color:#fff; border:none; padding:0.3rem 0.8rem; border-radius:1.5rem; cursor:pointer; font-size:0.75rem; } /* Zigzag toast */ -/* .toast-zigzag { */ - /* position: fixed; z-index: 9998; padding: 0.5rem 0.9rem; */ - /* border-radius: 0.5rem; font-size: 0.78rem; font-weight: 600; */ - /* pointer-events: none; animation: zigzagUp 1.4s ease-out forwards; white-space: nowrap; */ -/* } */ -/* .toast-zigzag.success { background: rgba(34,197,94,0.95); color: #fff; } */ -/* .toast-zigzag.error { background: rgba(239,68,68,0.95); color: #fff; } */ -/* @keyframes zigzagUp { */ - /* 0% { opacity: 1; transform: translate(0,0) scale(1); } */ - /* 15% { opacity: 1; transform: translate(-12px,-12px) scale(1.05); } */ - /* 30% { opacity: 0.9; transform: translate(14px,-24px) scale(1); } */ - /* 50% { opacity: 0.7; transform: translate(-10px,-38px) scale(0.95); } */ - /* 70% { opacity: 0.4; transform: translate(10px,-52px) scale(0.9); } */ - /* 100% { opacity: 0; transform: translate(0,-68px) scale(0.8); } */ -/* } */ -/* Zigzag toast – smaller over time, more transparent */ -.toast-zigzag { - position: fixed; - z-index: 9998; - padding: 0.4rem 0.7rem; - border-radius: 0.5rem; - font-size: 0.72rem; - font-weight: 600; - pointer-events: none; - animation: zigzagUp 1.2s ease-out forwards; - white-space: nowrap; -} -.toast-zigzag.success { - background: rgba(34, 197, 94, 0.95); - color: #fff; -} -.toast-zigzag.error { - background: rgba(239, 68, 68, 0.95); - color: #fff; -} +.toast-zigzag { position:fixed; z-index:9998; padding:0.4rem 0.7rem; border-radius:0.5rem; font-size:0.72rem; font-weight:600; pointer-events:none; animation:zigzagUp 1.2s ease-out forwards; white-space:nowrap; } +.toast-zigzag.success { background:rgba(34,197,94,0.95); color:#fff; } +.toast-zigzag.error { background:rgba(239,68,68,0.95); color:#fff; } +@keyframes zigzagUp { 0%{opacity:1;transform:translate(0,0) scale(1)} 20%{opacity:0.9;transform:translate(-10px,-14px) scale(0.9)} 40%{opacity:0.65;transform:translate(12px,-28px) scale(0.75)} 70%{opacity:0.3;transform:translate(-8px,-42px) scale(0.6)} 100%{opacity:0;transform:translate(0,-60px) scale(0.4)} } + +.idle-warning { position:fixed; top:50%; left:50%; transform:translate(-50%,-50%); background:rgba(0,0,0,0.95); color:#fff; padding:2rem; border-radius:2rem; z-index:10000; text-align:center; display:none; } +.idle-warning.show { display:block; } -@keyframes zigzagUp { - 0% { - opacity: 1; - transform: translate(0, 0) scale(1); - } - 20% { - opacity: 0.9; - transform: translate(-10px, -14px) scale(0.9); - } - 40% { - opacity: 0.65; - transform: translate(12px, -28px) scale(0.75); - } - 70% { - opacity: 0.3; - transform: translate(-8px, -42px) scale(0.6); - } - 100% { - opacity: 0; - transform: translate(0, -60px) scale(0.4); - } -} @media(max-width:700px) { - .vault { - background: rgba(20, 30, 45, 0.25); /* a bit more visible */ - backdrop-filter: blur(24px); - } - .entry-row { flex-direction: column; } + .vault { padding:1rem; border-radius:1.5rem; width:98%; } + .entry-row { flex-direction:column; } #entriesContainer.grid-view { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); } - .toolbar { flex-direction: column; } - .folders-bar { flex-direction: column; align-items: stretch; } -} -/* Table view improvements */ -#entriesContainer.table-view { - overflow-x: auto; -} - -#entriesContainer.table-view table { - min-width: 600px; /* Ensures columns don't squash too much */ - table-layout: auto; -} - -#entriesContainer.table-view th, -#entriesContainer.table-view td { - white-space: nowrap; - padding: 0.5rem 0.8rem; -} - -/* Limit password cell width and show ellipsis */ -#entriesContainer.table-view td.password-cell { - max-width: 180px; - overflow: hidden; - text-overflow: ellipsis; -} -/* Trash view */ -.trash-badge { - background: var(--danger); - color: #fff; - padding: 0.15rem 0.5rem; - border-radius: 1rem; - font-size: 0.65rem; - margin-left: 0.3rem; -} -.trash-info { - font-size: 0.7rem; - color: var(--text2); - margin-top: 0.2rem; -} -.restore-btn { - background: var(--success); - color: #fff; - border: none; - padding: 0.2rem 0.6rem; - border-radius: 1.5rem; - cursor: pointer; - font-size: 0.7rem; -} -.restore-btn:hover { filter: brightness(1.2); } -.empty-trash-btn { - background: var(--danger); - color: #fff; - border: none; - padding: 0.3rem 0.8rem; - border-radius: 1.5rem; - cursor: pointer; - font-size: 0.75rem; -} -.empty-trash-btn:hover { filter: brightness(1.2); } -#trashBtn.btn-danger { - background: var(--danger); - color: #fff; - border-color: var(--danger); + .toolbar { flex-direction:column; } + .folders-bar { flex-direction:column; align-items:stretch; } } \ No newline at end of file diff --git a/index.html b/index.html index 5e4a024..bdba1e2 100644 --- a/index.html +++ b/index.html @@ -8,119 +8,167 @@
-

⏰ Auto-lock

Vault locks in 30s

- +
+

⏰ Auto-lock

+

Vault locks in 30s

+ +
+
-
-

✏️ Edit Entry

-
- - - -
- - -
- - - -
- - -
-
-
-
+
+

✏️ Edit Entry

+ + + +
+ + +
+ + + +
+ + +
+
+

🔐 Vault XAMPP - - -

+ + + +
-
-
-
- - - -
-
+
+ + +
+
+
+ + + +
+
+
+ + + +
+
- + + +
+
📭 No entries
+
+
+ +
+ diff --git a/js/app.js b/js/app.js index 54623b4..05d65e3 100644 --- a/js/app.js +++ b/js/app.js @@ -93,14 +93,8 @@ function playSound(type) { function toggleSound() { soundEnabled = !soundEnabled; localStorage.setItem('soundEnabled', soundEnabled); - const btn = document.getElementById('soundToggle'); - if (btn) btn.textContent = soundEnabled ? '🔊' : '🔇'; - if (soundEnabled) playTone(440, 0.05, 'sine', 0.05); -} - -function updateSoundButton() { - const btn = document.getElementById('soundToggle'); - if (btn) btn.textContent = soundEnabled ? '🔊' : '🔇'; + if (soundEnabled) playTone(440, 0.05); + syncSettingsUI(); } // ==================== TOAST ==================== @@ -118,7 +112,7 @@ function showZigzagToast(elem, msg, type) { // ==================== THEME ==================== function applyTheme() { document.body.classList.toggle('light', !dark); } -function toggleTheme() { dark = !dark; localStorage.setItem('darkTheme', dark); applyTheme(); playSound('click'); } +function toggleTheme() { dark = !dark; localStorage.setItem('darkTheme', dark); applyTheme(); syncSettingsUI(); playSound('click'); } // ==================== CRYPTO ==================== function checkStrength() { const p = document.getElementById('passwordInput').value; const b = document.getElementById('strengthBar'); let s = 0; if (p.length >= 8) s++; if (p.length >= 12) s++; if (/[A-Z]/.test(p) && /[a-z]/.test(p)) s++; if (/\d/.test(p)) s++; if (/[!@#$%^&*()_+\-=\[\]{}|;:,.<>?]/.test(p)) s++; b.className = 'strength-bar s' + Math.min(4, s); } @@ -282,18 +276,28 @@ function timeAgo(dateStr) { return days <= 0 ? 'Expiring' : days + 'd left'; } +// ==================== SETTINGS ==================== +function toggleSettings() { + document.getElementById('settingsMenu').classList.toggle('hidden'); +} +function syncSettingsUI() { + document.getElementById('soundToggleSwitch').classList.toggle('active', soundEnabled); + document.getElementById('themeToggleSwitch').classList.toggle('active', !dark); + document.getElementById('showViewBtnToggle').classList.toggle('active', showView); + document.getElementById('showEmailToggle').classList.toggle('active', showMail); + document.getElementById('autoLockTimer').value = lockMin; +} + // ==================== INIT ==================== function init() { document.querySelectorAll('.view-btn').forEach(b => b.classList.toggle('active', b.dataset.view === view)); - document.getElementById('showViewBtnToggle').classList.toggle('active', showView); - document.getElementById('showEmailToggle').classList.toggle('active', showMail); document.getElementById('autoLockTimer').value = lockMin; applyTheme(); document.getElementById('usernameInput').style.display = showMail ? '' : 'none'; loadUsername(); const sl = localStorage.getItem('savedLoginUser'); if (sl) document.getElementById('loginUsername').value = sl; - updateSoundButton(); + syncSettingsUI(); document.getElementById('viewToggle').addEventListener('click', e => { if (e.target.classList.contains('view-btn')) { document.querySelectorAll('.view-btn').forEach(b => b.classList.remove('active')); @@ -304,9 +308,20 @@ function init() { playSound('click'); } }); + const clearBtn = document.getElementById('clearSearchBtn'); + if (clearBtn) clearBtn.style.display = 'none'; + // Close settings when clicking outside + document.addEventListener('click', (e) => { + const menu = document.getElementById('settingsMenu'); + const btn = document.getElementById('settingsBtn'); + if (menu && !menu.classList.contains('hidden') && !menu.contains(e.target) && e.target !== btn) { + menu.classList.add('hidden'); + } + }); } -function toggleViewBtn() { showView = !showView; localStorage.setItem('showViewBtn', showView); document.getElementById('showViewBtnToggle').classList.toggle('active', showView); render(); playSound('click'); } -function toggleShowEmail() { showMail = !showMail; localStorage.setItem('showEmail', showMail); document.getElementById('showEmailToggle').classList.toggle('active', showMail); document.getElementById('usernameInput').style.display = showMail ? '' : 'none'; render(); playSound('click'); } + +function toggleViewBtn() { showView = !showView; localStorage.setItem('showViewBtn', showView); syncSettingsUI(); render(); playSound('click'); } +function toggleShowEmail() { showMail = !showMail; localStorage.setItem('showEmail', showMail); syncSettingsUI(); document.getElementById('usernameInput').style.display = showMail ? '' : 'none'; render(); playSound('click'); } // ==================== GENERATOR ==================== function openGen() { document.getElementById('genModal').style.display = 'flex'; genPwd(); playSound('open'); } @@ -391,6 +406,7 @@ function showVault() { loadUsername(); renderFolders(); populateAddFolderSelect(); + syncSettingsUI(); resetIdle(); } @@ -587,10 +603,22 @@ async function delEntry(id) { } // ==================== UTILS ==================== -function searchEntries() { loadEntries(document.getElementById('searchInput').value); } +function searchEntries() { + const input = document.getElementById('searchInput'); + const btn = document.getElementById('clearSearchBtn'); + if (btn) btn.style.display = input.value.trim() ? 'block' : 'none'; + loadEntries(input.value); +} function exportPasswords() { if (!confirm('Export plain text?')) return; const b = new Blob([JSON.stringify(entries, null, 2)], { type: 'application/json' }); const a = document.createElement('a'); a.href = URL.createObjectURL(b); a.download = 'vault-' + new Date().toISOString().slice(0, 10) + '.json'; a.click(); URL.revokeObjectURL(a.href); toast('Exported!'); } function esc(t) { const d = document.createElement('div'); d.textContent = t; return d.innerHTML; } - +function clearSearch() { + const input = document.getElementById('searchInput'); + input.value = ''; + const btn = document.getElementById('clearSearchBtn'); + if (btn) btn.style.display = 'none'; + loadEntries(); + input.focus(); +} // ==================== STARTUP – session persistence ==================== init(); applyTheme(); diff --git a/vault.db b/vault.db index 853fb3772bb9ec7b196a4c880bb92c7265cfc770..34df7ff84e13addc60b0cae45ab9a109123347f4 100644 GIT binary patch delta 216 zcmZozz|^pSX@WH4?TIqZjJG!?G}&9t5M*LjXDmxB%_)gb%_}L&Of44XU}P5OEGUMzId5#1aoEFIUnb1Uz$q!}t1D@2EX=`B zoRS7ai9iro>0#vWSr8UfmSb)LRXnlJE!O8MYtOW_?I~Qm1kuadnYFaIJ)Lq v1SRKW0_`_4Ff!9MFx54%P%t#NGO@HWHpC+2n3L0}z{$tJDZM$|Yo#jyWyn4C delta 216 zcmZozz|^pSX@WH4)rm6Bj8``%G}&8C7Gz>pXDmxB%_)gb%_}L&Of44TU}P5OEG