dk2430098 commited on
Commit
14ff9cc
Β·
verified Β·
1 Parent(s): 6360a96

Upload folder using huggingface_hub

Browse files
Files changed (3) hide show
  1. frontend/index.html +80 -12
  2. frontend/regenerate_css.py +495 -0
  3. frontend/style.css +117 -49
frontend/index.html CHANGED
@@ -20,9 +20,18 @@
20
  <header class="header">
21
  <div class="header-inner">
22
  <div class="logo">
23
- <span class="logo-icon">⬑</span>
24
- <div>
25
- <span class="logo-title">ImageForensics</span><span class="logo-accent">Detect</span>
 
 
 
 
 
 
 
 
 
26
  <div class="logo-sub">Multi-Branch Forensic Analysis System</div>
27
  </div>
28
  </div>
@@ -72,7 +81,14 @@
72
  <div class="section-label">STEP 1 β€” UPLOAD IMAGE FOR FORENSIC ANALYSIS</div>
73
  <div class="upload-zone" id="uploadZone">
74
  <input type="file" id="fileInput" accept="image/*" hidden />
75
- <div class="upload-icon">πŸ”¬</div>
 
 
 
 
 
 
 
76
  <div class="upload-title">Drop an image here or click to upload</div>
77
  <div class="upload-sub">Supports JPG Β· PNG Β· WebP Β· BMP Β· Max 15 MB</div>
78
  <div class="upload-hint">System detects: <strong>Real Camera Photo</strong> vs <strong>AI-Generated
@@ -105,7 +121,16 @@
105
 
106
  <!-- ── Analyzing Spinner ──────────────────────────────────── -->
107
  <div class="analyzing-state" id="analyzingState" style="display:none">
108
- <div class="spinner-ring"></div>
 
 
 
 
 
 
 
 
 
109
  <div class="analyzing-title">Running 5-Branch Forensic Analysis...</div>
110
  <div class="analyzing-steps" id="analyzingSteps">
111
  <div class="step-item" id="step-spectral">β—‹ Spectral FFT/DCT Frequency Analysis</div>
@@ -170,7 +195,13 @@
170
 
171
  <!-- Spectral -->
172
  <div class="branch-card" id="bc-spectral">
173
- <div class="branch-icon">🌊</div>
 
 
 
 
 
 
174
  <div class="branch-info">
175
  <div class="branch-name">Spectral Branch <span class="branch-tag">Signal</span></div>
176
  <div class="branch-desc">FFT/DCT frequency-domain artifact detection</div>
@@ -187,7 +218,15 @@
187
 
188
  <!-- Edge -->
189
  <div class="branch-card" id="bc-edge">
190
- <div class="branch-icon">✏️</div>
 
 
 
 
 
 
 
 
191
  <div class="branch-info">
192
  <div class="branch-name">Edge Branch <span class="branch-tag">Signal</span></div>
193
  <div class="branch-desc">Sobel/Laplacian edge & gradient statistics</div>
@@ -204,7 +243,14 @@
204
 
205
  <!-- CNN -->
206
  <div class="branch-card" id="bc-cnn">
207
- <div class="branch-icon">🧠</div>
 
 
 
 
 
 
 
208
  <div class="branch-info">
209
  <div class="branch-name">CNN Branch <span class="branch-tag trained">Trained</span></div>
210
  <div class="branch-desc">EfficientNet-B0 texture & patch analysis</div>
@@ -221,7 +267,14 @@
221
 
222
  <!-- ViT -->
223
  <div class="branch-card" id="bc-vit">
224
- <div class="branch-icon">πŸ‘οΈ</div>
 
 
 
 
 
 
 
225
  <div class="branch-info">
226
  <div class="branch-name">ViT Branch <span class="branch-tag trained">99.30%</span></div>
227
  <div class="branch-desc">Vision Transformer global semantic analysis</div>
@@ -238,7 +291,14 @@
238
 
239
  <!-- Diffusion -->
240
  <div class="branch-card" id="bc-diffusion">
241
- <div class="branch-icon">πŸ’¨</div>
 
 
 
 
 
 
 
242
  <div class="branch-info">
243
  <div class="branch-name">Diffusion Branch <span class="branch-tag">Signal</span></div>
244
  <div class="branch-desc">Noise residual & denoising trace analysis</div>
@@ -342,7 +402,12 @@
342
  </div>
343
  <div class="how-arrow">β†’</div>
344
  <div class="how-step">
345
- <div class="how-icon">βš–οΈ</div>
 
 
 
 
 
346
  <div class="how-title">Fusion</div>
347
  <div class="how-desc">Certainty-weighted probabilistic fusion</div>
348
  </div>
@@ -361,7 +426,10 @@
361
 
362
  <div class="footer-col">
363
  <div class="footer-brand">
364
- <span class="footer-brand-icon">⬑</span>
 
 
 
365
  <span class="footer-brand-name">ImageForensics<span class="footer-brand-accent">Detect</span></span>
366
  </div>
367
  <p class="footer-tagline">Research-grade multi-branch AI image forensics system for detecting AI-generated
 
20
  <header class="header">
21
  <div class="header-inner">
22
  <div class="logo">
23
+ <svg class="logo-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
24
+ stroke-linecap="round" stroke-linejoin="round">
25
+ <path d="M12 2l9 4.5v9L12 20l-9-4.5v-9L12 2z" />
26
+ <path d="M12 12m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" />
27
+ <path d="M12 7.5l0 1" />
28
+ <path d="M12 15.5l0 1" />
29
+ <path d="M7.5 12l1 0" />
30
+ <path d="M15.5 12l1 0" />
31
+ </svg>
32
+ <div class="logo-text-group">
33
+ <div class="logo-main"><span class="logo-title">ImageForensics</span><span class="logo-accent">Detect</span>
34
+ </div>
35
  <div class="logo-sub">Multi-Branch Forensic Analysis System</div>
36
  </div>
37
  </div>
 
81
  <div class="section-label">STEP 1 β€” UPLOAD IMAGE FOR FORENSIC ANALYSIS</div>
