From caf360c978c00a455e53b858672c003681142a10 Mon Sep 17 00:00:00 2001 From: adlee-was-taken Date: Sun, 12 Apr 2026 09:42:17 -0400 Subject: [PATCH] feat: add terminal dark theme for popup Monospace font stack, #0d1117 background, blue accents, TOTP green, entry list with keyboard selection, confirm overlay, wizard progress bar, and custom 4px scrollbar. Co-Authored-By: Claude Opus 4.6 (1M context) --- extension/src/popup/styles.css | 454 +++++++++++++++++++++++++++++++++ 1 file changed, 454 insertions(+) create mode 100644 extension/src/popup/styles.css diff --git a/extension/src/popup/styles.css b/extension/src/popup/styles.css new file mode 100644 index 0000000..6bbc6d5 --- /dev/null +++ b/extension/src/popup/styles.css @@ -0,0 +1,454 @@ +/* idfoto extension — terminal dark theme */ + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + width: 360px; + max-height: 500px; + overflow-y: auto; + background: #0d1117; + color: #c9d1d9; + font-family: 'JetBrains Mono', 'Cascadia Code', 'Fira Code', 'SF Mono', Menlo, monospace; + font-size: 13px; + line-height: 1.5; +} + +/* Scrollbar */ +::-webkit-scrollbar { + width: 4px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +::-webkit-scrollbar-thumb { + background: #30363d; + border-radius: 2px; +} + +/* Typography */ +.brand { + font-size: 16px; + font-weight: 700; + color: #58a6ff; + letter-spacing: 1px; +} + +.label { + font-size: 11px; + font-weight: 600; + color: #8b949e; + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: 4px; +} + +.secondary { + color: #8b949e; +} + +.muted { + color: #484f58; + font-size: 11px; +} + +.error { + color: #f85149; + font-size: 12px; + margin-top: 8px; +} + +/* Buttons */ +.btn { + display: inline-block; + padding: 6px 14px; + font-family: inherit; + font-size: 12px; + border: 1px solid #30363d; + border-radius: 4px; + background: #21262d; + color: #c9d1d9; + cursor: pointer; + transition: background 0.15s; +} + +.btn:hover { + background: #30363d; +} + +.btn:focus { + outline: 1px solid #58a6ff; + outline-offset: 1px; +} + +.btn-primary { + background: #1f6feb; + border-color: #1f6feb; + color: #fff; +} + +.btn-primary:hover { + background: #388bfd; +} + +.btn-danger { + background: #da3633; + border-color: #da3633; + color: #fff; +} + +.btn-danger:hover { + background: #f85149; +} + +/* Inputs */ +input, textarea, select { + width: 100%; + padding: 8px 10px; + font-family: inherit; + font-size: 13px; + background: #161b22; + border: 1px solid #30363d; + border-radius: 4px; + color: #c9d1d9; + outline: none; + transition: border-color 0.15s; +} + +input:focus, textarea:focus, select:focus { + border-color: #58a6ff; +} + +input::placeholder, textarea::placeholder { + color: #484f58; +} + +textarea { + resize: vertical; + min-height: 60px; +} + +/* Layout */ +.pad { + padding: 16px; +} + +/* Search bar */ +.search-bar { + position: sticky; + top: 0; + z-index: 10; + padding: 8px 12px; + background: #0d1117; + border-bottom: 1px solid #21262d; +} + +.search-bar input { + padding: 6px 10px; + font-size: 12px; +} + +/* Group tabs */ +.group-tabs { + display: flex; + gap: 2px; + padding: 6px 12px; + background: #0d1117; + border-bottom: 1px solid #21262d; + overflow-x: auto; +} + +.group-tab { + padding: 4px 10px; + font-size: 11px; + border: none; + border-radius: 3px; + background: transparent; + color: #8b949e; + cursor: pointer; + white-space: nowrap; + font-family: inherit; +} + +.group-tab:hover { + color: #c9d1d9; + background: #161b22; +} + +.group-tab.active { + color: #58a6ff; + background: #161b22; +} + +/* Entry list */ +.entry-list { + max-height: 360px; + overflow-y: auto; +} + +.entry-row { + display: flex; + flex-direction: column; + padding: 8px 12px; + border-bottom: 1px solid #21262d; + border-left: 3px solid transparent; + cursor: pointer; + transition: background 0.1s; +} + +.entry-row:hover { + background: #161b22; +} + +.entry-row.selected { + background: #161b22; + border-left-color: #58a6ff; +} + +.entry-row .entry-name { + font-size: 13px; + font-weight: 500; + color: #c9d1d9; +} + +.entry-row .entry-meta { + font-size: 11px; + color: #8b949e; + margin-top: 2px; +} + +/* Detail view */ +.detail-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px; + border-bottom: 1px solid #21262d; +} + +.detail-title { + font-size: 15px; + font-weight: 600; + color: #c9d1d9; +} + +.field { + padding: 10px 12px; + border-bottom: 1px solid #21262d; +} + +.field-value { + font-size: 13px; + color: #c9d1d9; + word-break: break-all; + user-select: all; +} + +/* TOTP */ +.totp-code { + font-size: 22px; + font-weight: 700; + color: #3fb950; + letter-spacing: 4px; +} + +.totp-bar { + height: 3px; + background: #21262d; + border-radius: 2px; + margin-top: 6px; + overflow: hidden; +} + +.totp-bar-fill { + height: 100%; + background: #3fb950; + border-radius: 2px; + transition: width 1s linear; +} + +/* Keyboard hints */ +.keyhints { + display: flex; + gap: 8px; + flex-wrap: wrap; + padding: 8px 12px; + border-top: 1px solid #21262d; + background: #0d1117; +} + +.keyhints span { + font-size: 10px; + color: #484f58; +} + +.keyhints kbd { + display: inline-block; + padding: 1px 4px; + font-family: inherit; + font-size: 10px; + background: #21262d; + border: 1px solid #30363d; + border-radius: 3px; + color: #8b949e; +} + +/* Wizard */ +.wizard-step { + padding: 16px; +} + +.wizard-step h3 { + font-size: 14px; + font-weight: 600; + margin-bottom: 12px; + color: #c9d1d9; +} + +.progress-bar { + display: flex; + gap: 4px; + padding: 12px 16px 0; +} + +.progress-bar .step { + flex: 1; + height: 3px; + background: #21262d; + border-radius: 2px; +} + +.progress-bar .step.done { + background: #58a6ff; +} + +.progress-bar .step.current { + background: #388bfd; +} + +/* Spinner */ +.spinner { + display: inline-block; + width: 16px; + height: 16px; + border: 2px solid #30363d; + border-top-color: #58a6ff; + border-radius: 50%; + animation: spin 0.6s linear infinite; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* Confirm overlay */ +.confirm-overlay { + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.7); + display: flex; + align-items: center; + justify-content: center; + z-index: 100; +} + +.confirm-box { + background: #161b22; + border: 1px solid #30363d; + border-radius: 6px; + padding: 20px; + max-width: 280px; + text-align: center; +} + +.confirm-box p { + margin-bottom: 16px; + font-size: 13px; +} + +.confirm-box .btn + .btn { + margin-left: 8px; +} + +/* Empty state */ +.empty { + text-align: center; + padding: 40px 16px; + color: #484f58; + font-size: 13px; +} + +/* Form layout */ +.form-group { + margin-bottom: 12px; +} + +.form-group .label { + display: block; + margin-bottom: 4px; +} + +.form-actions { + display: flex; + gap: 8px; + margin-top: 16px; +} + +.inline-row { + display: flex; + gap: 8px; + align-items: center; +} + +.inline-row input { + flex: 1; +} + +/* Toggle (for host type) */ +.toggle-group { + display: flex; + gap: 0; + border: 1px solid #30363d; + border-radius: 4px; + overflow: hidden; +} + +.toggle-group button { + flex: 1; + padding: 6px 12px; + font-family: inherit; + font-size: 12px; + border: none; + background: #21262d; + color: #8b949e; + cursor: pointer; +} + +.toggle-group button.active { + background: #1f6feb; + color: #fff; +} + +/* File upload area */ +.file-drop { + border: 2px dashed #30363d; + border-radius: 6px; + padding: 24px; + text-align: center; + cursor: pointer; + transition: border-color 0.15s; +} + +.file-drop:hover { + border-color: #58a6ff; +} + +.file-drop.has-file { + border-color: #3fb950; + border-style: solid; +}