cyberai-1 commited on
Commit
e48e5be
Β·
1 Parent(s): 98ecda7
Files changed (1) hide show
  1. templates/index.html +212 -197
templates/index.html CHANGED
@@ -3,32 +3,31 @@
3
  <head>
4
  <meta charset="UTF-8"/>
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
6
- <title>SCENEIQ β€” Intel Scene Classifier</title>
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
  <link href="https://fonts.googleapis.com/css2?family=Share+Tech+Mono&family=Rajdhani:wght@400;500;600;700&family=Exo+2:wght@300;400;600&display=swap" rel="stylesheet">
9
  <style>
10
 
11
-
12
-
13
- /* ══ TOKENS ══ */
14
  :root {
15
- --g0:#000000; --g1:#050d05; --g2:#0a150a; --g3:#0f1f0f; --g4:#1a2e1a;
16
- --green:#00ff41; --green2:#00cc33; --green3:#008f1f;
17
- --green-dim:#004d11; --green-glow:rgba(0,255,65,0.15);
18
- --border:rgba(0,255,65,0.18); --border2:rgba(0,255,65,0.35);
19
- --muted:rgba(0,255,65,0.45);
 
20
  --ff-mono:'Share Tech Mono',monospace;
21
  --ff-head:'Rajdhani',sans-serif;
22
  --ff-body:'Exo 2',sans-serif;
23
- --r:4px;
24
  }
25
 
26
  *, *::before, *::after { box-sizing:border-box; margin:0; padding:0; }
27
 
28
- /* ── FULL VIEWPORT β€” no scroll ── */
29
  html, body {
30
  height: 100vh;
31
  overflow: hidden;
 
32
  }
33
 
34
  body {
@@ -37,371 +36,389 @@
37
  font-family: var(--ff-body);
38
  display: flex;
39
  flex-direction: column;
 
40
  }
41
 
42
- /* ── Background layers ── */
43
  #plexus-bg {
44
  position: fixed; inset: 0; z-index: 0; pointer-events: none;
45
  }
46
  body::before {
47
  content: ''; position: fixed; inset: 0; z-index: 0; pointer-events: none;
48
  background-image:
49
- linear-gradient(rgba(0,255,65,0.03) 1px, transparent 1px),
50
- linear-gradient(90deg, rgba(0,255,65,0.03) 1px, transparent 1px);
51
  background-size: 40px 40px;
52
  }
53
  body::after {
54
  content: ''; position: fixed; inset: 0; z-index: 0; pointer-events: none;
55
  background: repeating-linear-gradient(
56
  0deg, transparent, transparent 2px,
57
- rgba(0,0,0,0.07) 2px, rgba(0,0,0,0.07) 4px
58
  );
59
  }
60
 
61
- /* ══ WRAPPER β€” flex column, full height ══ */
62
- .wrapper {
63
- width: 100%;
64
- max-width: 1320px;
65
- margin: 0 auto;
66
- padding: 0 1.2rem;
67
- height: 100vh;
68
- display: flex;
69
- flex-direction: column;
70
- gap: 0;
71
- }
 
 
72
 
73
- /* ══ HEADER β€” compact, fixed height ══ */
74
  header {
75
  flex-shrink: 0;
76
- border-bottom: 10px solid var(--border);
77
- padding: 1rem 0;
78
  display: flex; align-items: center; justify-content: space-between;
79
  animation: fadeIn .5s ease both;
80
  }
81
- .logo { display:flex; align-items:center; gap:.75rem; }
82
  .logo-icon {
83
- width:42px; height:42px; border:1.5px solid var(--green);
84
- display:grid; place-items:center; font-size:1.1rem;
85
- box-shadow: 0 0 14px var(--green-glow), inset 0 0 8px var(--green-glow);
86
  animation: pulse-box 3s ease-in-out infinite;
 
87
  }
88
  @keyframes pulse-box {
89
- 0%,100%{box-shadow:0 0 10px var(--green-glow),inset 0 0 6px var(--green-glow);}
90
- 50%{box-shadow:0 0 22px rgba(0,255,65,.3),inset 0 0 14px rgba(0,255,65,.2);}
91
  }
92
  .logo-text {
93
- font-family:var(--ff-head); font-size:2rem; font-weight:700;
94
- letter-spacing:.15em; text-shadow:0 0 20px rgba(0,255,65,.6);
95
  }
96
  .logo-text span { color:var(--green3); }
97
 
98
- /* Hero tagline inline in header */
99
- .hero-inline {
100
- font-family:var(--ff-mono); font-size:0.5rem;
101
- color:var(--muted); letter-spacing:.06em;
102
- display:none;
103
- }
104
-
105
- .header-right { display:flex; align-items:center; gap:1.2rem; }
106
  .status-dot {
107
  display:flex; align-items:center; gap:.9rem;
108
- font-family:var(--ff-mono); font-size:0.72rem; color:var(--muted);
 
109
  }
110
  .dot {
111
- width:7px; height:7px; border-radius:50%;
112
- background:var(--green); box-shadow:0 0 8px var(--green);
113
  animation:blink 2s step-end infinite;
114
  }
115
  @keyframes blink{0%,100%{opacity:1}50%{opacity:.2}}
116
- .version { font-family:var(--ff-mono); font-size:.7rem; color:var(--green-dim); letter-spacing:.1em; }
117
 
118
- /* ── Classes strip row β€” sits between header and grid ── */
119
  .classes-bar {
120
  flex-shrink: 0;
121
- display: flex; align-items: center; gap: .8rem;
122
- padding: .4rem 0;
123
  border-bottom: 1px solid var(--border);
124
  animation: fadeIn .6s ease .1s both;
125
  }
126
- .cs-label { font-family:var(--ff-mono); font-size:.72rem; color:var(--green-dim); letter-spacing:.15em; white-space:nowrap; }
127
- .cs-pills { display:flex; gap:.35rem; flex-wrap:wrap; }
 
 
 
 
128
  .cs-pill {
129
- font-family:var(--ff-mono); font-size:.72rem;
130
- padding:.22rem .65rem;
131
- border:1px solid var(--border); border-radius:2px;
132
  color:var(--green-dim); transition:all .2s; cursor:default;
 
 
133
  }
134
- .cs-pill:hover { border-color:var(--green3); color:var(--green2); }
135
 
