pssx commited on
Commit
92a9d9d
·
verified ·
1 Parent(s): 43c782a

Add 2 files

Browse files
Files changed (2) hide show
  1. README.md +6 -4
  2. index.html +1071 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Paulseperformancev2
3
- emoji: 🚀
4
- colorFrom: green
5
  colorTo: blue
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: paulseperformancev2
3
+ emoji: 🐳
4
+ colorFrom: yellow
5
  colorTo: blue
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,1071 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>pAulse performance</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <style>
10
+ @import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;500;700;900&display=swap');
11
+
12
+ :root {
13
+ --neon-blue: #05d9e8;
14
+ --neon-pink: #ff2a6d;
15
+ --neon-purple: #d300c5;
16
+ --dark-bg: #05010e;
17
+ --darker-bg: #0d0221;
18
+ --nav-dark: #12092a;
19
+ }
20
+
21
+ body {
22
+ font-family: 'Orbitron', sans-serif;
23
+ background-color: var(--dark-bg);
24
+ color: white;
25
+ min-height: 100vh;
26
+ background-image: var(--bg-image, none);
27
+ background-size: cover;
28
+ background-attachment: fixed;
29
+ background-position: center;
30
+ }
31
+
32
+ .glitch-effect {
33
+ position: relative;
34
+ color: white;
35
+ }
36
+
37
+ .glitch-effect::before, .glitch-effect::after {
38
+ content: attr(data-text);
39
+ position: absolute;
40
+ top: 0;
41
+ left: 0;
42
+ width: 100%;
43
+ height: 100%;
44
+ opacity: 0.8;
45
+ }
46
+
47
+ .glitch-effect::before {
48
+ color: var(--neon-blue);
49
+ z-index: -1;
50
+ animation: glitch-effect 3s infinite;
51
+ }
52
+
53
+ .glitch-effect::after {
54
+ color: var(--neon-pink);
55
+ z-index: -2;
56
+ animation: glitch-effect 2s infinite reverse;
57
+ }
58
+
59
+ @keyframes glitch-effect {
60
+ 0% { transform: translate(0); }
61
+ 20% { transform: translate(-3px, 3px); }
62
+ 40% { transform: translate(-3px, -3px); }
63
+ 60% { transform: translate(3px, 3px); }
64
+ 80% { transform: translate(3px, -3px); }
65
+ 100% { transform: translate(0); }
66
+ }
67
+
68
+ .neon-text-blue {
69
+ color: var(--neon-blue);
70
+ text-shadow: 0 0 5px var(--neon-blue), 0 0 10px var(--neon-blue), 0 0 20px var(--neon-blue);
71
+ }
72
+
73
+ .neon-text-pink {
74
+ color: var(--neon-pink);
75
+ text-shadow: 0 0 5px var(--neon-pink), 0 0 10px var(--neon-pink), 0 0 20px var(--neon-pink);
76
+ }
77
+
78
+ .neon-text-purple {
79
+ color: var(--neon-purple);
80
+ text-shadow: 0 0 5px var(--neon-purple), 0 0 10px var(--neon-purple), 0 0 20px var(--neon-purple);
81
+ }
82
+
83
+ .neon-border-blue {
84
+ border: 1px solid var(--neon-blue);
85
+ box-shadow: 0 0 5px var(--neon-blue), inset 0 0 5px var(--neon-blue), 0 0 20px var(--neon-blue);
86
+ }
87
+
88
+ .neon-border-pink {
89
+ border: 1px solid var(--neon-pink);
90
+ box-shadow: 0 0 5px var(--neon-pink), inset 0 0 5px var(--neon-pink), 0 0 20px var(--neon-pink);
91
+ }
92
+
93
+ .neon-hover:hover {
94
+ text-shadow: 0 0 10px currentColor, 0 0 20px currentColor, 0 0 30px currentColor;
95
+ transition: text-shadow 0.3s ease;
96
+ }
97
+
98
+ .nav-item:hover {
99
+ transform: translateY(-2px);
100
+ transition: transform 0.3s ease;
101
+ }
102
+
103
+ .dropdown {
104
+ display: none;
105
+ background: var(--nav-dark);
106
+ border: 1px solid var(--neon-blue);
107
+ box-shadow: 0 0 20px var(--neon-blue);
108
+ transition: all 0.3s ease;
109
+ z-index: 100;
110
+ }
111
+
112
+ .group:hover .dropdown {
113
+ display: block;
114
+ }
115
+
116
+ .portal-card {
117
+ transition: all 0.3s ease;
118
+ backdrop-filter: blur(10px);
119
+ perspective: 1000px;
120
+ transform-style: preserve-3d;
121
+ }
122
+
123
+ .portal-card:hover {
124
+ transform: translateY(-5px) scale(1.05);
125
+ box-shadow: 0 0 20px currentColor;
126
+ }
127
+
128
+ .portal-card-inner {
129
+ transition: transform 0.6s;
130
+ transform-style: preserve-3d;
131
+ }
132
+
133
+ .portal-card:hover .portal-card-inner {
134
+ transform: rotateY(15deg) rotateX(10deg);
135
+ }
136
+
137
+ .modal-overlay {
138
+ background: rgba(5, 1, 14, 0.9);
139
+ backdrop-filter: blur(5px);
140
+ animation: fadeIn 0.3s ease;
141
+ }
142
+
143
+ .modal-content {
144
+ animation: slideIn 0.3s ease;
145
+ background: var(--darker-bg);
146
+ }
147
+
148
+ @keyframes fadeIn {
149
+ from { opacity: 0; }
150
+ to { opacity: 1; }
151
+ }
152
+
153
+ @keyframes slideIn {
154
+ from { transform: translateY(-50px); opacity: 0; }
155
+ to { transform: translateY(0); opacity: 1; }
156
+ }
157
+
158
+ .color-option {
159
+ width: 30px;
160
+ height: 30px;
161
+ border-radius: 50%;
162
+ display: inline-block;
163
+ margin: 5px;
164
+ cursor: pointer;
165
+ transition: all 0.3s ease;
166
+ position: relative;
167
+ }
168
+
169
+ .color-option:hover {
170
+ transform: scale(1.1);
171
+ }
172
+
173
+ .color-option.selected::after {
174
+ content: "✓";
175
+ position: absolute;
176
+ top: 50%;
177
+ left: 50%;
178
+ transform: translate(-50%, -50%);
179
+ color: white;
180
+ font-weight: bold;
181
+ }
182
+
183
+ .custom-color-toggle {
184
+ padding: 8px;
185
+ cursor: pointer;
186
+ border-radius: 5px;
187
+ margin-top: 10px;
188
+ text-align: center;
189
+ border: 1px dashed var(--neon-blue);
190
+ }
191
+
192
+ .custom-color-toggle:hover {
193
+ background: rgba(5, 217, 232, 0.1);
194
+ }
195
+
196
+ .custom-color-input {
197
+ width: 100%;
198
+ height: 30px;
199
+ border: none;
200
+ background: transparent;
201
+ cursor: pointer;
202
+ margin-top: 10px;
203
+ }
204
+
205
+ .bg-preview, .icon-preview {
206
+ max-width: 100%;
207
+ height: auto;
208
+ margin-top: 10px;
209
+ border-radius: 5px;
210
+ display: none;
211
+ }
212
+
213
+ .grid-lines {
214
+ position: fixed;
215
+ top: 0;
216
+ left: 0;
217
+ width: 100%;
218
+ height: 100%;
219
+ background-image: linear-gradient(to right, rgba(5, 217, 232, 0.05) 1px, transparent 1px),
220
+ linear-gradient(to bottom, rgba(5, 217, 232, 0.05) 1px, transparent 1px);
221
+ background-size: 30px 30px;
222
+ z-index: -1;
223
+ pointer-events: none;
224
+ }
225
+
226
+ .neon-underline {
227
+ position: relative;
228
+ display: inline-block;
229
+ }
230
+
231
+ .neon-underline::after {
232
+ content: '';
233
+ position: absolute;
234
+ bottom: -5px;
235
+ left: 0;
236
+ width: 100%;
237
+ height: 2px;
238
+ background: linear-gradient(to right, var(--neon-blue), var(--neon-pink));
239
+ transform: scaleX(0);
240
+ transform-origin: bottom right;
241
+ transition: transform 0.5s ease-out;
242
+ }
243
+
244
+ .neon-underline:hover::after {
245
+ transform: scaleX(1);
246
+ transform-origin: bottom left;
247
+ }
248
+
249
+ /* Holographic effect */
250
+ .holographic-effect {
251
+ position: relative;
252
+ overflow: hidden;
253
+ }
254
+
255
+ .holographic-effect::before {
256
+ content: '';
257
+ position: absolute;
258
+ top: -50%;
259
+ left: -50%;
260
+ width: 200%;
261
+ height: 200%;
262
+ background: linear-gradient(
263
+ to bottom right,
264
+ rgba(255, 255, 255, 0) 45%,
265
+ rgba(5, 217, 232, 0.2) 50%,
266
+ rgba(255, 255, 255, 0) 55%
267
+ );
268
+ transform: rotate(30deg);
269
+ animation: holographic 6s linear infinite;
270
+ }
271
+
272
+ @keyframes holographic {
273
+ 0% { transform: translateY(-100%) rotate(30deg); }
274
+ 100% { transform: translateY(100%) rotate(30deg); }
275
+ }
276
+
277
+ /* Heartbeat cardiogram animation */
278
+ .title-container {
279
+ position: relative;
280
+ display: inline-block;
281
+ }
282
+
283
+ .pulse-letter {
284
+ position: relative;
285
+ display: inline-block;
286
+ color: var(--neon-pink);
287
+ text-shadow: 0 0 5px var(--neon-pink), 0 0 10px var(--neon-pink), 0 0 20px var(--neon-pink);
288
+ z-index: 2;
289
+ }
290
+
291
+ .cardiogram {
292
+ position: absolute;
293
+ bottom: -10px;
294
+ left: 0;
295
+ width: 100%;
296
+ height: 4px;
297
+ background: transparent;
298
+ z-index: 1;
299
+ overflow: hidden;
300
+ }
301
+
302
+ .cardiogram-line {
303
+ position: absolute;
304
+ bottom: 0;
305
+ left: 0;
306
+ width: 100%;
307
+ height: 100%;
308
+ background: linear-gradient(90deg, transparent 0%, var(--neon-pink) 20%, var(--neon-pink) 80%, transparent 100%);
309
+ transform-origin: left center;
310
+ animation: cardiogram 2s infinite;
311
+ }
312
+
313
+ @keyframes cardiogram {
314
+ 0% {
315
+ transform: scaleX(0);
316
+ opacity: 0;
317
+ }
318
+ 10% {
319
+ transform: scaleX(0.3);
320
+ opacity: 1;
321
+ }
322
+ 20% {
323
+ transform: scaleX(0.5);
324
+ }
325
+ 30% {
326
+ transform: scaleX(0.7);
327
+ }
328
+ 40% {
329
+ transform: scaleX(0.9);
330
+ }
331
+ 50% {
332
+ transform: scaleX(1);
333
+ }
334
+ 60% {
335
+ transform: scaleX(0.9);
336
+ }
337
+ 70% {
338
+ transform: scaleX(0.7);
339
+ }
340
+ 80% {
341
+ transform: scaleX(0.5);
342
+ }
343
+ 90% {
344
+ transform: scaleX(0.3);
345
+ }
346
+ 100% {
347
+ transform: scaleX(0);
348
+ opacity: 0;
349
+ }
350
+ }
351
+
352
+ .neon-title {
353
+ position: relative;
354
+ display: inline-block;
355
+ padding: 0 10px;
356
+ }
357
+
358
+ .neon-title::before {
359
+ content: '';
360
+ position: absolute;
361
+ top: -2px;
362
+ left: -2px;
363
+ right: -2px;
364
+ bottom: -2px;
365
+ background: linear-gradient(45deg, var(--neon-blue), var(--neon-pink), var(--neon-purple), var(--neon-pink), var(--neon-blue));
366
+ background-size: 400%;
367
+ z-index: -1;
368
+ border-radius: 4px;
369
+ opacity: 0;
370
+ transition: 0.5s;
371
+ animation: neon-border 20s linear infinite;
372
+ }
373
+
374
+ .neon-title:hover::before {
375
+ opacity: 1;
376
+ }
377
+
378
+ @keyframes neon-border {
379
+ 0% {
380
+ background-position: 0 0;
381
+ }
382
+ 50% {
383
+ background-position: 300% 0;
384
+ }
385
+ 100% {
386
+ background-position: 0 0;
387
+ }
388
+ }
389
+
390
+ .neon-title::after {
391
+ content: '';
392
+ position: absolute;
393
+ top: -2px;
394
+ left: -2px;
395
+ right: -2px;
396
+ bottom: -2px;
397
+ background: linear-gradient(45deg, var(--neon-blue), var(--neon-pink), var(--neon-purple), var(--neon-pink), var(--neon-blue));
398
+ background-size: 400%;
399
+ z-index: -2;
400
+ filter: blur(20px);
401
+ border-radius: 4px;
402
+ opacity: 0;
403
+ transition: 0.5s;
404
+ animation: neon-border 20s linear infinite;
405
+ }
406
+
407
+ .neon-title:hover::after {
408
+ opacity: 0.7;
409
+ }
410
+ </style>
411
+ </head>
412
+ <body class="min-h-screen relative">
413
+ <!-- Grid lines effect -->
414
+ <div class="grid-lines"></div>
415
+
416
+ <!-- Navbar -->
417
+ <nav class="navbar fixed top-0 left-0 right-0 z-50 bg-[#05010e]/90 backdrop-blur-md border-b border-[#12092a]">
418
+ <div class="container mx-auto px-4">
419
+ <div class="flex justify-between items-center h-16">
420
+ <!-- Logo -->
421
+ <div class="flex items-center">
422
+ <div class="neon-border-pink rounded-full p-2">
423
+ <i class="fas fa-terminal text-xl neon-text-pink"></i>
424
+ </div>
425
+ <span class="ml-3 font-bold text-xl neon-text-blue">pAulse</span>
426
+ </div>
427
+
428
+ <!-- Nav Items -->
429
+ <div class="hidden md:flex items-center space-x-6">
430
+ <div class="nav-item relative group">
431
+ <button class="flex items-center space-x-1 neon-text-blue neon-underline">
432
+ <i class="fas fa-cog"></i>
433
+ <span>Settings</span>
434
+ <i class="fas fa-chevron-down text-xs"></i>
435
+ </button>
436
+ <div class="dropdown absolute right-0 mt-2 w-80 rounded-lg dropdown-content p-4">
437
+ <h3 class="text-sm neon-text-pink mb-3 uppercase tracking-wider">Portal Management</h3>
438
+ <button onclick="showAddLinkModal()"
439
+ class="w-full py-2 neon-border-blue rounded flex items-center justify-center mb-3 hover:bg-[#05d9e8] hover:text-[#0d0221] transition-all">
440
+ <i class="fas fa-plus mr-2"></i>Add New Portal
441
+ </button>
442
+
443
+ <h3 class="text-sm neon-text-blue mt-4 mb-3 uppercase tracking-wider">Customization</h3>
444
+ <div class="space-y-4">
445
+ <div>
446
+ <label for="bg-image" class="block mb-2 text-xs uppercase tracking-wider">Background Image URL</label>
447
+ <div class="flex">
448
+ <input type="url" id="bg-image" class="flex-grow p-2 rounded-l-lg bg-[#12092a]"
449
+ placeholder="https://example.com/image.jpg">
450
+ <button onclick="setBackgroundImage()"
451
+ class="px-3 py-2 bg-[#05d9e8] text-[#0d0221] rounded-r-lg hover:bg-[#00c4d2] transition-all">
452
+ <i class="fas fa-check"></i>
453
+ </button>
454
+ </div>
455
+ <div class="bg-upload-container">
456
+ <label class="block mt-2 text-xs uppercase tracking-wider">Upload Background</label>
457
+ <input type="file" id="bg-upload" class="w-full mt-1" accept="image/*">
458
+ <img id="bg-preview" class="bg-preview" src="#" alt="Background Preview">
459
+ <button onclick="applyUploadedBackground()"
460
+ class="mt-2 px-3 py-1 rounded border border-[#ff2a6d] hover:bg-[#ff2a6d]/20 transition-all text-xs">
461
+ Apply Uploaded Image
462
+ </button>
463
+ </div>
464
+ <button onclick="resetBackgroundImage()"
465
+ class="mt-2 text-xs px-3 py-1 rounded border border-[#ff2a6d] hover:bg-[#ff2a6d]/20 transition-all">
466
+ Reset Background
467
+ </button>
468
+ </div>
469
+
470
+ <div>
471
+ <label class="block mb-2 text-xs uppercase tracking-wider">Theme Color</label>
472
+ <div class="color-picker-container neon-border-blue rounded-lg p-4">
473
+ <div class="color-option selected" style="background-color: #05d9e8;"
474
+ onclick="selectThemeColor('#05d9e8', this)"></div>
475
+ <div class="color-option" style="background-color: #ff2a6d;"
476
+ onclick="selectThemeColor('#ff2a6d', this)"></div>
477
+ <div class="color-option" style="background-color: #d300c5;"
478
+ onclick="selectThemeColor('#d300c5', this)"></div>
479
+ <div class="color-option" style="background-color: #00ff9d;"
480
+ onclick="selectThemeColor('#00ff9d', this)"></div>
481
+ <div class="color-option" style="background-color: #ffcc00;"
482
+ onclick="selectThemeColor('#ffcc00', this)"></div>
483
+ <div class="color-option" style="background-color: #ff3333;"
484
+ onclick="selectThemeColor('#ff3333', this)"></div>
485
+ <div class="color-option" style="background-color: #4267B2;"
486
+ onclick="selectThemeColor('#4267B2', this)"></div>
487
+ <div class="color-option" style="background-color: #9147ff;"
488
+ onclick="selectThemeColor('#9147ff', this)"></div>
489
+ <div class="color-option" style="background-color: #25F4EE;"
490
+ onclick="selectThemeColor('#25F4EE', this)"></div>
491
+ <div class="custom-color-toggle w-full" onclick="toggleCustomColorInput()">
492
+ Custom Color
493
+ </div>
494
+ <div id="custom-color-wrapper" class="custom-color-option" style="display: none;">
495
+ <input type="color" id="custom-color" class="custom-color-input">
496
+ <button class="custom-color-confirm mt-2 px-3 py-1 rounded border border-[#05d9e8] hover:bg-[#05d9e8]/20 transition-all" onclick="confirmCustomColor()">OK</button>
497
+ </div>
498
+ </div>
499
+ </div>
500
+ </div>
501
+
502
+ <h3 class="text-sm neon-text-blue mt-4 mb-3 uppercase tracking-wider">System Info</h3>
503
+ <div class="text-xs space-y-2">
504
+ <div class="flex justify-between">
505
+ <span>Version</span>
506
+ <span class="text-[#05d9e8]">v2.3.5</span>
507
+ </div>
508
+ <div class="flex justify-between">
509
+ <span>Portals</span>
510
+ <span id="portal-count" class="text-[#ff2a6d]">0</span>
511
+ </div>
512
+ </div>
513
+ </div>
514
+ </div>
515
+
516
+ <div class="nav-item relative group">
517
+ <button class="flex items-center space-x-1 neon-text-blue neon-underline">
518
+ <i class="fas fa-address-card"></i>
519
+ <span>Contact</span>
520
+ <i class="fas fa-chevron-down text-xs"></i>
521
+ </button>
522
+ <div class="dropdown absolute right-0 mt-2 w-72 rounded-lg dropdown-content p-4">
523
+ <h3 class="text-sm neon-text-pink mb-3 uppercase tracking-wider">Connection Channels</h3>
524
+ <div class="space-y-3">
525
+ <div class="contact-card p-3 rounded border border-[#05d9e8] hover:bg-[#05d9e8]/10 transition-all">
526
+ <div class="flex items-center">
527
+ <i class="fas fa-envelope text-lg text-[#05d9e8] mr-3"></i>
528
+ <div>
529
+ <h4 class="font-bold">Encrypted Mail</h4>
530
+ <a href="mailto:contact@neonportal.dev"
531
+ class="text-sm hover:underline block">contact@neonportal.dev</a>
532
+ </div>
533
+ </div>
534
+ </div>
535
+
536
+ <div class="contact-card p-3 rounded border border-[#ff2a6d] hover:bg-[#ff2a6d]/10 transition-all">
537
+ <div class="flex items-center">
538
+ <i class="fab fa-discord text-lg text-[#5865F2] mr-3"></i>
539
+ <div>
540
+ <h4 class="font-bold">Discord</h4>
541
+ <span class="text-sm">NeonPortal#0001</span>
542
+ </div>
543
+ </div>
544
+ </div>
545
+
546
+ <div class="contact-card p-3 rounded border border-[#25F4EE] hover:bg-[#25F4EE]/10 transition-all">
547
+ <div class="flex items-center">
548
+ <i class="fab fa-twitter text-lg text-[#1DA1F2] mr-3"></i>
549
+ <div>
550
+ <h4 class="font-bold">Twitter</h4>
551
+ <a href="https://twitter.com/neonportal" target="_blank" class="text-sm hover:underline block">@neonportal</a>
552
+ </div>
553
+ </div>
554
+ </div>
555
+
556
+ <div class="contact-card p-3 rounded border border-[#9147ff] hover:bg-[#9147ff]/10 transition-all">
557
+ <div class="flex items-center">
558
+ <i class="fab fa-patreon text-lg text-[#FF424D] mr-3"></i>
559
+ <div>
560
+ <h4 class="font-bold">Support</h4>
561
+ <a href="https://patreon.com/neonportal" target="_blank" class="text-sm hover:underline block">Patreon</a>
562
+ </div>
563
+ </div>
564
+ </div>
565
+ </div>
566
+ </div>
567
+ </div>
568
+ </div>
569
+
570
+ <!-- Mobile menu button -->
571
+ <div class="md:hidden">
572
+ <button id="mobile-menu-button" class="neon-text-pink text-2xl focus:outline-none">
573
+ <i class="fas fa-bars"></i>
574
+ </button>
575
+ </div>
576
+ </div>
577
+ </div>
578
+
579
+ <!-- Mobile menu -->
580
+ <div id="mobile-menu" class="md:hidden hidden bg-[#05010e] border-t border-[#ff2a6d]">
581
+ <div class="px-2 py-3 space-y-1">
582
+ <button onclick="showAddLinkModal()" class="block px-3 py-2 rounded-md neon-text-blue w-full text-left hover:bg-[#05d9e8]/20">
583
+ <i class="fas fa-plus mr-2"></i>Add New Portal
584
+ </button>
585
+ <button class="block px-3 py-2 rounded-md neon-text-blue w-full text-left hover:bg-[#05d9e8]/20">
586
+ <i class="fas fa-cog mr-2"></i>Settings
587
+ </button>
588
+ <button class="block px-3 py-2 rounded-md neon-text-blue w-full text-left hover:bg-[#05d9e8]/20">
589
+ <i class="fas fa-address-card mr-2"></i>Contact
590
+ </button>
591
+ <div class="px-3 py-2">
592
+ <label class="block text-xs neon-text-blue mb-1">Background Image</label>
593
+ <div class="flex mb-2">
594
+ <input type="url" id="bg-image-mobile" class="flex-grow p-2 rounded-l-lg bg-[#12092a]"
595
+ placeholder="Image URL">
596
+ <button onclick="setBackgroundImage()"
597
+ class="px-3 py-2 bg-[#05d9e8] text-[#0d0221] rounded-r-lg hover:bg-[#00c4d2] transition-all">
598
+ <i class="fas fa-check"></i>
599
+ </button>
600
+ </div>
601
+ <button onclick="resetBackgroundImage()"
602
+ class="w-full px-3 py-1.5 text-xs rounded border border-[#ff2a6d] hover:bg-[#ff2a6d]/20 transition-all">
603
+ Reset Background
604
+ </button>
605
+ </div>
606
+ </div>
607
+ </div>
608
+ </nav>
609
+
610
+ <!-- Main container -->
611
+ <div class="container mx-auto px-4 py-8 relative z-10 mt-20">
612
+ <!-- Header -->
613
+ <header class="text-center mb-12">
614
+ <div class="title-container">
615
+ <h1 class="text-5xl md:text-7xl font-bold mb-4 neon-title">
616
+ <span class="neon-text-blue">p</span>
617
+ <span class="pulse-letter">A</span>
618
+ <span class="neon-text-blue">ulse performance</span>
619
+ <div class="cardiogram">
620
+ <div class="cardiogram-line"></div>
621
+ </div>
622
+ </h1>
623
+ <span class="absolute -bottom-3 left-1/2 transform -translate-x-1/2 w-48 h-1 bg-gradient-to-r from-transparent via-[#05d9e8] to-transparent"></span>
624
+ <span class="absolute -bottom-5 left-1/2 transform -translate-x-1/2 w-32 h-1 bg-gradient-to-r from-transparent via-[#ff2a6d] to-transparent"></span>
625
+ </div>
626
+ <p class="text-xl neon-text-purple uppercase tracking-wider mt-8">Your gateway to the digital neonverse</p>
627
+ </header>
628
+
629
+ <!-- Time and date display -->
630
+ <div class="flex justify-center mb-12">
631
+ <div class="neon-border-blue rounded-lg p-4 text-center backdrop-blur-sm bg-[#0d0221]/50 holographic-effect">
632
+ <div id="time" class="text-3xl font-bold neon-text-blue">00:00:00</div>
633
+ <div id="date" class="text-lg uppercase tracking-wider mt-1">Loading...</div>
634
+ </div>
635
+ </div>
636
+
637
+ <!-- Portals grid -->
638
+ <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-6 mb-12" id="portals-grid">
639
+ <!-- Default portals will be added here by JavaScript -->
640
+ </div>
641
+ </div>
642
+
643
+ <!-- Add Portal Modal -->
644
+ <div id="add-portal-modal" class="fixed inset-0 flex items-center justify-center z-50 hidden modal-overlay">
645
+ <div class="modal-content neon-border-blue rounded-xl p-8 max-w-md w-full mx-4 relative">
646
+ <button id="close-portal-modal"
647
+ class="absolute top-4 right-4 text-xl hover:text-[#ff2a6d] transition-all">×</button>
648
+ <h2 class="text-2xl neon-text-pink mb-6 uppercase tracking-wider">Create New Portal</h2>
649
+
650
+ <form id="portal-form" class="space-y-6">
651
+ <div>
652
+ <label for="portal-name" class="block mb-2 neon-text-blue uppercase text-sm tracking-wider">Portal Name</label>
653
+ <input type="text" id="portal-name" class="w-full p-3 rounded-lg bg-[#12092a] focus:outline-none focus:border focus:border-[#05d9e8]" required>
654
+ </div>
655
+
656
+ <div>
657
+ <label for="portal-url"
658
+ class="block mb-2 neon-text-blue uppercase text-sm tracking-wider">Destination URL</label>
659
+ <input type="url" id="portal-url" class="w-full p-3 rounded-lg bg-[#12092a] focus:outline-none focus:border focus:border-[#05d9e8]" placeholder="https://"
660
+ required>
661
+ </div>
662
+
663
+ <div>
664
+ <label class="block mb-2 neon-text-blue uppercase text-sm tracking-wider">Icon</label>
665
+ <select id="portal-icon" class="w-full p-3 rounded-lg bg-[#0d0221] border border-[#05d9e8] focus:outline-none focus:border focus:border-[#ff2a6d]">
666
+ <option value="fab fa-youtube">YouTube</option>
667
+ <option value="fab fa-twitter">Twitter</option>
668
+ <option value="fab fa-github">GitHub</option>
669
+ <option value="fab fa-reddit">Reddit</option>
670
+ <option value="fab fa-discord">Discord</option>
671
+ <option value="fab fa-facebook">Facebook</option>
672
+ <option value="fab fa-google-drive">Drive</option>
673
+ <option value="fas fa-envelope">Mail</option>
674
+ <option value="fas fa-music">Music</option>
675
+ <option value="fas fa-gamepad">Games</option>
676
+ <option value="fas fa-film">Movies</option>
677
+ <option value="fas fa-newspaper">News</option>
678
+ <option value="fas fa-shopping-cart">Shop</option>
679
+ <option value="custom-icon">Custom Icon</option>
680
+ </select>
681
+
682
+ <div id="custom-icon-options" class="custom-icon-option mt-3" style="display: none;">
683
+ <div class="flex space-x-4">
684
+ <div class="flex-1">
685
+ <label class="block mb-2 text-xs uppercase tracking-wider">Upload Icon</label>
686
+ <input type="file" id="icon-upload" class="w-full" accept="image/*">
687
+ </div>
688
+ <div class="flex-1">
689
+ <label class="block mb-2 text-xs uppercase tracking-wider">Icon URL</label>
690
+ <input type="url" id="icon-url" class="w-full p-2 rounded bg-[#0d0221]"
691
+ placeholder="https://example.com/icon.png">
692
+ </div>
693
+ </div>
694
+ <img id="icon-preview" class="icon-preview" src="#" alt="Icon Preview">
695
+ </div>
696
+ </div>
697
+
698
+ <div>
699
+ <label class="block mb-2 neon-text-blue uppercase text-sm tracking-wider">Color</label>
700
+ <div class="color-picker-container neon-border-blue rounded-lg p-4">
701
+ <div class="color-option" style="background-color: #ff2a6d;"
702
+ onclick="selectPortalColor('#ff2a6d', this)"></div>
703
+ <div class="color-option selected" style="background-color: #05d9e8;"
704
+ onclick="selectPortalColor('#05d9e8', this)"></div>
705
+ <div class="color-option" style="background-color: #d300c5;"
706
+ onclick="selectPortalColor('#d300c5', this)"></div>
707
+ <div class="color-option" style="background-color: #00ff9d;"
708
+ onclick="selectPortalColor('#00ff9d', this)"></div>
709
+ <div class="color-option" style="background-color: #ffcc00;"
710
+ onclick="selectPortalColor('#ffcc00', this)"></div>
711
+ <div class="color-option" style="background-color: #ffffff;"
712
+ onclick="selectPortalColor('#ffffff', this)"></div>
713
+ <div class="color-option" style="background-color: #4267B2;"
714
+ onclick="selectPortalColor('#4267B2', this)"></div>
715
+ <div class="color-option" style="background-color: #9147ff;"
716
+ onclick="selectPortalColor('#9147ff', this)"></div>
717
+ <div class="custom-color-toggle w-full" onclick="togglePortalCustomColorInput()">
718
+ Custom Color
719
+ </div>
720
+ <input type="color" id="portal-custom-color" class="custom-color-input"
721
+ onchange="applyCustomPortalColor(this.value)">
722
+ </div>
723
+ <input type="hidden" id="portal-color" value="#05d9e8">
724
+ </div>
725
+
726
+ <div class="flex justify-end space-x-3">
727
+ <button type="button" onclick="document.getElementById('add-portal-modal').classList.add('hidden')"
728
+ class="px-4 py-2 rounded-lg border border-[#ff2a6d] hover:bg-[#ff2a6d] hover:text-white transition-all">
729
+ Cancel
730
+ </button>
731
+ <button type="submit"
732
+ class="px-6 py-2 neon-border-blue rounded-lg hover:bg-[#05d9e8] hover:text-[#0d0221] transition-all font-bold">
733
+ Create Portal
734
+ </button>
735
+ </div>
736
+ </form>
737
+ </div>
738
+ </div>
739
+
740
+ <script>
741
+ // Initialize default portals
742
+ const defaultPortals = [
743
+ { name: 'YouTube', url: 'https://youtube.com', icon: 'fab fa-youtube', color: '#ff0000' },
744
+ { name: 'Twitter', url: 'https://twitter.com', icon: 'fab fa-twitter', color: '#1DA1F2' },
745
+ { name: 'GitHub', url: 'https://github.com', icon: 'fab fa-github', color: '#ffffff' },
746
+ { name: 'Reddit', url: 'https://reddit.com', icon: 'fab fa-reddit', color: '#FF5700' },
747
+ { name: 'Discord', url: 'https://discord.com', icon: 'fab fa-discord', color: '#5865F2' },
748
+ { name: 'Google Drive', url: 'https://drive.google.com', icon: 'fab fa-google-drive', color: '#34A853' },
749
+ { name: 'Gmail', url: 'https://mail.google.com', icon: 'fas fa-envelope', color: '#EA4335' },
750
+ { name: 'Spotify', url: 'https://open.spotify.com', icon: 'fas fa-music', color: '#1DB954' }
751
+ ];
752
+
753
+ // DOM elements
754
+ const portalsGrid = document.getElementById('portals-grid');
755
+ const portalForm = document.getElementById('portal-form');
756
+ const portalCount = document.getElementById('portal-count');
757
+ const mobileMenuButton = document.getElementById('mobile-menu-button');
758
+ const mobileMenu = document.getElementById('mobile-menu');
759
+ const timeDisplay = document.getElementById('time');
760
+ const dateDisplay = document.getElementById('date');
761
+ const portalIconSelect = document.getElementById('portal-icon');
762
+ const customIconOptions = document.getElementById('custom-icon-options');
763
+ const bgUpload = document.getElementById('bg-upload');
764
+ const bgPreview = document.getElementById('bg-preview');
765
+ const iconUpload = document.getElementById('icon-upload');
766
+ const iconPreview = document.getElementById('icon-preview');
767
+
768
+ // Current state
769
+ let portals = JSON.parse(localStorage.getItem('portals')) || defaultPortals;
770
+ let currentThemeColor = '#05d9e8'; // Default neon blue
771
+ let currentBgImage = localStorage.getItem('bgImage') || '';
772
+
773
+ // Initialize the app
774
+ document.addEventListener('DOMContentLoaded', function() {
775
+ renderPortals();
776
+ updateTime();
777
+ setInterval(updateTime, 1000);
778
+ loadBackgroundImage();
779
+
780
+ // Mobile menu toggle
781
+ mobileMenuButton.addEventListener('click', function() {
782
+ mobileMenu.classList.toggle('hidden');
783
+ });
784
+
785
+ // Event listeners for form
786
+ portalForm.addEventListener('submit', handlePortalFormSubmit);
787
+
788
+ // Show custom icon options when custom icon is selected
789
+ portalIconSelect.addEventListener('change', function() {
790
+ if (this.value === 'custom-icon') {
791
+ customIconOptions.style.display = 'block';
792
+ } else {
793
+ customIconOptions.style.display = 'none';
794
+ }
795
+ });
796
+
797
+ // Image preview for background upload
798
+ bgUpload.addEventListener('change', function(e) {
799
+ const file = e.target.files[0];
800
+ if (file) {
801
+ const reader = new FileReader();
802
+ reader.onload = function(event) {
803
+ bgPreview.src = event.target.result;
804
+ bgPreview.style.display = 'block';
805
+ };
806
+ reader.readAsDataURL(file);
807
+ }
808
+ });
809
+
810
+ // Image preview for custom icon upload
811
+ iconUpload.addEventListener('change', function(e) {
812
+ const file = e.target.files[0];
813
+ if (file) {
814
+ const reader = new FileReader();
815
+ reader.onload = function(event) {
816
+ iconPreview.src = event.target.result;
817
+ iconPreview.style.display = 'block';
818
+ };
819
+ reader.readAsDataURL(file);
820
+ }
821
+ });
822
+ });
823
+
824
+ // Render all portals
825
+ function renderPortals() {
826
+ portalsGrid.innerHTML = '';
827
+
828
+ portals.forEach((portal, index) => {
829
+ const portalElement = document.createElement('div');
830
+
831
+ // Apply the portal's color for text and border glow
832
+ const textColorStyle = `color: ${portal.color}; text-shadow: 0 0 5px ${portal.color}, 0 0 10px ${portal.color};`;
833
+ const borderStyle = `border: 1px solid ${portal.color}; box-shadow: 0 0 5px ${portal.color}, inset 0 0 5px ${portal.color}, 0 0 20px ${portal.color};`;
834
+
835
+ portalElement.innerHTML = `
836
+ <div class="portal-card h-full" style="${borderStyle}">
837
+ <a href="${portal.url}" target="_blank" class="block h-full p-6 rounded-lg text-center relative overflow-hidden backdrop-blur-sm bg-[#0d0221]/50 transition-all duration-300">
838
+ <div class="portal-card-inner">
839
+ ${portal.icon.startsWith('http') ?
840
+ `<img src="${portal.icon}" class="mx-auto h-12 w-12 mb-4" alt="${portal.name} icon">` :
841
+ `<i class="${portal.icon} text-4xl mb-4" style="${textColorStyle}"></i>`}
842
+ <h3 class="font-bold uppercase tracking-wider" style="${textColorStyle}">${portal.name}</h3>
843
+ </div>
844
+ <button onclick="deletePortal(${index}); event.preventDefault();"
845
+ class="absolute top-1 right-1 text-xs text-red-500 hover:text-red-400">
846
+ <i class="fas fa-times"></i>
847
+ </button>
848
+ </a>
849
+ </div>
850
+ `;
851
+
852
+ portalsGrid.appendChild(portalElement);
853
+ });
854
+
855
+ // Update portal count
856
+ portalCount.textContent = portals.length;
857
+ }
858
+
859
+ // Handle form submission
860
+ function handlePortalFormSubmit(e) {
861
+ e.preventDefault();
862
+
863
+ const name = document.getElementById('portal-name').value;
864
+ const url = document.getElementById('portal-url').value;
865
+ let icon = document.getElementById('portal-icon').value;
866
+ const color = document.getElementById('portal-color').value;
867
+
868
+ // Handle custom icon
869
+ if (icon === 'custom-icon') {
870
+ const iconUrl = document.getElementById('icon-url').value;
871
+ const iconFile = document.getElementById('icon-upload').files[0];
872
+
873
+ if (iconUrl) {
874
+ icon = iconUrl;
875
+ } else if (iconFile) {
876
+ const reader = new FileReader();
877
+ reader.onload = function(e) {
878
+ // Convert image to base64 to store in local storage
879
+ icon = e.target.result;
880
+ addPortalToArray(name, url, icon, color);
881
+ };
882
+ reader.readAsDataURL(iconFile);
883
+ return; // Exit early as we'll call addPortalToArray in the callback
884
+ } else {
885
+ alert('Please provide an icon URL or upload an icon');
886
+ return;
887
+ }
888
+ }
889
+
890
+ addPortalToArray(name, url, icon, color);
891
+ }
892
+
893
+ // Add a new portal to the array and update UI
894
+ function addPortalToArray(name, url, icon, color) {
895
+ const newPortal = {
896
+ name: name,
897
+ url: url,
898
+ icon: icon,
899
+ color: color
900
+ };
901
+
902
+ portals.push(newPortal);
903
+ savePortals();
904
+ renderPortals();
905
+ document.getElementById('add-portal-modal').classList.add('hidden');
906
+ resetPortalForm();
907
+ }
908
+
909
+ // Delete a portal
910
+ function deletePortal(index) {
911
+ if (confirm('Are you sure you want to delete this portal?')) {
912
+ portals.splice(index, 1);
913
+ savePortals();
914
+ renderPortals();
915
+ }
916
+ }
917
+
918
+ // Reset portal form
919
+ function resetPortalForm() {
920
+ document.getElementById('portal-form').reset();
921
+ customIconOptions.style.display = 'none';
922
+ iconPreview.style.display = 'none';
923
+ document.getElementById('portal-color').value = '#05d9e8';
924
+ }
925
+
926
+ // Save portals to localStorage
927
+ function savePortals() {
928
+ localStorage.setItem('portals', JSON.stringify(portals));
929
+ }
930
+
931
+ // Show add portal modal
932
+ function showAddLinkModal() {
933
+ document.getElementById('add-portal-modal').classList.remove('hidden');
934
+ mobileMenu.classList.add('hidden');
935
+ }
936
+
937
+ // Update time display
938
+ function updateTime() {
939
+ const now = new Date();
940
+ const timeString = now.toLocaleTimeString();
941
+ const dateString = now.toLocaleDateString(undefined, {
942
+ weekday: 'long',
943
+ year: 'numeric',
944
+ month: 'long',
945
+ day: 'numeric'
946
+ });
947
+
948
+ timeDisplay.textContent = timeString;
949
+ dateDisplay.textContent = dateString;
950
+ }
951
+
952
+ // Select portal color
953
+ function selectPortalColor(color, element) {
954
+ // Remove selected class from all options
955
+ document.querySelectorAll('.color-picker-container .color-option').forEach(el => {
956
+ el.classList.remove('selected');
957
+ });
958
+
959
+ // Add selected class to clicked option
960
+ element.classList.add('selected');
961
+
962
+ // Update hidden input value
963
+ document.getElementById('portal-color').value = color;
964
+ }
965
+
966
+ // Select theme color
967
+ function selectThemeColor(color, element) {
968
+ // Remove selected class from all options
969
+ document.querySelectorAll('.dropdown .color-option').forEach(el => {
970
+ el.classList.remove('selected');
971
+ });
972
+
973
+ // Add selected class to clicked option
974
+ element.classList.add('selected');
975
+
976
+ // Update current theme color
977
+ currentThemeColor = color;
978
+ updateThemeColor(color);
979
+ }
980
+
981
+ // Update theme color
982
+ function updateThemeColor(color) {
983
+ // Update CSS variables
984
+ document.documentElement.style.setProperty('--neon-blue', color);
985
+
986
+ // Update all elements with the neon-blue color classes
987
+ // This is a simplified version - in a real app you might need more comprehensive updates
988
+ const neonElements = document.querySelectorAll('.neon-text-blue, .neon-border-blue');
989
+ neonElements.forEach(el => {
990
+ if (el.classList.contains('neon-text-blue')) {
991
+ el.style.color = color;
992
+ el.style.textShadow = `0 0 5px ${color}, 0 0 10px ${color}, 0 0 20px ${color}`;
993
+ }
994
+ if (el.classList.contains('neon-border-blue')) {
995
+ el.style.borderColor = color;
996
+ el.style.boxShadow = `0 0 5px ${color}, inset 0 0 5px ${color}, 0 0 20px ${color}`;
997
+ }
998
+ });
999
+ }
1000
+
1001
+ // Toggle custom color input in settings
1002
+ function toggleCustomColorInput() {
1003
+ const wrapper = document.getElementById('custom-color-wrapper');
1004
+ wrapper.style.display = wrapper.style.display === 'none' ? 'block' : 'none';
1005
+ }
1006
+
1007
+ // Toggle custom color input in portal form
1008
+ function togglePortalCustomColorInput() {
1009
+ const input = document.getElementById('portal-custom-color');
1010
+ input.style.display = input.style.display === 'none' ? 'block' : 'none';
1011
+ }
1012
+
1013
+ // Apply custom portal color
1014
+ function applyCustomPortalColor(color) {
1015
+ selectPortalColor(color, document.querySelector('.portal-form .color-option.selected'));
1016
+ }
1017
+
1018
+ // Confirm custom theme color
1019
+ function confirmCustomColor() {
1020
+ const customColor = document.getElementById('custom-color').value;
1021
+ selectThemeColor(customColor, document.querySelector('.dropdown .color-option.selected'));
1022
+ document.getElementById('custom-color-wrapper').style.display = 'none';
1023
+ }
1024
+
1025
+ // Set background image from URL
1026
+ function setBackgroundImage() {
1027
+ // Check if we're on mobile or desktop
1028
+ const bgUrlInput = document.getElementById('bg-image-mobile') || document.getElementById('bg-image');
1029
+
1030
+ if (bgUrlInput && bgUrlInput.value) {
1031
+ currentBgImage = bgUrlInput.value;
1032
+ localStorage.setItem('bgImage', currentBgImage);
1033
+ document.body.style.backgroundImage = `url('${currentBgImage}')`;
1034
+ }
1035
+ }
1036
+
1037
+ // Apply uploaded background
1038
+ function applyUploadedBackground() {
1039
+ if (bgPreview.src && bgPreview.src !== '#') {
1040
+ currentBgImage = bgPreview.src;
1041
+ localStorage.setItem('bgImage', currentBgImage);
1042
+ document.body.style.backgroundImage = `url('${currentBgImage}')`;
1043
+ }
1044
+ }
1045
+
1046
+ // Load background image from localStorage
1047
+ function loadBackgroundImage() {
1048
+ if (currentBgImage) {
1049
+ document.body.style.backgroundImage = `url('${currentBgImage}')`;
1050
+ document.body.style.backgroundSize = 'cover';
1051
+ document.body.style.backgroundAttachment = 'fixed';
1052
+ document.body.style.backgroundColor = 'transparent';
1053
+ }
1054
+ }
1055
+
1056
+ // Reset background image
1057
+ function resetBackgroundImage() {
1058
+ currentBgImage = '';
1059
+ localStorage.removeItem('bgImage');
1060
+ document.body.style.backgroundImage = 'none';
1061
+ document.body.style.backgroundColor = '#05010e';
1062
+
1063
+ // Reset input fields
1064
+ const bgInputs = document.querySelectorAll('[id^=bg-image]');
1065
+ bgInputs.forEach(input => input.value = '');
1066
+
1067
+ if (bgPreview) bgPreview.style.display = 'none';
1068
+ }
1069
+ </script>
1070
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - <a href="https://enzostvs-deepsite.hf.space?remix=Shiroaki085/hubv2" style="color: #fff;text-decoration: underline;" target="_blank" >🧬 Remix</a></p><p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=pssx/paulseperformancev2" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
1071
+ </html>