AnesKAM commited on
Commit
9989e30
·
verified ·
1 Parent(s): 8666110

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +278 -611
index.html CHANGED
@@ -2,652 +2,319 @@
2
  <html lang="en" dir="ltr">
3
  <head>
4
  <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
6
- <title>SurfGO | Intelligent Search</title>
7
-
 
8
  <link rel="preconnect" href="https://fonts.googleapis.com">
9
- <link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;800&family=Tajawal:wght@300;400;700&display=swap" rel="stylesheet">
10
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
11
 
12
  <style>
13
- /* ════════════════════════════════════════════
14
- TOKENS
15
- ════════════════════════════════════════════ */
16
  :root {
17
- --bg-deep: #020408;
18
- --bg-surface: rgba(15,23,42,0.6);
19
- --bg-card: rgba(30,41,59,0.3);
20
- --accent: #3B82F6;
21
- --accent-glow: rgba(59,130,246,0.35);
22
- --accent-2: #8B5CF6;
23
- --text-main: #F8FAFC;
24
- --text-dim: #94A3B8;
25
- --text-link: #60A5FA;
26
- --border: rgba(255,255,255,0.08);
27
- --border-hover: rgba(59,130,246,0.45);
28
- --ease: cubic-bezier(0.23,1,0.32,1);
29
- --tr: all 0.32s var(--ease);
30
- --nav-h: 68px;
31
- --r: 18px;
32
- }
33
-
34
- /* ════════════════════════════════════════════
35
- BASE
36
- ════════════════════════════════════════════ */
37
- *, *::before, *::after { margin:0; padding:0; box-sizing:border-box; }
38
- html { -webkit-tap-highlight-color: transparent; }
39
- body {
40
- font-family: 'Plus Jakarta Sans','Tajawal',sans-serif;
41
- background: var(--bg-deep);
42
- color: var(--text-main);
43
- min-height: 100vh;
44
- overflow-x: hidden;
45
  }
46
 
47
- /* Ambient glow – disabled on touch devices for perf */
48
- .bg-glow {
49
- position: fixed; inset: 0; pointer-events: none; z-index: 0;
50
- background: radial-gradient(circle at 50% 28%, rgba(59,130,246,0.1) 0%, transparent 55%);
51
- }
52
- @media (hover:none) { .bg-glow { display:none; } }
53
-
54
- /* Noise */
55
- body::before {
56
- content:'';
57
- position:fixed; inset:0; pointer-events:none; z-index:0;
58
- opacity:.45;
59
- 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.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.025'/%3E%3C/svg%3E");
60
  }
61
 