136
- /* ══ MAIN GRID β€” takes all remaining space ══ */
137
  .main-grid {
138
  flex: 1;
139
- min-height: 0; /* critical: allows flex child to shrink */
140
  display: grid;
141
  grid-template-columns: 1fr 1fr;
142
- gap: 1rem;
143
- padding: .75rem 0;
144
  animation: fadeIn .7s ease .15s both;
145
  }
146
 
147
- /* ══ PANELS β€” fill their grid cell ══ */
148
  .panel {
149
- background: var(--g2);
 
150
  border: 1px solid var(--border);
151
  border-radius: var(--r);
152
- padding: 1.1rem 1.25rem;
153
  position: relative;
154
- overflow: hidden; /* no overflow on panel itself */
155
  display: flex;
156
  flex-direction: column;
 
 
 
 
 
157
  }
158
  .panel::before {
159
- content:''; position:absolute; top:0; left:0; right:0; height:2px;
160
- background:linear-gradient(90deg,transparent,var(--green3),transparent);
161
  }
162
  .panel-title {
163
  flex-shrink: 0;
164
- font-family:var(--ff-mono); font-size:.82rem;
165
- letter-spacing:.2em; color:var(--green3);
166
- text-transform:uppercase; margin-bottom:.75rem;
167
- display:flex; align-items:center; gap:.6rem;
 
168
  }
169
- .panel-title::after { content:''; flex:1; height:1px; background:var(--border); }
170
 
171
- /* ── Left panel: scrollable interior ── */
172
  .panel-scroll {
173
  flex: 1;
174
  min-height: 0;
175
  overflow-y: auto;
176
  overflow-x: hidden;
177
- scrollbar-width: none; /* Firefox */
 
 
178
  }
179
- .panel-scroll::-webkit-scrollbar { display:none; }
 
 
180
 
181
- /* ── MODEL SELECTOR ── */
182
  .model-grid {
183
- display:grid; grid-template-columns:1fr 1fr; gap:.6rem;
184
- margin-bottom:.9rem;
185
  }
186
  .model-card {
187
- border:1px solid var(--border); border-radius:var(--r);
188
- padding:.6rem .7rem; cursor:pointer; transition:all .2s;
189
  background:var(--g1);
190
- display:flex; flex-direction:column; gap:.2rem;
191
  }
192
- .model-card:hover { border-color:var(--green3); background:var(--g3); }
193
  .model-card.active {
194
- border-color:var(--green); background:rgba(0,255,65,.06);
195
- box-shadow:0 0 16px rgba(0,255,65,.12),inset 0 0 12px rgba(0,255,65,.04);
196
  }
197
- .model-card.active .mc-name { color:var(--green); }
198
- .mc-icon { font-size:1.2rem; }
199
- .mc-name { font-family:var(--ff-head); font-weight:600; font-size:1.1rem; color:var(--green2); transition:color .2s; }
200
- .mc-sub { font-family:var(--ff-mono); font-size:.72rem; color:var(--muted); }
201
 
202
- /* ── INPUT TABS ── */
203
  .input-tabs {
204
- display:flex; margin-bottom:.6rem;
205
- border:1px solid var(--border); border-radius:var(--r); overflow:hidden;
206
  }
207
  .tab-btn {
208
- flex:1; padding:.55rem; background:var(--g1);
209
  border:none; color:var(--muted); font-family:var(--ff-mono);
210
- font-size:0.72rem; letter-spacing:.1em; cursor:pointer;
211
- transition:all .2s; text-transform:uppercase;
212
  }
213
  .tab-btn:hover { background:var(--g3); color:var(--green2); }
214
  .tab-btn.active {
215
- background:rgba(0,255,65,.08); color:var(--green);
216
- box-shadow:inset 0 -2px 0 var(--green);
217
  }
218
 
219
- /* ── DROP ZONE β€” reduced height ── */
220
  .drop-zone {
221
- border:1.5px dashed var(--border2); border-radius:var(--r);
222
- height: 180px; /* fixed, no min-height */
223
  display:flex; flex-direction:column;
224
  align-items:center; justify-content:center;
225
- gap:.5rem; cursor:pointer;
226
  transition:all .25s; background:var(--g1);
227
  position:relative; overflow:hidden;
228
  }
229
  .drop-zone:hover,.drop-zone.drag {
230
- border-color:var(--green); background:rgba(0,255,65,.04);
231
- box-shadow:0 0 20px rgba(0,255,65,.08);
232
  }
233
  .drop-zone.has-img .dz-ph { display:none; }
234
  #preview-img {
235
  position:absolute; inset:0; width:100%; height:100%;
236
  object-fit:cover; display:none;
237
- border-radius:calc(var(--r) - 1px); opacity:.85;
238
  }
239
  .drop-zone.has-img #preview-img { display:block; }
240
- .dz-corner { position:absolute; width:12px; height:12px; border-color:var(--green3); border-style:solid; }
241
- .dz-corner.tl{top:6px;left:6px;border-width:1.5px 0 0 1.5px;}
242
- .dz-corner.tr{top:6px;right:6px;border-width:1.5px 1.5px 0 0;}
243
- .dz-corner.bl{bottom:6px;left:6px;border-width:0 0 1.5px 1.5px;}
244
- .dz-corner.br{bottom:6px;right:6px;border-width:0 1.5px 1.5px 0;}
245
- .dz-ph { display:flex; flex-direction:column; align-items:center; gap:.4rem; pointer-events:none; }
246
  .dz-icon {
247
- width:36px; height:36px; border:1px solid var(--border2);
248
  border-radius:50%; display:grid; place-items:center;
249
- font-size:1rem; color:var(--green3);
250
  }
251
- .dz-ph p { font-family:var(--ff-mono); font-size:.82rem; color:var(--muted); }
252
- .dz-ph em { font-family:var(--ff-mono); font-size:.68rem; color:var(--green-dim); font-style:normal; }
253
  #file-input { display:none; }
254
 
255
- /* ── URL INPUT ── */
256
- .url-input-wrap { display:none; flex-direction:column; gap:.5rem; }
257
  .url-input-wrap.show { display:flex; }
258
  .url-field {
259
  display:flex; align-items:center;
260
- border:1px solid var(--border2); border-radius:var(--r);
261
  background:var(--g1); overflow:hidden;
262
  }