82
  <div class="upload-zone" id="uploadZone">
83
  <input type="file" id="fileInput" accept="image/*" hidden />
84
+ <div class="upload-icon">
85
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"
86
+ stroke-linejoin="round">
87
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
88
+ <polyline points="17 8 12 3 7 8" />
89
+ <line x1="12" y1="3" x2="12" y2="15" />
90
+ </svg>
91
+ </div>
92
  <div class="upload-title">Drop an image here or click to upload</div>
93
  <div class="upload-sub">Supports JPG Β· PNG Β· WebP Β· BMP Β· Max 15 MB</div>
94
  <div class="upload-hint">System detects: <strong>Real Camera Photo</strong> vs <strong>AI-Generated
 
121
 
122
  <!-- ── Analyzing Spinner ──────────────────────────────────── -->
123
  <div class="analyzing-state" id="analyzingState" style="display:none">
124
+ <div class="spinner-container">
125
+ <div class="spinner-ring"></div>
126
+ <div class="spinner-core">
127
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
128
+ stroke-linejoin="round">
129
+ <circle cx="11" cy="11" r="8" />
130
+ <line x1="21" y1="21" x2="16.65" y2="16.65" />
131
+ </svg>
132
+ </div>
133
+ </div>
134
  <div class="analyzing-title">Running 5-Branch Forensic Analysis...</div>
135
  <div class="analyzing-steps" id="analyzingSteps">
136
  <div class="step-item" id="step-spectral">β—‹ Spectral FFT/DCT Frequency Analysis</div>
 
195
 
196
  <!-- Spectral -->
197
  <div class="branch-card" id="bc-spectral">
198
+ <div class="branch-icon spectral">
199
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
200
+ stroke-linejoin="round">
201
+ <path d="M2 10s3-3 3-3 2 1 2 1 3-3 3-3 2 1 2 1 3-3 3-3" />
202
+ <path d="M22 14s-3 3-3 3-2-1-2-1-3 3-3 3-2-1-2-1-3 3-3 3" />
203
+ </svg>
204
+ </div>
205
  <div class="branch-info">
206
  <div class="branch-name">Spectral Branch <span class="branch-tag">Signal</span></div>
207
  <div class="branch-desc">FFT/DCT frequency-domain artifact detection</div>
 
218
 
219
  <!-- Edge -->
220
  <div class="branch-card" id="bc-edge">
221
+ <div class="branch-icon edge">
222
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
223
+ stroke-linejoin="round">
224
+ <path d="M12 3v18" />
225
+ <path d="M3 12h18" />
226
+ <path d="M18 9l-3 3 3 3" />
227
+ <path d="M6 9l3 3-3 3" />
228
+ </svg>
229
+ </div>
230
  <div class="branch-info">
231
  <div class="branch-name">Edge Branch <span class="branch-tag">Signal</span></div>
232
  <div class="branch-desc">Sobel/Laplacian edge & gradient statistics</div>
 
243
 
244
  <!-- CNN -->
245
  <div class="branch-card" id="bc-cnn">
246
+ <div class="branch-icon cnn">
247
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
248
+ stroke-linejoin="round">
249
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
250
+ <path d="M12 8v4" />
251
+ <path d="M12 16h.01" />
252
+ </svg>
253
+ </div>
254
  <div class="branch-info">
255
  <div class="branch-name">CNN Branch <span class="branch-tag trained">Trained</span></div>
256
  <div class="branch-desc">EfficientNet-B0 texture & patch analysis</div>
 
267
 
268
  <!-- ViT -->
269
  <div class="branch-card" id="bc-vit">
270
+ <div class="branch-icon vit">
271
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
272
+ stroke-linejoin="round">
273
+ <circle cx="12" cy="12" r="3" />
274
+ <path
275
+ d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z" />
276
+ </svg>
277
+ </div>
278
  <div class="branch-info">
279
  <div class="branch-name">ViT Branch <span class="branch-tag trained">99.30%</span></div>
280
  <div class="branch-desc">Vision Transformer global semantic analysis</div>
 
291
 
292
  <!-- Diffusion -->
293
  <div class="branch-card" id="bc-diffusion">
294
+ <div class="branch-icon diffusion">
295
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
296
+ stroke-linejoin="round">
297
+ <path d="M4.5 16.5c-1.5 1.26-2 3.1--1 4.5s3.1 1.67 4.5.3 2.1-3.21 1.1-4.7-3.1-1.36-4.6-.1z" />
298
+ <path d="M15 7c-1.5 1.26-2 3.1--1 4.5s3.1 1.67 4.5.3 2.1-3.21 1.1-4.7-3.1-1.36-4.6-.1z" />
299
+ <path d="M8 8c-1.5 1.26-2 3.1--1 4.5s3.1 1.67 4.5.3 2.1-3.21 1.1-4.7-3.1-1.36-4.6-.1z" />
300
+ </svg>
301
+ </div>
302
  <div class="branch-info">
303
  <div class="branch-name">Diffusion Branch <span class="branch-tag">Signal</span></div>
304
  <div class="branch-desc">Noise residual & denoising trace analysis</div>
 
402
  </div>
403
  <div class="how-arrow">β†’</div>
404
  <div class="how-step">
405
+ <div class="how-icon">
406
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
407
+ stroke-linejoin="round">
408
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" />
409
+ </svg>
410
+ </div>
411
  <div class="how-title">Fusion</div>
412
  <div class="how-desc">Certainty-weighted probabilistic fusion</div>
413
  </div>
 
426
 
427
  <div class="footer-col">
428
  <div class="footer-brand">
429
+ <svg class="footer-brand-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
430
+ stroke-linecap="round" stroke-linejoin="round">
431
+ <path d="M12 2l9 4.5v9L12 20l-9-4.5v-9L12 2z" />
432
+ </svg>
433
  <span class="footer-brand-name">ImageForensics<span class="footer-brand-accent">Detect</span></span>
434
  </div>
