Spaces:
Paused
Paused
File size: 17,076 Bytes
efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a c2a0864 4a97a7a efeddde 4a97a7a c2a0864 4a97a7a c2a0864 4a97a7a c2a0864 4a97a7a efeddde 4a97a7a c2a0864 efeddde 4a97a7a efeddde edf85c0 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a c2a0864 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde 4a97a7a efeddde | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FACEID</title>
<!-- Google Fonts: Playfair Display / Cinzel for Retro Serif titles + JetBrains Mono / Space Mono for Terminal -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Cinzel:wght@600;700;800;900&family=JetBrains+Mono:wght@400;500;600;700;800&family=Plus+Jakarta+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="/static/styles.css">
</head>
<body class="bg-[#F8F5EC] text-slate-950 font-sans antialiased min-h-screen p-3 sm:p-6 selection:bg-emerald-950 selection:text-emerald-300">
<!-- Outer Retro Terminal Shell -->
<div class="max-w-7xl mx-auto space-y-4">
<!-- Header Bar -->
<header class="border-2 border-black bg-[#F2EDE0] p-3 sm:p-4 shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] flex flex-col md:flex-row items-start md:items-center justify-between gap-4">
<div class="flex items-center space-x-3">
<div class="w-9 h-9 bg-black text-amber-400 flex items-center justify-center font-mono font-black text-xl rounded-sm shadow-[2px_2px_0px_0px_rgba(0,0,0,0.3)]">
🛡️
</div>
<div>
<h1 class="font-serif text-xl sm:text-2xl font-extrabold tracking-wider text-black uppercase">FACEID</h1>
<p class="font-mono text-[11px] text-slate-700 tracking-tight font-medium">PRIVACY-PRESERVING IMAGE VERIFICATION & BLOCKCHAIN PROOF</p>
</div>
</div>
<!-- Tech Stack Telemetry Badges -->
<div class="flex flex-wrap items-center gap-2 font-mono text-[11px]">
<span class="bg-white border border-black px-2.5 py-1 font-bold shadow-[2px_2px_0px_0px_rgba(0,0,0,1)] flex items-center space-x-1.5">
<span class="w-2 h-2 rounded-full bg-emerald-500 animate-pulse"></span>
<span>ArcFace 512-d</span>
</span>
<span class="bg-white border border-black px-2.5 py-1 font-bold shadow-[2px_2px_0px_0px_rgba(0,0,0,1)]">
Google Lens via SerpApi
</span>
<span class="bg-white border border-black px-2.5 py-1 font-bold shadow-[2px_2px_0px_0px_rgba(0,0,0,1)]">
Ethereum Sepolia
</span>
</div>
</header>
<!-- Subheader Controls & SLA Bar -->
<div class="border-2 border-black bg-[#F2EDE0] p-2.5 sm:p-3 shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] flex flex-col md:flex-row items-start md:items-center justify-between gap-3 font-mono text-xs">
<div class="flex items-center space-x-2 flex-wrap">
<span class="font-extrabold text-black uppercase">VERIFICATION MODE:</span>
<span class="px-3 py-1 font-bold bg-black text-white shadow-[2px_2px_0px_0px_rgba(0,0,0,1)]">IMAGE FORENSICS</span>
</div>
<div class="flex items-center space-x-4 flex-wrap">
<label class="flex items-center space-x-2 cursor-pointer font-bold select-none bg-white border border-black px-2.5 py-1 shadow-[2px_2px_0px_0px_rgba(0,0,0,1)]">
<input type="checkbox" id="chk-privacy" checked disabled class="accent-black">
<span>Zero-Biometric Exposure (RAM Only)</span>
</label>
<span class="border border-black bg-amber-200 px-2.5 py-1 font-bold shadow-[2px_2px_0px_0px_rgba(0,0,0,1)]">
Target SLA: < 300 ms
</span>
</div>
</div>
<!-- Main 2-Column Desktop Grid -->
<div class="grid grid-cols-1 lg:grid-cols-12 gap-6">
<!-- Left Card: THE BIOMETRIC TERMINAL -->
<div class="lg:col-span-5 border-2 border-black bg-white p-5 shadow-[6px_6px_0px_0px_rgba(0,0,0,1)] space-y-5">
<div class="flex items-center justify-between border-b-2 border-black pb-3">
<h2 class="font-serif text-lg font-black uppercase text-black tracking-wide">THE BIOMETRIC TERMINAL</h2>
<span class="font-mono text-[10px] font-bold bg-black text-white px-2 py-0.5 uppercase tracking-wider">IMAGE SCANNER</span>
</div>
<!-- Central Geometric Scan Target Box -->
<div class="border-2 border-black bg-[#FAF8F3] p-4 text-center relative overflow-hidden shadow-[3px_3px_0px_0px_rgba(0,0,0,1)]">
<!-- File Input Hidden -->
<input type="file" id="file-input" accept="image/*" class="hidden">
<!-- Canvas Preview for Image + Landmark Overlay -->
<div id="preview-container" class="hidden relative w-full h-64 bg-slate-950 border-2 border-black flex items-center justify-center overflow-hidden mb-3">
<canvas id="canvas-overlay" class="max-w-full max-h-full object-contain"></canvas>
</div>
<!-- Default Scanner Graphic (when awaiting image) -->
<div id="target-graphic" class="py-6 space-y-4 cursor-pointer">
<div class="relative w-28 h-28 mx-auto flex items-center justify-center border-2 border-dashed border-black bg-white rounded shadow-[2px_2px_0px_0px_rgba(0,0,0,1)] hover:bg-slate-100 transition-all">
<svg class="w-12 h-12 text-black" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="1.5">
<path stroke-linecap="round" stroke-linejoin="round" d="M6.827 6.175A2.31 2.31 0 0 1 5.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 0 0 2.25 2.25h15A2.25 2.25 0 0 0 21.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 0 0-1.134-.175 2.31 2.31 0 0 1-1.64-1.055l-.822-1.316a2.192 2.192 0 0 0-1.736-1.039 48.774 48.774 0 0 0-5.232 0 2.192 2.192 0 0 0-1.736 1.039l-.821 1.316Z" />
<path stroke-linecap="round" stroke-linejoin="round" d="M16.5 12.75a4.5 4.5 0 1 1-9 0 4.5 4.5 0 0 1 9 0ZM18.75 10.5h.008v.008h-.008V10.5Z" />
</svg>
</div>
<div class="bg-black text-emerald-400 font-mono text-xs font-extrabold py-1.5 px-3 inline-block uppercase tracking-wider border border-black shadow-[2px_2px_0px_0px_rgba(0,0,0,1)]">
>>> READY FOR FACIAL SCAN
</div>
<p class="text-xs font-mono font-bold text-slate-700">Click to upload image or drop file here</p>
</div>
</div>
<!-- Input Action Form & Anchor Checkbox -->
<div class="space-y-3 font-mono text-xs">
<div class="flex items-center justify-between border-2 border-black p-2 bg-[#F2EDE0] shadow-[2px_2px_0px_0px_rgba(0,0,0,1)]">
<span class="font-extrabold text-black">ANCHOR ON SEPOLIA CHAIN:</span>
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" id="chk-blockchain" class="sr-only peer">
<div class="w-9 h-5 bg-slate-400 peer-focus:outline-none border-2 border-black rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-black after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-2 after:border-black after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-emerald-500"></div>
</label>
</div>
<button id="btn-verify" class="w-full py-3.5 bg-black hover:bg-slate-900 text-amber-300 font-mono font-extrabold text-sm uppercase tracking-wider border-2 border-black shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] active:translate-x-0.5 active:translate-y-0.5 transition-all flex items-center justify-center space-x-2">
<span id="verify-spinner" class="hidden animate-spin">⚡</span>
<span id="verify-text">RUN PROVENANCE VERIFICATION →</span>
</button>
</div>
<!-- Quick Profiles Prompt Bar -->
<div class="pt-3 border-t-2 border-black font-mono text-[11px] space-y-2">
<span class="font-extrabold text-slate-800 uppercase block">💡 QUICK SAMPLE PROFILES:</span>
<div class="flex flex-wrap gap-2">
<button id="btn-sample-1" class="border border-black bg-[#FAF8F3] hover:bg-black hover:text-white px-2.5 py-1 font-bold shadow-[2px_2px_0px_0px_rgba(0,0,0,1)] transition-all">
[SAMPLE SCAN PROFILE]
</button>
</div>
</div>
</div>
<!-- Right Card: THE SEA LINKS -->
<div class="lg:col-span-7 border-2 border-black bg-white p-5 shadow-[6px_6px_0px_0px_rgba(0,0,0,1)] space-y-5 flex flex-col justify-between">
<div class="flex items-center justify-between border-b-2 border-black pb-3">
<h2 class="font-serif text-lg font-black uppercase text-black tracking-wide">THE SEA LINKS</h2>
<span id="sea-status-badge" class="font-mono text-[10px] font-bold bg-black text-amber-300 px-2 py-0.5 uppercase tracking-wider">AWAITING SCAN</span>
</div>
<!-- Dark Emerald Cyber Grid Canvas Area -->
<div id="grid-viewport" class="border-2 border-black bg-[#061A14] min-h-[380px] p-5 text-emerald-400 font-mono relative overflow-hidden shadow-[4px_4px_0px_0px_rgba(0,0,0,1)] flex flex-col justify-between">
<!-- Grid Background Pattern Layer -->
<div class="absolute inset-0 bg-[linear-gradient(to_right,#09382b_1px,transparent_1px),linear-gradient(to_bottom,#09382b_1px,transparent_1px)] bg-[size:24px_24px] opacity-40"></div>
<!-- Idle Screen State -->
<div id="idle-screen" class="relative z-10 my-auto text-center space-y-3 py-12">
<div class="w-12 h-12 mx-auto rounded-full bg-emerald-950 border-2 border-emerald-500/40 flex items-center justify-center text-emerald-400 text-xl shadow-[0_0_15px_rgba(16,185,129,0.3)]">
👁️
</div>
<h3 class="text-sm font-extrabold uppercase tracking-widest text-emerald-300">AWAITING BIOMETRIC SCAN INPUT</h3>
<p class="text-xs text-emerald-600/90 max-w-md mx-auto leading-relaxed">
Upload a facial image into <span class="text-emerald-300 font-bold">The Biometric Terminal</span> to execute local ArcFace detection, pHash perceptual comparison, and Sepolia blockchain proof verification.
</p>
</div>
<!-- Active Telemetry Screen (hidden by default) -->
<div id="telemetry-screen" class="hidden relative z-10 space-y-4 text-xs">
<!-- Status Banner Header -->
<div class="border border-emerald-500/40 bg-[#0A261D] p-3 flex flex-col sm:flex-row items-start sm:items-center justify-between gap-2 shadow-[2px_2px_0px_0px_rgba(0,0,0,1)]">
<div>
<span class="text-[10px] text-emerald-600 block uppercase">VERIFICATION RESULT:</span>
<span id="tele-status" class="text-sm font-extrabold text-emerald-300 tracking-wider">VERIFIED MATCH</span>
</div>
<div class="text-right">
<span class="text-[10px] text-emerald-600 block uppercase">BEST SIMILARITY SCORE:</span>
<span id="tele-score" class="text-base font-black text-amber-300">0.00%</span>
</div>
</div>
<!-- 4 Step Telemetry Modules Grid -->
<div class="grid grid-cols-1 sm:grid-cols-2 gap-3">
<!-- Module 1: Face Detection -->
<div class="border border-emerald-500/30 bg-[#082018] p-3 space-y-1">
<div class="text-[10px] font-bold text-emerald-500 uppercase">1. LOCAL ARCFACE DETECTION</div>
<div id="tele-face-detected" class="text-emerald-300 font-bold">Detected: False</div>
<div id="tele-face-count" class="text-emerald-600">Faces: 0</div>
</div>
<!-- Module 2: Hashes -->
<div class="border border-emerald-500/30 bg-[#082018] p-3 space-y-1">
<div class="text-[10px] font-bold text-emerald-500 uppercase">2. CRYPTOGRAPHIC FINGERPRINT</div>
<div class="truncate"><span class="text-emerald-600">SHA-256:</span> <span id="tele-sha" class="text-emerald-300 select-all">N/A</span></div>
<div><span class="text-emerald-600">pHash:</span> <span id="tele-phash" class="text-amber-300 select-all">N/A</span></div>
</div>
<!-- Module 3: Reverse Search -->
<div class="border border-emerald-500/30 bg-[#082018] p-3 space-y-1">
<div class="text-[10px] font-bold text-emerald-500 uppercase">3. GOOGLE LENS REVERSE SCAN</div>
<div id="tele-search-count" class="text-emerald-300 font-bold">Candidates Found: 0</div>
<div id="tele-search-engine" class="text-emerald-600">Engine: SerpApi Google Lens</div>
</div>
<!-- Module 4: Sepolia Blockchain -->
<div class="border border-emerald-500/30 bg-[#082018] p-3 space-y-1">
<div class="text-[10px] font-bold text-emerald-500 uppercase">4. SEPOLIA BLOCKCHAIN ANCHOR</div>
<div id="tele-bc-status" class="text-amber-300 font-bold">Status: NOT SUBMITTED</div>
<div id="tele-bc-link" class="truncate text-emerald-400">Tx: N/A</div>
</div>
</div>
<!-- Candidates Gallery Grid -->
<div class="border border-emerald-500/30 bg-[#082018] p-3 space-y-2">
<div class="text-[10px] font-bold text-emerald-500 uppercase">REVERSE SEARCH CANDIDATE MATRIX</div>
<div id="tele-candidates" class="grid grid-cols-1 sm:grid-cols-2 gap-2">
<span class="text-emerald-700 italic text-[11px]">No external matches found.</span>
</div>
</div>
</div>
<!-- Terminal Log Footer Bar -->
<div class="relative z-10 pt-3 border-t border-emerald-500/30 flex items-center justify-between text-[10px] text-emerald-600 font-mono">
<span id="log-line">> SYSTEM READY. AWAITING SCAN COMMAND.</span>
<span id="log-time">00:00:00</span>
</div>
</div>
<!-- Collapsible JSON Audit Report Box -->
<div class="border-2 border-black bg-[#FAF8F3] p-3 shadow-[3px_3px_0px_0px_rgba(0,0,0,1)] space-y-2">
<div class="flex items-center justify-between font-mono text-xs">
<span class="font-extrabold text-black uppercase">JSON PROVENANCE AUDIT REPORT</span>
<button id="btn-copy-json" class="bg-black text-amber-300 hover:bg-slate-800 px-2 py-0.5 text-[10px] font-bold border border-black shadow-[1px_1px_0px_0px_rgba(0,0,0,1)]">
COPY REPORT JSON
</button>
</div>
<pre id="json-viewer" class="bg-black p-3 text-[10px] font-mono text-emerald-400 border border-black max-h-36 overflow-y-auto select-all">{ "status": "AWAITING_INPUT" }</pre>
</div>
</div>
</div>
</div>
<script src="/static/app.js"></script>
</body>
</html>
|