263
- .url-prefix { font-family:var(--ff-mono); font-size:0.72rem; color:var(--green3); padding:0 .6rem; white-space:nowrap; border-right:1px solid var(--border); }
264
  .url-input {
265
  flex:1; background:transparent; border:none; outline:none;
266
- color:var(--green); font-family:var(--ff-mono); font-size:.72rem;
267
- padding:.6rem .7rem; caret-color:var(--green);
268
  }
269
- .url-input::placeholder { color:var(--green-dim); }
270
  .url-load-btn {
271
- padding:.55rem .8rem; background:rgba(0,255,65,.1); border:none;
272
- border-left:1px solid var(--border);
273
- color:var(--green2); font-family:var(--ff-mono); font-size:0.72rem;
274
  cursor:pointer; transition:background .2s; white-space:nowrap;
 
275
  }
276
- .url-load-btn:hover { background:rgba(0,255,65,.2); }
277
  .url-preview {
278
- width:100%; height:110px; object-fit:cover;
279
- border-radius:var(--r); border:1px solid var(--border); display:none;
280
  }
281
  .url-preview.show { display:block; }
282
 
283
- /* ── CLASSIFY BTN ── */
284
  .classify-btn {
285
  flex-shrink: 0;
286
- width:100%; margin-top:.7rem;
287
- padding:.7rem;
288
  background:linear-gradient(135deg,var(--green3),var(--green-dim));
289
- border:1px solid var(--green3); border-radius:var(--r);
290
  color:var(--green); font-family:var(--ff-head);
291
- font-size:1.15rem; font-weight:700; letter-spacing:.1em;
292
  cursor:pointer; position:relative; overflow:hidden;
293
- transition:all .2s; text-transform:uppercase;
 
294
  }
295
  .classify-btn::before {
296
  content:''; position:absolute; top:-2px; left:-100%;
297
  width:60%; height:calc(100% + 4px);
298
- background:linear-gradient(90deg,transparent,rgba(0,255,65,.18),transparent);
299
  transform:skewX(-15deg);
300
  }
301
  .classify-btn.loading::before { animation:sweep 1.2s linear infinite; }
302
  @keyframes sweep { to { left:150%; } }
303
  .classify-btn:not(:disabled):hover {
304
  background:linear-gradient(135deg,var(--green2),var(--green3));
305
- box-shadow:0 0 24px rgba(0,255,65,.3); transform:translateY(-1px);
 
306
  }
307
- .classify-btn:disabled { opacity:.35; cursor:default; }
308
 
309
- /* ══ RIGHT PANEL β€” results ══ */
310
  .result-panel-inner {
311
  flex: 1;
312
  min-height: 0;
313
  overflow-y: auto;
314
  overflow-x: hidden;
315
- scrollbar-width: none;
316
- display: flex;
317
- flex-direction: column;
318
  }
319
- .result-panel-inner::-webkit-scrollbar { display:none; }
320
 
321
  .result-waiting {
322
  display:flex; flex-direction:column;
323
  align-items:flex-start; justify-content:center;
324
- flex:1; gap:.5rem; padding:.5rem 0;
325
  }
326
- .result-waiting .rw-title { font-family:var(--ff-head); font-size:1.15rem; font-weight:600; color:var(--green3); }
327
- .result-waiting .rw-sub { font-family:var(--ff-mono); font-size:.82rem; color:var(--green-dim); line-height:1.75; }
328
  .terminal-cursor {
329
- display:inline-block; width:7px; height:13px;
330
- background:var(--green); margin-left:2px;
331
  animation:blink-c .8s step-end infinite; vertical-align:middle;
332
  }
333
  @keyframes blink-c{0%,100%{opacity:1}50%{opacity:0}}
334
 
335
- .result-content { display:none; flex-direction:column; gap:1rem; }
336
- .result-content.show { display:flex; animation:scanIn .4s ease; }
337
  @keyframes scanIn {
338
  from{opacity:0;clip-path:inset(0 0 100% 0)}
339
  to{opacity:1;clip-path:inset(0 0 0% 0)}
340
  }
341
 
342
- .rc-header { display:flex; flex-direction:column; gap:.2rem; }
343
- .rc-label { font-family:var(--ff-mono); font-size:.58rem; letter-spacing:.2em; color:var(--green3); }
344
  .rc-class {
345
- font-family:var(--ff-head); font-size:3.4rem; font-weight:700;
346
- letter-spacing:-.01em; line-height:1; color:var(--green);
347
- text-shadow:0 0 30px rgba(0,255,65,.5);
 
348
  }
349
- .rc-conf { font-family:var(--ff-mono); font-size:.9rem; color:var(--muted); margin-top:.1rem; }
350
- .rc-conf strong { color:var(--green2); font-size:1rem; }
351
 
352
  .conf-track {
353
- height:3px; background:var(--g4); border-radius:99px; overflow:hidden; margin-top:.4rem;
354
  }
355
  .conf-fill {
356
  height:100%;
357
  background:linear-gradient(90deg,var(--green3),var(--green));
358
- border-radius:99px; width:0%;
359
- transition:width 1s cubic-bezier(.4,0,.2,1);
360
- box-shadow:0 0 8px var(--green);
361
  }
362
 
363
- .rc-divider { height:1px; background:var(--border); flex-shrink:0; }
364
 
365
- .prob-list { display:flex; flex-direction:column; gap:.65rem; }
366
- .prob-row { display:flex; flex-direction:column; gap:.18rem; }
367
  .prob-meta { display:flex; justify-content:space-between; align-items:baseline; }
368
  .prob-name {
369
- font-family:var(--ff-body); font-size:.9rem; font-weight:400;
370
- color:var(--muted); display:flex; align-items:center; gap:.35rem; text-transform:capitalize;
371
  }
372
- .prob-row.top .prob-name { color:var(--green); font-weight:600; }
373
- .prob-pct { font-family:var(--ff-mono); font-size:.78rem; color:var(--green-dim); }
374
- .prob-row.top .prob-pct { color:var(--green2); }
375
- .prob-track { height:4px; background:var(--g4); border-radius:99px; overflow:hidden; }
376
  .prob-fill {
377
  height:100%; background:var(--green-dim);
378
- border-radius:99px; width:0%;
379
- transition:width .8s cubic-bezier(.4,0,.2,1);
380
  }