435
  <p class="footer-tagline">Research-grade multi-branch AI image forensics system for detecting AI-generated
frontend/regenerate_css.py ADDED
@@ -0,0 +1,495 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+
3
+ CSS_PATH = "/Users/Deepakkumar/Desktop/B.Tech Project/Image_forensic/ImageForensics-Detect/frontend/style.css"
4
+
5
+ # I'll use the content I know and the fixes I designed
6
+ new_css = """/* ================================================================
7
+ ImageForensics-Detect β€” Frontend CSS
8
+ Dark theme, glassmorphism, premium micro-animations
9
+ ================================================================ */
10
+
11
+ /* ── Tokens ─────────────────────────────────────────────────── */
12
+ :root {
13
+ --bg: #06080f;
14
+ --bg2: #0c1018;
15
+ --surface: rgba(255, 255, 255, 0.04);
16
+ --surface2: rgba(255, 255, 255, 0.07);
17
+ --border: rgba(255, 255, 255, 0.08);
18
+ --border2: rgba(255, 255, 255, 0.14);
19
+ --accent: #6d9dff;
20
+ --accent2: #a78bfa;
21
+ --real: #34d399;
22
+ --fake: #f87171;
23
+ --warn: #fbbf24;
24
+ --text: #e8ecf4;
25
+ --text2: #8892a4;
26
+ --text3: #4e5668;
27
+ --radius: 14px;
28
+ --radius-lg: 22px;
29
+ --font: 'Inter', system-ui, -apple-system, sans-serif;
30
+ --mono: 'JetBrains Mono', monospace;
31
+ --glow-accent: 0 0 40px rgba(109, 157, 255, 0.18);
32
+ --glow-fake: 0 0 30px rgba(248, 113, 113, 0.20);
33
+ --glow-real: 0 0 30px rgba(52, 211, 153, 0.20);
34
+ }
35
+
36
+ /* ── Reset ───────────────────────────────────────────────────── */
37
+ *, *::before, *::after {
38
+ box-sizing: border-box;
39
+ margin: 0;
40
+ padding: 0;
41
+ }
42
+
43
+ html {
44
+ scroll-behavior: smooth;
45
+ }
46
+
47
+ body {
48
+ font-family: var(--font);
49
+ background: var(--bg);
50
+ color: var(--text);
51
+ min-height: 100vh;
52
+ line-height: 1.6;
53
+ font-size: clamp(14px, 1.2vw, 16px);
54
+ background-image:
55
+ radial-gradient(ellipse 80% 50% at 50% -10%, rgba(109, 157, 255, 0.10) 0%, transparent 70%),
56
+ radial-gradient(ellipse 60% 40% at 90% 90%, rgba(167, 139, 250, 0.06) 0%, transparent 60%);
57
+ overflow-x: hidden;
58
+ }
59
+
60
+ /* ── Header ─────────────────────────────────────────────────── */
61
+ .header {
62
+ position: sticky;
63
+ top: 0;
64
+ z-index: 100;
65
+ background: rgba(6, 8, 15, 0.85);
66
+ backdrop-filter: blur(20px);
67
+ border-bottom: 1px solid var(--border);
68
+ }
69
+
70
+ .header-inner {
71
+ max-width: 1200px;
72
+ margin: 0 auto;
73
+ padding: 1rem 2rem;
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: space-between;
77
+ }
78
+
79
+ .logo {
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 0.9rem;
83
+ }
84
+
85
+ .logo-svg {
86
+ width: 38px;
87
+ height: 38px;
88
+ color: var(--accent);
89
+ filter: drop-shadow(0 0 8px rgba(109, 157, 255, 0.5));
90
+ flex-shrink: 0;
91
+ }
92
+
93
+ .logo-main {
94
+ display: flex;
95
+ align-items: center;
96
+ }
97
+
98
+ .logo-title {
99
+ font-size: clamp(1.1rem, 2vw, 1.35rem);
100
+ font-weight: 800;
101
+ color: var(--text);
102
+ letter-spacing: -0.5px;
103
+ }
104
+
105
+ .logo-accent {
106
+ font-size: clamp(1.1rem, 2vw, 1.35rem);
107
+ font-weight: 800;
108
+ background: linear-gradient(135deg, var(--accent), var(--accent2));
109
+ -webkit-background-clip: text;
110
+ background-clip: text;
111
+ -webkit-text-fill-color: transparent;
112
+ }
113
+
114
+ .logo-sub {
115
+ font-size: 0.65rem;
116
+ color: var(--text3);
117
+ letter-spacing: 0.5px;
118
+ text-transform: uppercase;
119
+ margin-top: 0.1rem;
120
+ }
121
+
122
+ .header-badges {
123
+ display: flex;
124
+ gap: 0.6rem;
125
+ align-items: center;
126
+ flex-wrap: wrap;
127
+ }
128
+
129
+ /* ── Badges ─────────────────────────────────────────────────── */
130
+ .badge {
131
+ font-size: 0.72rem;
132
+ font-weight: 600;
133
+ padding: 0.3rem 0.75rem;
134
+ border-radius: 999px;
135
+ letter-spacing: 0.3px;
136
+ }
137
+
138
+ .badge-research {
139
+ background: rgba(109, 157, 255, 0.12);
140
+ color: var(--accent);
141
+ border: 1px solid rgba(109, 157, 255, 0.25);
142
+ }
143
+
144
+ .badge-live {
145
+ background: rgba(52, 211, 153, 0.10);
146
+ color: var(--real);
147
+ border: 1px solid rgba(52, 211, 153, 0.25);
148
+ font-variant-numeric: tabular-nums;
149
+ }
150
+
151
+ .badge-live.offline {
152
+ color: var(--fake);
153
+ background: rgba(248, 113, 113, 0.10);
154
+ border-color: rgba(248, 113, 113, 0.25);
155
+ }
156
+
157
+ /* ── Stats Bar ───────────────────────────────────────────────── */
158
+ .stats-bar {
159
+ background: var(--bg2);
160
+ border-bottom: 1px solid var(--border);
161
+ padding: 0.8rem 1rem;
162
+ overflow-x: auto;
163
+ -webkit-overflow-scrolling: touch;
164
+ }
165
+
166
+ .stats-inner {
167
+ max-width: 960px;
168
+ margin: 0 auto;
169
+ display: flex;
170
+ align-items: center;
171
+ justify-content: space-between;
172
+ gap: 0;
173
+ min-width: 700px;
174
+ }
175
+
176
+ .stat-item {
177
+ text-align: center;
178
+ padding: 0.4rem 1.5rem;
179
+ transition: transform 0.2s;
180
+ }
181
+
182
+ .stat-item:hover { transform: translateY(-1px); }
183
+
184
+ .stat-value {
185
+ font-size: 1.15rem;
186
+ font-weight: 800;
187
+ background: linear-gradient(135deg, var(--accent), var(--accent2));
188
+ -webkit-background-clip: text;
189
+ background-clip: text;
190
+ -webkit-text-fill-color: transparent;
191
+ font-variant-numeric: tabular-nums;
192
+ }
193
+
194
+ .stat-label {
195
+ font-size: 0.62rem;
196
+ color: var(--text3);
197
+ font-weight: 500;
198
+ letter-spacing: 0.5px;
199
+ margin-top: 0.1rem;
200
+ }
201
+
202
+ .stat-divider {
203
+ width: 1px;
204
+ height: 24px;
205
+ background: var(--border);
206
+ flex-shrink: 0;
207
+ }
208
+
209
+ /* ── Main ────────────────────────────────────────────────────── */
210
+ .main {
211
+ max-width: 960px;
212
+ margin: 0 auto;
213
+ padding: 3rem 1.5rem 5rem;
214
+ }
215
+
216
+ .section-label {
217
+ font-size: 0.68rem;
218
+ font-weight: 700;
219
+ letter-spacing: 2px;
220
+ color: var(--text3);
221
+ text-transform: uppercase;
222
+ margin-bottom: 1.2rem;
223
+ }
224
+
225
+ /* ── Upload Zone ─────────────────────────────────────────────── */
226
+ .upload-zone {
227
+ border: 2px dashed var(--border2);
228
+ border-radius: var(--radius-lg);
229
+ background: var(--surface);
230
+ padding: 3.5rem 2rem;
231
+ text-align: center;
232
+ cursor: pointer;
233
+ transition: border-color 0.25s, background 0.25s, transform 0.2s;
234
+ position: relative;
235
+ }
236
+
237
+ .upload-zone:hover, .upload-zone.drag-over {
238
+ border-color: var(--accent);
239
+ background: rgba(109, 157, 255, 0.05);
240
+ transform: translateY(-2px);
241
+ box-shadow: var(--glow-accent);
242
+ }
243
+
244
+ .upload-icon {
245
+ width: 64px;
246
+ height: 64px;
247
+ margin: 0 auto 1.2rem;
248
+ color: var(--accent);
249
+ filter: drop-shadow(0 0 15px rgba(109, 157, 255, 0.4));
250
+ }
251
+
252
+ .upload-title {
253
+ font-size: 1.25rem;
254
+ font-weight: 700;
255
+ color: var(--text);
256
+ margin-bottom: 0.4rem;
257
+ }
258
+
259
+ .upload-sub { font-size: 0.85rem; color: var(--text2); margin-bottom: 0.4rem; }
260
+ .upload-hint { font-size: 0.78rem; color: var(--text3); margin-bottom: 1.8rem; }
261
+
262
+ .fmt-chip {
263
+ font-size: 0.62rem;
264
+ font-weight: 600;
265
+ padding: 0.15rem 0.5rem;
266
+ border-radius: 4px;
267
+ background: rgba(255, 255, 255, 0.06);
268
+ color: var(--text3);
269
+ border: 1px solid var(--border);
270
+ margin: 0 0.2rem;
271
+ }
272
+
273
+ .preview-area {
274
+ margin-top: 1.5rem;
275
+ display: flex;
276
+ align-items: center;
277
+ gap: 1.5rem;
278
+ flex-wrap: wrap;
279
+ background: var(--surface);
280
+ border: 1px solid var(--border);
281
+ border-radius: var(--radius-lg);
282
+ padding: 1.2rem;
283
+ animation: fadeIn 0.3s ease;
284
+ }
285
+
286
+ .preview-img {
287
+ width: 90px;
288
+ height: 90px;
289
+ object-fit: cover;
290
+ border-radius: 10px;
291
+ border: 2px solid var(--border2);
292
+ }
293
+
294
+ .preview-info { flex: 1; }
295
+ .preview-filename { font-weight: 600; font-size: 0.9rem; color: var(--text); overflow: hidden; text-overflow: ellipsis; max-width: 300px; }
296
+ .preview-filesize { font-size: 0.78rem; color: var(--text3); margin-top: 0.2rem; }
297
+
298
+ /* ── Buttons ─────────────────────────────────────────────────── */
299
+ .btn-upload, .btn-analyze {
300
+ border: none;
301
+ cursor: pointer;
302
+ font-family: var(--font);
303
+ transition: all 0.2s;
304
+ }
305
+
306
+ .btn-upload {
307
+ background: linear-gradient(135deg, var(--accent), var(--accent2));
308
+ color: #fff;
309
+ border-radius: var(--radius);
310
+ padding: 0.75rem 2.2rem;
311
+ font-size: 0.9rem;
312
+ font-weight: 600;
313
+ }
314
+
315
+ .btn-analyze {
316
+ background: linear-gradient(135deg, #3b5bdb, var(--accent2));
317
+ color: #fff;
318
+ border-radius: var(--radius);
319
+ padding: 0.85rem 2.4rem;
320
+ font-size: 1rem;
321
+ font-weight: 700;
322
+ box-shadow: 0 6px 25px rgba(59, 91, 219, 0.4);
323
+ display: inline-flex;
324
+ align-items: center;
325
+ gap: 0.5rem;
326
+ }
327
+
328
+ .btn-analyze:hover { transform: translateY(-2px); box-shadow: 0 10px 35px rgba(59, 91, 219, 0.5); }
329
+ .btn-clear { background: transparent; color: var(--text2); border: 1px solid var(--border); border-radius: var(--radius); padding: 0.7rem 1.6rem; font-size: 0.85rem; cursor: pointer; margin-left: 0.8rem; transition: all 0.2s; }
330
+ .btn-clear:hover { border-color: var(--fake); color: var(--fake); }
331
+
332
+ /* ── Analyzing State ─────────────────────────────────────────── */
333
+ .analyzing-state {
334
+ text-align: center;
335
+ padding: 3rem 2rem;
336
+ background: var(--surface);
337
+ border: 1px solid var(--border);
338
+ border-radius: var(--radius-lg);
339
+ animation: fadeIn 0.3s ease;
340
+ }
341
+
342
+ .spinner-container {
343
+ position: relative;
344
+ width: 80px;
345
+ height: 80px;
346
+ margin: 0 auto 1.5rem;
347
+ }
348
+
349
+ .spinner-ring {
350
+ width: 100%; height: 100%;
351
+ border: 3px solid var(--border);
352
+ border-top-color: var(--accent);
353
+ border-radius: 50%;
354
+ animation: spin 0.9s linear infinite;
355
+ }
356
+
357
+ .spinner-core {
358
+ position: absolute; inset: 0;
359
+ display: flex; align-items: center; justify-content: center;
360
+ color: var(--accent); padding: 1.2rem; animation: pulse 1.5s infinite;
361
+ }
362
+
363
+ .analyzing-title { font-size: clamp(0.95rem, 2vw, 1.1rem); font-weight: 700; margin-bottom: 1.5rem; color: var(--text); }
364
+ .analyzing-steps { display: inline-flex; flex-direction: column; gap: 0.55rem; text-align: left; }
365
+ .step-item { font-family: var(--mono); font-size: 0.82rem; color: var(--text3); transition: color 0.3s; }
366
+ .step-item.done { color: var(--real); }
367
+ .step-item.active { color: var(--accent); animation: pulse 1s infinite; }
368
+
369
+ @keyframes spin { to { transform: rotate(360deg); } }
370
+ @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
371
+
372
+ /* ── Verdict Card ────────────────────────────────────────────── */
373
+ .results-section { animation: fadeIn 0.4s ease; }
374
+ .verdict-card {
375
+ display: flex; align-items: center; gap: 2rem; flex-wrap: wrap;
376
+ padding: 2rem; border-radius: var(--radius-lg); border: 1px solid var(--border);
377
+ margin-bottom: 2rem; position: relative; overflow: hidden;
378
+ }
379
+
380
+ .verdict-card.real { border-color: rgba(52, 211, 153, 0.3); box-shadow: var(--glow-real); background: rgba(52, 211, 153, 0.02); }
381
+ .verdict-card.fake { border-color: rgba(248, 113, 113, 0.3); box-shadow: var(--glow-fake); background: rgba(248, 113, 113, 0.02); }
382
+
383
+ .verdict-icon { font-size: 3.5rem; }
384
+ .verdict-content { flex: 1; min-width: 160px; }
385
+ .verdict-label { font-size: 0.7rem; font-weight: 700; letter-spacing: 2px; color: var(--text3); text-transform: uppercase; margin-bottom: 0.35rem; }
386
+ .verdict-text { font-size: clamp(1.8rem, 4vw, 2.2rem); font-weight: 800; letter-spacing: -1px; }
387
+ .verdict-text.real { color: var(--real); }
388
+ .verdict-text.fake { color: var(--fake); }
389
+ .verdict-sub { font-size: 0.85rem; color: var(--text2); margin-top: 0.4rem; }
390
+
391
+ /* Confidence Ring */
392
+ .confidence-ring-wrap { position: relative; width: 120px; height: 120px; flex-shrink: 0; }
393
+ .ring-bg { fill: none; stroke: var(--border); stroke-width: 8; }
394
+ .ring-fill { fill: none; stroke-width: 8; stroke-linecap: round; stroke-dasharray: 314; stroke-dashoffset: 314; transition: stroke-dashoffset 1.2s cubic-bezier(0.34, 1.56, 0.64, 1); }
395
+ .ring-fill.real { stroke: var(--real); }
396
+ .ring-fill.fake { stroke: var(--fake); }
397
+ .confidence-center { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; }
398
+ .conf-value { font-size: 1.5rem; font-weight: 800; }
399
+ .conf-label { font-size: 0.58rem; font-weight: 600; letter-spacing: 1px; color: var(--text3); text-transform: uppercase; white-space: nowrap; }
400
+
401
+ /* Probability Bar */
402
+ .prob-bar-section { margin-top: 1.2rem; }
403
+ .prob-bar-labels { display: flex; justify-content: space-between; font-size: 0.72rem; font-weight: 600; margin-bottom: 0.4rem; }
404
+ .prob-label-real { color: var(--real); }
405
+ .prob-label-fake { color: var(--fake); }
406
+ .prob-bar-track { height: 8px; border-radius: 999px; overflow: hidden; background: rgba(255, 255, 255, 0.06); display: flex; }
407
+ .prob-bar-real { height: 100%; background: var(--real); transition: width 1s ease; }
408
+ .prob-bar-fake { height: 100%; background: var(--fake); transition: width 1s ease; }
409
+ .prob-bar-values { display: flex; justify-content: space-between; font-size: 0.68rem; color: var(--text3); margin-top: 0.3rem; font-family: var(--mono); }
410
+
411
+ /* ── Branch Cards ────────────────────────────────────────────── */
412
+ .branches-grid { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 1.5rem; margin-bottom: 2rem; }
413
+ .branches-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.2rem; flex-wrap: wrap; gap: 0.5rem; }
414
+ .branches-legend { display: flex; gap: 1rem; align-items: center; font-size: 0.75rem; color: var(--text2); }
415
+ .legend-dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 0.25rem; }
416
+ .legend-dot.real { background: var(--real); }
417
+ .legend-dot.fake { background: var(--fake); }
418
+
419
+ .branch-card { display: flex; align-items: center; gap: 1rem; padding: 0.9rem 0.5rem; border-bottom: 1px solid var(--border); transition: background 0.2s; }
420
+ .branch-card:last-child { border-bottom: none; }
421
+ .branch-card:hover { background: rgba(255, 255, 255, 0.02); border-radius: 8px; }
422
+
423
+ .branch-icon {
424
+ width: 38px; height: 38px; padding: 0.5rem; display: flex; align-items: center; justify-content: center;
425
+ flex-shrink: 0; border-radius: 10px; background: rgba(255, 255, 255, 0.03); color: var(--text3);
426
+ }
427
+ .branch-icon.spectral { color: #60a5fa; }
428
+ .branch-icon.edge { color: #818cf8; }
429
+ .branch-icon.cnn { color: #34d399; }
430
+ .branch-icon.vit { color: #a78bfa; }
431
+ .branch-icon.diffusion { color: #f472b6; }
432
+
433
+ .branch-info { flex: 1; min-width: 0; }
434
+ .branch-name { font-weight: 600; font-size: 0.88rem; }
435
+ .branch-desc { font-size: 0.72rem; color: var(--text3); margin-bottom: 0.5rem; }
436
+ .branch-bar-wrap { height: 6px; background: rgba(255, 255, 255, 0.06); border-radius: 999px; overflow: hidden; }
437
+ .branch-bar { height: 100%; border-radius: 999px; width: 0%; transition: width 0.9s cubic-bezier(0.34, 1.56, 0.64, 1); }
438
+ .branch-score-col { text-align: right; flex-shrink: 0; min-width: 80px; }
439
+ .branch-prob { font-family: var(--mono); font-size: 0.9rem; font-weight: 700; }
440
+ .branch-conf { font-size: 0.7rem; color: var(--text3); }
441
+
442
+ /* ── Viz Section ─────────────────────────────────────────────── */
443
+ .viz-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 1rem; }
444
+ .viz-card { background: var(--surface2); border: 1px solid var(--border); border-radius: var(--radius); padding: 1rem; text-align: center; }
445
+ .viz-img-wrap { position: relative; aspect-ratio: 1; overflow: hidden; border-radius: 8px; background: #000; }
446
+ .viz-img { width: 100%; height: 100%; object-fit: cover; display: none; }
447
+ .viz-img.loaded { display: block; }
448
+ .viz-unavailable { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 0.65rem; color: var(--text3); padding: 0.5rem; }
449
+
450
+ /* ── How section & Footer ─────────────────────────────────── */
451
+ .how-section { background: var(--bg2); border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); padding: 3rem 1.5rem; }
452
+ .how-inner { max-width: 960px; margin: 0 auto; display: flex; align-items: center; justify-content: center; gap: 1rem; flex-wrap: wrap; }
453
+ .how-step { text-align: center; flex: 1; min-width: 140px; padding: 1.5rem 1rem; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); }
454
+ .how-icon { width: 44px; height: 44px; margin: 0 auto 0.8rem; color: var(--accent); }
455
+ .how-arrow { font-size: 1.5rem; color: var(--text3); }
456
+
457
+ .footer { background: var(--bg2); padding: 4rem 2rem 0; }
458
+ .footer-grid { max-width: 1100px; margin: 0 auto; display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 3rem; padding-bottom: 3rem; border-bottom: 1px solid var(--border); }
459
+ .footer-brand { display: flex; align-items: center; gap: 0.8rem; margin-bottom: 1rem; }
460
+ .footer-brand-svg { width: 28px; height: 28px; color: var(--accent); }
461
+ .footer-brand-name { font-size: 1.1rem; font-weight: 800; }
462
+ .footer-brand-accent { background: linear-gradient(135deg, var(--accent), var(--accent2)); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; }
463
+ .footer-list { list-style: none; display: flex; flex-direction: column; gap: 0.6rem; margin-top: 1rem; }
464
+ .footer-list li { font-size: 0.78rem; color: var(--text3); }
465
+ .footer-bar { max-width: 1100px; margin: 0 auto; display: flex; justify-content: space-between; padding: 1.5rem 0; font-size: 0.72rem; color: var(--text3); flex-wrap: wrap; gap: 1rem; }
466
+
467
+ /* ── Responsive ──────────────────────────────────────────────── */
468
+ @media (max-width: 900px) {
469
+ .footer-grid { grid-template-columns: 1fr 1fr; }
470
+ .how-arrow { display: none; }
471
+ }
472
+
473
+ @media (max-width: 640px) {
474
+ .header-inner { flex-direction: column; gap: 1.2rem; text-align: center; }
475
+ .logo-text-group { text-align: center; }
476
+ .main { padding: 2rem 1rem 4rem; }
477
+ .verdict-card { flex-direction: column; text-align: center; padding: 1.5rem; }
478
+ .verdict-text { font-size: clamp(1.4rem, 5vw, 1.8rem); }
479
+ .viz-grid { grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); }
480
+ .footer-grid { grid-template-columns: 1fr; }
481
+ .footer-bar { flex-direction: column; text-align: center; }
482
+ .stats-inner { min-width: 600px; justify-content: flex-start; }
483
+ .branch-desc { display: none; }
484
+ .branch-card { padding: 0.8rem 0.2rem; gap: 0.75rem; }
485
+ }
486
+
487
+ @media (max-width: 400px) {
488
+ .logo-svg { width: 32px; height: 32px; }
489
+ }
490
+ """
491
+
492
+ with open(CSS_PATH, "w") as f:
493
+ f.write(new_css)
494
+
495
+ print(f"SUCCESS: Regenerated style.css at {CSS_PATH}")
frontend/style.css CHANGED
@@ -21,7 +21,7 @@
21
  --text3: #4e5668;
