:root {
--bg: #000000;
--bg-elev: #0a0a0a;
--bg-inset: #101010;
--border: #242424;
--border-hi: #383838;
--text: #ededed;
--text-muted: #8f8f8f;
--text-dim: #5a5a5a;
--accent-primary: #ffd60a;
--accent-ink: #000000;
--accent-soft: rgba(255, 214, 10, 0.12);
--accent-line: rgba(255, 214, 10, 0.55);
--radius: 0px;
--grid-line: rgba(255, 255, 255, 0.025);
--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, "Helvetica Neue", Arial, sans-serif;
--font-mono: ui-monospace, "SF Mono", SFMono-Regular, "Cascadia Code", "Roboto Mono", Menlo, Consolas, monospace;
--color-critical: #ff453a;
--color-high: #ff9f0a;
--color-medium: #ffd60a;
--color-low: #a0a0a0;
--color-info: #6a6a6a;
--color-client-safe:#30d158;
--color-live: #ffd60a;
--color-revoked: #8f8f8f;
--color-dead: #5a5a5a;
--color-rate-limited: #ededed;
--color-error: #ff4d4d;
--color-unverifiable: #8f8f8f;
--color-skipped: #5a5a5a;
--badge-critical-ink: #ffffff;
--badge-high-ink: #000000;
--badge-medium-ink: #000000;
}
[data-theme="light"] {
--bg: #ffffff;
--bg-elev: #fafafa;
--bg-inset: #f5f5f5;
--border: #eaeaea;
--border-hi: #cfcfcf;
--text: #0a0a0a;
--text-muted: #666666;
--text-dim: #999999;
--accent-primary: #e0a400;
--accent-ink: #000000;
--accent-soft: rgba(224, 164, 0, 0.14);
--accent-line: rgba(224, 164, 0, 0.6);
--grid-line: rgba(0, 0, 0, 0.04);
--color-critical: #e5484d;
--color-high: #b07d00;
--color-medium: #0a0a0a;
--color-low: #666666;
--color-info: #999999;
--color-client-safe:#666666;
--color-live: #b07d00;
--color-revoked: #666666;
--color-dead: #999999;
--color-rate-limited: #0a0a0a;
--color-error: #e5484d;
--color-unverifiable: #666666;
--color-skipped: #999999;
--badge-critical-ink: #ffffff;
--badge-high-ink: #000000;
--badge-medium-ink: #ffffff;
}
[data-theme="matrix"] {
--bg: #000000;
--bg-elev: #020a02;
--bg-inset: #010801;
--border: #0c3b0c;
--border-hi: #146614;
--text: #00ff66;
--text-muted: #0a9a3e;
--text-dim: #066a29;
--accent-primary: #00ff66;
--accent-ink: #000000;
--accent-soft: rgba(0, 255, 102, 0.10);
--accent-line: rgba(0, 255, 102, 0.55);
--grid-line: rgba(0, 255, 102, 0.04);
--font-sans: var(--font-mono);
--color-critical: #aaff00;
--color-high: #00ff66;
--color-medium: #0a9a3e;
--color-low: #066a29;
--color-info: #066a29;
--color-client-safe:#0a9a3e;
--color-live: #aaff00;
--color-revoked: #066a29;
--color-dead: #044d1d;
--color-rate-limited: #00ff66;
--color-error: #aaff00;
--color-unverifiable: #0a9a3e;
--color-skipped: #066a29;
--badge-critical-ink: #000000;
--badge-high-ink: #000000;
--badge-medium-ink: #000000;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: var(--bg);
color: var(--text);
font-family: var(--font-sans);
min-height: 100vh;
padding: 40px 28px;
position: relative;
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
body::before {
content: "";
position: fixed;
inset: 0;
background-image:
linear-gradient(var(--grid-line) 1px, transparent 1px),
linear-gradient(90deg, var(--grid-line) 1px, transparent 1px);
background-size: 46px 46px;
pointer-events: none;
z-index: 0;
}
.report-container {
max-width: 1320px;
margin: 0 auto;
position: relative;
z-index: 1;
}
button:focus-visible,
input:focus-visible,
tbody tr:focus-visible {
outline: 2px solid var(--accent-primary);
outline-offset: 1px;
}
header {
display: flex;
justify-content: space-between;
align-items: flex-end;
margin-bottom: 30px;
padding-bottom: 22px;
border-bottom: 1px solid var(--border);
}
.logo-lockup {
display: flex;
align-items: center;
}
.logo-word {
display: flex;
flex-direction: column;
gap: 3px;
}
.logo-name {
font-size: 23px;
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1;
color: var(--text);
}
.logo-sub {
font-family: var(--font-mono);
font-size: 10px;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--text-muted);
}
.theme-selector {
display: flex;
border: 1px solid var(--border);
}
.theme-btn {
background: transparent;
border: none;
border-right: 1px solid var(--border);
color: var(--text-muted);
padding: 7px 13px;
font-size: 11px;
font-weight: 500;
letter-spacing: 0.08em;
cursor: pointer;
font-family: var(--font-mono);
transition: color 0.14s ease, background 0.14s ease;
}
.theme-btn:last-child { border-right: none; }
.theme-btn:hover { color: var(--text); }
.theme-btn.active { background: var(--accent-primary); color: var(--accent-ink); }
.dashboard-grid {
display: grid;
grid-template-columns: 296px minmax(0, 1fr);
gap: 22px;
align-items: start;
}
@media (max-width: 1024px) {
.dashboard-grid { grid-template-columns: 1fr; }
}
.sidebar { display: flex; flex-direction: column; gap: 22px; }
.main-content { display: flex; flex-direction: column; gap: 22px; min-width: 0; }
.card {
background: var(--bg-elev);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 20px;
transition: border-color 0.2s ease, transform 0.2s ease;
}
.card h2 {
font-size: 11px;
font-weight: 500;
letter-spacing: 0.13em;
text-transform: uppercase;
color: var(--text-muted);
margin-bottom: 18px;
font-family: var(--font-mono);
}
.metric-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
margin-bottom: 10px;
}
.stat-box {
background: var(--bg-inset);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 16px;
}
.stat-val {
font-size: 30px;
font-weight: 600;
font-family: var(--font-mono);
letter-spacing: -0.03em;
line-height: 1;
font-variant-numeric: tabular-nums;
}
.stat-lbl {
font-size: 10px;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.1em;
margin-top: 9px;
font-family: var(--font-mono);
}
.chart-container {
display: flex;
justify-content: center;
align-items: center;
height: 168px;
margin: 4px 0 2px;
}
.chart-svg { width: 150px; height: 150px; overflow: visible; }
.chart-hole { fill: transparent; }
.chart-track {
fill: none;
stroke: var(--border);
stroke-width: 12;
opacity: 0.5;
}
.chart-segment {
fill: none;
stroke-width: 12;
stroke-linecap: round;
stroke-dasharray: 0 100;
stroke-dashoffset: 0;
transform: rotate(-90deg);
transform-origin: 50% 50%;
}
.chart-center-num {
fill: var(--text);
font-family: var(--font-mono);
font-size: 9px;
font-weight: 700;
letter-spacing: -0.03em;
}
.chart-center-lbl {
fill: var(--text-muted);
font-family: var(--font-mono);
font-size: 3px;
letter-spacing: 0.22em;
text-transform: uppercase;
}
.chart-legend {
display: flex;
flex-wrap: wrap;
gap: 5px 12px;
justify-content: center;
margin-top: 4px;
}
.legend-item {
display: inline-flex;
align-items: center;
gap: 6px;
font-family: var(--font-mono);
font-size: 10px;
color: var(--text-muted);
}
.legend-swatch { width: 8px; height: 8px; border-radius: 2px; flex-shrink: 0; }
.legend-count { color: var(--text); font-weight: 700; }
.chart-bar-container { display: flex; flex-direction: column; gap: 12px; margin-top: 6px; }
.chart-bar-item { display: flex; flex-direction: column; gap: 6px; }
.chart-bar-label {
display: flex;
justify-content: space-between;
font-size: 11px;
font-family: var(--font-mono);
color: var(--text-muted);
}
.chart-bar-track {
width: 100%;
height: 6px;
background: var(--bg-inset);
border: 1px solid var(--border);
overflow: hidden;
}
.chart-bar-fill { height: 100%; background: var(--service-bar-color, var(--accent-primary)); }
.filter-group { margin-bottom: 4px; }
.filter-group label {
display: flex;
align-items: center;
gap: 9px;
font-size: 12px;
margin-bottom: 10px;
cursor: pointer;
color: var(--text-muted);
font-family: var(--font-mono);
}
.filter-group label:hover { color: var(--text); }
.filter-group label input { accent-color: var(--accent-primary); cursor: pointer; }
.search-input {
width: 100%;
background: var(--bg-inset);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 10px 12px;
color: var(--text);
font-family: var(--font-mono);
font-size: 13px;
margin-bottom: 14px;
}
.search-input::placeholder { color: var(--text-dim); }
.search-input:focus { outline: none; border-color: var(--accent-primary); }
.result-count {
color: var(--text-dim);
font-size: 11px;
margin: -6px 0 16px;
font-family: var(--font-mono);
letter-spacing: 0.02em;
}
.tabs {
display: flex;
gap: 2px;
margin-bottom: 16px;
border-bottom: 1px solid var(--border);
}
.tab-btn {
background: transparent;
border: none;
border-bottom: 2px solid transparent;
color: var(--text-muted);
padding: 8px 12px;
margin-bottom: -1px;
font-size: 12px;
font-weight: 500;
letter-spacing: 0.04em;
cursor: pointer;
font-family: var(--font-mono);
transition: color 0.14s ease, border-color 0.14s ease;
}
.tab-btn:hover { color: var(--text); }
.tab-btn.active { color: var(--text); border-bottom-color: var(--accent-primary); }
.findings-panel { display: flex; flex-direction: column; gap: 16px; }
.table-wrapper { overflow-x: auto; width: 100%; }
table { width: 100%; border-collapse: collapse; text-align: left; font-size: 13px; table-layout: fixed; }
thead th:nth-child(1), tbody td:nth-child(1) { width: 21%; }
thead th:nth-child(2), tbody td:nth-child(2) { width: 13%; }
thead th:nth-child(3), tbody td:nth-child(3) { width: 34%; }
thead th:nth-child(4), tbody td:nth-child(4) { width: 11%; }
thead th:nth-child(5), tbody td:nth-child(5) { width: 21%; }
thead th {
padding: 10px 16px;
color: var(--text-dim);
font-weight: 500;
text-transform: uppercase;
font-size: 10px;
letter-spacing: 0.11em;
font-family: var(--font-mono);
border-bottom: 1px solid var(--border);
}
tbody td {
padding: 13px 16px;
border-bottom: 1px solid var(--border);
vertical-align: top;
}
tbody td:nth-child(1) small { overflow-wrap: anywhere; }
.kh-service {
display: inline-block; max-width: 100%;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
vertical-align: bottom;
font-family: var(--font-mono); font-size: 12px;
}
.kh-path { font-family: var(--font-mono); display: flex; flex-direction: column; gap: 1px; min-width: 0; max-width: 100%; }
.kh-path-file {
color: var(--text); font-weight: 600; font-size: 12px;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.kh-path-dir {
color: var(--text-muted); font-size: 11px;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.kh-path-line { color: var(--accent-primary); margin-left: 1px; }
tbody tr.finding-row { cursor: pointer; transition: background 0.12s ease; }
tbody tr.finding-row:hover { background: var(--bg-inset); }
tbody tr.finding-row:hover td:first-child { box-shadow: inset 2px 0 0 var(--accent-primary); }
.badge {
display: inline-flex;
align-items: center;
padding: 3px 8px;
font-size: 10px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.06em;
font-family: var(--font-mono);
border: 1px solid currentColor;
border-radius: var(--radius);
white-space: nowrap;
}
.badge-critical { color: var(--badge-critical-ink); background: var(--color-critical); border-color: var(--color-critical); }
.badge-high { color: var(--badge-high-ink); background: var(--color-high); border-color: var(--color-high); }
.badge-medium { color: var(--badge-medium-ink); background: var(--color-medium); border-color: var(--color-medium); }
.badge-low { color: var(--color-low); background: rgba(255, 255, 255, 0.03); }
.badge-info { color: var(--color-info); background: rgba(255, 255, 255, 0.02); }
.badge-client-safe { color: var(--color-client-safe); background: rgba(48, 209, 88, 0.09); }
.status-badge {
display: inline-flex;
align-items: flex-start;
gap: 7px;
font-family: var(--font-mono);
}
.status-text { display: flex; flex-direction: column; gap: 1px; min-width: 0; line-height: 1.25; }
.status-primary { font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.status-qual { font-size: 10px; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.status-dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; margin-top: 4px; }
.dot-live { background: var(--color-live); box-shadow: 0 0 8px var(--color-live); }
.dot-revoked { background: var(--color-revoked); }
.dot-dead { background: var(--color-dead); }
.dot-rate-limited { background: var(--color-rate-limited); }
.dot-error { background: var(--color-error); }
.dot-unverifiable { background: var(--color-unverifiable); }
.dot-skipped { background: var(--color-skipped); }
.dot-unattempted {
background: transparent !important;
box-shadow: none !important;
border: 1.5px dashed var(--text-muted);
width: 8px;
height: 8px;
}
.status-badge--unattempted .status-primary {
color: var(--text-muted);
text-decoration: underline dotted var(--border-hi);
text-underline-offset: 3px;
}
.verify-note { color: var(--accent-primary); font-size: 10px; font-family: var(--font-mono); }
.coverage-panel { margin-bottom: 18px; }
.coverage-dot {
display: inline-block;
width: 9px; height: 9px; border-radius: 50%;
margin-right: 7px; vertical-align: middle;
}
.coverage-dot--clean { background: var(--color-client-safe); box-shadow: 0 0 8px var(--color-client-safe); }
.coverage-dot--gapped { background: var(--color-high); box-shadow: 0 0 9px var(--color-high); }
.coverage-note {
color: var(--text-muted);
font-size: 12px;
font-family: var(--font-mono);
margin: 2px 0 0;
line-height: 1.5;
}
.coverage-panel.coverage-gapped .coverage-note { color: var(--color-high); }
.coverage-list {
list-style: none;
margin: 13px 0 0;
padding: 0;
display: flex;
flex-direction: column;
gap: 8px;
}
.coverage-item {
display: flex;
align-items: baseline;
gap: 11px;
font-size: 13px;
border-left: 2px solid var(--color-high);
padding-left: 10px;
}
.coverage-count {
font-family: var(--font-mono);
font-weight: 700;
color: var(--color-high);
min-width: 2.4em;
text-align: right;
}
.coverage-reason { color: var(--text); }
.details-row { display: none; }
.details-row.active { display: table-row; }
.details-row td { background: var(--bg-inset); }
.details-container {
padding: 24px;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24px;
}
@media (max-width: 768px) {
.details-container { grid-template-columns: 1fr; }
}
.details-block h3 {
font-size: 10px;
text-transform: uppercase;
color: var(--text-dim);
margin-bottom: 12px;
letter-spacing: 0.11em;
font-family: var(--font-mono);
}
.details-list { display: flex; flex-direction: column; gap: 9px; }
.details-item { display: flex; align-items: baseline; font-size: 12px; }
.details-lbl {
width: 150px;
flex-shrink: 0;
color: var(--text-dim);
font-family: var(--font-mono);
font-size: 11px;
}
.details-val {
color: var(--text);
word-break: break-all;
font-family: var(--font-mono);
font-size: 12px;
}
.cred-box {
display: inline-flex;
align-items: center;
gap: 8px;
background: var(--bg);
padding: 5px 10px;
border: 1px solid var(--border);
font-family: var(--font-mono);
}
.copy-btn {
background: transparent;
border: 1px solid var(--border);
color: var(--text-muted);
border-radius: var(--radius);
font-size: 10px;
font-weight: 500;
letter-spacing: 0.06em;
text-transform: uppercase;
padding: 2px 8px;
margin-left: 8px;
cursor: pointer;
font-family: var(--font-mono);
transition: color 0.14s ease, border-color 0.14s ease, transform 0.1s ease;
}
.copy-btn:hover { color: var(--text); border-color: var(--accent-primary); }
.copy-btn.copied { color: var(--accent-primary); border-color: var(--accent-primary); }
.copy-btn:active { transform: scale(0.94); }
.empty-state {
text-align: center;
padding: 48px;
color: var(--text-dim);
font-size: 13px;
font-family: var(--font-mono);
}
#cnt-live.has-live { color: var(--accent-primary); }
.risk-hero {
display: flex;
align-items: baseline;
flex-wrap: wrap;
gap: 8px 16px;
padding: 20px 24px;
margin-bottom: 22px;
background: var(--bg-elev);
border: 1px solid var(--border);
border-left: 3px solid var(--accent-primary);
}
.risk-hero-verdict {
font-size: 23px;
font-weight: 700;
letter-spacing: -0.02em;
color: var(--text);
}
.risk-hero-verdict.danger { color: var(--accent-primary); }
.risk-hero-verdict.warn { color: var(--color-high); }
.risk-hero-verdict.ok { color: var(--text-muted); }
.risk-hero.danger { border-left-color: var(--color-critical); }
.risk-hero.warn { border-left-color: var(--color-high); }
.risk-hero.ok { border-left-color: var(--border-hi); }
.risk-hero-sub {
font-family: var(--font-mono);
font-size: 12px;
color: var(--text-muted);
letter-spacing: 0.02em;
}
.scan-metadata {
display: grid;
grid-template-columns: repeat(6, minmax(0, 1fr));
gap: 1px;
margin: -8px 0 22px;
border: 1px solid var(--border);
background: var(--border);
}
.metadata-item {
min-width: 0;
padding: 12px 14px;
background: var(--bg-elev);
}
.metadata-label {
display: block;
margin-bottom: 5px;
color: var(--text-dim);
font-family: var(--font-mono);
font-size: 10px;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.metadata-value {
display: block;
color: var(--text);
font-family: var(--font-mono);
font-size: 12px;
line-height: 1.35;
overflow-wrap: anywhere;
}
@media (max-width: 1024px) {
.scan-metadata { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 720px) {
body { padding: 24px 14px; }
header {
align-items: flex-start;
flex-direction: column;
gap: 16px;
}
.theme-selector { width: 100%; }
.theme-btn { flex: 1; }
.scan-metadata { grid-template-columns: 1fr; }
.risk-hero { padding: 16px; }
.risk-hero-verdict { font-size: 19px; }
}
thead th.sortable { cursor: pointer; user-select: none; transition: color 0.14s ease; }
thead th.sortable:hover { color: var(--text); }
.sort-ind { color: var(--accent-primary); margin-left: 4px; }
@keyframes kh-rise {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes kh-row-in {
from { opacity: 0; transform: translateX(-6px); }
to { opacity: 1; transform: translateX(0); }
}
@keyframes kh-expand-in {
from { opacity: 0; transform: translateY(-5px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes kh-pulse-live {
0%, 100% { box-shadow: 0 0 4px var(--color-live); }
50% { box-shadow: 0 0 10px var(--color-live), 0 0 16px var(--color-live); }
}
@keyframes kh-pulse-critical {
0%, 100% { box-shadow: 0 0 0 0 rgba(255, 77, 77, 0); }
50% { box-shadow: 0 0 11px 0 rgba(255, 77, 77, 0.5); }
}
@keyframes kh-scanline {
0% { transform: translateY(-2px); opacity: 0.85; }
92% { opacity: 0.85; }
100% { transform: translateY(100vh); opacity: 0; }
}
@media (prefers-reduced-motion: no-preference) {
.report-container::after {
content: "";
position: fixed;
left: 0;
right: 0;
top: 0;
height: 1px;
background: linear-gradient(90deg, transparent, var(--accent-primary), transparent);
box-shadow: 0 0 14px var(--accent-line);
z-index: 999;
pointer-events: none;
animation: kh-scanline 1.05s cubic-bezier(0.4, 0, 0.2, 1) both;
}
header { animation: kh-rise 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; }
.risk-hero { animation: kh-rise 0.52s cubic-bezier(0.16, 1, 0.3, 1) both; animation-delay: 0.06s; }
.sidebar .card { animation: kh-rise 0.55s cubic-bezier(0.16, 1, 0.3, 1) both; }
.sidebar .card:nth-child(1) { animation-delay: 0.04s; }
.sidebar .card:nth-child(2) { animation-delay: 0.10s; }
.sidebar .card:nth-child(3) { animation-delay: 0.16s; }
.sidebar .card:nth-child(4) { animation-delay: 0.22s; }
.findings-panel .card { animation: kh-rise 0.55s cubic-bezier(0.16, 1, 0.3, 1) both; animation-delay: 0.1s; }
.finding-row--enter {
animation: kh-row-in 0.4s cubic-bezier(0.16, 1, 0.3, 1) both;
animation-delay: calc(var(--kh-i, 0) * 20ms);
}
.details-row.active .details-container {
animation: kh-expand-in 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;
}
.dot-live { animation: kh-pulse-live 1.8s ease-in-out infinite; }
.badge-critical { animation: kh-pulse-critical 2.4s ease-in-out infinite; }
.card:hover { transform: translateY(-1px); border-color: var(--border-hi); }
.chart-segment {
transition: stroke-dasharray 0.9s cubic-bezier(0.16, 1, 0.3, 1),
stroke-dashoffset 0.9s cubic-bezier(0.16, 1, 0.3, 1);
}
.chart-bar-fill { transition: width 0.85s cubic-bezier(0.16, 1, 0.3, 1); }
}
@media print {
:root,
[data-theme="keyhog"],
[data-theme="light"],
[data-theme="matrix"] {
--bg: #ffffff;
--bg-elev: #ffffff;
--bg-inset: #f5f5f5;
--border: #cfcfcf;
--border-hi: #999999;
--text: #000000;
--text-muted: #444444;
--text-dim: #666666;
--accent-primary: #000000;
--accent-ink: #ffffff;
--grid-line: transparent;
}
body { padding: 0; background: #ffffff; }
body::before,
.report-container::after,
.theme-selector,
.filter-group,
.search-input,
.copy-btn {
display: none !important;
}
.report-container { max-width: none; }
header,
.risk-hero,
.scan-metadata,
.card {
break-inside: avoid;
box-shadow: none;
}
.dashboard-grid,
.details-container,
.scan-metadata {
grid-template-columns: 1fr;
}
.sidebar { display: none; }
.findings-panel { width: 100%; }
.details-row.active { display: table-row; }
table { font-size: 10px; }
}