381
  .prob-row.top .prob-fill {
382
  background:linear-gradient(90deg,var(--green3),var(--green));
383
- box-shadow:0 0 6px rgba(0,255,65,.4);
384
  }
385
 
386
  .result-error {
387
- display:none; padding:.75rem;
388
- border:1px solid rgba(255,50,50,.3); border-radius:var(--r);
389
- background:rgba(255,0,0,.05);
390
- font-family:var(--ff-mono); font-size:.7rem; color:#ff4444; line-height:1.6;
391
  }
392
  .result-error.show { display:block; animation:fadeIn .3s ease; }
393
 
394
- /* ══ FOOTER BAR β€” minimal, fixed ══ */
395
  .footer-bar {
396
  flex-shrink: 0;
397
- border-top: 1px solid var(--border);
398
- padding: .25rem 0;
399
  display: flex; justify-content: space-between; align-items: center;
400
  animation: fadeIn .8s ease .25s both;
401
  }
402
- .footer-bar p { font-family:var(--ff-mono); font-size:.72rem; color:var(--green-dim); }
403
 
404
- @keyframes fadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
405
  </style>
406
  </head>
407
  <body>
@@ -422,7 +439,7 @@
422
  </div>
423
  </header>
424
 
425
- <!-- CLASSES BAR (moved out of grid, compact strip) -->
426
  <div class="classes-bar">
427
  <span class="cs-label">CLASSES //</span>
428
  <div class="cs-pills">
@@ -441,8 +458,6 @@
441
  <!-- LEFT : inputs -->
442
  <div class="panel">
443
  <div class="panel-title">01 // MODEL_SELECT</div>
444
-
445
- <!-- scrollable zone so nothing overflows -->
446
  <div class="panel-scroll">
447
  <div class="model-grid">
448
  <div class="model-card active" data-fw="pytorch" onclick="selectModel(this)">
@@ -490,10 +505,9 @@
490
  <img id="url-preview" class="url-preview" src="" alt="URL preview"/>
491
  </div>
492
 
493
- <div class="panel-title" style="margin-top:.9rem;">03 // ANALYZE</div>
494
  </div><!-- /panel-scroll -->
495
 
496
- <!-- Btn outside scroll so it stays at bottom -->
497
  <button class="classify-btn" id="classify-btn" disabled onclick="classify()">
498
  RUN CLASSIFICATION β†’
499
  </button>
@@ -523,7 +537,7 @@
523
  </div>
524
  <div class="rc-divider"></div>
525
  <div>
526
- <div class="panel-title" style="margin-bottom:.6rem;">// CLASS_SCORES</div>
527
  <div class="prob-list" id="prob-list"></div>
528
  </div>
529
  </div>
@@ -679,7 +693,7 @@
679
  document.getElementById("tab-file").style.display = "block";
680
  </script>
681
 
682
- <!-- PLEXUS BACKGROUND -->
683
  <script>
684
  (function(){
685
  const canvas = document.getElementById('plexus-bg');
@@ -708,23 +722,23 @@
708
  }
709
  for(let i=0;i<nodes.length;i++)for(let j=i+1;j<nodes.length;j++){
710
  const a=nodes[i],b=nodes[j],dx=a.x-b.x,dy=a.y-b.y,d=Math.sqrt(dx*dx+dy*dy);
711
- if(d<MAX_DIST){const al=(1-d/MAX_DIST)*.28;ctx.beginPath();ctx.moveTo(a.x,a.y);ctx.lineTo(b.x,b.y);ctx.strokeStyle=LINE_COLOR+al+')';ctx.lineWidth=.8;ctx.stroke();}
712
  }
713
  for(const n of nodes){
714
  const dxM=mouse.x-n.x,dyM=mouse.y-n.y,dM=Math.sqrt(dxM*dxM+dyM*dyM);
715
- if(dM<MOUSE_DIST){const al=(1-dM/MOUSE_DIST)*.35;ctx.beginPath();ctx.moveTo(mouse.x,mouse.y);ctx.lineTo(n.x,n.y);ctx.strokeStyle=LINE_COLOR+al+')';ctx.lineWidth=.5;ctx.stroke();}
716
  }
717
  if(mouse.x>0){
718
- const g=ctx.createRadialGradient(mouse.x,mouse.y,0,mouse.x,mouse.y,20);
719
- g.addColorStop(0,'rgba(0,255,65,0.5)');g.addColorStop(1,'rgba(0,255,65,0)');
720
- ctx.beginPath();ctx.arc(mouse.x,mouse.y,20,0,Math.PI*2);ctx.fillStyle=g;ctx.fill();
721
- ctx.beginPath();ctx.arc(mouse.x,mouse.y,2,0,Math.PI*2);ctx.fillStyle='rgba(0,255,65,0.95)';ctx.fill();
722
  }
723
  for(const n of nodes){
724
- const g=ctx.createRadialGradient(n.x,n.y,0,n.x,n.y,n.r*5);
725
- g.addColorStop(0,NODE_COLOR+'0.3)');g.addColorStop(1,NODE_COLOR+'0)');
726
- ctx.beginPath();ctx.arc(n.x,n.y,n.r*5,0,Math.PI*2);ctx.fillStyle=g;ctx.fill();
727
- ctx.beginPath();ctx.arc(n.x,n.y,n.r,0,Math.PI*2);ctx.fillStyle=NODE_COLOR+'0.85)';ctx.fill();
728
  }
729
  requestAnimationFrame(draw);
730
  }
@@ -734,3 +748,4 @@
734
  </script>
735
  </body>
736
  </html>
 
 
3
  <head>
4
  <meta charset="UTF-8"/>
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
6
+ <title>SCENEIQ β€” Intel Scene Classifier | Enhanced Readability</title>
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
8
  <link href="https://fonts.googleapis.com/css2?family=Share+Tech+Mono&family=Rajdhani:wght@400;500;600;700&family=Exo+2:wght@300;400;600&display=swap" rel="stylesheet">
9
  <style>
10
 
