diff --git a/CHANGELOG.md b/CHANGELOG.md index b488690..ef338b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ All notable changes to KeyFinder are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versioning follows [SemVer](https://semver.org/spec/v2.0.0.html). +## [2.2.1] - 2026-07-18 + +### Changed +- Anti-slop UI refinement: removed scanline/vignette overlays, colored glows, gradient washes, and card grids in favor of flat value-step surfaces, segmented stat strips with hairline dividers, sharp corners, reverse-video active states and hover emphasis, and a titled-border (`findings.log`) table shell — stricter terminal discipline throughout +- Store listing screenshots regenerated from the flattened UI + ## [2.2.0] - 2026-07-18 ### Added diff --git a/css/popup.css b/css/popup.css index d8ee0a5..540be2b 100644 --- a/css/popup.css +++ b/css/popup.css @@ -1,18 +1,20 @@ /* ============================================================ KeyFinder — ops console popup - design system: dark instrument panel · amber = action - teal = recovered secrets · mono chrome · 1px hairlines + flat terminal discipline: value-step surfaces, 1px hairlines, + reverse-video emphasis, zero glow, zero surface effects + amber = action · teal = recovered secrets ============================================================ */ :root { --bg: #05070c; - --bg-raise: #0a0e16; - --bg-overlay: #101623; + --bg-raise: #090d14; + --bg-overlay: #0d131d; --line: #1a2233; --line-strong: #2a3650; --text: #d6dde8; --text-dim: #8b96a8; --text-faint: #525d70; + --ink: #05070c; --amber: #f5a524; --amber-hot: #ffc45c; --teal: #45d0c4; @@ -38,45 +40,24 @@ body { overflow-x: hidden; } -/* vignette + scanlines — instrument-panel texture */ -body::before { - content: ""; - position: fixed; - inset: 0; - background: radial-gradient(130% 90% at 50% -10%, rgba(245,165,36,.05) 0%, transparent 45%), - radial-gradient(120% 100% at 50% 110%, rgba(0,0,0,.5) 0%, transparent 55%); - pointer-events: none; - z-index: 0; -} -body::after { - content: ""; - position: fixed; - inset: 0; - background: repeating-linear-gradient(0deg, rgba(255,255,255,.016) 0 1px, transparent 1px 3px); - pointer-events: none; - z-index: 60; -} - -::selection { background: rgba(245,165,36,.28); color: #fff; } +::selection { background: var(--amber); color: var(--ink); } :focus-visible { - outline: none; - box-shadow: 0 0 0 1px var(--bg), 0 0 0 3px var(--amber); + outline: 1px solid var(--amber); + outline-offset: 1px; } /* ------------------------------------------------ header */ .header { - position: relative; - z-index: 1; padding: 14px 14px 12px; border-bottom: 1px solid var(--line); - background: linear-gradient(180deg, rgba(245,165,36,.045) 0%, transparent 100%); + background: var(--bg-raise); } .header-brand { display: flex; align-items: center; gap: 11px; } -/* radar: rotating sweep ring + teal blip around the key */ +/* radar: rotating sweep ring + blip around the key */ .radar { position: relative; flex: none; @@ -84,7 +65,7 @@ body::after { height: 38px; border-radius: 50%; border: 1px solid var(--line-strong); - background: radial-gradient(circle at 50% 42%, #0d1320 0%, #070a11 72%); + background: var(--bg); display: grid; place-items: center; } @@ -94,7 +75,7 @@ body::after { inset: -1px; border-radius: 50%; background: conic-gradient(from 0deg, - rgba(245,165,36,.95) 0deg, rgba(245,165,36,.22) 60deg, transparent 95deg); + var(--amber) 0deg, rgba(245,165,36,.15) 60deg, transparent 95deg); -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 2.5px), #000 calc(100% - 1.5px)); mask: radial-gradient(farthest-side, transparent calc(100% - 2.5px), #000 calc(100% - 1.5px)); animation: radar-sweep 4.2s linear infinite; @@ -108,7 +89,6 @@ body::after { height: 3px; border-radius: 50%; background: var(--teal); - box-shadow: 0 0 6px var(--teal); animation: blip 2.1s ease-in-out infinite; } .header-icon { width: 20px; height: 20px; display: block; } @@ -135,8 +115,7 @@ body::after { color: var(--text-faint); border: 1px solid var(--line); padding: 2px 5px; - border-radius: 2px; - background: var(--bg-raise); + background: var(--bg); } .version::before { content: "["; color: var(--line-strong); } .version::after { content: "]"; color: var(--line-strong); } @@ -148,9 +127,9 @@ body::after { color: var(--text-faint); white-space: nowrap; } -.header-tagline::before { content: "// "; color: var(--amber); opacity: .7; } +.header-tagline::before { content: "// "; color: var(--amber); } -/* armed badge — pulsing status LED */ +/* armed badge — flat status LED */ .live-badge { flex: none; display: inline-flex; @@ -160,30 +139,25 @@ body::after { font-weight: 700; letter-spacing: .2em; color: var(--green); - border: 1px solid rgba(61,220,151,.32); - background: rgba(61,220,151,.06); + border: 1px solid rgba(61,220,151,.4); padding: 4px 7px 4px 6px; - border-radius: 2px; } .live-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--green); - box-shadow: 0 0 8px var(--green); animation: pulse 1.5s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: .25; } } -/* ------------------------------------------------ stats */ +/* ------------------------------------------------ stats: one segmented strip, no cards */ .stats { - position: relative; - z-index: 1; display: flex; - gap: 8px; - padding: 10px 14px; - border-bottom: 1px solid var(--line); + margin: 10px 14px; + border: 1px solid var(--line); + background: var(--bg-raise); } .stat-card { @@ -192,22 +166,8 @@ body::after { flex-direction: column; gap: 4px; padding: 9px 11px 8px; - background: var(--bg-raise); - border: 1px solid var(--line); - border-radius: 3px; - position: relative; - overflow: hidden; } -.stat-card::before { - content: ""; - position: absolute; - top: 0; left: 0; right: 0; - height: 1px; - background: linear-gradient(90deg, var(--accent, var(--amber)), transparent 70%); - opacity: .8; -} -.stat-findings { --accent: var(--amber); } -.stat-keywords { --accent: var(--teal); } +.stat-card + .stat-card { border-left: 1px solid var(--line); } .stat-top { display: flex; align-items: center; gap: 6px; } @@ -216,8 +176,9 @@ body::after { height: 4px; border-radius: 50%; background: var(--accent, var(--amber)); - box-shadow: 0 0 5px var(--accent, var(--amber)); } +.stat-findings { --accent: var(--amber); } +.stat-keywords { --accent: var(--teal); } .stat-label { font-size: 8.5px; @@ -237,7 +198,7 @@ body::after { /* ------------------------------------------------ watchlist */ -.section { position: relative; z-index: 1; padding: 12px 14px 10px; } +.section { padding: 2px 14px 10px; } .section-title { font-size: 9px; @@ -247,9 +208,14 @@ body::after { letter-spacing: .22em; margin-bottom: 9px; display: flex; - align-items: baseline; + align-items: center; gap: 7px; } +.section-title::after { + content: ""; + flex: 1; + border-top: 1px dashed var(--line); +} .section-sub { font-size: 8.5px; font-weight: 400; @@ -264,13 +230,12 @@ body::after { align-items: stretch; background: var(--bg-raise); border: 1px solid var(--line-strong); - border-radius: 3px; margin-bottom: 8px; transition: border-color .15s var(--ease), box-shadow .15s var(--ease); } .keyword-form:focus-within { border-color: var(--amber); - box-shadow: 0 0 0 1px rgba(245,165,36,.35), 0 0 18px rgba(245,165,36,.07); + box-shadow: 0 0 0 1px var(--amber); } .prompt { @@ -301,9 +266,8 @@ body::after { margin: 3px; padding: 0 13px; background: var(--amber); - color: #120a00; + color: var(--ink); border: none; - border-radius: 2px; font-family: var(--mono); font-size: 10px; font-weight: 700; @@ -317,17 +281,16 @@ body::after { .error-msg { padding: 6px 9px; - background: rgba(255,92,92,.07); - border: 1px solid rgba(255,92,92,.3); + background: rgba(255,92,92,.08); + border: 1px solid rgba(255,92,92,.35); border-left-width: 2px; - border-radius: 2px; color: var(--red); font-size: 10px; letter-spacing: .04em; margin-bottom: 8px; animation: shake .3s var(--ease); } -.error-msg::before { content: "ERR // "; font-weight: 700; opacity: .7; } +.error-msg::before { content: "ERR // "; font-weight: 700; } @keyframes shake { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-3px); } @@ -350,9 +313,7 @@ body::after { align-items: center; gap: 9px; padding: 5px 7px; - border-radius: 2px; - border-left: 2px solid transparent; - transition: background .12s var(--ease), border-color .12s var(--ease); + transition: background .12s var(--ease); } .keyword-item::before { content: counter(kw, decimal-leading-zero); @@ -361,10 +322,8 @@ body::after { letter-spacing: .05em; flex: none; } -.keyword-item:hover { - background: var(--bg-raise); - border-left-color: var(--teal); -} +.keyword-item:hover { background: var(--bg-raise); } +.keyword-item:hover .keyword-label { color: var(--teal); } .keyword-label { flex: 1; @@ -374,6 +333,7 @@ body::after { white-space: nowrap; font-size: 11.5px; color: var(--text); + transition: color .12s var(--ease); } .keyword-remove { @@ -388,15 +348,13 @@ body::after { font-size: 13px; line-height: 1; cursor: pointer; - border-radius: 2px; opacity: .45; transition: all .12s var(--ease); } .keyword-item:hover .keyword-remove { opacity: 1; } .keyword-remove:hover { - background: rgba(255,92,92,.1); - border-color: rgba(255,92,92,.35); - color: var(--red); + background: var(--red); + color: var(--ink); } .empty-state { @@ -406,15 +364,12 @@ body::after { font-size: 10.5px; letter-spacing: .06em; border: 1px dashed var(--line-strong); - border-radius: 3px; } .empty-state::before { content: "[ empty watchlist ]"; display: block; margin-bottom: 2px; opacity: .6; } /* ------------------------------------------------ footer */ .footer { - position: relative; - z-index: 1; padding: 10px 14px 14px; border-top: 1px solid var(--line); } @@ -438,9 +393,9 @@ body::after { height: 11px; margin-left: 3px; background: var(--amber); - animation: cursor-blink 1s steps(1) infinite; + animation: cursor-blink 1.06s steps(1) infinite; } -@keyframes cursor-blink { 0%, 55% { opacity: 1; } 56%, 100% { opacity: 0; } } +@keyframes cursor-blink { 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0; } } .results-btn { display: flex; @@ -449,9 +404,8 @@ body::after { gap: 8px; padding: 10px; background: var(--amber); - color: #120a00; + color: var(--ink); text-decoration: none; - border-radius: 3px; font-size: 11px; font-weight: 700; text-transform: uppercase; @@ -467,7 +421,7 @@ body::after { ::-webkit-scrollbar { width: 5px; } ::-webkit-scrollbar-track { background: transparent; } -::-webkit-scrollbar-thumb { background: #1c2536; border-radius: 3px; } +::-webkit-scrollbar-thumb { background: #1c2536; } ::-webkit-scrollbar-thumb:hover { background: #2a3650; } /* ------------------------------------------------ reduced motion */ diff --git a/css/results.css b/css/results.css index c8ccf37..7f0444f 100644 --- a/css/results.css +++ b/css/results.css @@ -1,18 +1,20 @@ /* ============================================================ KeyFinder — findings console - dark instrument panel · amber = action · teal = secrets + flat terminal discipline: value-step surfaces, 1px hairlines, + reverse-video emphasis, zero glow, zero surface effects severity scale: red > orange > yellow > teal ============================================================ */ :root { --bg: #05070c; - --bg-raise: #0a0e16; - --bg-overlay: #101623; + --bg-raise: #090d14; + --bg-overlay: #0d131d; --line: #1a2233; --line-strong: #2a3650; --text: #d6dde8; --text-dim: #8b96a8; --text-faint: #525d70; + --ink: #05070c; --amber: #f5a524; --amber-hot: #ffc45c; --teal: #45d0c4; @@ -39,40 +41,19 @@ body { font-feature-settings: "tnum"; } -/* vignette + scanlines */ -body::before { - content: ""; - position: fixed; - inset: 0; - background: radial-gradient(130% 70% at 50% -10%, rgba(245,165,36,.05) 0%, transparent 45%), - radial-gradient(120% 100% at 50% 115%, rgba(0,0,0,.45) 0%, transparent 55%); - pointer-events: none; - z-index: 0; -} -body::after { - content: ""; - position: fixed; - inset: 0; - background: repeating-linear-gradient(0deg, rgba(255,255,255,.014) 0 1px, transparent 1px 3px); - pointer-events: none; - z-index: 90; -} - -::selection { background: rgba(245,165,36,.28); color: #fff; } +::selection { background: var(--amber); color: var(--ink); } :focus-visible { - outline: none; - box-shadow: 0 0 0 1px var(--bg), 0 0 0 3px var(--amber); + outline: 1px solid var(--amber); + outline-offset: 1px; } /* ------------------------------------------------ header */ .header { - position: relative; - z-index: 1; padding: 14px 24px 12px; border-bottom: 1px solid var(--line); - background: linear-gradient(180deg, rgba(245,165,36,.04) 0%, transparent 100%); + background: var(--bg-raise); display: flex; flex-direction: column; gap: 11px; @@ -96,7 +77,7 @@ body::after { height: 42px; border-radius: 50%; border: 1px solid var(--line-strong); - background: radial-gradient(circle at 50% 42%, #0d1320 0%, #070a11 72%); + background: var(--bg); display: grid; place-items: center; } @@ -106,7 +87,7 @@ body::after { inset: -1px; border-radius: 50%; background: conic-gradient(from 0deg, - rgba(245,165,36,.95) 0deg, rgba(245,165,36,.22) 60deg, transparent 95deg); + var(--amber) 0deg, rgba(245,165,36,.15) 60deg, transparent 95deg); -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 2.5px), #000 calc(100% - 1.5px)); mask: radial-gradient(farthest-side, transparent calc(100% - 2.5px), #000 calc(100% - 1.5px)); animation: radar-sweep 4.2s linear infinite; @@ -120,7 +101,6 @@ body::after { height: 3px; border-radius: 50%; background: var(--teal); - box-shadow: 0 0 6px var(--teal); animation: blip 2.1s ease-in-out infinite; } .header-icon { width: 22px; height: 22px; display: block; } @@ -145,8 +125,7 @@ body::after { color: var(--text-faint); border: 1px solid var(--line); padding: 2px 5px; - border-radius: 2px; - background: var(--bg-raise); + background: var(--bg); } .version::before { content: "["; color: var(--line-strong); } .version::after { content: "]"; color: var(--line-strong); } @@ -158,7 +137,7 @@ body::after { color: var(--text-faint); text-transform: uppercase; } -.header-sub::before { content: "// "; color: var(--amber); opacity: .7; } +.header-sub::before { content: "// "; color: var(--amber); } .live-badge { flex: none; @@ -169,17 +148,14 @@ body::after { font-weight: 700; letter-spacing: .2em; color: var(--green); - border: 1px solid rgba(61,220,151,.32); - background: rgba(61,220,151,.06); + border: 1px solid rgba(61,220,151,.4); padding: 4px 8px 4px 7px; - border-radius: 2px; } .live-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--green); - box-shadow: 0 0 8px var(--green); animation: pulse 1.5s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: .25; } } @@ -198,15 +174,14 @@ body::after { display: flex; align-items: center; gap: 7px; - background: var(--bg-raise); + background: var(--bg); border: 1px solid var(--line-strong); - border-radius: 3px; padding: 0 8px; transition: border-color .15s var(--ease), box-shadow .15s var(--ease); } .search-wrap:focus-within { border-color: var(--amber); - box-shadow: 0 0 0 1px rgba(245,165,36,.3), 0 0 18px rgba(245,165,36,.06); + box-shadow: 0 0 0 1px var(--amber); } .search-glyph { color: var(--amber); font-size: 13px; user-select: none; } .search-wrap input { @@ -228,7 +203,6 @@ body::after { color: var(--text-faint); border: 1px solid var(--line-strong); border-bottom-width: 2px; - border-radius: 3px; padding: 1px 5px; user-select: none; } @@ -242,7 +216,6 @@ body::after { text-transform: uppercase; letter-spacing: .1em; padding: 7px 12px; - border-radius: 3px; border: 1px solid transparent; cursor: pointer; transition: all .15s var(--ease); @@ -255,17 +228,17 @@ body::after { color: var(--text-dim); } .btn-secondary:hover { - color: var(--amber-hot); + color: var(--ink); + background: var(--amber); border-color: var(--amber); - background: rgba(245,165,36,.06); } .btn-danger { background: transparent; - border-color: rgba(255,92,92,.35); + border-color: rgba(255,92,92,.4); color: var(--red); } -.btn-danger:hover { background: rgba(255,92,92,.1); border-color: var(--red); } +.btn-danger:hover { background: var(--red); border-color: var(--red); color: var(--ink); } /* ------------------------------------------------ filter row */ @@ -281,10 +254,8 @@ body::after { .filter { display: flex; align-items: center; - gap: 0; - background: var(--bg-raise); + background: var(--bg); border: 1px solid var(--line); - border-radius: 3px; overflow: hidden; transition: border-color .15s var(--ease); } @@ -296,7 +267,6 @@ body::after { letter-spacing: .16em; text-transform: uppercase; color: var(--amber); - background: rgba(245,165,36,.07); border-right: 1px solid var(--line); padding: 7px 7px 7px 9px; user-select: none; @@ -330,16 +300,14 @@ body::after { } .meta-line strong { color: var(--text-dim); font-weight: 600; } -/* ------------------------------------------------ stats bar */ +/* ------------------------------------------------ stats: one segmented strip, no cards */ .stats-bar { - position: relative; - z-index: 1; display: flex; flex-wrap: wrap; - gap: 8px; - padding: 12px 24px; - border-bottom: 1px solid var(--line); + margin: 12px 24px; + border: 1px solid var(--line); + background: var(--bg-raise); } .stat-item { @@ -349,23 +317,18 @@ body::after { flex-direction: column; gap: 4px; padding: 9px 12px 8px; - background: var(--bg-raise); - border: 1px solid var(--line); - border-radius: 3px; position: relative; - overflow: hidden; - transition: border-color .15s var(--ease), background .15s var(--ease); -} -.stat-item::before { - content: ""; - position: absolute; - top: 0; left: 0; right: 0; - height: 1px; - background: linear-gradient(90deg, var(--accent, var(--text-dim)), transparent 75%); + transition: background .15s var(--ease); } +.stat-item + .stat-item { border-left: 1px solid var(--line); } .stat-item[data-filter] { cursor: pointer; } -.stat-item[data-filter]:hover { background: var(--bg-overlay); border-color: var(--line-strong); } -.stat-item.active { border-color: var(--accent, var(--amber)); box-shadow: 0 0 0 1px var(--accent, var(--amber)) inset; } +.stat-item[data-filter]:hover { background: var(--bg-overlay); } + +/* reverse-video active filter */ +.stat-item.active { background: var(--accent, var(--amber)); } +.stat-item.active .stat-num, +.stat-item.active .stat-lbl { color: var(--ink); } +.stat-item.active .stat-led { background: var(--ink); } .stat-total { --accent: #d6dde8; } .stat-critical { --accent: var(--red); } @@ -381,7 +344,6 @@ body::after { height: 4px; border-radius: 50%; background: var(--accent, var(--text-dim)); - box-shadow: 0 0 5px var(--accent, var(--text-dim)); } .stat-critical .stat-led { animation: pulse 1.5s ease-in-out infinite; } @@ -405,14 +367,12 @@ body::after { /* ------------------------------------------------ ticker */ .ticker { - position: relative; - z-index: 1; display: flex; align-items: center; gap: 9px; padding: 7px 24px; + border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); - background: rgba(245,165,36,.03); font-size: 10px; letter-spacing: .05em; white-space: nowrap; @@ -426,7 +386,6 @@ body::after { height: 5px; border-radius: 50%; background: var(--amber); - box-shadow: 0 0 6px var(--amber); animation: pulse 1.5s ease-in-out infinite; } .ticker-label { @@ -443,50 +402,41 @@ body::after { } .ticker-text code { color: var(--teal); } -/* ------------------------------------------------ table shell */ +/* ------------------------------------------------ table shell: titled border */ -.main { position: relative; z-index: 1; padding: 16px 24px 20px; } +.main { padding: 14px 24px 20px; } -.table-shell { +.titled { position: relative; border: 1px solid var(--line); - border-radius: 4px; - background: rgba(10,14,22,.55); + background: var(--bg-raise); } -/* HUD corner brackets */ -.table-shell::before, -.table-shell::after { - content: ""; +.titled-label { position: absolute; - width: 9px; - height: 9px; - border: 0 solid var(--amber); - opacity: .55; - pointer-events: none; -} -.table-shell::before { top: -1px; left: -1px; border-top-width: 1px; border-left-width: 1px; } -.table-shell::after { bottom: -1px; right: -1px; border-bottom-width: 1px; border-right-width: 1px; } - -.shell-head { - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; - padding: 8px 12px; - border-bottom: 1px solid var(--line); -} -.shell-title { + top: -7px; + left: 12px; + z-index: 3; + background: var(--bg); + padding: 0 7px; font-size: 9.5px; font-weight: 700; letter-spacing: .18em; color: var(--text-dim); text-transform: uppercase; + line-height: 1.4; } -.shell-title::before { content: "● "; color: var(--amber); font-size: 7px; vertical-align: 1.5px; } -.shell-meta { +.titled-label::before { content: "● "; color: var(--amber); font-size: 7px; vertical-align: 1.5px; } +.titled-meta { + position: absolute; + top: -7px; + right: 12px; + z-index: 3; + background: var(--bg); + padding: 0 7px; font-size: 9px; letter-spacing: .1em; color: var(--text-faint); + line-height: 1.4; } .findings-table { @@ -497,7 +447,7 @@ body::after { } .findings-table thead th { - padding: 8px 12px; + padding: 12px 12px 8px; text-align: left; font-size: 8.5px; font-weight: 700; @@ -508,18 +458,18 @@ body::after { white-space: nowrap; position: sticky; top: 0; - background: var(--bg); + background: var(--bg-raise); z-index: 2; } .findings-table tbody tr { - border-bottom: 1px solid rgba(26,34,51,.5); + border-bottom: 1px solid rgba(26,34,51,.55); transition: background .1s var(--ease); } .findings-table tbody tr:last-child { border-bottom: none; } -.findings-table tbody tr:hover { background: rgba(255,255,255,.022); } +.findings-table tbody tr:hover { background: var(--bg-overlay); } -/* severity accent on the row's leading edge */ +/* severity accent on the row's leading edge — functional color coding */ .findings-table tbody tr td:first-child { box-shadow: inset 2px 0 0 transparent; } .findings-table tbody tr.sev-critical td:first-child { box-shadow: inset 2px 0 0 var(--red); } .findings-table tbody tr.sev-high td:first-child { box-shadow: inset 2px 0 0 var(--orange); } @@ -549,19 +499,17 @@ body::after { .td-num { color: var(--text-faint); font-size: 9.5px; } -/* severity badge — LED + label */ +/* severity badge — flat LED + label */ .badge { display: inline-flex; align-items: center; gap: 6px; padding: 3px 8px 3px 7px; - border-radius: 2px; font-size: 8.5px; font-weight: 700; letter-spacing: .14em; color: var(--sev, var(--text-dim)); - border: 1px solid color-mix(in srgb, var(--sev, #8b96a8) 38%, transparent); - background: color-mix(in srgb, var(--sev, #8b96a8) 8%, transparent); + border: 1px solid color-mix(in srgb, var(--sev, #8b96a8) 45%, transparent); } .badge::before { content: ""; @@ -569,7 +517,6 @@ body::after { height: 4px; border-radius: 50%; background: var(--sev, var(--text-dim)); - box-shadow: 0 0 5px var(--sev, transparent); } .badge-critical { --sev: var(--red); } .badge-critical::before { animation: pulse 1.5s ease-in-out infinite; } @@ -581,22 +528,20 @@ body::after { .type-badge { display: inline-block; padding: 2px 7px; - background: var(--bg-raise); + background: var(--bg); border: 1px solid var(--line); - border-radius: 2px; font-size: 9px; letter-spacing: .06em; color: var(--text-dim); } -/* the recovered secret — teal mono chip, click to copy */ +/* the recovered secret — teal mono chip, reverse video on hover */ .match-value { font-family: var(--mono); font-size: 10.5px; - background: rgba(69,208,196,.06); + background: var(--bg); padding: 3px 8px; - border-radius: 2px; - border: 1px solid rgba(69,208,196,.22); + border: 1px solid rgba(69,208,196,.35); color: var(--teal); max-width: 220px; display: inline-block; @@ -607,9 +552,9 @@ body::after { transition: all .12s var(--ease); } .match-value:hover { - background: rgba(69,208,196,.12); + background: var(--teal); border-color: var(--teal); - box-shadow: 0 0 12px rgba(69,208,196,.12); + color: var(--ink); } .td-provider { font-weight: 700; color: var(--text); font-size: 10.5px; letter-spacing: .04em; max-width: 130px; } @@ -618,8 +563,8 @@ body::after { .td-source { max-width: 200px; } .td-time { color: var(--text-faint); font-size: 10px; white-space: nowrap; } -a { color: var(--teal); text-decoration: none; border-bottom: 1px dashed rgba(69,208,196,.35); } -a:hover { color: #8be8de; border-bottom-style: solid; } +a { color: var(--teal); text-decoration: none; border-bottom: 1px dashed rgba(69,208,196,.4); } +a:hover { color: var(--ink); background: var(--teal); border-bottom-color: var(--teal); } /* row actions — revealed on row hover */ .td-actions { white-space: nowrap; text-align: right; } @@ -629,7 +574,6 @@ a:hover { color: #8be8de; border-bottom-style: solid; } padding: 3px 8px; background: transparent; border: 1px solid var(--line-strong); - border-radius: 2px; color: var(--text-faint); font-size: 9px; font-weight: 700; @@ -642,15 +586,14 @@ a:hover { color: #8be8de; border-bottom-style: solid; } } .findings-table tbody tr:hover .btn-icon, .btn-icon:focus-visible { opacity: 1; } -.btn-icon:hover { color: var(--amber-hot); border-color: var(--amber); background: rgba(245,165,36,.06); } -.btn-icon.copied { color: var(--green); border-color: var(--green); } -.btn-icon-danger:hover { color: var(--red); border-color: var(--red); background: rgba(255,92,92,.08); } +.btn-icon:hover { color: var(--ink); background: var(--amber); border-color: var(--amber); } +.btn-icon.copied { color: var(--ink); background: var(--green); border-color: var(--green); } +.btn-icon-danger:hover { color: var(--ink); background: var(--red); border-color: var(--red); } /* skeleton loading rows */ .skl-row td { padding: 9px 12px; } .skl { height: 9px; - border-radius: 2px; background: linear-gradient(90deg, #0c1119 25%, #151c2b 50%, #0c1119 75%); background-size: 200% 100%; animation: shimmer 1.15s linear infinite; @@ -666,12 +609,12 @@ a:hover { color: #8be8de; border-bottom-style: solid; } color: var(--text-faint); } -.empty-radar { width: 72px; height: 72px; margin-bottom: 18px; opacity: .8; } +.empty-radar { width: 72px; height: 72px; margin-bottom: 18px; opacity: .85; } .er-ring { fill: none; stroke: var(--line-strong); stroke-width: 1; } .er-cross { stroke: var(--line); stroke-width: 1; } .er-core { fill: var(--teal); } .er-sweep { - fill: rgba(245,165,36,.14); + fill: rgba(245,165,36,.16); transform-origin: 36px 36px; animation: radar-sweep 4.2s linear infinite; } @@ -695,7 +638,6 @@ a:hover { color: #8be8de; border-bottom-style: solid; } font-size: 9.5px; letter-spacing: .1em; color: var(--amber); - opacity: .75; } .empty-hint::before { content: "» "; } @@ -708,7 +650,6 @@ a:hover { color: #8be8de; border-bottom-style: solid; } letter-spacing: .14em; color: var(--text-faint); text-transform: uppercase; - opacity: .7; } .footer-sep { margin: 0 8px; color: var(--line-strong); } @@ -716,7 +657,7 @@ a:hover { color: #8be8de; border-bottom-style: solid; } ::-webkit-scrollbar { width: 7px; height: 7px; } ::-webkit-scrollbar-track { background: transparent; } -::-webkit-scrollbar-thumb { background: #1c2536; border-radius: 4px; } +::-webkit-scrollbar-thumb { background: #1c2536; } ::-webkit-scrollbar-thumb:hover { background: #2a3650; } /* ------------------------------------------------ reduced motion */ diff --git a/manifest.firefox.json b/manifest.firefox.json index 23ad668..57b0516 100644 --- a/manifest.firefox.json +++ b/manifest.firefox.json @@ -1,7 +1,7 @@ { "name": "KeyFinder", "description": "Passively discovers API keys, tokens, and secrets leaked in page scripts, DOM, network responses, and browser storage. Available for Chrome and Firefox.", - "version": "2.2.0", + "version": "2.2.1", "manifest_version": 3, "browser_specific_settings": { "gecko": { diff --git a/manifest.json b/manifest.json index cb9b09a..d7d89ed 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "KeyFinder", "description": "Passively discovers API keys, tokens, and secrets leaked in page scripts, DOM, network responses, and browser storage. Available for Chrome and Firefox.", - "version": "2.2.0", + "version": "2.2.1", "manifest_version": 3, "action": { "default_icon": { diff --git a/preview/preview-stub-empty.js b/preview/preview-stub-empty.js index 157194c..e86eb9e 100644 --- a/preview/preview-stub-empty.js +++ b/preview/preview-stub-empty.js @@ -29,7 +29,7 @@ window.chrome = { runtime: { - getManifest: () => ({ version: "2.2.0" }), + getManifest: () => ({ version: "2.2.1" }), sendMessage: async (msg) => { switch (msg && msg.type) { case "getFindings": return { findings: [] }; diff --git a/preview/preview-stub.js b/preview/preview-stub.js index 8440831..fddc0cc 100644 --- a/preview/preview-stub.js +++ b/preview/preview-stub.js @@ -29,7 +29,7 @@ window.chrome = { runtime: { - getManifest: () => ({ version: "2.2.0" }), + getManifest: () => ({ version: "2.2.1" }), sendMessage: async (msg) => { switch (msg && msg.type) { case "getFindings": return { findings: SAMPLE_FINDINGS.slice() }; diff --git a/preview/results-preview.html b/preview/results-preview.html index 3163598..3ef132d 100644 --- a/preview/results-preview.html +++ b/preview/results-preview.html @@ -70,11 +70,9 @@
-
-
- findings.log - -
+
+ findings.log + diff --git a/preview/shot-empty.png b/preview/shot-empty.png index a48f594..6ae4124 100644 Binary files a/preview/shot-empty.png and b/preview/shot-empty.png differ diff --git a/preview/shot-popup.png b/preview/shot-popup.png index eecc203..7907602 100644 Binary files a/preview/shot-popup.png and b/preview/shot-popup.png differ diff --git a/preview/shot-results.png b/preview/shot-results.png index 7390eac..189c24c 100644 Binary files a/preview/shot-results.png and b/preview/shot-results.png differ diff --git a/preview/store-popup.html b/preview/store-popup.html index 24cd9fb..d538c73 100644 --- a/preview/store-popup.html +++ b/preview/store-popup.html @@ -9,7 +9,7 @@
-
KEYFINDER v2.2.0 — PASSIVE SCANNER
+
KEYFINDER v2.2.1 — PASSIVE SCANNER

Catch leaked keys
while you browse.

KeyFinder passively scans every page for exposed API keys, tokens and credentials — across scripts, DOM, storage and network responses.

    @@ -19,8 +19,7 @@
diff --git a/preview/store.css b/preview/store.css index d15052d..3e839e4 100644 --- a/preview/store.css +++ b/preview/store.css @@ -19,14 +19,13 @@ body.store { padding: 0 64px; } -/* ambient brand glows */ +/* ambient depth: a single flat value step, no glow washes */ .stage::before { content: ""; position: absolute; inset: 0; background: - radial-gradient(560px 420px at 12% 18%, rgba(245,165,36,.09) 0%, transparent 60%), - radial-gradient(620px 480px at 88% 82%, rgba(69,208,196,.07) 0%, transparent 60%); + radial-gradient(700px 500px at 85% 80%, rgba(69,208,196,.045) 0%, transparent 65%); pointer-events: none; } @@ -103,12 +102,8 @@ body.store { flex: none; width: 372px; border: 1px solid var(--line-strong); - border-radius: 8px; overflow: hidden; - box-shadow: - 0 0 0 1px rgba(245,165,36,.08), - 0 24px 80px rgba(0,0,0,.65), - 0 0 120px rgba(245,165,36,.05); + box-shadow: 0 24px 80px rgba(0,0,0,.6); } .popup-frame::before { content: ""; diff --git a/results.html b/results.html index 1e42710..8ca0f3e 100644 --- a/results.html +++ b/results.html @@ -70,11 +70,9 @@
-
-
- findings.log - -
+
+ findings.log +
diff --git a/store/store-1-dashboard.png b/store/store-1-dashboard.png index df6b482..6f296b6 100644 Binary files a/store/store-1-dashboard.png and b/store/store-1-dashboard.png differ diff --git a/store/store-2-popup.png b/store/store-2-popup.png index 29e2df0..d02eb18 100644 Binary files a/store/store-2-popup.png and b/store/store-2-popup.png differ diff --git a/store/store-3-empty.png b/store/store-3-empty.png index 35c3d22..dfa8a7c 100644 Binary files a/store/store-3-empty.png and b/store/store-3-empty.png differ