22
  --radius: 14px;
23
  --radius-lg: 22px;
24
- --font: 'Inter', sans-serif;
25
  --mono: 'JetBrains Mono', monospace;
26
  --glow-accent: 0 0 40px rgba(109, 157, 255, 0.18);
27
  --glow-fake: 0 0 30px rgba(248, 113, 113, 0.20);
@@ -47,9 +47,12 @@ body {
47
  color: var(--text);
48
  min-height: 100vh;
49
  line-height: 1.6;
 
 
50
  background-image:
51
  radial-gradient(ellipse 80% 50% at 50% -10%, rgba(109, 157, 255, 0.10) 0%, transparent 70%),
52
  radial-gradient(ellipse 60% 40% at 90% 90%, rgba(167, 139, 250, 0.06) 0%, transparent 60%);
 
53
  }
54
 
55
  /* ── Header ─────────────────────────────────────────────────── */
@@ -77,20 +80,28 @@ body {
77
  gap: 0.9rem;
78
  }
79
 
80
- .logo-icon {
81
- font-size: 2rem;
82
- filter: drop-shadow(0 0 12px rgba(109, 157, 255, 0.6));
 
 
 
 
 
 
 
 
83
  }
84
 
85
  .logo-title {
86
- font-size: 1.35rem;
87
  font-weight: 800;
88
  color: var(--text);
89
  letter-spacing: -0.5px;
90
  }