11
+ /* ══ TOKENS β€” SCALED FOR READABILITY ══ */
 
 
12
  :root {
13
+ --g0:#000000; --g1:#071007; --g2:#0f1a0f; --g3:#152215;
14
+ --g4:#1f331f;
15
+ --green:#00ff41; --green2:#00dd33; --green3:#00aa22;
16
+ --green-dim:#00661a; --green-glow:rgba(0,255,65,0.2);
17
+ --border:rgba(0,255,65,0.22); --border2:rgba(0,255,65,0.45);
18
+ --muted:rgba(0,255,65,0.55);
19
  --ff-mono:'Share Tech Mono',monospace;
20
  --ff-head:'Rajdhani',sans-serif;
21
  --ff-body:'Exo 2',sans-serif;
22
+ --r:8px;
23
  }
24
 
25
  *, *::before, *::after { box-sizing:border-box; margin:0; padding:0; }
26
 
 
27
  html, body {
28
  height: 100vh;
29
  overflow: hidden;
30
+ font-size: 18px; /* base boost for readability */
31
  }
32
 
33
  body {
 
36
  font-family: var(--ff-body);
37
  display: flex;
38
  flex-direction: column;
39
+ line-height: 1.45;
40
  }
41
 
42
+ /* ── Background layers (enhanced depth) ── */
43
  #plexus-bg {
44
  position: fixed; inset: 0; z-index: 0; pointer-events: none;
45
  }
46
  body::before {
47
  content: ''; position: fixed; inset: 0; z-index: 0; pointer-events: none;
48
  background-image:
49
+ linear-gradient(rgba(0,255,65,0.045) 1px, transparent 1px),
50
+ linear-gradient(90deg, rgba(0,255,65,0.045) 1px, transparent 1px);
51
  background-size: 40px 40px;
52
  }
53
  body::after {
54
  content: ''; position: fixed; inset: 0; z-index: 0; pointer-events: none;
55
  background: repeating-linear-gradient(
56
  0deg, transparent, transparent 2px,
57
+ rgba(0,0,0,0.1) 2px, rgba(0,0,0,0.1) 5px
58
  );
59
  }
60
 
61
+ /* ══ WRAPPER β€” full height, spacious inner layout ══ */
62
+ .wrapper {
63
+ width: 100%;
64
+ max-width: 1400px;
65
+ margin: 0 auto;
66
+ padding: 0 1.5rem;
67
+ height: 100vh;
68
+ display: flex;
69
+ flex-direction: column;
70
+ gap: 0.25rem;
71
+ position: relative;
72
+ z-index: 2;
73
+ }
74
 
75
+ /* ══ HEADER β€” bold, crisp ══ */
76
  header {
77
  flex-shrink: 0;
78
+ border-bottom: 2px solid var(--border);
79
+ padding: 1.2rem 0 0.8rem 0;
80
  display: flex; align-items: center; justify-content: space-between;
81
  animation: fadeIn .5s ease both;
82
  }
83
+ .logo { display:flex; align-items:center; gap:1rem; }
84
  .logo-icon {
85
+ width:50px; height:50px; border:1.8px solid var(--green);
86
+ display:grid; place-items:center; font-size:1.4rem;
87
+ box-shadow: 0 0 18px var(--green-glow), inset 0 0 12px var(--green-glow);
88
  animation: pulse-box 3s ease-in-out infinite;
89
+ background: rgba(0,255,65,0.02);
90
  }
91
  @keyframes pulse-box {
92
+ 0%,100%{box-shadow:0 0 14px var(--green-glow),inset 0 0 8px var(--green-glow);}
93
+ 50%{box-shadow:0 0 28px rgba(0,255,65,.4),inset 0 0 18px rgba(0,255,65,.2);}
94
  }
95
  .logo-text {
96
+ font-family:var(--ff-head); font-size:2.5rem; font-weight:700;
97
+ letter-spacing:.12em; text-shadow:0 0 22px rgba(0,255,65,.7);
98
  }
99
  .logo-text span { color:var(--green3); }
100
 
101
+ .header-right { display:flex; align-items:center; gap:1.6rem; }
 
 
 
 
 
 
 
102
  .status-dot {
103
  display:flex; align-items:center; gap:.9rem;
104
+ font-family:var(--ff-mono); font-size:0.85rem; color:var(--muted);
105
+ letter-spacing: 0.5px;
106
  }
107
  .dot {
108
+ width:9px; height:9px; border-radius:50%;
109
+ background:var(--green); box-shadow:0 0 12px var(--green);
110
  animation:blink 2s step-end infinite;
111
  }
112
  @keyframes blink{0%,100%{opacity:1}50%{opacity:.2}}
113
+ .version { font-family:var(--ff-mono); font-size:.85rem; color:var(--green-dim); letter-spacing:.12em; }
114
 
115
+ /* ── CLASSES BAR β€” bigger pills, readable ── */
116
  .classes-bar {
117
  flex-shrink: 0;
118
+ display: flex; align-items: center; gap: 1rem;
119
+ padding: 0.7rem 0;
120
  border-bottom: 1px solid var(--border);
121
  animation: fadeIn .6s ease .1s both;
122
  }
123
+ .cs-label {
124
+ font-family:var(--ff-mono); font-size:0.85rem;
125
+ color:var(--green-dim); letter-spacing:.2em;
126
+ white-space:nowrap; font-weight:500;
127
+ }
128
+ .cs-pills { display:flex; gap:0.6rem; flex-wrap:wrap; }
129
  .cs-pill {
130
+ font-family:var(--ff-mono); font-size:0.85rem;
131
+ padding:0.3rem 0.9rem;
132
+ border:1px solid var(--border); border-radius:20px;
133
  color:var(--green-dim); transition:all .2s; cursor:default;
134
+ background: rgba(0,20,0,0.4);
135
+ backdrop-filter: blur(1px);
136
  }
137
+ .cs-pill:hover { border-color:var(--green2); color:var(--green); background:rgba(0,255,65,0.08); }
138
 
139
+ /* ══ MAIN GRID β€” generous spacing, bigger cards ══ */
140
  .main-grid {
141
  flex: 1;
142
+ min-height: 0;
143
  display: grid;
144
  grid-template-columns: 1fr 1fr;
145
+ gap: 1.5rem;
146
+ padding: 1rem 0 0.75rem 0;
147
  animation: fadeIn .7s ease .15s both;
148
  }
149
 