62
- /* ════════════════════════════════════════════
63
- NAVBAR
64
- ════════════════════════════════════════════ */
65
- .navbar {
66
- position: sticky; top:0; z-index:900;
67
- height: var(--nav-h);
68
- background: rgba(2,4,8,0.88);
69
- backdrop-filter: blur(28px) saturate(200%);
70
- -webkit-backdrop-filter: blur(28px) saturate(200%);
71
- border-bottom: 1px solid var(--border);
72
- display: flex; align-items: center;
73
- gap: 14px;
74
- padding: 0 clamp(14px,4vw,40px);
75
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76
 
77
  .logo {
78
- font-size: clamp(18px,3vw,24px); font-weight:800;
79
- color:#fff; text-decoration:none;
80
- letter-spacing:-0.8px; white-space:nowrap; flex-shrink:0;
 
 
 
 
 
81
  }
82
- .logo span {
83
- background: linear-gradient(135deg,var(--accent),var(--accent-2));
84
- -webkit-background-clip:text; -webkit-text-fill-color:transparent;
 
 
 
 
 
85
  }
86
 
87
- /* Search bar */
88
- .search-bar-wrapper { flex:1; min-width:0; max-width:680px; }
89
  .search-form {
90
- display:flex; align-items:center;
91
- background: var(--bg-surface);
92
- border: 1px solid var(--border);
93
- border-radius:100px; padding:4px 6px;
94
- transition: var(--tr);
 
 
 
 
95
  }
 
96
  .search-form:focus-within {
 
97
  border-color: var(--accent);
98
- box-shadow: 0 0 26px var(--accent-glow), 0 0 52px rgba(59,130,246,0.08);
99
- background: rgba(255,255,255,0.05);
100
  }
 
101
  .search-form input {
102
- flex:1; min-width:0;
103
- background:transparent; border:none; outline:none;
104
- color:var(--text-main);
105
- padding:10px 14px;
106
- font-size:clamp(13px,2.5vw,15px);
107
- font-family:inherit;
 
 
108
  }
109
- .search-form input::placeholder { color:var(--text-dim); }
110
 
111
- .clear-btn {
112
- background:none; border:none; color:var(--text-dim);
113
- cursor:pointer; padding:0 6px; font-size:15px; line-height:1;
114
- transition:.2s; display:none; flex-shrink:0;
115
- }
116
- .clear-btn:hover { color:#fff; transform:rotate(90deg); }
117
 
118
  .search-btn {
119
- background: linear-gradient(135deg,var(--accent),var(--accent-2));
120
- border:none; color:#fff;
121
- width:36px; height:36px; border-radius:50%;
122
- cursor:pointer; flex-shrink:0;
123
- display:flex; align-items:center; justify-content:center;
124
- font-size:13px; transition:var(--tr);
125
- }
126
- .search-btn:hover { transform:scale(1.08); box-shadow:0 6px 18px var(--accent-glow); }
127
- .search-btn:active { transform:scale(0.95); }
128
-
129
- /* Desktop tabs */
130
- .nav-tabs { display:flex; gap:5px; flex-shrink:0; }
131
-
132
- /* Hamburger – mobile only */
133
- .menu-btn {
134
- display:none;
135
- background:none; border:none; color:var(--text-dim);
136
- cursor:pointer; font-size:20px; padding:6px; flex-shrink:0;
137
- transition:color .2s;
138
- }
139
- .menu-btn:hover { color:#fff; }
140
-
141
- /* Shared tab button styles */
142
- .tab-btn {
143
- background:transparent;
144
- border:1px solid transparent;
145
- color:var(--text-dim);
146
- font-family:inherit; font-size:13px; font-weight:500;
147
- padding:7px 14px; cursor:pointer;
148
- border-radius:100px;
149
- transition:var(--tr);
150
- display:flex; align-items:center; gap:6px; white-space:nowrap;
151
- }
152
- .tab-btn:hover { color:var(--text-main); border-color:var(--border); background:rgba(255,255,255,0.04); }
153
- .tab-btn.active {
154
- background: linear-gradient(135deg,var(--accent),var(--accent-2));
155
- color:#fff; box-shadow:0 4px 16px var(--accent-glow);
156
- border-color:transparent;
157
- }
158
-
159
- /* ════════════════════════════════════════════
160
- MOBILE TAB STRIP (sticky, scrollable)
161
- ════════════════════════════════════════════ */
162
- .mobile-tabs {
163
- display:none;
164
- position:sticky; top:var(--nav-h); z-index:800;
165
- background:rgba(2,4,8,0.9);
166
- backdrop-filter:blur(20px);
167
- border-bottom:1px solid var(--border);
168
- padding:8px 14px;
169
- gap:8px;
170
- overflow-x:auto; -webkit-overflow-scrolling:touch; scrollbar-width:none;
171
- }
172
- .mobile-tabs::-webkit-scrollbar { display:none; }
173
- .mobile-tabs .tab-btn { font-size:12px; padding:7px 14px; flex-shrink:0; }
174
-
175
- /* ════════════════════════════════════════════
176
- PAGE LAYOUT
177
- ════════════════════════════════════════════ */
178
- .page-wrap {
179
- position:relative; z-index:1;
180
- max-width:1280px; margin:0 auto;
181
- padding:clamp(20px,4vw,40px) clamp(14px,4vw,40px);
182
- display:grid;
183
- grid-template-columns:1fr 310px;
184
- gap:44px; align-items:start;
185
- }
186
-
187
- /* Meta bar */
188
- .results-meta {
189
- display:flex; align-items:center; gap:10px;
190
- font-size:13px; color:var(--text-dim);
191
- margin-bottom:24px; min-height:20px; flex-wrap:wrap;
192
- }
193
- .pulse {
194
- width:7px; height:7px;
195
- background:var(--accent); border-radius:50%;
196
- box-shadow:0 0 10px var(--accent);
197
- animation:blink 1.6s infinite; flex-shrink:0;
198
- }
199
- @keyframes blink { 0%,100%{opacity:1} 50%{opacity:.25} }
200
-
201
- /* Skeleton */
202
- .skeleton-card {
203
- background:var(--bg-card);
204
- border:1px solid var(--border);
205
- border-radius:var(--r);
206
- padding:clamp(16px,3vw,26px) clamp(16px,3vw,28px);
207
- margin-bottom:16px;
208
- animation:shimmer 1.6s infinite ease-in-out;
209
- }
210
- .sk-line { background:rgba(255,255,255,0.07); border-radius:6px; margin-bottom:10px; }
211
- .sk-line.title { height:18px; width:52%; }
212
- .sk-line.url { height:11px; width:26%; margin-bottom:14px; }
213
- .sk-line.body { height:13px; width:100%; }
214
- .sk-line.body2 { height:13px; width:83%; }
215
- .sk-line.body3 { height:13px; width:60%; margin-bottom:0; }
216
- @keyframes shimmer { 0%,100%{opacity:.4} 50%{opacity:.75} }
217
-
218
- /* ── Google CSE overrides ── */
219
- .gsc-control-cse { background:transparent!important; border:none!important; padding:0!important; }
220
- .gsc-result {
221
- background:var(--bg-card)!important;
222
- border:1px solid var(--border)!important;
223
- border-radius:var(--r)!important;
224
- margin-bottom:16px!important;
225
- padding:clamp(14px,3vw,24px) clamp(14px,3vw,28px)!important;
226
- transition:var(--tr)!important;
227
- backdrop-filter:blur(14px)!important;
228
- }
229
- .gsc-result:hover {
230
- border-color:var(--border-hover)!important;
231
- background:rgba(59,130,246,0.08)!important;
232
- transform:translateY(-3px)!important;
233
- box-shadow:0 16px 34px rgba(0,0,0,0.45)!important;
234
- }
235
- .gs-title,.gs-title b,.gs-title a {
236
- color:var(--text-link)!important;
237
- font-size:clamp(15px,2.5vw,19px)!important;
238
- font-weight:600!important; text-decoration:none!important; line-height:1.4!important;
239
- }
240
- .gs-title a:hover { color:#fff!important; }
241
- .gsc-url-top,.gs-visibleUrl,.gs-visibleUrl-short {
242
- color:#4ade80!important; font-size:12px!important; opacity:.75!important;
243
- }
244
- .gs-snippet,.gs-snippet b {
245
- color:var(--text-dim)!important;
246
- font-size:clamp(13px,2vw,14.5px)!important; line-height:1.75!important;
247
- }
248
- /* Hide CSE noise */
249
- .gsc-results-branding,.gsc-control-sunburst,.gsc-above-wrapper-area,
250
- .gsc-tabsArea,.gsc-search-box,.gsc-adBlock,
251
- .gcsc-find-more-on-google-root,.gsc-refinementHeader { display:none!important; }
252
-
253
- /* Pagination */
254
- .gsc-cursor-box { margin-top:22px; text-align:center; }
255
- .gsc-cursor-page {
256
- color:var(--text-dim)!important; background:var(--bg-card)!important;
257
- border:1px solid var(--border)!important; border-radius:8px!important;
258
- padding:6px 14px!important; margin:0 3px!important;
259
- cursor:pointer; display:inline-block;
260
- font-family:inherit!important; transition:var(--tr)!important;
261
- }
262
- .gsc-cursor-page:hover,.gsc-cursor-current-page {
263
- background:var(--accent)!important; color:#fff!important; border-color:var(--accent)!important;
264
- }
265
 
266
- /* Empty state */
267
- .empty-state { text-align:center; padding:80px 20px; color:var(--text-dim); }
268
- .empty-state i { font-size:44px; margin-bottom:16px; opacity:.22; display:block; }
269
- .empty-state p { font-size:15px; }
270
-
271
- @keyframes fadeUp { from{opacity:0;transform:translateY(14px)} to{opacity:1;transform:none} }
272
- #cse-results { animation:fadeUp .4s ease both; }
273
-
274
- /* ════════════════════════════════════════════
275
- SIDEBAR (desktop)
276
- ════════════════════════════════════════════ */
277
- .sidebar { position:sticky; top:calc(var(--nav-h) + 24px); }
278
-
279
- .side-card {
280
- background:var(--bg-surface); border:1px solid var(--border);
281
- border-radius:var(--r); padding:22px;
282
- margin-bottom:18px; backdrop-filter:blur(16px);
283
- transition:var(--tr);
284
- }
285
- .side-card:hover { border-color:rgba(139,92,246,.4); box-shadow:0 12px 32px rgba(0,0,0,.3); }
286
- .side-title {
287
- font-size:14.5px; font-weight:700; color:#fff;
288
- margin-bottom:14px; display:flex; align-items:center; gap:10px;
289
- }
290
- .side-title i {
291
- background:linear-gradient(135deg,var(--accent),var(--accent-2));
292
- -webkit-background-clip:text; -webkit-text-fill-color:transparent;
293
- }
294
- .side-link {
295
- display:flex; align-items:center; gap:12px;
296
- padding:11px 8px; color:var(--text-dim);
297
- text-decoration:none; font-size:13.5px;
298
- border-bottom:1px solid var(--border);
299
- border-radius:8px; transition:var(--tr);
300
- }
301
- .side-link:last-of-type { border-bottom:none; }
302
- .side-link:hover { color:var(--text-main); background:rgba(59,130,246,.08); padding-left:16px; }
303
- .side-link i { width:16px; text-align:center; color:var(--accent); opacity:.85; }
304
- .stats-row { display:flex; gap:10px; margin-top:16px; }
305
- .stat-badge {
306
- flex:1;
307
- background:rgba(59,130,246,.1); border:1px solid rgba(59,130,246,.2);
308
- border-radius:12px; padding:10px; text-align:center;
309
- }
310
- .stat-num { font-size:20px; font-weight:800; color:var(--accent); }
311
- .stat-label { font-size:10px; color:var(--text-dim); margin-top:2px; }
312
- .tip-text { font-size:13px; color:var(--text-dim); line-height:1.7; font-weight:300; }
313
- .tip-text strong { color:var(--text-main); font-weight:600; }
314
-
315
- /* ════════════════════════════════════════════
316
- MOBILE DRAWER (bottom sheet)
317
- ════════════════════════════════════════════ */
318
- .drawer-overlay {
319
- display:none; position:fixed; inset:0; z-index:1100;
320
- background:rgba(0,0,0,.65); backdrop-filter:blur(4px);
321
- animation:fadeIn .22s ease;
322
- }
323
- @keyframes fadeIn { from{opacity:0} to{opacity:1} }
324
- .drawer {
325
- position:fixed; bottom:0; left:0; right:0; z-index:1200;
326
- background:rgba(8,14,28,0.98);
327
- border-top:1px solid var(--border);
328
- border-radius:24px 24px 0 0;
329
- padding:18px 18px calc(18px + env(safe-area-inset-bottom));
330
- max-height:82vh; overflow-y:auto;
331
- transform:translateY(100%);
332
- transition:transform .35s var(--ease);
333
- }
334
- .drawer.open { transform:translateY(0); }
335
- .drawer-handle {
336
- width:40px; height:4px;
337
- background:rgba(255,255,255,.14);
338
- border-radius:100px; margin:0 auto 18px;
339
- }
340
- .drawer-close {
341
- position:absolute; top:14px; right:16px;
342
- background:none; border:none; color:var(--text-dim);
343
- cursor:pointer; font-size:18px; transition:color .2s;
344
- }
345
- .drawer-close:hover { color:#fff; }
346
-
347
- /* ════════════════════════════════════════════
348
- RESPONSIVE BREAKPOINTS
349
- ════════════════════════════════════════════ */
350
-
351
- /* Tablet */
352
- @media (max-width:1100px) {
353
- .page-wrap { grid-template-columns:1fr; gap:0; }
354
- .sidebar { display:none; }
355
- .nav-tabs { display:none; }
356
- .mobile-tabs { display:flex; }
357
- .menu-btn { display:block; }
358
- }
359
-
360
- /* Large phone */
361
- @media (max-width:768px) {
362
- :root { --nav-h:60px; }
363
- .search-form input { font-size:13px; padding:9px 12px; }
364
- .search-btn { width:34px; height:34px; font-size:12px; }
365
- }
366
-
367
- /* Small phone */
368
- @media (max-width:480px) {
369
- .mobile-tabs .tab-btn { font-size:11.5px; padding:6px 12px; }
370
- .empty-state { padding:50px 14px; }
371
- }
372
-
373
- /* Tiny phone */
374
- @media (max-width:360px) { .logo { display:none; } }
375
-
376
- /* Safe area */
377
- @supports (padding-bottom:env(safe-area-inset-bottom)) {
378
- .mobile-tabs { padding-bottom:calc(8px + env(safe-area-inset-bottom)); }
379
- }
380
  </style>
381
  </head>
382
  <body>
383
 
384
- <div class="bg-glow" id="bg-glow"></div>
385
-
386
- <!-- ══════════════════════ NAVBAR ══════════════════════ -->
387
- <nav class="navbar">
388
- <a href="index.html" class="logo" aria-label="SurfGO">Surf<span>GO</span></a>
389
-
390
- <div class="search-bar-wrapper">
391
- <form class="search-form" id="search-form" action="results.html" method="get">
392
- <input type="hidden" name="tab" id="tab-hidden" value="all">
393
- <input type="text" name="q" id="search-input"
394
- placeholder="Search anything…"
395
- autocomplete="off" autocorrect="off" spellcheck="false"
396
- enterkeyhint="search" inputmode="search">
397
- <button type="button" class="clear-btn" id="clear-btn" aria-label="Clear">
398
- <i class="fa-solid fa-circle-xmark"></i>
399
- </button>
400
- <button type="submit" class="search-btn" aria-label="Search">
401
- <i class="fa-solid fa-magnifying-glass"></i>
402
- </button>
403
- </form>
404
  </div>
405
 
406
- <!-- Desktop tabs -->
407
- <div class="nav-tabs" id="tabs-desktop" role="tablist">
408
- <button class="tab-btn" data-tab="all" role="tab"><i class="fa-solid fa-globe"></i> All</button>
409
- <button class="tab-btn" data-tab="news" role="tab"><i class="fa-solid fa-newspaper"></i> News</button>
410
- <button class="tab-btn" data-tab="images" role="tab"><i class="fa-solid fa-image"></i> Images</button>
411
- <button class="tab-btn" data-tab="videos" role="tab"><i class="fa-solid fa-play"></i> Videos</button>
 
 
 
 
 
412
  </div>
413
 
414
- <!-- Mobile menu button -->
415
- <button class="menu-btn" id="menu-btn" aria-label="Open links" aria-expanded="false">
416
- <i class="fa-solid fa-bars-staggered"></i>
417
- </button>
418
- </nav>
419
-
420
- <!-- ══════════════════════ MOBILE TABS ══════════════════════ -->
421
- <div class="mobile-tabs" id="tabs-mobile" role="tablist">
422
- <button class="tab-btn" data-tab="all" role="tab"><i class="fa-solid fa-globe"></i> All</button>
423
- <button class="tab-btn" data-tab="news" role="tab"><i class="fa-solid fa-newspaper"></i> News</button>
424
- <button class="tab-btn" data-tab="images" role="tab"><i class="fa-solid fa-image"></i> Images</button>
425
- <button class="tab-btn" data-tab="videos" role="tab"><i class="fa-solid fa-play"></i> Videos</button>
426
- </div>
427
-
428
- <!-- ══════════════════════ CONTENT ══════════════════════ -->
429
- <div class="page-wrap">
430
- <main>
431
- <div class="results-meta" id="results-meta" aria-live="polite">
432
- <div class="pulse" id="pulse-dot"></div>
433
- <span id="meta-text">Analyzing the universe…</span>
434
- </div>
435
- <div id="skeleton-area"></div>
436
- <div id="cse-results"></div>
437
- </main>
438
-
439
- <!-- Desktop sidebar -->
440
- <aside class="sidebar">
441
- <div class="side-card">
442
- <div class="side-title"><i class="fa-solid fa-wand-magic-sparkles"></i> Genisi AI Core</div>
443
- <a href="https://genisi.web.app/" target="_blank" rel="noopener" class="side-link"><i class="fa-solid fa-robot"></i> Launch Genisi AI</a>
444
- <a href="https://github.com" target="_blank" rel="noopener" class="side-link"><i class="fa-brands fa-github"></i> Dev Repository</a>
445
- <a href="https://wikipedia.org" target="_blank" rel="noopener" class="side-link"><i class="fa-solid fa-book-open"></i> Global Knowledge</a>
446
- <div class="stats-row">
447
- <div class="stat-badge"><div class="stat-num" id="d-stat-tab">—</div><div class="stat-label">Active Tab</div></div>
448
- <div class="stat-badge"><div class="stat-num" id="d-stat-q">—</div><div class="stat-label">Query Words</div></div>
449
  </div>
450
- </div>
451
- <div class="side-card">
452
- <div class="side-title"><i class="fa-solid fa-lightbulb"></i> Pro Tip</div>
453
- <p class="tip-text">Combine <strong>Genisi AI</strong> with <strong>SurfGO</strong> to synthesize complex information faster than ever.</p>
454
- </div>
455
- </aside>
456
- </div>
457
-
458
- <!-- ══════════════════════ MOBILE DRAWER ══════════════════════ -->
459
- <div class="drawer-overlay" id="drawer-overlay"></div>
460
- <div class="drawer" id="drawer" role="dialog" aria-modal="true" aria-label="Quick links">
461
- <div class="drawer-handle"></div>
462
- <button class="drawer-close" id="drawer-close" aria-label="Close"><i class="fa-solid fa-xmark"></i></button>
463
-
464
- <div class="side-card" style="margin-bottom:14px">
465
- <div class="side-title"><i class="fa-solid fa-wand-magic-sparkles"></i> Genisi AI Core</div>
466
- <a href="https://genisi.web.app/" target="_blank" rel="noopener" class="side-link"><i class="fa-solid fa-robot"></i> Launch Genisi AI</a>
467
- <a href="https://github.com" target="_blank" rel="noopener" class="side-link"><i class="fa-brands fa-github"></i> Dev Repository</a>
468
- <a href="https://wikipedia.org" target="_blank" rel="noopener" class="side-link"><i class="fa-solid fa-book-open"></i> Global Knowledge</a>
469
- <div class="stats-row">
470
- <div class="stat-badge"><div class="stat-num" id="m-stat-tab">—</div><div class="stat-label">Active Tab</div></div>
471
- <div class="stat-badge"><div class="stat-num" id="m-stat-q">—</div><div class="stat-label">Query Words</div></div>
472
- </div>
473
  </div>
474
- <div class="side-card">
475
- <div class="side-title"><i class="fa-solid fa-lightbulb"></i> Pro Tip</div>
476
- <p class="tip-text">Combine <strong>Genisi AI</strong> with <strong>SurfGO</strong> to synthesize complex information faster than ever.</p>
 
477
  </div>
478
- </div>
479
-
480
- <!-- ══════════════════════ SCRIPT ══════════════════════ -->
481
- <script>
482
- (function () {
483
- /* ── Engine IDs (replace with real cx values) ── */
484
- const ENGINES = {
485
- all: '75aa960081baa4f0c',
486
- news: '35b0f5b6012e94f78',
487
- images: '23c7fd94975714dd8',
488
- videos: 'b11f5dceb04784b9f'
489
- };
490
-
491
- /* ── URL ── */
492
- const params = new URLSearchParams(location.search);
493
- const query = (params.get('q') || '').trim();
494
- let currentTab = params.get('tab') || 'all';
495
- if (!ENGINES[currentTab]) currentTab = 'all';
496
-
497
- /* ── DOM ── */
498
- const $ = id => document.getElementById(id);
499
- const searchInput = $('search-input');
500
- const clearBtn = $('clear-btn');
501
- const tabHidden = $('tab-hidden');
502
- const metaText = $('meta-text');
503
- const pulseDot = $('pulse-dot');
504
- const skeletonArea = $('skeleton-area');
505
- const cseResults = $('cse-results');
506
- const menuBtn = $('menu-btn');
507
- const drawer = $('drawer');
508
- const drawerOverlay = $('drawer-overlay');
509
- const drawerClose = $('drawer-close');
510
- const bgGlow = $('bg-glow');
511
-
512
- /* ── Ambient glow (desktop only) ── */
513
- if (window.matchMedia('(hover:hover)').matches) {
514
- document.addEventListener('mousemove', e => {
515
- bgGlow.style.background =
516
- `radial-gradient(circle at ${(e.clientX/innerWidth*100).toFixed(1)}% `+
517
- `${(e.clientY/innerHeight*100).toFixed(1)}%, rgba(59,130,246,0.11) 0%, transparent 48%)`;
518
- }, { passive:true });
519
- }
520
-
521
- /* ── Search input ── */
522
- if (query) {
523
- searchInput.value = query;
524
- document.title = `${query} | SurfGO`;
525
- clearBtn.style.display = 'block';
526
- }
527
- searchInput.addEventListener('input', () => {
528
- clearBtn.style.display = searchInput.value ? 'block' : 'none';
529
- });
530
- clearBtn.addEventListener('click', () => {
531
- searchInput.value = '';
532
- clearBtn.style.display = 'none';
533
- searchInput.focus();
534
- });
535
-
536
- /* ── Drawer ── */
537
- function openDrawer() {
538
- drawerOverlay.style.display = 'block';
539
- requestAnimationFrame(() => drawer.classList.add('open'));
540
- menuBtn.setAttribute('aria-expanded','true');
541
- }
542
- function closeDrawer() {
543
- drawer.classList.remove('open');
544
- setTimeout(() => drawerOverlay.style.display = 'none', 330);
545
- menuBtn.setAttribute('aria-expanded','false');
546
- }
547
- menuBtn.addEventListener('click', openDrawer);
548
- drawerClose.addEventListener('click', closeDrawer);
549
- drawerOverlay.addEventListener('click', closeDrawer);
550
-
551
- /* Swipe-down to close */
552
- let ty0 = 0;
553
- drawer.addEventListener('touchstart', e => { ty0 = e.touches[0].clientY; }, { passive:true });
554
- drawer.addEventListener('touchend', e => { if (e.changedTouches[0].clientY - ty0 > 70) closeDrawer(); }, { passive:true });
555
-
556
- /* ── Helpers ── */
557
- function esc(s) {
558
- return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');
559
- }
560
- function updateStats() {
561
- const label = currentTab.charAt(0).toUpperCase() + currentTab.slice(1);
562
- const words = query ? query.split(/\s+/).length : 0;
563
- $('d-stat-tab').textContent = label;
564
- $('d-stat-q').textContent = words;
565
- $('m-stat-tab').textContent = label;
566
- $('m-stat-q').textContent = words;
567
- }
568
-
569
- /* ── Skeleton ── */
570
- function showSkeletons() {
571
- skeletonArea.innerHTML = Array(4).fill(`
572
- <div class="skeleton-card" aria-hidden="true">
573
- <div class="sk-line title"></div><div class="sk-line url"></div>
574
- <div class="sk-line body"></div><div class="sk-line body2"></div>
575
- <div class="sk-line body3"></div>
576
- </div>`).join('');
577
- cseResults.innerHTML = '';
578
- }
579
- function hideSkeletons() { skeletonArea.innerHTML = ''; }
580
-
581
- /* ── CSE loader ── */
582
- let cseScript = null;
583
- function loadCSE(tabKey) {
584
- if (cseScript) { cseScript.remove(); cseScript = null; }
585
- try { if (window.google?.search?.cse?.element) window.google.search.cse.element.render = undefined; } catch(_){}
586
-
587
- cseResults.innerHTML =
588
- `<div class="gcse-searchresults-only" data-q="${esc(query)}" data-queryParameterName="q"></div>`;
589
-
590
- cseScript = Object.assign(document.createElement('script'), {
591
- src: `https://cse.google.com/cse.js?cx=${ENGINES[tabKey]}`,
592
- async: true
593
- });
594
- cseScript.onload = () => setTimeout(hideSkeletons, 850);
595
- cseScript.onerror = () => {
596
- hideSkeletons();
597
- metaText.textContent = '⚠ Could not load search engine — check your CSE IDs.';
598
- pulseDot.style.display = 'none';
599
- };
600
- document.head.appendChild(cseScript);
601
- }
602
-
603
- /* ── Tab switching ── */
604
- function setActiveTab(key, reload) {
605
- currentTab = key;
606
- tabHidden.value = key;
607
-
608
- document.querySelectorAll('.tab-btn[data-tab]').forEach(b =>
609
- b.classList.toggle('active', b.dataset.tab === key)
610
- );
611
-
612
- const p = new URLSearchParams(location.search);
613
- p.set('tab', key);
614
- if (query) p.set('q', query);
615
- history.replaceState(null,'','?'+p.toString());
616
-
617
- const label = key.charAt(0).toUpperCase() + key.slice(1);
618
- metaText.innerHTML = query
619
- ? `Showing <strong>${label}</strong> results for "<strong>${esc(query)}</strong>"`
620
- : `Tab: <strong>${label}</strong>`;
621
-
622
- updateStats();
623
- if (reload) { showSkeletons(); loadCSE(key); }
624
- }
625
-
626
- /* Delegate clicks for both tab containers */
627
- ['tabs-desktop','tabs-mobile'].forEach(id => {
628
- $(id).addEventListener('click', e => {
629
- const b = e.target.closest('.tab-btn[data-tab]');
630
- if (!b || b.dataset.tab === currentTab) return;
631
- setActiveTab(b.dataset.tab, true);
632
- });
633
- });
634
-
635
- /* ── Init ── */
636
- setActiveTab(currentTab, false);
637
-
638
- if (query) {
639
- showSkeletons();
640
- loadCSE(currentTab);
641
- } else {
642
- pulseDot.style.display = 'none';
643
- metaText.textContent = '';
644
- cseResults.innerHTML = `
645
- <div class="empty-state">
646
- <i class="fa-solid fa-magnifying-glass"></i>
647
- <p>Enter a query above to start exploring the universe.</p>
648
- </div>`;
649
- }
650
- })();
651
- </script>
652
  </body>
653
  </html>
 
2
  <html lang="en" dir="ltr">
3
  <head>
4
  <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>SurfGO | Discover the Universe</title>
7
+
8
+ <!-- Fonts & Icons -->
9
  <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link href="https://fonts.googleapis.com/css2?family=Tajawal:wght@300;400;500;700&display=swap" rel="stylesheet">
11
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css">
12
 
13
  <style>
14
+ /* =========================================
15
+ 1. VARIABLES & RESET
16
+ ========================================= */
17
  :root {
18
+ --accent: #3B82F6;
19
+ --accent-light: #60A5FA;
20
+ --shadow-accent: rgba(59, 130, 246, 0.35);
21
+ --bg-gradient: radial-gradient(circle at center, #0e1219 0%, #020304 100%);
22
+ --surface: rgba(255, 255, 255, 0.05);
23
+ --text: #F0EDE6;
24
+ --text-dim: #9CA3AF;
25
+ --glass-border: rgba(255, 255, 255, 0.1);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  }
27
 
28
+ * {
29
+ margin: 0;
30
+ padding: 0;
31
+ box-sizing: border-box;
 
 
 
 
 
 
 
 
 
32
  }
33
 
34
+ body {
35
+ font-family: 'Tajawal', sans-serif;
36
+ background: var(--bg-gradient);
37
+ color: var(--text);
38
+ height: 100vh;
39
+ display: flex;
40
+ flex-direction: column;
41
+ justify-content: center;
42
+ align-items: center;
43
+ overflow: hidden;
44
+ position: relative;
45
+ transition: all 0.5s ease;
46
+ }
47
+
48
+ /* =========================================
49
+ 2. SPACE BACKGROUND
50
+ ========================================= */
51
+ .stars-container {
52
+ position: absolute;
53
+ inset: 0;
54
+ pointer-events: none;
55
+ z-index: 0;
56
+ }
57
+
58
+ .nebula {
59
+ position: absolute;
60
+ width: 500px;
61
+ height: 500px;
62
+ background: radial-gradient(circle, rgba(59, 130, 246, 0.07) 0%, transparent 70%);
63
+ border-radius: 50%;
64
+ filter: blur(60px);
65
+ z-index: 0;
66
+ animation: float 20s ease-in-out infinite;
67
+ }
68
+
69
+ @keyframes float {
70
+ 0%, 100% { transform: translate(0, 0); }
71
+ 50% { transform: translate(100px, 50px); }
72
+ }
73
+
74
+ /* =========================================
75
+ 3. WIDGETS & LOGO
76
+ ========================================= */
77
+ .clock-container {
78
+ position: absolute;
79
+ top: 40px;
80
+ text-align: center;
81
+ z-index: 10;
82
+ animation: fadeIn 1s ease;
83
+ }
84
+ #time { font-size: 3rem; font-weight: 700; letter-spacing: 2px; color: var(--text); }
85
+ #date { font-size: 1rem; color: var(--text-dim); }
86
 
87
  .logo {
88
+ font-size: clamp(48px, 10vw, 85px);
89
+ font-weight: 800;
90
+ color: var(--accent);
91
+ margin-bottom: 30px;
92
+ z-index: 10;
93
+ text-shadow: 0 10px 20px var(--shadow-accent);
94
+ letter-spacing: -2px;
95
+ animation: fadeIn 1.2s ease;
96
  }
97
+
98
+ /* =========================================
99
+ 4. SEARCH BAR
100
+ ========================================= */
101
+ .search-container {
102
+ width: 90%;
103
+ max-width: 680px;
104
+ z-index: 10;
105
  }
106
 
 
 
107
  .search-form {
108
+ display: flex;
109
+ background: var(--surface);
110
+ backdrop-filter: blur(20px);
111
+ -webkit-backdrop-filter: blur(20px);
112
+ border: 1px solid var(--glass-border);
113
+ border-radius: 100px;
114
+ padding: 8px 12px;
115
+ transition: 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
116
+ box-shadow: 0 20px 40px rgba(0,0,0,0.3);
117
  }
118
+
119
  .search-form:focus-within {
120
+ transform: scale(1.02);
121
  border-color: var(--accent);
122
+ box-shadow: 0 0 40px var(--shadow-accent);
123
+ background: rgba(255,255,255,0.08);
124
  }
125
+
126
  .search-form input {
127
+ flex: 1;
128
+ background: transparent;
129
+ border: none;
130
+ outline: none;
131
+ color: var(--text);
132
+ font-family: 'Tajawal', sans-serif;
133
+ font-size: 1.1rem;
134
+ padding: 12px 20px;
135
  }
 
136
 
137
+ .search-form input::placeholder { color: var(--text-dim); opacity: 0.6; }
 
 
 
 
 
138
 
139
  .search-btn {
140
+ background: none;
141
+ border: none;
142
+ color: var(--accent);
143
+ cursor: pointer;
144
+ padding: 0 15px;
145
+ font-size: 1.2rem;
146
+ transition: 0.3s;
147
+ }
148
+ .search-btn:hover { color: var(--accent-light); }
149
+
150
+ /* =========================================
151
+ 5. QUICK LINKS
152
+ ========================================= */
153
+ .quick-links {
154
+ margin-top: 45px;
155
+ display: flex;
156
+ gap: 20px;
157
+ z-index: 10;
158
+ flex-wrap: wrap;
159
+ justify-content: center;
160
+ animation: fadeInUp 1s ease;
161
+ }
162
+
163
+ .link-item {
164
+ text-decoration: none;
165
+ color: inherit;
166
+ text-align: center;
167
+ transition: 0.3s;
168
+ }
169
+
170
+ .link-icon {
171
+ width: 60px;
172
+ height: 60px;
173
+ background: var(--surface);
174
+ border: 1px solid var(--glass-border);
175
+ border-radius: 20px;
176
+ display: flex;
177
+ align-items: center;
178
+ justify-content: center;
179
+ font-size: 24px;
180
+ transition: all 0.3s ease;
181
+ cursor: pointer;
182
+ overflow: hidden;
183
+ }
184
+
185
+ /* Genisi Logo Specifics */
186
+ .genisi-logo {
187
+ width: 70%;
188
+ height: 70%;
189
+ object-fit: contain;
190
+ transition: transform 0.3s ease;
191
+ }
192
+
193
+ /* Official Icon Colors */
194
+ .fa-youtube { color: #FF0000; }
195
+ .fa-facebook-f { color: #1877F2; }
196
+ .fa-instagram { color: #E4405F; }
197
+ .fa-x-twitter { color: #FFFFFF; }
198
+
199
+ .link-label {
200
+ margin-top: 8px;
201
+ font-size: 0.8rem;
202
+ color: var(--text-dim);
203
+ transition: 0.3s;
204
+ }
205
+
206
+ /* Hover effects - NO MOVEMENT as requested */
207
+ .link-item:hover { transform: none; }
208
+ .link-item:hover .link-icon {
209
+ transform: none;
210
+ background: var(--accent);
211
+ color: white;
212
+ border-color: transparent;
213
+ box-shadow: 0 15px 30px var(--shadow-accent);
214
+ }
215
+ .link-item:hover .link-label { color: var(--text); }
216
+ .link-item:hover .genisi-logo { transform: scale(1.1); }
217
+
218
+ /* =========================================
219
+ 6. FOOTER & ANIMATIONS
220
+ ========================================= */
221
+ .footer {
222
+ position: absolute;
223
+ bottom: 20px;
224
+ font-size: 0.8rem;
225
+ color: var(--text-dim);
226
+ text-align: center;
227
+ z-index: 10;
228
+ }
229
+
230
+ @keyframes fadeIn { from { opacity: 0; transform: translateY(-20px); } to { opacity: 1; transform: translateY(0); } }
231
+ @keyframes fadeInUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
232
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
  </style>
234
  </head>
235
  <body>
236
 
237
+ <!-- Background Layer -->
238
+ <div class="stars-container" id="stars"></div>
239
+ <div class="nebula" style="top: 10%; left: 10%;"></div>
240
+ <div class="nebula" style="bottom: 10%; right: 10%; background: radial-gradient(circle, rgba(59, 130, 246, 0.05) 0%, transparent 70%);"></div>
241
+
242
+ <!-- Clock Widget -->
243
+ <div class="clock-container">
244
+ <div id="time">00:00</div>
245
+ <div id="date">Loading date...</div>
 
 
 
 
 
 
 
 
 
 
 
246
  </div>
247
 
248
+ <!-- Main Logo -->
249
+ <div class="logo">SurfGO</div>
250
+
251
+ <!-- Search Section -->
252
+ <div class="search-container">
253
+ <form action="results.html" method="get" class="search-form">
254
+ <input type="text" name="q" placeholder="Explore the universe..." autocomplete="off">
255
+ <button type="submit" class="search-btn">
256
+ <i class="fa-solid fa-paper-plane"></i>
257
+ </button>
258
+ </form>
259
  </div>
260
 
261
+ <!-- Quick Navigation -->
262
+ <div class="quick-links">
263
+ <a href="https://youtube.com" target="_blank" class="link-item">
264
+ <div class="link-icon"><i class="fa-brands fa-youtube"></i></div>
265
+ <div class="link-label">YouTube</div>
266
+ </a>
267
+ <a href="https://facebook.com" target="_blank" class="link-item">
268
+ <div class="link-icon"><i class="fa-brands fa-facebook-f"></i></div>
269
+ <div class="link-label">Facebook</div>
270
+ </a>
271
+ <a href="https://instagram.com" target="_blank" class="link-item">
272
+ <div class="link-icon"><i class="fa-brands fa-instagram"></i></div>
273
+ <div class="link-label">Instagram</div>
274
+ </a>
275
+ <a href="https://genisi.web.app/" target="_blank" class="link-item">
276
+ <div class="link-icon">
277
+ <img src="https://copilot.microsoft.com/th/id/BCO.f29916dd-b0c1-4089-87cd-43d099a7d1a6.png" alt="Genisi Logo" class="genisi-logo">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
  </div>
279
+ <div class="link-label">Genisi</div>
280
+ </a>
281
+ <a href="https://twitter.com" target="_blank" class="link-item">
282
+ <div class="link-icon"><i class="fa-brands fa-x-twitter"></i></div>
283
+ <div class="link-label">Twitter</div>
284
+ </a>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
285
  </div>
286
+
287
+ <!-- Footer -->
288
+ <div class="footer">
289
+ Crafted by <strong>AnesNT</strong> • 2026
290
  </div>
291
+
292
+ <script>
293
+ // 1. Real-time Clock & Date
294
+ function updateClock() {
295
+ const now = new Date();
296
+ const timeStr = now.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit' });
297
+ const dateStr = now.toLocaleDateString('en-US', { weekday: 'long', month: 'long', day: 'numeric' });
298
+ document.getElementById('time').textContent = timeStr;
299
+ document.getElementById('date').textContent = dateStr;
300
+ }
301
+ setInterval(updateClock, 1000);
302
+ updateClock();
303
+
304
+ // 2. Dynamic Stars Generation
305
+ const starsContainer = document.getElementById('stars');
306
+ for (let i = 0; i < 150; i++) {
307
+ const star = document.createElement('div');
308
+ star.style.position = 'absolute';
309
+ star.style.left = Math.random() * 100 + '%';
310
+ star.style.top = Math.random() * 100 + '%';
311
+ star.style.width = Math.random() * 2 + 'px';
312
+ star.style.height = star.style.width;
313
+ star.style.background = '#fff';
314
+ star.style.borderRadius = '50%';
315
+ star.style.opacity = Math.random();
316
+ starsContainer.appendChild(star);
317
+ }
318
+ </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
319
  </body>
320
  </html>