91
 
92
  .logo-accent {
93
- font-size: 1.35rem;
94
  font-weight: 800;
95
  background: linear-gradient(135deg, var(--accent), var(--accent2));
96
  -webkit-background-clip: text;
@@ -99,7 +110,7 @@ body {
99
  }
100
 
101
  .logo-sub {
102
- font-size: 0.68rem;
103
  color: var(--text3);
104
  letter-spacing: 0.5px;
105
  text-transform: uppercase;
@@ -145,7 +156,9 @@ body {
145
  .stats-bar {
146
  background: var(--bg2);
147
  border-bottom: 1px solid var(--border);
148
- padding: 0.8rem 2rem;
 
 
149
  }
150
 
151
  .stats-inner {
@@ -153,9 +166,10 @@ body {
153
  margin: 0 auto;
154
  display: flex;
155
  align-items: center;
156
- justify-content: center;
157
  gap: 0;
158
- flex-wrap: wrap;
 
159
  }
160
 
161
  .stat-item {
@@ -234,8 +248,10 @@ body {
234
  }
235
 
236
  .upload-icon {
237
- font-size: 3.5rem;
238
- margin-bottom: 1rem;
 
 
239
  filter: drop-shadow(0 0 15px rgba(109, 157, 255, 0.4));
240
  }
241
 
@@ -412,27 +428,38 @@ body {
412
  animation: fadeIn 0.3s ease;
413
  }
414
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
415
  .spinner-ring {
416
- width: 64px;
417
- height: 64px;
418
  border: 3px solid var(--border);
419
  border-top-color: var(--accent);
420
  border-radius: 50%;
421
  animation: spin 0.9s linear infinite;
422
- margin: 0 auto 1.5rem;
423
- }
424
-
425
- @keyframes spin {
426
- to {
427
- transform: rotate(360deg);
428
- }
429
  }
430
 
431
- .analyzing-title {
432
- font-size: 1.1rem;
433
- font-weight: 700;
434
- margin-bottom: 1.5rem;
435
- color: var(--text);
 
 
 
 
436
  }
437
 
438
  .analyzing-steps {
@@ -606,6 +633,7 @@ body {
606
  letter-spacing: 1px;
607
  color: var(--text3);
608
  text-transform: uppercase;
 
609
  }
610
 
611
  /* ── Probability Bar ─────────────────────────────────────────── */
@@ -753,10 +781,36 @@ body {
753
  }
754
 
755
  .branch-icon {
756
- font-size: 1.5rem;
757
  width: 38px;
758
- text-align: center;
 
 
 
 
759
  flex-shrink: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
760
  }
761
 
762
  .branch-info {
@@ -948,8 +1002,13 @@ body {
948
  }
949
 
950
  .how-icon {
951
- font-size: 1.8rem;
952
- margin-bottom: 0.5rem;
 
 
 
 
 
953
  }
954
 
955
  .how-title {
@@ -1134,33 +1193,42 @@ body {
1134
  @media (max-width: 640px) {
1135
  .header-inner {
1136
  padding: 0.75rem 1rem;
 
 
 
 
 
 
1137
  }
1138
 
1139
  .main {
1140
  padding: 2rem 1rem 4rem;
1141
  }
 
1142
 
1143
- .verdict-card {
1144
- flex-direction: column;
1145
- text-align: center;
1146
- }
 
 
1147
 
1148
- .verdict-text {
1149
- font-size: 1.7rem;
1150
- }
1151
 
1152
- .viz-grid {
1153
- grid-template-columns: repeat(2, 1fr);
1154
- }
1155
 
1156
- .footer-grid {
1157
- grid-template-columns: 1fr;
1158
- gap: 1.5rem;
1159
- }
1160
 
1161
- .footer-bar {
1162
- flex-direction: column;
1163
- text-align: center;
1164
- gap: 0.4rem;
1165
- }
1166
  }
 
21
  --text3: #4e5668;
22
  --radius: 14px;
23
  --radius-lg: 22px;
24
+ --font: 'Inter', system-ui, -apple-system, sans-serif;
25
  --mono: 'JetBrains Mono', monospace;
26
  --glow-accent: 0 0 40px rgba(109, 157, 255, 0.18);
27
  --glow-fake: 0 0 30px rgba(248, 113, 113, 0.20);
 
47
  color: var(--text);
48
  min-height: 100vh;
49
  line-height: 1.6;
50
+ font-size: clamp(14px, 1.2vw, 16px);
51
+ /* Fluid typography */
52
  background-image:
53
  radial-gradient(ellipse 80% 50% at 50% -10%, rgba(109, 157, 255, 0.10) 0%, transparent 70%),
54
  radial-gradient(ellipse 60% 40% at 90% 90%, rgba(167, 139, 250, 0.06) 0%, transparent 60%);
55
+ overflow-x: hidden;
56
  }
57
 
58
  /* ── Header ─────────────────────────────────────────────────── */
 
80
  gap: 0.9rem;
81
  }
82
 
83
+ .logo-svg {
84
+ width: 38px;
85
+ height: 38px;
86
+ color: var(--accent);
87
+ filter: drop-shadow(0 0 8px rgba(109, 157, 255, 0.5));
88
+ flex-shrink: 0;
89
+ }
90
+
91
+ .logo-main {
92
+ display: flex;
93
+ align-items: center;
94
  }
95
 
96
  .logo-title {
97
+ font-size: clamp(1.1rem, 2vw, 1.35rem);
98
  font-weight: 800;
99
  color: var(--text);
100
  letter-spacing: -0.5px;
101
  }
102
 
103
  .logo-accent {
104
+ font-size: clamp(1.1rem, 2vw, 1.35rem);
105
  font-weight: 800;
106
  background: linear-gradient(135deg, var(--accent), var(--accent2));
107
  -webkit-background-clip: text;
 
110
  }
111
 
112
  .logo-sub {
113
+ font-size: 0.65rem;
114
  color: var(--text3);
115
  letter-spacing: 0.5px;
116
  text-transform: uppercase;
 
156
  .stats-bar {
157
  background: var(--bg2);
158
  border-bottom: 1px solid var(--border);
159
+ padding: 0.8rem 1rem;
160
+ overflow-x: auto;
161
+ -webkit-overflow-scrolling: touch;
162
  }
163
 
164
  .stats-inner {
 
166
  margin: 0 auto;
167
  display: flex;
168
  align-items: center;
169
+ justify-content: space-between;
170
  gap: 0;
171
+ min-width: 700px;
172
+ /* Force scroll on mobile */
173
  }
174
 
175
  .stat-item {
 
248
  }
249
 
250
  .upload-icon {
251
+ width: 64px;
252
+ height: 64px;
253
+ margin: 0 auto 1rem;
254
+ color: var(--accent);
255
  filter: drop-shadow(0 0 15px rgba(109, 157, 255, 0.4));
256
  }
257
 
 
428
  animation: fadeIn 0.3s ease;
429
  }
430
 
431
+ .analyzing-title {
432
+ font-size: clamp(0.95rem, 2vw, 1.1rem);
433
+ font-weight: 700;
434
+ margin-bottom: 1.5rem;
435
+ color: var(--text);
436
+ }
437
+
438
+ .spinner-container {
439
+ position: relative;
440
+ width: 80px;
441
+ height: 80px;
442
+ margin: 0 auto 1.5rem;
443
+ }
444
+
445
  .spinner-ring {
446
+ width: 100%;
447
+ height: 100%;
448
  border: 3px solid var(--border);
449
  border-top-color: var(--accent);
450
  border-radius: 50%;
451
  animation: spin 0.9s linear infinite;
 
 
 
 
 
 
 
452
  }
453
 
454
+ .spinner-core {
455
+ position: absolute;
456
+ inset: 0;
457
+ display: flex;
458
+ align-items: center;
459
+ justify-content: center;
460
+ color: var(--accent);
461
+ padding: 1.2rem;
462
+ animation: pulse 1.5s infinite;
463
  }
464
 
465
  .analyzing-steps {
 
633
  letter-spacing: 1px;
634
  color: var(--text3);
635
  text-transform: uppercase;
636
+ white-space: nowrap;
637
  }
638
 
639
  /* ── Probability Bar ─────────────────────────────────────────── */
 
781
  }
782
 
783
  .branch-icon {
 
784
  width: 38px;
785
+ height: 38px;
786
+ padding: 0.5rem;
787
+ display: flex;
788
+ align-items: center;
789
+ justify-content: center;
790
  flex-shrink: 0;
791
+ border-radius: 10px;
792
+ background: rgba(255, 255, 255, 0.03);
793
+ color: var(--text3);
794
+ }
795
+
796
+ .branch-icon.spectral {
797
+ color: #60a5fa;
798
+ }
799
+
800
+ .branch-icon.edge {
801
+ color: #818cf8;
802
+ }
803
+
804
+ .branch-icon.cnn {
805
+ color: #34d399;
806
+ }
807
+
808
+ .branch-icon.vit {
809
+ color: #a78bfa;
810
+ }
811
+
812
+ .branch-icon.diffusion {
813
+ color: #f472b6;
814
  }
815
 
816
  .branch-info {
 
1002
  }
1003
 
1004
  .how-icon {
1005
+ width: 48px;
1006
+ height: 48px;
1007
+ margin: 0 auto 0.5rem;
1008
+ color: var(--accent);
1009
+ display: flex;
1010
+ align-items: center;
1011
+ justify-content: center;
1012
  }
1013
 
1014
  .how-title {
 
1193
  @media (max-width: 640px) {
1194
  .header-inner {
1195
  padding: 0.75rem 1rem;
1196
+ flex-direction: column;
1197
+ gap: 1rem;
1198
+ }
1199
+
1200
+ .logo-text-group {
1201
+ text-align: center;
1202
  }
1203
 
1204
  .main {
1205
  padding: 2rem 1rem 4rem;
1206
  }
1207
+ }
1208
 
1209
+ .verdict-card {
1210
+ flex-direction: column;
1211
+ text-align: center;
1212
+ padding: 1.5rem;
1213
+ gap: 1.5rem;
1214
+ }
1215
 
1216
+ .verdict-text {
1217
+ font-size: clamp(1.4rem, 5vw, 1.8rem);
1218
+ }
1219
 
1220
+ .viz-grid {
1221
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
1222
+ }
1223
 
1224
+ .footer-grid {
1225
+ grid-template-columns: 1fr;
1226
+ gap: 1.5rem;
1227
+ }
1228
 
1229
+ .footer-bar {
1230
+ flex-direction: column;
1231
+ text-align: center;
1232
+ gap: 0.4rem;
1233
+ }
1234
  }