150
+ /* ══ PANELS β€” elevated, more padding, readable containers ══ */
151
  .panel {
152
+ background: rgba(10, 21, 10, 0.92);
153
+ backdrop-filter: blur(2px);
154
  border: 1px solid var(--border);
155
  border-radius: var(--r);
156
+ padding: 1.5rem 1.6rem;
157
  position: relative;
158
+ overflow: hidden;
159
  display: flex;
160
  flex-direction: column;
161
+ box-shadow: 0 8px 20px rgba(0,0,0,0.6), 0 0 0 1px rgba(0,255,65,0.05) inset;
162
+ transition: box-shadow 0.2s;
163
+ }
164
+ .panel:hover {
165
+ box-shadow: 0 10px 28px rgba(0,0,0,0.7), 0 0 0 1px rgba(0,255,65,0.15) inset;
166
  }
167
  .panel::before {
168
+ content:''; position:absolute; top:0; left:0; right:0; height:3px;
169
+ background:linear-gradient(90deg,transparent,var(--green2),transparent);
170
  }
171
  .panel-title {
172
  flex-shrink: 0;
173
+ font-family:var(--ff-mono); font-size:0.9rem;
174
+ letter-spacing:.25em; color:var(--green3);
175
+ text-transform:uppercase; margin-bottom:1rem;
176
+ display:flex; align-items:center; gap:.8rem;
177
+ font-weight: 500;
178
  }
179
+ .panel-title::after { content:''; flex:1; height:1.5px; background:var(--border); }
180
 
181
+ /* scrollable zones β€” smooth, no visible scrollbar */
182
  .panel-scroll {
183
  flex: 1;
184
  min-height: 0;
185
  overflow-y: auto;
186
  overflow-x: hidden;
187
+ scrollbar-width: thin;
188
+ scrollbar-color: var(--green3) var(--g2);
189
+ padding-right: 3px;
190
  }
191
+ .panel-scroll::-webkit-scrollbar { width: 5px; }
192
+ .panel-scroll::-webkit-scrollbar-track { background: var(--g2); border-radius: 4px; }
193
+ .panel-scroll::-webkit-scrollbar-thumb { background: var(--green-dim); border-radius: 4px; }
194
 
195
+ /* ── MODEL SELECTOR (larger cards) ── */
196
  .model-grid {
197
+ display:grid; grid-template-columns:1fr 1fr; gap:1rem;
198
+ margin-bottom:1.4rem;
199
  }
200
  .model-card {
201
+ border:1.5px solid var(--border); border-radius:12px;
202
+ padding:0.9rem 0.8rem; cursor:pointer; transition:all .2s;
203
  background:var(--g1);
204
+ display:flex; flex-direction:column; gap:0.4rem;
205
  }
206
+ .model-card:hover { border-color:var(--green2); background:rgba(0,255,65,0.08); transform:translateY(-2px); }
207
  .model-card.active {
208
+ border-color:var(--green); background:rgba(0,255,65,.1);
209
+ box-shadow:0 0 20px rgba(0,255,65,.18),inset 0 0 12px rgba(0,255,65,.06);
210
  }
211
+ .model-card.active .mc-name { color:var(--green); text-shadow:0 0 5px var(--green-glow);}
212
+ .mc-icon { font-size:1.6rem; }
213
+ .mc-name { font-family:var(--ff-head); font-weight:700; font-size:1.3rem; color:var(--green2); transition:color .2s; }
214
+ .mc-sub { font-family:var(--ff-mono); font-size:0.75rem; color:var(--muted); letter-spacing: -0.2px;}
215
 
216
+ /* ── INPUT TABS (bigger click area) ── */
217
  .input-tabs {
218
+ display:flex; margin-bottom:1rem;
219
+ border:1px solid var(--border); border-radius:12px; overflow:hidden;
220
  }
221
  .tab-btn {
222
+ flex:1; padding:0.7rem 0.5rem; background:var(--g1);
223
  border:none; color:var(--muted); font-family:var(--ff-mono);
224
+ font-size:0.85rem; letter-spacing:.1em; cursor:pointer;
225
+ transition:all .2s; text-transform:uppercase; font-weight:500;
226
  }
227
  .tab-btn:hover { background:var(--g3); color:var(--green2); }
228
  .tab-btn.active {
229
+ background:rgba(0,255,65,.12); color:var(--green);
230
+ box-shadow:inset 0 -3px 0 var(--green);
231
  }
232
 
233
+ /* ── DROP ZONE β€” taller, clearer text ── */
234
  .drop-zone {
235
+ border:2px dashed var(--border2); border-radius:16px;
236
+ height: 210px;
237
  display:flex; flex-direction:column;
238
  align-items:center; justify-content:center;
239
+ gap:.7rem; cursor:pointer;
240
  transition:all .25s; background:var(--g1);
241
  position:relative; overflow:hidden;
242
  }
243
  .drop-zone:hover,.drop-zone.drag {
244
+ border-color:var(--green); background:rgba(0,255,65,.08);
245
+ box-shadow:0 0 28px rgba(0,255,65,.12);
246
  }
247
  .drop-zone.has-img .dz-ph { display:none; }
248
  #preview-img {
249
  position:absolute; inset:0; width:100%; height:100%;
250
  object-fit:cover; display:none;
251
+ border-radius:14px; opacity:.9;
252
  }
253
  .drop-zone.has-img #preview-img { display:block; }
254
+ .dz-corner { position:absolute; width:14px; height:14px; border-color:var(--green2); border-style:solid; }
255
+ .dz-corner.tl{top:10px;left:10px;border-width:2px 0 0 2px;}
256
+ .dz-corner.tr{top:10px;right:10px;border-width:2px 2px 0 0;}
257
+ .dz-corner.bl{bottom:10px;left:10px;border-width:0 0 2px 2px;}
258
+ .dz-corner.br{bottom:10px;right:10px;border-width:0 2px 2px 0;}
259
+ .dz-ph { display:flex; flex-direction:column; align-items:center; gap:.5rem; pointer-events:none; }
260
  .dz-icon {
261
+ width:48px; height:48px; border:1.5px solid var(--border2);
262
  border-radius:50%; display:grid; place-items:center;
263
+ font-size:1.5rem; color:var(--green2);
264
  }
265
+ .dz-ph p { font-family:var(--ff-mono); font-size:0.95rem; color:var(--muted); font-weight:500; }
266
+ .dz-ph em { font-family:var(--ff-mono); font-size:0.75rem; color:var(--green-dim); font-style:normal; }
267
  #file-input { display:none; }
268
 
