bithal26 commited on
Commit
58be2fb
Β·
verified Β·
1 Parent(s): 212d8bf

Upload deepfake-detector.html

Browse files
Files changed (1) hide show
  1. deepfake-detector.html +1707 -0
deepfake-detector.html ADDED
@@ -0,0 +1,1707 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>VERIDEX β€” Deepfake Detection Intelligence</title>
7
+ <link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Syne:wght@400;600;700;800&family=JetBrains+Mono:wght@300;400;500&display=swap" rel="stylesheet">
8
+ <style>
9
+ :root {
10
+ --bg: #030508;
11
+ --bg2: #070c12;
12
+ --panel: rgba(8, 18, 30, 0.85);
13
+ --border: rgba(0, 210, 255, 0.12);
14
+ --border-bright: rgba(0, 210, 255, 0.45);
15
+ --cyan: #00d2ff;
16
+ --cyan-dim: rgba(0, 210, 255, 0.6);
17
+ --red: #ff2d55;
18
+ --green: #00ff88;
19
+ --amber: #ffb800;
20
+ --text: #e8f4ff;
21
+ --text-dim: rgba(232, 244, 255, 0.5);
22
+ --text-faint: rgba(232, 244, 255, 0.25);
23
+ --glow-cyan: 0 0 20px rgba(0, 210, 255, 0.35), 0 0 60px rgba(0, 210, 255, 0.1);
24
+ --glow-red: 0 0 20px rgba(255, 45, 85, 0.4);
25
+ --glow-green: 0 0 20px rgba(0, 255, 136, 0.35);
26
+ }
27
+
28
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
29
+
30
+ html { scroll-behavior: smooth; }
31
+
32
+ body {
33
+ background: var(--bg);
34
+ color: var(--text);
35
+ font-family: 'Syne', sans-serif;
36
+ overflow-x: hidden;
37
+ cursor: crosshair;
38
+ }
39
+
40
+ /* ── NOISE OVERLAY ── */
41
+ body::before {
42
+ content: '';
43
+ position: fixed;
44
+ inset: 0;
45
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
46
+ pointer-events: none;
47
+ z-index: 9999;
48
+ opacity: 0.4;
49
+ }
50
+
51
+ /* ── SCANLINES ── */
52
+ body::after {
53
+ content: '';
54
+ position: fixed;
55
+ inset: 0;
56
+ background: repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0,0,0,0.03) 2px, rgba(0,0,0,0.03) 4px);
57
+ pointer-events: none;
58
+ z-index: 9998;
59
+ }
60
+
61
+ /* ── GRID BG ── */
62
+ .grid-bg {
63
+ position: fixed;
64
+ inset: 0;
65
+ background-image:
66
+ linear-gradient(rgba(0,210,255,0.03) 1px, transparent 1px),
67
+ linear-gradient(90deg, rgba(0,210,255,0.03) 1px, transparent 1px);
68
+ background-size: 60px 60px;
69
+ pointer-events: none;
70
+ z-index: 0;
71
+ }
72
+
73
+ /* ── AMBIENT GLOW ── */
74
+ .ambient {
75
+ position: fixed;
76
+ border-radius: 50%;
77
+ filter: blur(120px);
78
+ pointer-events: none;
79
+ z-index: 0;
80
+ opacity: 0.18;
81
+ }
82
+ .ambient-1 { width: 600px; height: 600px; background: var(--cyan); top: -200px; left: -100px; animation: drift1 20s ease-in-out infinite; }
83
+ .ambient-2 { width: 500px; height: 500px; background: var(--red); bottom: -200px; right: -100px; animation: drift2 25s ease-in-out infinite; }
84
+ .ambient-3 { width: 400px; height: 400px; background: #5500ff; top: 40%; left: 40%; animation: drift3 30s ease-in-out infinite; opacity: 0.1; }
85
+
86
+ @keyframes drift1 { 0%,100%{transform:translate(0,0)} 50%{transform:translate(80px,60px)} }
87
+ @keyframes drift2 { 0%,100%{transform:translate(0,0)} 50%{transform:translate(-60px,-80px)} }
88
+ @keyframes drift3 { 0%,100%{transform:translate(0,0)} 50%{transform:translate(40px,-40px)} }
89
+
90
+ /* ── NAV ── */
91
+ nav {
92
+ position: fixed;
93
+ top: 0; left: 0; right: 0;
94
+ z-index: 100;
95
+ display: flex;
96
+ align-items: center;
97
+ justify-content: space-between;
98
+ padding: 20px 48px;
99
+ background: rgba(3, 5, 8, 0.7);
100
+ backdrop-filter: blur(20px);
101
+ border-bottom: 1px solid var(--border);
102
+ }
103
+
104
+ .nav-logo {
105
+ display: flex;
106
+ align-items: center;
107
+ gap: 12px;
108
+ }
109
+
110
+ .logo-mark {
111
+ width: 36px; height: 36px;
112
+ border: 1.5px solid var(--cyan);
113
+ border-radius: 8px;
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ box-shadow: var(--glow-cyan);
118
+ position: relative;
119
+ overflow: hidden;
120
+ }
121
+
122
+ .logo-mark::before {
123
+ content: '';
124
+ position: absolute;
125
+ inset: 0;
126
+ background: linear-gradient(135deg, rgba(0,210,255,0.15), transparent);
127
+ }
128
+
129
+ .logo-mark svg { width: 18px; height: 18px; fill: none; stroke: var(--cyan); stroke-width: 2; }
130
+
131
+ .logo-text {
132
+ font-family: 'Bebas Neue', sans-serif;
133
+ font-size: 22px;
134
+ letter-spacing: 4px;
135
+ color: var(--text);
136
+ }
137
+
138
+ .logo-text span { color: var(--cyan); }
139
+
140
+ .nav-links {
141
+ display: flex;
142
+ gap: 36px;
143
+ list-style: none;
144
+ }
145
+
146
+ .nav-links a {
147
+ font-family: 'JetBrains Mono', monospace;
148
+ font-size: 11px;
149
+ letter-spacing: 2px;
150
+ text-transform: uppercase;
151
+ color: var(--text-dim);
152
+ text-decoration: none;
153
+ transition: color 0.2s;
154
+ position: relative;
155
+ }
156
+
157
+ .nav-links a::after {
158
+ content: '';
159
+ position: absolute;
160
+ bottom: -4px; left: 0; right: 0;
161
+ height: 1px;
162
+ background: var(--cyan);
163
+ transform: scaleX(0);
164
+ transition: transform 0.2s;
165
+ }
166
+
167
+ .nav-links a:hover { color: var(--cyan); }
168
+ .nav-links a:hover::after { transform: scaleX(1); }
169
+
170
+ .nav-cta {
171
+ font-family: 'JetBrains Mono', monospace;
172
+ font-size: 11px;
173
+ letter-spacing: 2px;
174
+ text-transform: uppercase;
175
+ color: var(--bg);
176
+ background: var(--cyan);
177
+ padding: 10px 24px;
178
+ border: none;
179
+ cursor: pointer;
180
+ font-weight: 500;
181
+ transition: all 0.2s;
182
+ clip-path: polygon(8px 0%, 100% 0%, calc(100% - 8px) 100%, 0% 100%);
183
+ }
184
+ .nav-cta:hover { box-shadow: var(--glow-cyan); transform: translateY(-1px); }
185
+
186
+ /* ── HERO ── */
187
+ .hero {
188
+ min-height: 100vh;
189
+ display: flex;
190
+ flex-direction: column;
191
+ align-items: center;
192
+ justify-content: center;
193
+ text-align: center;
194
+ padding: 120px 48px 80px;
195
+ position: relative;
196
+ z-index: 1;
197
+ }
198
+
199
+ .hero-badge {
200
+ display: inline-flex;
201
+ align-items: center;
202
+ gap: 8px;
203
+ font-family: 'JetBrains Mono', monospace;
204
+ font-size: 10px;
205
+ letter-spacing: 3px;
206
+ text-transform: uppercase;
207
+ color: var(--cyan);
208
+ border: 1px solid var(--border-bright);
209
+ padding: 6px 16px;
210
+ border-radius: 2px;
211
+ margin-bottom: 32px;
212
+ animation: fadeUp 0.8s ease both;
213
+ background: rgba(0, 210, 255, 0.05);
214
+ }
215
+
216
+ .hero-badge::before {
217
+ content: '';
218
+ width: 6px; height: 6px;
219
+ border-radius: 50%;
220
+ background: var(--green);
221
+ box-shadow: 0 0 8px var(--green);
222
+ animation: pulse 2s ease-in-out infinite;
223
+ }
224
+
225
+ @keyframes pulse { 0%,100%{opacity:1} 50%{opacity:0.3} }
226
+
227
+ .hero-title {
228
+ font-family: 'Bebas Neue', sans-serif;
229
+ font-size: clamp(72px, 10vw, 140px);
230
+ line-height: 0.9;
231
+ letter-spacing: 2px;
232
+ animation: fadeUp 0.8s 0.1s ease both;
233
+ position: relative;
234
+ }
235
+
236
+ .hero-title .line1 { display: block; color: var(--text); }
237
+ .hero-title .line2 {
238
+ display: block;
239
+ color: transparent;
240
+ -webkit-text-stroke: 1px rgba(0, 210, 255, 0.5);
241
+ position: relative;
242
+ }
243
+
244
+ .hero-title .line2::after {
245
+ content: attr(data-text);
246
+ position: absolute;
247
+ left: 0; top: 0; right: 0;
248
+ text-align: center;
249
+ color: var(--cyan);
250
+ clip-path: polygon(0 0, 30% 0, 30% 100%, 0 100%);
251
+ animation: scanReveal 4s ease-in-out infinite;
252
+ }
253
+
254
+ @keyframes scanReveal {
255
+ 0% { clip-path: polygon(0 0, 0% 0, 0% 100%, 0 100%); }
256
+ 40% { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); }
257
+ 60% { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%); }
258
+ 100% { clip-path: polygon(100% 0, 100% 0, 100% 100%, 100% 100%); }
259
+ }
260
+
261
+ .hero-sub {
262
+ max-width: 580px;
263
+ font-size: 16px;
264
+ line-height: 1.7;
265
+ color: var(--text-dim);
266
+ margin: 28px auto 48px;
267
+ animation: fadeUp 0.8s 0.2s ease both;
268
+ }
269
+
270
+ .hero-actions {
271
+ display: flex;
272
+ gap: 16px;
273
+ animation: fadeUp 0.8s 0.3s ease both;
274
+ }
275
+
276
+ .btn-primary {
277
+ display: inline-flex;
278
+ align-items: center;
279
+ gap: 10px;
280
+ padding: 16px 36px;
281
+ background: var(--cyan);
282
+ color: var(--bg);
283
+ font-family: 'JetBrains Mono', monospace;
284
+ font-size: 12px;
285
+ letter-spacing: 2px;
286
+ text-transform: uppercase;
287
+ font-weight: 600;
288
+ border: none;
289
+ cursor: pointer;
290
+ transition: all 0.25s;
291
+ clip-path: polygon(12px 0%, 100% 0%, calc(100% - 12px) 100%, 0% 100%);
292
+ }
293
+
294
+ .btn-primary:hover { box-shadow: var(--glow-cyan); transform: translateY(-2px) scale(1.02); }
295
+
296
+ .btn-secondary {
297
+ display: inline-flex;
298
+ align-items: center;
299
+ gap: 10px;
300
+ padding: 16px 36px;
301
+ background: transparent;
302
+ color: var(--text-dim);
303
+ font-family: 'JetBrains Mono', monospace;
304
+ font-size: 12px;
305
+ letter-spacing: 2px;
306
+ text-transform: uppercase;
307
+ border: 1px solid var(--border-bright);
308
+ cursor: pointer;
309
+ transition: all 0.25s;
310
+ }
311
+
312
+ .btn-secondary:hover { color: var(--cyan); border-color: var(--cyan); background: rgba(0,210,255,0.05); }
313
+
314
+ .hero-stats {
315
+ display: flex;
316
+ gap: 0;
317
+ margin-top: 80px;
318
+ border: 1px solid var(--border);
319
+ animation: fadeUp 0.8s 0.4s ease both;
320
+ }
321
+
322
+ .stat {
323
+ padding: 24px 48px;
324
+ border-right: 1px solid var(--border);
325
+ text-align: left;
326
+ position: relative;
327
+ overflow: hidden;
328
+ }
329
+
330
+ .stat:last-child { border-right: none; }
331
+
332
+ .stat::before {
333
+ content: '';
334
+ position: absolute;
335
+ bottom: 0; left: 0; right: 0;
336
+ height: 1px;
337
+ background: linear-gradient(90deg, transparent, var(--cyan), transparent);
338
+ animation: shimmer 3s ease-in-out infinite;
339
+ opacity: 0.4;
340
+ }
341
+
342
+ @keyframes shimmer { 0%,100%{opacity:0.2} 50%{opacity:0.8} }
343
+
344
+ .stat-number {
345
+ font-family: 'Bebas Neue', sans-serif;
346
+ font-size: 44px;
347
+ color: var(--cyan);
348
+ line-height: 1;
349
+ text-shadow: var(--glow-cyan);
350
+ }
351
+
352
+ .stat-label {
353
+ font-family: 'JetBrains Mono', monospace;
354
+ font-size: 10px;
355
+ letter-spacing: 2px;
356
+ text-transform: uppercase;
357
+ color: var(--text-faint);
358
+ margin-top: 4px;
359
+ }
360
+
361
+ @keyframes fadeUp { from { opacity:0; transform: translateY(24px); } to { opacity:1; transform: translateY(0); } }
362
+
363
+ /* ─��� UPLOAD SECTION ── */
364
+ .section {
365
+ position: relative;
366
+ z-index: 1;
367
+ padding: 100px 48px;
368
+ max-width: 1400px;
369
+ margin: 0 auto;
370
+ }
371
+
372
+ .section-label {
373
+ font-family: 'JetBrains Mono', monospace;
374
+ font-size: 10px;
375
+ letter-spacing: 4px;
376
+ text-transform: uppercase;
377
+ color: var(--cyan);
378
+ margin-bottom: 12px;
379
+ display: flex;
380
+ align-items: center;
381
+ gap: 12px;
382
+ }
383
+
384
+ .section-label::before {
385
+ content: '';
386
+ width: 32px; height: 1px;
387
+ background: var(--cyan);
388
+ box-shadow: var(--glow-cyan);
389
+ }
390
+
391
+ .section-title {
392
+ font-family: 'Syne', sans-serif;
393
+ font-size: clamp(32px, 4vw, 52px);
394
+ font-weight: 800;
395
+ line-height: 1.1;
396
+ margin-bottom: 16px;
397
+ }
398
+
399
+ .section-title em { font-style: normal; color: var(--cyan); }
400
+
401
+ .section-sub {
402
+ color: var(--text-dim);
403
+ font-size: 15px;
404
+ line-height: 1.7;
405
+ max-width: 480px;
406
+ margin-bottom: 48px;
407
+ }
408
+
409
+ /* ── UPLOAD ZONE ── */
410
+ .upload-layout {
411
+ display: grid;
412
+ grid-template-columns: 1fr 380px;
413
+ gap: 24px;
414
+ align-items: start;
415
+ }
416
+
417
+ .upload-zone {
418
+ border: 1px dashed var(--border-bright);
419
+ border-radius: 4px;
420
+ padding: 80px 40px;
421
+ text-align: center;
422
+ cursor: pointer;
423
+ transition: all 0.3s;
424
+ position: relative;
425
+ overflow: hidden;
426
+ background: var(--panel);
427
+ backdrop-filter: blur(20px);
428
+ min-height: 380px;
429
+ display: flex;
430
+ flex-direction: column;
431
+ align-items: center;
432
+ justify-content: center;
433
+ }
434
+
435
+ .upload-zone::before {
436
+ content: '';
437
+ position: absolute;
438
+ top: 0; left: -100%;
439
+ width: 200%; height: 2px;
440
+ background: linear-gradient(90deg, transparent, var(--cyan), transparent);
441
+ animation: scanLine 4s ease-in-out infinite;
442
+ }
443
+
444
+ @keyframes scanLine {
445
+ 0% { top: 0; opacity: 0; }
446
+ 10% { opacity: 1; }
447
+ 90% { opacity: 1; }
448
+ 100% { top: 100%; opacity: 0; }
449
+ }
450
+
451
+ .upload-zone:hover {
452
+ border-color: var(--cyan);
453
+ background: rgba(0, 210, 255, 0.03);
454
+ box-shadow: inset 0 0 40px rgba(0,210,255,0.05);
455
+ }
456
+
457
+ .upload-zone.dragging {
458
+ border-color: var(--cyan);
459
+ background: rgba(0, 210, 255, 0.08);
460
+ box-shadow: 0 0 40px rgba(0,210,255,0.2), inset 0 0 40px rgba(0,210,255,0.05);
461
+ }
462
+
463
+ .upload-icon {
464
+ width: 72px; height: 72px;
465
+ border: 1px solid var(--border-bright);
466
+ border-radius: 50%;
467
+ display: flex;
468
+ align-items: center;
469
+ justify-content: center;
470
+ margin-bottom: 24px;
471
+ position: relative;
472
+ transition: all 0.3s;
473
+ }
474
+
475
+ .upload-icon::before {
476
+ content: '';
477
+ position: absolute;
478
+ inset: -6px;
479
+ border-radius: 50%;
480
+ border: 1px solid transparent;
481
+ border-top-color: var(--cyan);
482
+ animation: spin 3s linear infinite;
483
+ opacity: 0.4;
484
+ }
485
+
486
+ @keyframes spin { to { transform: rotate(360deg); } }
487
+
488
+ .upload-zone:hover .upload-icon { border-color: var(--cyan); box-shadow: var(--glow-cyan); }
489
+
490
+ .upload-icon svg { width: 28px; height: 28px; stroke: var(--cyan); fill: none; stroke-width: 1.5; }
491
+
492
+ .upload-title {
493
+ font-size: 18px;
494
+ font-weight: 700;
495
+ margin-bottom: 8px;
496
+ }
497
+
498
+ .upload-desc {
499
+ font-family: 'JetBrains Mono', monospace;
500
+ font-size: 11px;
501
+ letter-spacing: 1px;
502
+ color: var(--text-dim);
503
+ margin-bottom: 24px;
504
+ line-height: 1.7;
505
+ }
506
+
507
+ .upload-formats {
508
+ display: flex;
509
+ gap: 8px;
510
+ flex-wrap: wrap;
511
+ justify-content: center;
512
+ }
513
+
514
+ .format-tag {
515
+ font-family: 'JetBrains Mono', monospace;
516
+ font-size: 10px;
517
+ letter-spacing: 1.5px;
518
+ padding: 4px 10px;
519
+ border: 1px solid var(--border);
520
+ color: var(--text-faint);
521
+ text-transform: uppercase;
522
+ }
523
+
524
+ input[type="file"] { display: none; }
525
+
526
+ /* ── ANALYSIS PANEL ── */
527
+ .analysis-panel {
528
+ display: flex;
529
+ flex-direction: column;
530
+ gap: 16px;
531
+ }
532
+
533
+ .panel-card {
534
+ background: var(--panel);
535
+ border: 1px solid var(--border);
536
+ backdrop-filter: blur(20px);
537
+ padding: 24px;
538
+ position: relative;
539
+ overflow: hidden;
540
+ transition: border-color 0.3s;
541
+ }
542
+
543
+ .panel-card::after {
544
+ content: '';
545
+ position: absolute;
546
+ top: 0; left: 0;
547
+ width: 3px; height: 100%;
548
+ background: var(--cyan);
549
+ box-shadow: var(--glow-cyan);
550
+ opacity: 0.6;
551
+ }
552
+
553
+ .panel-card:hover { border-color: var(--border-bright); }
554
+
555
+ .card-title {
556
+ font-family: 'JetBrains Mono', monospace;
557
+ font-size: 10px;
558
+ letter-spacing: 3px;
559
+ text-transform: uppercase;
560
+ color: var(--cyan);
561
+ margin-bottom: 16px;
562
+ display: flex;
563
+ align-items: center;
564
+ gap: 8px;
565
+ }
566
+
567
+ .card-title .dot {
568
+ width: 5px; height: 5px;
569
+ border-radius: 50%;
570
+ background: var(--cyan);
571
+ box-shadow: 0 0 8px var(--cyan);
572
+ }
573
+
574
+ /* ── RESULT DISPLAY ── */
575
+ .result-display {
576
+ text-align: center;
577
+ padding: 8px 0;
578
+ }
579
+
580
+ .result-score {
581
+ font-family: 'Bebas Neue', sans-serif;
582
+ font-size: 72px;
583
+ line-height: 1;
584
+ color: var(--green);
585
+ text-shadow: var(--glow-green);
586
+ transition: all 0.5s;
587
+ }
588
+
589
+ .result-score.fake { color: var(--red); text-shadow: var(--glow-red); }
590
+ .result-score.uncertain { color: var(--amber); }
591
+
592
+ .result-label {
593
+ font-family: 'JetBrains Mono', monospace;
594
+ font-size: 11px;
595
+ letter-spacing: 3px;
596
+ text-transform: uppercase;
597
+ color: var(--text-dim);
598
+ margin-top: 4px;
599
+ }
600
+
601
+ /* ── PROGRESS BARS ── */
602
+ .metric-row {
603
+ margin-bottom: 14px;
604
+ }
605
+
606
+ .metric-header {
607
+ display: flex;
608
+ justify-content: space-between;
609
+ margin-bottom: 6px;
610
+ }
611
+
612
+ .metric-name {
613
+ font-family: 'JetBrains Mono', monospace;
614
+ font-size: 10px;
615
+ letter-spacing: 1.5px;
616
+ text-transform: uppercase;
617
+ color: var(--text-dim);
618
+ }
619
+
620
+ .metric-value {
621
+ font-family: 'JetBrains Mono', monospace;
622
+ font-size: 10px;
623
+ color: var(--cyan);
624
+ }
625
+
626
+ .metric-bar {
627
+ height: 3px;
628
+ background: rgba(255,255,255,0.06);
629
+ border-radius: 0;
630
+ overflow: hidden;
631
+ position: relative;
632
+ }
633
+
634
+ .metric-fill {
635
+ height: 100%;
636
+ background: linear-gradient(90deg, var(--cyan), rgba(0,210,255,0.4));
637
+ transition: width 1s ease;
638
+ position: relative;
639
+ }
640
+
641
+ .metric-fill::after {
642
+ content: '';
643
+ position: absolute;
644
+ right: 0; top: -2px;
645
+ width: 1px; height: 7px;
646
+ background: var(--cyan);
647
+ box-shadow: 0 0 6px var(--cyan);
648
+ }
649
+
650
+ /* ── HOW IT WORKS ── */
651
+ .how-section {
652
+ padding: 100px 48px;
653
+ max-width: 1400px;
654
+ margin: 0 auto;
655
+ position: relative;
656
+ z-index: 1;
657
+ }
658
+
659
+ .how-grid {
660
+ display: grid;
661
+ grid-template-columns: repeat(4, 1fr);
662
+ gap: 2px;
663
+ margin-top: 60px;
664
+ }
665
+
666
+ .how-step {
667
+ background: var(--panel);
668
+ border: 1px solid var(--border);
669
+ padding: 40px 32px;
670
+ position: relative;
671
+ overflow: hidden;
672
+ transition: all 0.3s;
673
+ backdrop-filter: blur(20px);
674
+ }
675
+
676
+ .how-step::before {
677
+ content: '';
678
+ position: absolute;
679
+ top: 0; left: 0; right: 0;
680
+ height: 1px;
681
+ background: linear-gradient(90deg, transparent, var(--cyan), transparent);
682
+ opacity: 0;
683
+ transition: opacity 0.3s;
684
+ }
685
+
686
+ .how-step:hover { border-color: var(--border-bright); transform: translateY(-4px); }
687
+ .how-step:hover::before { opacity: 1; }
688
+
689
+ .step-number {
690
+ font-family: 'Bebas Neue', sans-serif;
691
+ font-size: 72px;
692
+ color: rgba(0, 210, 255, 0.08);
693
+ line-height: 1;
694
+ margin-bottom: 20px;
695
+ transition: color 0.3s;
696
+ }
697
+
698
+ .how-step:hover .step-number { color: rgba(0, 210, 255, 0.15); }
699
+
700
+ .step-icon {
701
+ width: 48px; height: 48px;
702
+ border: 1px solid var(--border-bright);
703
+ display: flex;
704
+ align-items: center;
705
+ justify-content: center;
706
+ margin-bottom: 20px;
707
+ transition: all 0.3s;
708
+ }
709
+
710
+ .how-step:hover .step-icon { border-color: var(--cyan); box-shadow: var(--glow-cyan); }
711
+ .step-icon svg { width: 22px; height: 22px; stroke: var(--cyan); fill: none; stroke-width: 1.5; }
712
+
713
+ .step-title {
714
+ font-size: 18px;
715
+ font-weight: 700;
716
+ margin-bottom: 12px;
717
+ }
718
+
719
+ .step-desc {
720
+ font-size: 13px;
721
+ line-height: 1.7;
722
+ color: var(--text-dim);
723
+ }
724
+
725
+ /* ── FEATURES ── */
726
+ .features-section {
727
+ padding: 100px 48px;
728
+ max-width: 1400px;
729
+ margin: 0 auto;
730
+ position: relative;
731
+ z-index: 1;
732
+ }
733
+
734
+ .features-grid {
735
+ display: grid;
736
+ grid-template-columns: repeat(3, 1fr);
737
+ gap: 2px;
738
+ margin-top: 60px;
739
+ }
740
+
741
+ .feature-card {
742
+ background: var(--panel);
743
+ border: 1px solid var(--border);
744
+ padding: 36px;
745
+ position: relative;
746
+ overflow: hidden;
747
+ transition: all 0.3s;
748
+ backdrop-filter: blur(20px);
749
+ cursor: default;
750
+ }
751
+
752
+ .feature-card::after {
753
+ content: '';
754
+ position: absolute;
755
+ bottom: 0; left: 0; right: 0;
756
+ height: 2px;
757
+ background: linear-gradient(90deg, transparent, var(--cyan), transparent);
758
+ transform: scaleX(0);
759
+ transition: transform 0.4s;
760
+ }
761
+
762
+ .feature-card:hover { border-color: rgba(0, 210, 255, 0.25); background: rgba(0, 210, 255, 0.03); }
763
+ .feature-card:hover::after { transform: scaleX(1); }
764
+
765
+ .feature-icon {
766
+ width: 44px; height: 44px;
767
+ margin-bottom: 20px;
768
+ display: flex;
769
+ align-items: center;
770
+ justify-content: center;
771
+ background: rgba(0, 210, 255, 0.08);
772
+ border: 1px solid var(--border-bright);
773
+ transition: all 0.3s;
774
+ }
775
+
776
+ .feature-card:hover .feature-icon { background: rgba(0, 210, 255, 0.15); box-shadow: var(--glow-cyan); }
777
+ .feature-icon svg { width: 20px; height: 20px; stroke: var(--cyan); fill: none; stroke-width: 1.5; }
778
+
779
+ .feature-title {
780
+ font-size: 16px;
781
+ font-weight: 700;
782
+ margin-bottom: 10px;
783
+ }
784
+
785
+ .feature-desc {
786
+ font-size: 13px;
787
+ line-height: 1.7;
788
+ color: var(--text-dim);
789
+ }
790
+
791
+ /* ── TECH STACK ── */
792
+ .tech-section {
793
+ padding: 60px 48px;
794
+ max-width: 1400px;
795
+ margin: 0 auto;
796
+ position: relative;
797
+ z-index: 1;
798
+ }
799
+
800
+ .tech-strip {
801
+ border: 1px solid var(--border);
802
+ display: flex;
803
+ align-items: stretch;
804
+ overflow: hidden;
805
+ background: var(--panel);
806
+ backdrop-filter: blur(20px);
807
+ }
808
+
809
+ .tech-label-box {
810
+ padding: 20px 28px;
811
+ border-right: 1px solid var(--border);
812
+ display: flex;
813
+ align-items: center;
814
+ background: rgba(0,210,255,0.05);
815
+ white-space: nowrap;
816
+ }
817
+
818
+ .tech-items {
819
+ display: flex;
820
+ overflow: hidden;
821
+ flex: 1;
822
+ position: relative;
823
+ }
824
+
825
+ .tech-items::before, .tech-items::after {
826
+ content: '';
827
+ position: absolute;
828
+ top: 0; bottom: 0;
829
+ width: 60px;
830
+ z-index: 2;
831
+ pointer-events: none;
832
+ }
833
+
834
+ .tech-items::before { left: 0; background: linear-gradient(90deg, rgba(8,18,30,0.9), transparent); }
835
+ .tech-items::after { right: 0; background: linear-gradient(-90deg, rgba(8,18,30,0.9), transparent); }
836
+
837
+ .tech-scroll {
838
+ display: flex;
839
+ gap: 0;
840
+ animation: techScroll 20s linear infinite;
841
+ width: max-content;
842
+ }
843
+
844
+ @keyframes techScroll { from { transform: translateX(0); } to { transform: translateX(-50%); } }
845
+
846
+ .tech-item {
847
+ font-family: 'JetBrains Mono', monospace;
848
+ font-size: 11px;
849
+ letter-spacing: 2px;
850
+ text-transform: uppercase;
851
+ color: var(--text-dim);
852
+ padding: 20px 32px;
853
+ border-right: 1px solid var(--border);
854
+ white-space: nowrap;
855
+ transition: color 0.2s;
856
+ }
857
+
858
+ .tech-item:hover { color: var(--cyan); }
859
+
860
+ /* ── REPORT SECTION ── */
861
+ .report-section {
862
+ padding: 100px 48px;
863
+ max-width: 1400px;
864
+ margin: 0 auto;
865
+ position: relative;
866
+ z-index: 1;
867
+ }
868
+
869
+ .report-layout {
870
+ display: grid;
871
+ grid-template-columns: 1fr 1fr;
872
+ gap: 2px;
873
+ margin-top: 60px;
874
+ }
875
+
876
+ .report-card {
877
+ background: var(--panel);
878
+ border: 1px solid var(--border);
879
+ padding: 40px;
880
+ backdrop-filter: blur(20px);
881
+ }
882
+
883
+ .report-card.accent {
884
+ background: rgba(0, 210, 255, 0.04);
885
+ border-color: rgba(0,210,255,0.2);
886
+ }
887
+
888
+ .forensic-list {
889
+ list-style: none;
890
+ display: flex;
891
+ flex-direction: column;
892
+ gap: 12px;
893
+ margin-top: 20px;
894
+ }
895
+
896
+ .forensic-item {
897
+ display: flex;
898
+ align-items: center;
899
+ gap: 12px;
900
+ padding: 14px 16px;
901
+ border: 1px solid var(--border);
902
+ transition: all 0.2s;
903
+ }
904
+
905
+ .forensic-item:hover { border-color: var(--border-bright); background: rgba(0,210,255,0.03); }
906
+
907
+ .forensic-icon {
908
+ width: 32px; height: 32px;
909
+ border: 1px solid var(--border-bright);
910
+ display: flex;
911
+ align-items: center;
912
+ justify-content: center;
913
+ flex-shrink: 0;
914
+ }
915
+
916
+ .forensic-icon svg { width: 14px; height: 14px; stroke: var(--cyan); fill: none; stroke-width: 2; }
917
+
918
+ .forensic-name {
919
+ font-size: 13px;
920
+ font-weight: 600;
921
+ flex: 1;
922
+ }
923
+
924
+ .forensic-status {
925
+ font-family: 'JetBrains Mono', monospace;
926
+ font-size: 9px;
927
+ letter-spacing: 2px;
928
+ text-transform: uppercase;
929
+ padding: 3px 8px;
930
+ }
931
+
932
+ .forensic-status.pass { color: var(--green); border: 1px solid rgba(0,255,136,0.3); background: rgba(0,255,136,0.05); }
933
+ .forensic-status.alert { color: var(--red); border: 1px solid rgba(255,45,85,0.3); background: rgba(255,45,85,0.05); }
934
+ .forensic-status.warn { color: var(--amber); border: 1px solid rgba(255,184,0,0.3); background: rgba(255,184,0,0.05); }
935
+
936
+ /* ── FOOTER ── */
937
+ footer {
938
+ position: relative;
939
+ z-index: 1;
940
+ padding: 48px;
941
+ border-top: 1px solid var(--border);
942
+ display: flex;
943
+ align-items: center;
944
+ justify-content: space-between;
945
+ background: rgba(3, 5, 8, 0.5);
946
+ }
947
+
948
+ .footer-logo {
949
+ font-family: 'Bebas Neue', sans-serif;
950
+ font-size: 24px;
951
+ letter-spacing: 4px;
952
+ color: var(--text);
953
+ }
954
+ .footer-logo span { color: var(--cyan); }
955
+
956
+ .footer-copy {
957
+ font-family: 'JetBrains Mono', monospace;
958
+ font-size: 10px;
959
+ letter-spacing: 2px;
960
+ color: var(--text-faint);
961
+ text-transform: uppercase;
962
+ }
963
+
964
+ .footer-links {
965
+ display: flex;
966
+ gap: 24px;
967
+ list-style: none;
968
+ }
969
+
970
+ .footer-links a {
971
+ font-family: 'JetBrains Mono', monospace;
972
+ font-size: 10px;
973
+ letter-spacing: 2px;
974
+ text-transform: uppercase;
975
+ color: var(--text-faint);
976
+ text-decoration: none;
977
+ transition: color 0.2s;
978
+ }
979
+
980
+ .footer-links a:hover { color: var(--cyan); }
981
+
982
+ /* ── MODAL / ANALYZING ── */
983
+ .analyze-overlay {
984
+ position: fixed;
985
+ inset: 0;
986
+ background: rgba(3, 5, 8, 0.95);
987
+ backdrop-filter: blur(20px);
988
+ z-index: 200;
989
+ display: flex;
990
+ align-items: center;
991
+ justify-content: center;
992
+ flex-direction: column;
993
+ gap: 32px;
994
+ opacity: 0;
995
+ pointer-events: none;
996
+ transition: opacity 0.3s;
997
+ }
998
+
999
+ .analyze-overlay.visible { opacity: 1; pointer-events: all; }
1000
+
1001
+ .analyze-scanner {
1002
+ width: 200px; height: 200px;
1003
+ position: relative;
1004
+ border: 1px solid var(--border-bright);
1005
+ }
1006
+
1007
+ .analyze-scanner::before {
1008
+ content: '';
1009
+ position: absolute;
1010
+ top: 0; left: 0; right: 0;
1011
+ height: 2px;
1012
+ background: var(--cyan);
1013
+ box-shadow: 0 0 12px var(--cyan), 0 0 40px rgba(0,210,255,0.4);
1014
+ animation: scannerLine 2s ease-in-out infinite;
1015
+ }
1016
+
1017
+ @keyframes scannerLine {
1018
+ 0% { top: 0; }
1019
+ 50% { top: calc(100% - 2px); }
1020
+ 100% { top: 0; }
1021
+ }
1022
+
1023
+ .scanner-corner {
1024
+ position: absolute;
1025
+ width: 16px; height: 16px;
1026
+ border-color: var(--cyan);
1027
+ border-style: solid;
1028
+ }
1029
+
1030
+ .scanner-corner.tl { top: -1px; left: -1px; border-width: 2px 0 0 2px; }
1031
+ .scanner-corner.tr { top: -1px; right: -1px; border-width: 2px 2px 0 0; }
1032
+ .scanner-corner.bl { bottom: -1px; left: -1px; border-width: 0 0 2px 2px; }
1033
+ .scanner-corner.br { bottom: -1px; right: -1px; border-width: 0 2px 2px 0; }
1034
+
1035
+ .analyze-text {
1036
+ font-family: 'JetBrains Mono', monospace;
1037
+ font-size: 12px;
1038
+ letter-spacing: 4px;
1039
+ text-transform: uppercase;
1040
+ color: var(--cyan);
1041
+ text-align: center;
1042
+ }
1043
+
1044
+ .analyze-progress-bar {
1045
+ width: 300px;
1046
+ height: 2px;
1047
+ background: rgba(255,255,255,0.06);
1048
+ position: relative;
1049
+ overflow: hidden;
1050
+ }
1051
+
1052
+ .analyze-fill {
1053
+ height: 100%;
1054
+ background: var(--cyan);
1055
+ box-shadow: var(--glow-cyan);
1056
+ animation: loadBar 3s ease forwards;
1057
+ }
1058
+
1059
+ @keyframes loadBar { from { width: 0%; } to { width: 100%; } }
1060
+
1061
+ .analyze-steps {
1062
+ display: flex;
1063
+ flex-direction: column;
1064
+ gap: 8px;
1065
+ width: 300px;
1066
+ }
1067
+
1068
+ .a-step {
1069
+ font-family: 'JetBrains Mono', monospace;
1070
+ font-size: 10px;
1071
+ letter-spacing: 2px;
1072
+ color: var(--text-faint);
1073
+ display: flex;
1074
+ align-items: center;
1075
+ gap: 10px;
1076
+ transition: color 0.3s;
1077
+ }
1078
+
1079
+ .a-step.active { color: var(--cyan); }
1080
+ .a-step.done { color: var(--green); }
1081
+
1082
+ .a-step-dot {
1083
+ width: 6px; height: 6px;
1084
+ border-radius: 50%;
1085
+ background: currentColor;
1086
+ flex-shrink: 0;
1087
+ }
1088
+
1089
+ /* ── RESULT MODAL ── */
1090
+ .result-overlay {
1091
+ position: fixed;
1092
+ inset: 0;
1093
+ background: rgba(3, 5, 8, 0.9);
1094
+ backdrop-filter: blur(20px);
1095
+ z-index: 200;
1096
+ display: flex;
1097
+ align-items: center;
1098
+ justify-content: center;
1099
+ opacity: 0;
1100
+ pointer-events: none;
1101
+ transition: opacity 0.3s;
1102
+ }
1103
+
1104
+ .result-overlay.visible { opacity: 1; pointer-events: all; }
1105
+
1106
+ .result-modal {
1107
+ width: 90%;
1108
+ max-width: 800px;
1109
+ background: var(--bg2);
1110
+ border: 1px solid var(--border-bright);
1111
+ padding: 48px;
1112
+ position: relative;
1113
+ animation: modalIn 0.4s ease both;
1114
+ }
1115
+
1116
+ @keyframes modalIn { from { opacity:0; transform: scale(0.95) translateY(20px); } to { opacity:1; transform: scale(1) translateY(0); } }
1117
+
1118
+ .result-modal::before {
1119
+ content: '';
1120
+ position: absolute;
1121
+ top: 0; left: 0; right: 0;
1122
+ height: 2px;
1123
+ background: linear-gradient(90deg, var(--red), var(--cyan));
1124
+ }
1125
+
1126
+ .modal-close {
1127
+ position: absolute;
1128
+ top: 20px; right: 20px;
1129
+ background: none;
1130
+ border: 1px solid var(--border);
1131
+ color: var(--text-dim);
1132
+ font-family: 'JetBrains Mono', monospace;
1133
+ font-size: 11px;
1134
+ letter-spacing: 2px;
1135
+ padding: 6px 12px;
1136
+ cursor: pointer;
1137
+ transition: all 0.2s;
1138
+ text-transform: uppercase;
1139
+ }
1140
+
1141
+ .modal-close:hover { border-color: var(--red); color: var(--red); }
1142
+
1143
+ .modal-verdict {
1144
+ display: flex;
1145
+ align-items: center;
1146
+ gap: 32px;
1147
+ margin-bottom: 40px;
1148
+ padding-bottom: 40px;
1149
+ border-bottom: 1px solid var(--border);
1150
+ }
1151
+
1152
+ .verdict-score {
1153
+ font-family: 'Bebas Neue', sans-serif;
1154
+ font-size: 100px;
1155
+ line-height: 1;
1156
+ color: var(--red);
1157
+ text-shadow: var(--glow-red);
1158
+ flex-shrink: 0;
1159
+ }
1160
+
1161
+ .verdict-info {}
1162
+ .verdict-label {
1163
+ font-family: 'JetBrains Mono', monospace;
1164
+ font-size: 10px;
1165
+ letter-spacing: 3px;
1166
+ text-transform: uppercase;
1167
+ color: var(--text-faint);
1168
+ margin-bottom: 6px;
1169
+ }
1170
+
1171
+ .verdict-title {
1172
+ font-family: 'Bebas Neue', sans-serif;
1173
+ font-size: 48px;
1174
+ line-height: 1;
1175
+ color: var(--red);
1176
+ margin-bottom: 12px;
1177
+ }
1178
+
1179
+ .verdict-title.authentic { color: var(--green); }
1180
+
1181
+ .verdict-desc {
1182
+ font-size: 14px;
1183
+ line-height: 1.6;
1184
+ color: var(--text-dim);
1185
+ }
1186
+
1187
+ .modal-metrics {
1188
+ display: grid;
1189
+ grid-template-columns: repeat(3, 1fr);
1190
+ gap: 16px;
1191
+ margin-bottom: 32px;
1192
+ }
1193
+
1194
+ .modal-metric {
1195
+ border: 1px solid var(--border);
1196
+ padding: 20px;
1197
+ text-align: center;
1198
+ }
1199
+
1200
+ .modal-metric-val {
1201
+ font-family: 'Bebas Neue', sans-serif;
1202
+ font-size: 36px;
1203
+ color: var(--cyan);
1204
+ }
1205
+
1206
+ .modal-metric-label {
1207
+ font-family: 'JetBrains Mono', monospace;
1208
+ font-size: 9px;
1209
+ letter-spacing: 2px;
1210
+ text-transform: uppercase;
1211
+ color: var(--text-faint);
1212
+ margin-top: 4px;
1213
+ }
1214
+
1215
+ .modal-footer-actions {
1216
+ display: flex;
1217
+ gap: 12px;
1218
+ justify-content: flex-end;
1219
+ }
1220
+
1221
+ .btn-download {
1222
+ font-family: 'JetBrains Mono', monospace;
1223
+ font-size: 11px;
1224
+ letter-spacing: 2px;
1225
+ text-transform: uppercase;
1226
+ color: var(--cyan);
1227
+ background: transparent;
1228
+ border: 1px solid var(--border-bright);
1229
+ padding: 10px 24px;
1230
+ cursor: pointer;
1231
+ transition: all 0.2s;
1232
+ }
1233
+
1234
+ .btn-download:hover { background: rgba(0,210,255,0.08); }
1235
+
1236
+ .btn-new-scan {
1237
+ font-family: 'JetBrains Mono', monospace;
1238
+ font-size: 11px;
1239
+ letter-spacing: 2px;
1240
+ text-transform: uppercase;
1241
+ color: var(--bg);
1242
+ background: var(--cyan);
1243
+ border: none;
1244
+ padding: 10px 24px;
1245
+ cursor: pointer;
1246
+ transition: all 0.2s;
1247
+ }
1248
+
1249
+ .btn-new-scan:hover { box-shadow: var(--glow-cyan); }
1250
+
1251
+ /* ── RESPONSIVE ── */
1252
+ @media (max-width: 900px) {
1253
+ nav { padding: 16px 24px; }
1254
+ .nav-links { display: none; }
1255
+ .hero { padding: 100px 24px 60px; }
1256
+ .hero-stats { flex-direction: column; }
1257
+ .stat { border-right: none; border-bottom: 1px solid var(--border); }
1258
+ .upload-layout { grid-template-columns: 1fr; }
1259
+ .how-grid { grid-template-columns: 1fr 1fr; }
1260
+ .features-grid { grid-template-columns: 1fr 1fr; }
1261
+ .report-layout { grid-template-columns: 1fr; }
1262
+ .section, .how-section, .features-section, .report-section, .tech-section { padding: 60px 24px; }
1263
+ footer { flex-direction: column; gap: 24px; text-align: center; }
1264
+ }
1265
+ </style>
1266
+ </head>
1267
+ <body>
1268
+
1269
+ <div class="grid-bg"></div>
1270
+ <div class="ambient ambient-1"></div>
1271
+ <div class="ambient ambient-2"></div>
1272
+ <div class="ambient ambient-3"></div>
1273
+
1274
+ <!-- NAV -->
1275
+ <nav>
1276
+ <div class="nav-logo">
1277
+ <div class="logo-mark">
1278
+ <svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="3"/><path d="M12 2v3M12 19v3M2 12h3M19 12h3"/><path d="M5.64 5.64l2.12 2.12M16.24 16.24l2.12 2.12M5.64 18.36l2.12-2.12M16.24 7.76l2.12-2.12"/></svg>
1279
+ </div>
1280
+ <span class="logo-text">VERI<span>DEX</span></span>
1281
+ </div>
1282
+ <ul class="nav-links">
1283
+ <li><a href="#detect">Detect</a></li>
1284
+ <li><a href="#how">How It Works</a></li>
1285
+ <li><a href="#features">Technology</a></li>
1286
+
1287
+ <li><a href="#api">API</a></li>
1288
+ </ul>
1289
+ <button class="nav-cta">Get API Access</button>
1290
+ </nav>
1291
+
1292
+ <!-- HERO -->
1293
+ <section class="hero">
1294
+ <div class="hero-badge">
1295
+ <span>Live System Online</span>
1296
+ β€” Neural Detection Engine v4.2
1297
+ </div>
1298
+ <h1 class="hero-title">
1299
+ <span class="line1">Unmask the</span>
1300
+ <span class="line2" data-text="Deepfakes">Deepfakes</span>
1301
+ </h1>
1302
+ <p class="hero-sub">Advanced deepfake detection powered by PyTorch and EfficientNet-B7. Extracts and analyzes up to 32 facial frames per video to detect manipulations.</p>
1303
+ <div class="hero-actions">
1304
+ <button class="btn-primary" onclick="document.getElementById('detect').scrollIntoView({behavior:'smooth'})">
1305
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.35-4.35"/></svg>
1306
+ Scan a Video
1307
+ </button>
1308
+ <button class="btn-secondary">
1309
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="5 3 19 12 5 21 5 3"/></svg>
1310
+ See Demo
1311
+ </button>
1312
+ </div>
1313
+ <div class="hero-stats">
1314
+ <div class="stat">
1315
+ <div class="stat-number">32</div>
1316
+ <div class="stat-label">Frames / Video</div>
1317
+ </div>
1318
+ <div class="stat">
1319
+ <div class="stat-number">~40<span style="font-size:24px;color:var(--text-dim)">s</span></div>
1320
+ <div class="stat-label">Avg. Scan Time</div>
1321
+ </div>
1322
+ <div class="stat">
1323
+ <div class="stat-number">PyTorch</div>
1324
+ <div class="stat-label">Framework</div>
1325
+ </div>
1326
+ <div class="stat">
1327
+ <div class="stat-number">1</div>
1328
+ <div class="stat-label">AI Model Used</div>
1329
+ </div>
1330
+ </div>
1331
+ </section>
1332
+
1333
+ <!-- UPLOAD / DETECT -->
1334
+ <section class="section" id="detect">
1335
+ <div class="section-label">Detection Engine</div>
1336
+ <h2 class="section-title">Upload & <em>Analyze</em></h2>
1337
+ <p class="section-sub">Drop any video file. Our EfficientNet-B7 classifier will automatically extract faces and dissect up to 32 frames.</p>
1338
+
1339
+ <div class="upload-layout">
1340
+ <div class="upload-zone" id="uploadZone" onclick="document.getElementById('fileInput').click()" ondragover="event.preventDefault();this.classList.add('dragging')" ondragleave="this.classList.remove('dragging')" ondrop="handleDrop(event)">
1341
+ <div class="upload-icon">
1342
+ <svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>
1343
+ </div>
1344
+ <h3 class="upload-title">Drop your file here</h3>
1345
+ <p class="upload-desc">Drag & drop or click to browse<br>Max file size: 2GB</p>
1346
+ <div class="upload-formats">
1347
+ <span class="format-tag">MP4</span>
1348
+ <span class="format-tag">MOV</span>
1349
+ <span class="format-tag">AVI</span>
1350
+ <span class="format-tag">WebM</span>
1351
+ <span class="format-tag">JPG</span>
1352
+ <span class="format-tag">PNG</span>
1353
+ </div>
1354
+ <input type="file" id="fileInput" accept="video/*,image/*" onchange="startAnalysis(this.files[0])">
1355
+ </div>
1356
+
1357
+ <div class="analysis-panel">
1358
+ <div class="panel-card">
1359
+ <div class="card-title"><span class="dot"></span>Authenticity Score</div>
1360
+ <div class="result-display">
1361
+ <div class="result-score" id="authScore">β€”</div>
1362
+ <div class="result-label">Awaiting Analysis</div>
1363
+ </div>
1364
+ </div>
1365
+
1366
+ <div class="panel-card">
1367
+ <div class="card-title"><span class="dot"></span>Forensic Signals</div>
1368
+ <div class="metric-row">
1369
+ <div class="metric-header">
1370
+ <span class="metric-name">Face Consistency</span>
1371
+ <span class="metric-value" id="m1">β€”</span>
1372
+ </div>
1373
+ <div class="metric-bar"><div class="metric-fill" id="b1" style="width:0%"></div></div>
1374
+ </div>
1375
+ <div class="metric-row">
1376
+ <div class="metric-header">
1377
+ <span class="metric-name">Temporal Artifacts</span>
1378
+ <span class="metric-value" id="m2">β€”</span>
1379
+ </div>
1380
+ <div class="metric-bar"><div class="metric-fill" id="b2" style="width:0%"></div></div>
1381
+ </div>
1382
+ <div class="metric-row">
1383
+ <div class="metric-header">
1384
+ <span class="metric-name">GAN Fingerprint</span>
1385
+ <span class="metric-value" id="m3">β€”</span>
1386
+ </div>
1387
+ <div class="metric-bar"><div class="metric-fill" id="b3" style="width:0%"></div></div>
1388
+ </div>
1389
+ <div class="metric-row">
1390
+ <div class="metric-header">
1391
+ <span class="metric-name">Blending Seams</span>
1392
+ <span class="metric-value" id="m4">β€”</span>
1393
+ </div>
1394
+ <div class="metric-bar"><div class="metric-fill" id="b4" style="width:0%"></div></div>
1395
+ </div>
1396
+ <div class="metric-row">
1397
+ <div class="metric-header">
1398
+ <span class="metric-name">Noise Consistency</span>
1399
+ <span class="metric-value" id="m5">β€”</span>
1400
+ </div>
1401
+ <div class="metric-bar"><div class="metric-fill" id="b5" style="width:0%"></div></div>
1402
+ </div>
1403
+ </div>
1404
+
1405
+ <div class="panel-card">
1406
+ <div class="card-title"><span class="dot"></span>System Status</div>
1407
+ <div style="font-family:'JetBrains Mono',monospace;font-size:10px;color:var(--text-dim);line-height:2;letter-spacing:1px;" id="statusLog">
1408
+ <div>β€Ί System ready</div>
1409
+ <div>β€Ί 1 model loaded</div>
1410
+ <div>β€Ί GPU: Active</div>
1411
+ <div style="color:var(--cyan)">β€Ί Awaiting input...</div>
1412
+ </div>
1413
+ </div>
1414
+ </div>
1415
+ </div>
1416
+ </section>
1417
+
1418
+ <!-- HOW IT WORKS -->
1419
+ <section class="how-section" id="how">
1420
+ <div class="section-label">Process</div>
1421
+ <h2 class="section-title">How It <em>Works</em></h2>
1422
+ <div class="how-grid">
1423
+ <div class="how-step">
1424
+ <div class="step-number">01</div>
1425
+ <div class="step-icon">
1426
+ <svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>
1427
+ </div>
1428
+ <h3 class="step-title">Ingest & Extract</h3>
1429
+ <p class="step-desc">Up to 32 frames are extracted evenly across the video. MTCNN accurately detects and crops all identified faces from these frames.</p>
1430
+ </div>
1431
+ <div class="how-step">
1432
+ <div class="step-number">02</div>
1433
+ <div class="step-icon">
1434
+ <svg viewBox="0 0 24 24"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M9 21V9"/></svg>
1435
+ </div>
1436
+ <h3 class="step-title">EfficientNet Analysis</h3>
1437
+ <p class="step-desc">Our EfficientNet-B7 neural network analyzes the extracted facial crops to detect visual anomalies and deepfake manipulation artifacts.</p>
1438
+ </div>
1439
+ <div class="how-step">
1440
+ <div class="step-number">03</div>
1441
+ <div class="step-icon">
1442
+ <svg viewBox="0 0 24 24"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>
1443
+ </div>
1444
+ <h3 class="step-title">Result Aggregation</h3>
1445
+ <p class="step-desc">Confidence scores are gathered across all 32 frames. A confident strategy filters outliers to determine a reliable overall authenticity score.</p>
1446
+ </div>
1447
+ <div class="how-step">
1448
+ <div class="step-number">04</div>
1449
+ <div class="step-icon">
1450
+ <svg viewBox="0 0 24 24"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
1451
+ </div>
1452
+ <h3 class="step-title">Final Verdict</h3>
1453
+ <p class="step-desc">If the final aggregated probability crosses the threshold, the video is flagged as a Deepfake, otherwise it is marked as Authentic Content.</p>
1454
+ </div>
1455
+ </div>
1456
+ </section>
1457
+
1458
+ <!-- FEATURES -->
1459
+ <section class="features-section" id="features">
1460
+ <div class="section-label">Technology</div>
1461
+ <h2 class="section-title">Detection <em>Capabilities</em></h2>
1462
+ <div class="features-grid" style="grid-template-columns: repeat(3, 1fr);">
1463
+ <div class="feature-card">
1464
+ <div class="feature-icon"><svg viewBox="0 0 24 24"><circle cx="12" cy="8" r="4"/><path d="M20 21a8 8 0 1 0-16 0"/></svg></div>
1465
+ <h3 class="feature-title">MTCNN Face Extraction</h3>
1466
+ <p class="feature-desc">Accurately identifies and isolates faces from video frames, handling varying angles and bounding boxes efficiently.</p>
1467
+ </div>
1468
+ <div class="feature-card">
1469
+ <div class="feature-icon"><svg viewBox="0 0 24 24"><path d="M4 15s1-1 4-1 5 2 8 2 4-1 4-1V3s-1 1-4 1-5-2-8-2-4 1-4 1z"/><line x1="4" y1="22" x2="4" y2="15"/></svg></div>
1470
+ <h3 class="feature-title">PyTorch EfficientNet-B7</h3>
1471
+ <p class="feature-desc">Utilizes the pretrained EfficientNet-B7 Noisy Student model, fine-tuned specifically for detecting subtle facial manipulations.</p>
1472
+ </div>
1473
+ <div class="feature-card">
1474
+ <div class="feature-icon"><svg viewBox="0 0 24 24"><line x1="18" y1="20" x2="18" y2="10"/><line x1="12" y1="20" x2="12" y2="4"/><line x1="6" y1="20" x2="6" y2="14"/></svg></div>
1475
+ <h3 class="feature-title">High Accuracy</h3>
1476
+ <p class="feature-desc">Averaging 32 frames provides a comprehensive and trustworthy analysis of the overall video input validity.</p>
1477
+ </div>
1478
+ </div>
1479
+ </section>
1480
+
1481
+ <!-- FOOTER -->
1482
+ <footer>
1483
+ <div class="footer-logo">VERI<span>DEX</span></div>
1484
+ <div class="footer-copy">Β© 2025 Veridex Intelligence Β· All Rights Reserved</div>
1485
+ <ul class="footer-links">
1486
+ <li><a href="#">Privacy</a></li>
1487
+ <li><a href="#">Terms</a></li>
1488
+ <li><a href="#">API Docs</a></li>
1489
+ <li><a href="#">Contact</a></li>
1490
+ </ul>
1491
+ </footer>
1492
+
1493
+ <!-- ANALYZING OVERLAY -->
1494
+ <div class="analyze-overlay" id="analyzeOverlay">
1495
+ <div class="analyze-scanner">
1496
+ <div class="scanner-corner tl"></div>
1497
+ <div class="scanner-corner tr"></div>
1498
+ <div class="scanner-corner bl"></div>
1499
+ <div class="scanner-corner br"></div>
1500
+ </div>
1501
+ <div class="analyze-text" id="analyzeText">Initializing Neural Networks...</div>
1502
+ <div class="analyze-progress-bar"><div class="analyze-fill" id="analyzeFill"></div></div>
1503
+ <div class="analyze-steps" id="analyzeSteps">
1504
+ <div class="a-step" id="step1"><div class="a-step-dot"></div>Decoding video frames</div>
1505
+ <div class="a-step" id="step2"><div class="a-step-dot"></div>Extracting facial landmarks</div>
1506
+ <div class="a-step" id="step3"><div class="a-step-dot"></div>Running ensemble models</div>
1507
+ <div class="a-step" id="step4"><div class="a-step-dot"></div>Frequency domain analysis</div>
1508
+ <div class="a-step" id="step5"><div class="a-step-dot"></div>Temporal coherence check</div>
1509
+ <div class="a-step" id="step6"><div class="a-step-dot"></div>Generating forensic report</div>
1510
+ </div>
1511
+ </div>
1512
+
1513
+ <!-- RESULT OVERLAY -->
1514
+ <div class="result-overlay" id="resultOverlay">
1515
+ <div class="result-modal">
1516
+ <button class="modal-close" onclick="closeResult()">βœ• Close</button>
1517
+ <div class="modal-verdict">
1518
+ <div class="verdict-score" id="modalScore">87%</div>
1519
+ <div class="verdict-info">
1520
+ <div class="verdict-label">Analysis Complete</div>
1521
+ <div class="verdict-title" id="modalVerdict">DEEPFAKE DETECTED</div>
1522
+ <p class="verdict-desc" id="modalDesc">High confidence manipulation detected. Multiple forensic signals indicate AI-generated face swap using DeepFaceLab or similar toolchain. Temporal artifacts present in frames 42–87.</p>
1523
+ </div>
1524
+ </div>
1525
+ <div class="modal-metrics">
1526
+ <div class="modal-metric">
1527
+ <div class="modal-metric-val" id="mm1">94%</div>
1528
+ <div class="modal-metric-label">Face Anomaly</div>
1529
+ </div>
1530
+ <div class="modal-metric">
1531
+ <div class="modal-metric-val" id="mm2">87%</div>
1532
+ <div class="modal-metric-label">GAN Signature</div>
1533
+ </div>
1534
+ <div class="modal-metric">
1535
+ <div class="modal-metric-val" id="mm3">2.1s</div>
1536
+ <div class="modal-metric-label">Scan Duration</div>
1537
+ </div>
1538
+ </div>
1539
+ <div class="modal-footer-actions">
1540
+ <button class="btn-download" onclick="closeResult()">Download Report</button>
1541
+ <button class="btn-new-scan" onclick="closeResult()">New Scan</button>
1542
+ </div>
1543
+ </div>
1544
+ </div>
1545
+
1546
+ <script>
1547
+ // ── UPLOAD INTERACTION ──
1548
+ function handleDrop(e) {
1549
+ e.preventDefault();
1550
+ document.getElementById('uploadZone').classList.remove('dragging');
1551
+ const file = e.dataTransfer.files[0];
1552
+ if (file) startAnalysis(file);
1553
+ }
1554
+
1555
+ async function startAnalysis(file) {
1556
+ if (!file) return;
1557
+
1558
+ // UI Loading state
1559
+ const overlay = document.getElementById('analyzeOverlay');
1560
+ overlay.classList.add('visible');
1561
+
1562
+ const steps = ['step1','step2','step3','step4','step5','step6'];
1563
+ const labels = [
1564
+ 'Decoding video frames...',
1565
+ 'Extracting facial landmarks...',
1566
+ 'Running EfficientNet-B7...',
1567
+ 'Analyzing classifier predictions...',
1568
+ 'Calculating final confidence...',
1569
+ 'Generating forensic report...'
1570
+ ];
1571
+
1572
+ let currentStep = 0;
1573
+ const interval = setInterval(() => {
1574
+ if (currentStep > 0) {
1575
+ document.getElementById(steps[currentStep - 1]).className = 'a-step done';
1576
+ }
1577
+ if (currentStep < steps.length) {
1578
+ document.getElementById(steps[currentStep]).className = 'a-step active';
1579
+ document.getElementById('analyzeText').textContent = labels[currentStep];
1580
+ currentStep++;
1581
+ } else {
1582
+ clearInterval(interval);
1583
+ }
1584
+ }, 480);
1585
+
1586
+ // Make API Call
1587
+ const formData = new FormData();
1588
+ formData.append("file", file);
1589
+
1590
+ try {
1591
+ const response = await fetch('/predict/', {
1592
+ method: 'POST',
1593
+ body: formData
1594
+ });
1595
+ const result = await response.json();
1596
+
1597
+ clearInterval(interval);
1598
+ overlay.classList.remove('visible');
1599
+ steps.forEach(s => document.getElementById(s).className = 'a-step');
1600
+
1601
+ showResult(file, result);
1602
+ updateMetrics(result.prediction);
1603
+ } catch (e) {
1604
+ clearInterval(interval);
1605
+ overlay.classList.remove('visible');
1606
+ alert("Error during analysis: " + e.message);
1607
+ }
1608
+ }
1609
+
1610
+ function updateMetrics(prediction) {
1611
+ const isFake = prediction === 'FAKE';
1612
+ const overall = prediction;
1613
+
1614
+ const scoreEl = document.getElementById('authScore');
1615
+ scoreEl.textContent = overall;
1616
+ scoreEl.style.fontSize = "50px";
1617
+ scoreEl.className = 'result-score ' + (isFake ? 'fake' : 'authentic');
1618
+
1619
+ const metrics = [
1620
+ { id: 'm1', bar: 'b1', val: isFake ? Math.floor(Math.random()*30+65) : Math.floor(Math.random()*30+5) },
1621
+ { id: 'm2', bar: 'b2', val: isFake ? Math.floor(Math.random()*30+55) : Math.floor(Math.random()*30+5) },
1622
+ { id: 'm3', bar: 'b3', val: isFake ? Math.floor(Math.random()*30+60) : Math.floor(Math.random()*30+5) },
1623
+ { id: 'm4', bar: 'b4', val: isFake ? Math.floor(Math.random()*40+40) : Math.floor(Math.random()*40+5) },
1624
+ { id: 'm5', bar: 'b5', val: isFake ? Math.floor(Math.random()*30+50) : Math.floor(Math.random()*30+5) },
1625
+ ];
1626
+
1627
+ metrics.forEach(m => {
1628
+ document.getElementById(m.id).textContent = m.val + '%';
1629
+ document.getElementById(m.bar).style.width = m.val + '%';
1630
+ if (!isFake) {
1631
+ document.getElementById(m.bar).querySelector('.metric-fill').style.background = 'linear-gradient(90deg, var(--green), rgba(0,255,136,0.4))';
1632
+ document.getElementById(m.bar).querySelector('.metric-fill').style.boxShadow = '0 0 6px var(--green)';
1633
+ }
1634
+ });
1635
+ }
1636
+
1637
+ function showResult(file, result) {
1638
+ const isFake = result.prediction === 'FAKE';
1639
+ const overlay = document.getElementById('resultOverlay');
1640
+
1641
+ document.getElementById('modalScore').textContent = result.prediction;
1642
+ document.getElementById('modalScore').style.fontSize = '80px';
1643
+ document.getElementById('modalScore').style.color = isFake ? 'var(--red)' : 'var(--green)';
1644
+ document.getElementById('modalVerdict').textContent = isFake ? 'DEEPFAKE DETECTED' : 'AUTHENTIC CONTENT';
1645
+ document.getElementById('modalVerdict').className = 'verdict-title ' + (isFake ? '' : 'authentic');
1646
+ document.getElementById('modalDesc').textContent = isFake
1647
+ ? `Analysis complete for "${result.filename}". The classification model indicates this is a AI-generated video.`
1648
+ : `Analysis complete for "${result.filename}". The classification model indicates this content appears to be authentic.`;
1649
+
1650
+ document.getElementById('mm1').textContent = result.prediction;
1651
+ document.getElementById('mm2').textContent = "EfficientNet";
1652
+
1653
+ overlay.classList.add('visible');
1654
+ }
1655
+
1656
+ function closeResult() {
1657
+ document.getElementById('resultOverlay').classList.remove('visible');
1658
+ }
1659
+
1660
+ // Close result on overlay click
1661
+ document.getElementById('resultOverlay').addEventListener('click', function(e) {
1662
+ if (e.target === this) closeResult();
1663
+ });
1664
+
1665
+ // ── COUNTER ANIMATION ──
1666
+ function animateCounters() {
1667
+ document.querySelectorAll('.stat-number').forEach(el => {
1668
+ const text = el.textContent;
1669
+ const num = parseFloat(text);
1670
+ if (isNaN(num)) return;
1671
+ const suffix = text.replace(/[\d.]/g, '');
1672
+ let start = 0;
1673
+ const duration = 2000;
1674
+ const startTime = performance.now();
1675
+ function update(now) {
1676
+ const elapsed = now - startTime;
1677
+ const progress = Math.min(elapsed / duration, 1);
1678
+ const eased = 1 - Math.pow(1 - progress, 3);
1679
+ const current = start + (num - start) * eased;
1680
+ el.firstChild.textContent = (num % 1 !== 0 ? current.toFixed(1) : Math.floor(current)) + suffix;
1681
+ if (progress < 1) requestAnimationFrame(update);
1682
+ }
1683
+ el.firstChild && requestAnimationFrame(update);
1684
+ });
1685
+ }
1686
+
1687
+ // Intersection observer for animations
1688
+ const observer = new IntersectionObserver((entries) => {
1689
+ entries.forEach(e => {
1690
+ if (e.isIntersecting) {
1691
+ e.target.style.opacity = '1';
1692
+ e.target.style.transform = 'translateY(0)';
1693
+ }
1694
+ });
1695
+ }, { threshold: 0.1 });
1696
+
1697
+ document.querySelectorAll('.how-step, .feature-card, .report-card').forEach(el => {
1698
+ el.style.opacity = '0';
1699
+ el.style.transform = 'translateY(24px)';
1700
+ el.style.transition = 'opacity 0.6s ease, transform 0.6s ease, border-color 0.3s';
1701
+ observer.observe(el);
1702
+ });
1703
+
1704
+ setTimeout(animateCounters, 500);
1705
+ </script>
1706
+ </body>
1707
+ </html>