269
+ /* ── URL INPUT β€” bigger controls ── */
270
+ .url-input-wrap { display:none; flex-direction:column; gap:.8rem; }
271
  .url-input-wrap.show { display:flex; }
272
  .url-field {
273
  display:flex; align-items:center;
274
+ border:1.5px solid var(--border2); border-radius:12px;
275
  background:var(--g1); overflow:hidden;
276
  }
277
+ .url-prefix { font-family:var(--ff-mono); font-size:0.85rem; color:var(--green2); padding:0 0.8rem; white-space:nowrap; border-right:1.5px solid var(--border); }
278
  .url-input {
279
  flex:1; background:transparent; border:none; outline:none;
280
+ color:var(--green); font-family:var(--ff-mono); font-size:0.9rem;
281
+ padding:0.8rem 1rem; caret-color:var(--green);
282
  }
283
+ .url-input::placeholder { color:var(--green-dim); font-size:0.8rem; }
284
  .url-load-btn {
285
+ padding:0.7rem 1rem; background:rgba(0,255,65,.12); border:none;
286
+ border-left:1.5px solid var(--border);
287
+ color:var(--green2); font-family:var(--ff-mono); font-size:0.85rem;
288
  cursor:pointer; transition:background .2s; white-space:nowrap;
289
+ font-weight:600;
290
  }
291
+ .url-load-btn:hover { background:rgba(0,255,65,.25); }
292
  .url-preview {
293
+ width:100%; height:130px; object-fit:cover;
294
+ border-radius:12px; border:1px solid var(--border); display:none;
295
  }
296
  .url-preview.show { display:block; }
297
 
298
+ /* ── CLASSIFY BTN β€” bold, interactive ── */
299
  .classify-btn {
300
  flex-shrink: 0;
301
+ width:100%; margin-top:1rem;
302
+ padding:0.9rem 0.5rem;
303
  background:linear-gradient(135deg,var(--green3),var(--green-dim));
304
+ border:1.5px solid var(--green3); border-radius:60px;
305
  color:var(--green); font-family:var(--ff-head);
306
+ font-size:1.3rem; font-weight:700; letter-spacing:.12em;
307
  cursor:pointer; position:relative; overflow:hidden;
308
+ transition:all .25s; text-transform:uppercase;
309
+ box-shadow:0 2px 8px rgba(0,0,0,0.3);
310
  }
311
  .classify-btn::before {
312
  content:''; position:absolute; top:-2px; left:-100%;
313
  width:60%; height:calc(100% + 4px);
314
+ background:linear-gradient(90deg,transparent,rgba(0,255,65,.25),transparent);
315
  transform:skewX(-15deg);
316
  }
317
  .classify-btn.loading::before { animation:sweep 1.2s linear infinite; }
318
  @keyframes sweep { to { left:150%; } }
319
  .classify-btn:not(:disabled):hover {
320
  background:linear-gradient(135deg,var(--green2),var(--green3));
321
+ box-shadow:0 0 30px rgba(0,255,65,.45); transform:translateY(-2px);
322
+ border-color: var(--green);
323
  }
324
+ .classify-btn:disabled { opacity:.4; cursor:not-allowed; transform: none; }
325
 
326
+ /* ══ RIGHT PANEL β€” results, big class display, crisp probabilities ══ */
327
  .result-panel-inner {
328
  flex: 1;
329
  min-height: 0;
330
  overflow-y: auto;
331
  overflow-x: hidden;
332
+ scrollbar-width: thin;
333
+ padding-right: 4px;
 
334
  }
335
+ .result-panel-inner::-webkit-scrollbar { width: 5px; }
336
 
337
  .result-waiting {
338
  display:flex; flex-direction:column;
339
  align-items:flex-start; justify-content:center;
340
+ flex:1; gap:.8rem; padding:0.6rem 0;
341
  }
342
+ .result-waiting .rw-title { font-family:var(--ff-head); font-size:1.5rem; font-weight:600; color:var(--green2); letter-spacing:-0.2px; }
343
+ .result-waiting .rw-sub { font-family:var(--ff-mono); font-size:1rem; color:var(--green-dim); line-height:1.9; }
344
  .terminal-cursor {
345
+ display:inline-block; width:9px; height:18px;
346
+ background:var(--green); margin-left:4px;
347
  animation:blink-c .8s step-end infinite; vertical-align:middle;
348
  }
349
  @keyframes blink-c{0%,100%{opacity:1}50%{opacity:0}}
350
 
351
+ .result-content { display:none; flex-direction:column; gap:1.4rem; }
352
+ .result-content.show { display:flex; animation:scanIn .45s ease; }
353
  @keyframes scanIn {
354
  from{opacity:0;clip-path:inset(0 0 100% 0)}
355
  to{opacity:1;clip-path:inset(0 0 0% 0)}
356
  }
357
 
358
+ .rc-header { display:flex; flex-direction:column; gap:.5rem; }
359
+ .rc-label { font-family:var(--ff-mono); font-size:0.7rem; letter-spacing:.25em; color:var(--green3); font-weight:500; }
360
  .rc-class {
361
+ font-family:var(--ff-head); font-size:4rem; font-weight:800;
362
+ letter-spacing:-0.02em; line-height:1.1; color:var(--green);
363
+ text-shadow:0 0 28px rgba(0,255,65,.7);
364
+ word-break: break-word;
365
  }
366
+ .rc-conf { font-family:var(--ff-mono); font-size:1rem; color:var(--muted); margin-top:.2rem; }
367
+ .rc-conf strong { color:var(--green2); font-size:1.2rem; }
368
 
369
  .conf-track {
370
+ height:8px; background:var(--g4); border-radius:40px; overflow:hidden; margin-top:.6rem;
371
  }
372
  .conf-fill {
373
  height:100%;
374
  background:linear-gradient(90deg,var(--green3),var(--green));
375
+ border-radius:40px; width:0%;
376
+ transition:width 1s cubic-bezier(.2,.9,.3,1.1);
377
+ box-shadow:0 0 12px var(--green);
378
  }
379
 
380
+ .rc-divider { height:1.5px; background:var(--border); flex-shrink:0; margin:.2rem 0; }
381
 
382
+ .prob-list { display:flex; flex-direction:column; gap:1rem; margin-top:0.3rem; }
383
+ .prob-row { display:flex; flex-direction:column; gap:.3rem; }
384
  .prob-meta { display:flex; justify-content:space-between; align-items:baseline; }
385
  .prob-name {
386
+ font-family:var(--ff-body); font-size:1rem; font-weight:500;
387
+ color:var(--muted); display:flex; align-items:center; gap:.5rem; text-transform:capitalize;
388
  }
389
+ .prob-row.top .prob-name { color:var(--green); font-weight:700; text-shadow:0 0 3px rgba(0,255,65,0.3);}
390
+ .prob-pct { font-family:var(--ff-mono); font-size:0.85rem; color:var(--green-dim); font-weight:500; }
391
+ .prob-row.top .prob-pct { color:var(--green2); font-weight:600; }
392
+ .prob-track { height:7px; background:var(--g4); border-radius:40px; overflow:hidden; }
393
  .prob-fill {
394
  height:100%; background:var(--green-dim);
395
+ border-radius:40px; width:0%;
396
+ transition:width .8s cubic-bezier(.3,.8,.4,1);
397
  }
398
  .prob-row.top .prob-fill {
399
  background:linear-gradient(90deg,var(--green3),var(--green));
400
+ box-shadow:0 0 10px rgba(0,255,65,.5);
401
  }
402
 
403
  .result-error {
404
+ display:none; padding:1rem;
405
+ border:1px solid rgba(255,70,70,.5); border-radius:12px;
406
+ background:rgba(255,30,30,.08);
407
+ font-family:var(--ff-mono); font-size:0.85rem; color:#ff7a7a; line-height:1.7;
408
  }
409
  .result-error.show { display:block; animation:fadeIn .3s ease; }
410
 
411
+ /* ══ FOOTER BAR β€” readable, relaxed ══ */
412
  .footer-bar {
413
  flex-shrink: 0;
414
+ border-top: 1.5px solid var(--border);
415
+ padding: 0.5rem 0;
416
  display: flex; justify-content: space-between; align-items: center;
417
  animation: fadeIn .8s ease .25s both;
418
  }
419
+ .footer-bar p { font-family:var(--ff-mono); font-size:0.8rem; color:var(--green-dim); letter-spacing:0.3px; }
420
 
421
+ @keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
422
  </style>
423
  </head>
424
  <body>
 
439
  </div>
440
  </header>
441
 
442
+ <!-- CLASSES BAR -->
443
  <div class="classes-bar">
444
  <span class="cs-label">CLASSES //</span>
445
  <div class="cs-pills">
 
458
  <!-- LEFT : inputs -->
459
  <div class="panel">
460
  <div class="panel-title">01 // MODEL_SELECT</div>
 
 
461
  <div class="panel-scroll">
462
  <div class="model-grid">
463
  <div class="model-card active" data-fw="pytorch" onclick="selectModel(this)">
 
505
  <img id="url-preview" class="url-preview" src="" alt="URL preview"/>
506
  </div>
507
 
508
+ <div class="panel-title" style="margin-top:1rem;">03 // ANALYZE</div>
509
  </div><!-- /panel-scroll -->
510
 
 
511
  <button class="classify-btn" id="classify-btn" disabled onclick="classify()">
512
  RUN CLASSIFICATION β†’
513
  </button>
 
537
  </div>
538
  <div class="rc-divider"></div>
539
  <div>
540
+ <div class="panel-title" style="margin-bottom:.8rem;">// CLASS_SCORES</div>
541
  <div class="prob-list" id="prob-list"></div>
542
  </div>
543
  </div>
 
693
  document.getElementById("tab-file").style.display = "block";
694
  </script>
695
 
696
+ <!-- PLEXUS BACKGROUND (enhanced) -->
697
  <script>
698
  (function(){
699
  const canvas = document.getElementById('plexus-bg');
 
722
  }
723
  for(let i=0;i<nodes.length;i++)for(let j=i+1;j<nodes.length;j++){
724
  const a=nodes[i],b=nodes[j],dx=a.x-b.x,dy=a.y-b.y,d=Math.sqrt(dx*dx+dy*dy);
725
+ if(d<MAX_DIST){const al=(1-d/MAX_DIST)*.28;ctx.beginPath();ctx.moveTo(a.x,a.y);ctx.lineTo(b.x,b.y);ctx.strokeStyle=LINE_COLOR+al+')';ctx.lineWidth=.9;ctx.stroke();}
726
  }
727
  for(const n of nodes){
728
  const dxM=mouse.x-n.x,dyM=mouse.y-n.y,dM=Math.sqrt(dxM*dxM+dyM*dyM);
729
+ if(dM<MOUSE_DIST){const al=(1-dM/MOUSE_DIST)*.35;ctx.beginPath();ctx.moveTo(mouse.x,mouse.y);ctx.lineTo(n.x,n.y);ctx.strokeStyle=LINE_COLOR+al+')';ctx.lineWidth=.7;ctx.stroke();}
730
  }
731
  if(mouse.x>0){
732
+ const g=ctx.createRadialGradient(mouse.x,mouse.y,0,mouse.x,mouse.y,22);
733
+ g.addColorStop(0,'rgba(0,255,65,0.45)');g.addColorStop(1,'rgba(0,255,65,0)');
734
+ ctx.beginPath();ctx.arc(mouse.x,mouse.y,22,0,Math.PI*2);ctx.fillStyle=g;ctx.fill();
735
+ ctx.beginPath();ctx.arc(mouse.x,mouse.y,3,0,Math.PI*2);ctx.fillStyle='rgba(0,255,65,0.95)';ctx.fill();
736
  }
737
  for(const n of nodes){
738
+ const g=ctx.createRadialGradient(n.x,n.y,0,n.x,n.y,n.r*6);
739
+ g.addColorStop(0,NODE_COLOR+'0.35)');g.addColorStop(1,NODE_COLOR+'0)');
740
+ ctx.beginPath();ctx.arc(n.x,n.y,n.r*6,0,Math.PI*2);ctx.fillStyle=g;ctx.fill();
741
+ ctx.beginPath();ctx.arc(n.x,n.y,n.r,0,Math.PI*2);ctx.fillStyle=NODE_COLOR+'0.9)';ctx.fill();
742
  }
743
  requestAnimationFrame(draw);
744
  }
 
748
  </script>
749
  </body>
750
  </html>
751
+ ```