NexusV1 commited on
Commit
602ce84
Β·
verified Β·
1 Parent(s): c330b87

Create public/index.html

Browse files
Files changed (1) hide show
  1. public/index.html +538 -0
public/index.html ADDED
@@ -0,0 +1,538 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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>FilesNest - Permanent File Hosting</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ html {
15
+ background: #0a0a0f;
16
+ background-attachment: fixed;
17
+ }
18
+
19
+ body {
20
+ background: linear-gradient(135deg, #0a0a0f 0%, #1a0a1f 50%, #0f0a1a 100%);
21
+ background-attachment: fixed;
22
+ color: #e8e0ff;
23
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
24
+ min-height: 100vh;
25
+ display: flex;
26
+ flex-direction: column;
27
+ align-items: center;
28
+ justify-content: center;
29
+ padding: 20px;
30
+ position: relative;
31
+ overflow-x: hidden;
32
+ }
33
+
34
+ body::before {
35
+ content: '';
36
+ position: fixed;
37
+ top: 0;
38
+ left: 0;
39
+ width: 100%;
40
+ height: 100%;
41
+ background: radial-gradient(circle at 20% 80%, rgba(120, 77, 255, 0.1) 0%, transparent 50%),
42
+ radial-gradient(circle at 80% 20%, rgba(183, 148, 255, 0.08) 0%, transparent 50%);
43
+ pointer-events: none;
44
+ z-index: -1;
45
+ will-change: auto;
46
+ backface-visibility: hidden;
47
+ transform: translateZ(0);
48
+ }
49
+
50
+ .container {
51
+ text-align: center;
52
+ max-width: 600px;
53
+ width: 100%;
54
+ }
55
+
56
+ .logo-section {
57
+ margin-bottom: 40px;
58
+ }
59
+
60
+ h1 {
61
+ color: #b794ff;
62
+ font-size: 3.5rem;
63
+ font-weight: 700;
64
+ margin-bottom: 10px;
65
+ text-shadow: 0 0 20px rgba(183, 148, 255, 0.3);
66
+ letter-spacing: -1px;
67
+ }
68
+
69
+ .tagline {
70
+ color: #9d8bcc;
71
+ font-size: 1.2rem;
72
+ margin-bottom: 30px;
73
+ font-weight: 300;
74
+ }
75
+
76
+ .description {
77
+ background: rgba(28, 28, 42, 0.6);
78
+ backdrop-filter: blur(10px);
79
+ border: 1px solid rgba(183, 148, 255, 0.2);
80
+ border-radius: 16px;
81
+ padding: 30px;
82
+ margin-bottom: 40px;
83
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
84
+ }
85
+
86
+ .description h2 {
87
+ color: #c9b8ff;
88
+ font-size: 1.5rem;
89
+ margin-bottom: 15px;
90
+ font-weight: 600;
91
+ }
92
+
93
+ .description p {
94
+ color: #b8a8e0;
95
+ line-height: 1.6;
96
+ font-size: 1rem;
97
+ margin-bottom: 15px;
98
+ }
99
+
100
+ .features {
101
+ display: grid;
102
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
103
+ gap: 15px;
104
+ margin-top: 20px;
105
+ }
106
+
107
+ .feature {
108
+ background: rgba(45, 45, 68, 0.4);
109
+ padding: 15px;
110
+ border-radius: 10px;
111
+ border: 1px solid rgba(107, 77, 191, 0.3);
112
+ }
113
+
114
+ .feature-icon {
115
+ font-size: 1.5rem;
116
+ margin-bottom: 8px;
117
+ }
118
+
119
+ .feature h3 {
120
+ color: #d4c4ff;
121
+ font-size: 0.9rem;
122
+ font-weight: 600;
123
+ margin-bottom: 5px;
124
+ }
125
+
126
+ .feature p {
127
+ color: #a899c7;
128
+ font-size: 0.8rem;
129
+ margin: 0;
130
+ }
131
+
132
+ .upload-section {
133
+ background: rgba(28, 28, 42, 0.8);
134
+ backdrop-filter: blur(15px);
135
+ padding: 40px;
136
+ border-radius: 20px;
137
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(183, 148, 255, 0.3);
138
+ border: 1px solid rgba(107, 77, 191, 0.4);
139
+ }
140
+
141
+ .upload-form {
142
+ display: flex;
143
+ flex-direction: column;
144
+ gap: 20px;
145
+ width: 100%;
146
+ }
147
+
148
+ .file-input-wrapper {
149
+ position: relative;
150
+ overflow: hidden;
151
+ background: linear-gradient(135deg, #2d2d44, #3d3d54);
152
+ border: 2px dashed rgba(183, 148, 255, 0.4);
153
+ border-radius: 12px;
154
+ padding: 40px 20px;
155
+ transition: all 0.3s ease;
156
+ cursor: pointer;
157
+ }
158
+
159
+ .file-input-wrapper:hover {
160
+ border-color: rgba(183, 148, 255, 0.7);
161
+ background: linear-gradient(135deg, #3d3d54, #4d4d64);
162
+ transform: translateY(-2px);
163
+ }
164
+
165
+ .file-input-wrapper.dragover {
166
+ border-color: #b794ff;
167
+ background: linear-gradient(135deg, #4d4d64, #5d5d74);
168
+ box-shadow: 0 0 20px rgba(183, 148, 255, 0.3);
169
+ }
170
+
171
+ input[type="file"] {
172
+ position: absolute;
173
+ left: -9999px;
174
+ opacity: 0;
175
+ }
176
+
177
+ .file-input-label {
178
+ color: #c9b8ff;
179
+ font-size: 1.1rem;
180
+ font-weight: 500;
181
+ display: block;
182
+ cursor: pointer;
183
+ }
184
+
185
+ .file-input-sublabel {
186
+ color: #9d8bcc;
187
+ font-size: 0.9rem;
188
+ margin-top: 8px;
189
+ display: block;
190
+ }
191
+
192
+ .upload-btn {
193
+ background: linear-gradient(135deg, #7c4dff, #9f70ff);
194
+ color: #fff;
195
+ border: none;
196
+ padding: 16px 32px;
197
+ border-radius: 12px;
198
+ cursor: pointer;
199
+ font-size: 1.1rem;
200
+ font-weight: 600;
201
+ transition: all 0.3s ease;
202
+ box-shadow: 0 4px 16px rgba(124, 77, 255, 0.3);
203
+ position: relative;
204
+ overflow: hidden;
205
+ }
206
+
207
+ .upload-btn:hover {
208
+ background: linear-gradient(135deg, #9f70ff, #b794ff);
209
+ transform: translateY(-2px);
210
+ box-shadow: 0 8px 24px rgba(124, 77, 255, 0.4);
211
+ }
212
+
213
+ .upload-btn:active {
214
+ transform: translateY(0);
215
+ }
216
+
217
+ .upload-btn:disabled {
218
+ background: #444;
219
+ cursor: not-allowed;
220
+ transform: none;
221
+ box-shadow: none;
222
+ }
223
+
224
+ .progress-container {
225
+ display: none;
226
+ margin-top: 20px;
227
+ }
228
+
229
+ .progress-bar {
230
+ width: 100%;
231
+ height: 8px;
232
+ background: rgba(45, 45, 68, 0.6);
233
+ border-radius: 4px;
234
+ overflow: hidden;
235
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.3);
236
+ }
237
+
238
+ .progress-fill {
239
+ height: 100%;
240
+ background: linear-gradient(90deg, #7c4dff, #b794ff);
241
+ width: 0%;
242
+ transition: width 0.3s ease;
243
+ border-radius: 4px;
244
+ box-shadow: 0 0 10px rgba(124, 77, 255, 0.5);
245
+ }
246
+
247
+ .progress-text {
248
+ color: #c9b8ff;
249
+ font-size: 0.9rem;
250
+ margin-top: 8px;
251
+ text-align: center;
252
+ }
253
+
254
+ .result {
255
+ margin-top: 30px;
256
+ padding: 20px;
257
+ background: rgba(45, 68, 45, 0.3);
258
+ border: 1px solid rgba(76, 175, 80, 0.4);
259
+ border-radius: 12px;
260
+ display: none;
261
+ }
262
+
263
+ .result.error {
264
+ background: rgba(68, 45, 45, 0.3);
265
+ border-color: rgba(244, 67, 54, 0.4);
266
+ }
267
+
268
+ .result-link {
269
+ color: #b794ff;
270
+ text-decoration: none;
271
+ word-break: break-all;
272
+ font-weight: 500;
273
+ }
274
+
275
+ .result-link:hover {
276
+ color: #d4c4ff;
277
+ text-decoration: underline;
278
+ }
279
+
280
+ @media (max-width: 768px) {
281
+ h1 {
282
+ font-size: 2.5rem;
283
+ }
284
+
285
+ .upload-section {
286
+ padding: 30px 20px;
287
+ }
288
+
289
+ .description {
290
+ padding: 20px;
291
+ }
292
+
293
+ .features {
294
+ grid-template-columns: 1fr;
295
+ }
296
+ }
297
+
298
+ .pulse-animation {
299
+ animation: pulse 2s infinite;
300
+ }
301
+
302
+ @keyframes pulse {
303
+ 0% { box-shadow: 0 0 0 0 rgba(124, 77, 255, 0.4); }
304
+ 70% { box-shadow: 0 0 0 10px rgba(124, 77, 255, 0); }
305
+ 100% { box-shadow: 0 0 0 0 rgba(124, 77, 255, 0); }
306
+ }
307
+ </style>
308
+ </head>
309
+ <body>
310
+ <div class="container">
311
+ <div class="logo-section">
312
+ <h1>FilesNest</h1>
313
+ <div class="tagline">Your Permanent File Sanctuary</div>
314
+ </div>
315
+
316
+ <div class="description">
317
+ <h2>🏠 Permanent File Hosting Made Simple</h2>
318
+ <p>FilesNest provides reliable, permanent file hosting that you can count on. Upload your files once and access them forever with guaranteed uptime and blazing-fast delivery speeds.</p>
319
+
320
+ <p>Whether you're sharing documents, images, videos, or any other digital content, FilesNest ensures your files remain accessible 24/7 with enterprise-grade security and redundancy.</p>
321
+
322
+ <div class="features">
323
+ <div class="feature">
324
+ <div class="feature-icon">πŸš€</div>
325
+ <h3>Lightning Fast</h3>
326
+ <p>Global CDN delivery</p>
327
+ </div>
328
+ <div class="feature">
329
+ <div class="feature-icon">πŸ”’</div>
330
+ <h3>Secure Storage</h3>
331
+ <p>Enterprise-grade security</p>
332
+ </div>
333
+ <div class="feature">
334
+ <div class="feature-icon">♾️</div>
335
+ <h3>Permanent Links</h3>
336
+ <p>Never expire or break</p>
337
+ </div>
338
+ <div class="feature">
339
+ <div class="feature-icon">πŸ“Š</div>
340
+ <h3>No Size Limits</h3>
341
+ <p>Upload files of any size</p>
342
+ </div>
343
+ </div>
344
+ </div>
345
+
346
+ <div class="upload-section">
347
+ <form id="uploadForm" class="upload-form" enctype="multipart/form-data">
348
+ <div class="file-input-wrapper" id="fileInputWrapper">
349
+ <input type="file" name="file" id="fileInput" required>
350
+ <label for="fileInput" class="file-input-label">
351
+ πŸ“ Click to select file or drag & drop
352
+ <span class="file-input-sublabel">Any file type β€’ Any size β€’ Permanent hosting</span>
353
+ </label>
354
+ </div>
355
+
356
+ <button type="submit" class="upload-btn" id="uploadBtn">
357
+ πŸš€ Upload to FilesNest
358
+ </button>
359
+
360
+ <div class="progress-container" id="progressContainer">
361
+ <div class="progress-bar">
362
+ <div class="progress-fill" id="progressFill"></div>
363
+ </div>
364
+ <div class="progress-text" id="progressText">Uploading... 0%</div>
365
+ </div>
366
+ </form>
367
+
368
+ <div id="result" class="result"></div>
369
+ </div>
370
+ </div>
371
+
372
+ <script>
373
+ const form = document.getElementById('uploadForm');
374
+ const result = document.getElementById('result');
375
+ const fileInput = document.getElementById('fileInput');
376
+ const fileInputWrapper = document.getElementById('fileInputWrapper');
377
+ const uploadBtn = document.getElementById('uploadBtn');
378
+ const progressContainer = document.getElementById('progressContainer');
379
+ const progressFill = document.getElementById('progressFill');
380
+ const progressText = document.getElementById('progressText');
381
+
382
+ // Drag and drop functionality
383
+ ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
384
+ fileInputWrapper.addEventListener(eventName, preventDefaults, false);
385
+ });
386
+
387
+ ['dragenter', 'dragover'].forEach(eventName => {
388
+ fileInputWrapper.addEventListener(eventName, highlight, false);
389
+ });
390
+
391
+ ['dragleave', 'drop'].forEach(eventName => {
392
+ fileInputWrapper.addEventListener(eventName, unhighlight, false);
393
+ });
394
+
395
+ fileInputWrapper.addEventListener('drop', handleDrop, false);
396
+
397
+ function preventDefaults(e) {
398
+ e.preventDefault();
399
+ e.stopPropagation();
400
+ }
401
+
402
+ function highlight() {
403
+ fileInputWrapper.classList.add('dragover');
404
+ }
405
+
406
+ function unhighlight() {
407
+ fileInputWrapper.classList.remove('dragover');
408
+ }
409
+
410
+ function handleDrop(e) {
411
+ const dt = e.dataTransfer;
412
+ const files = dt.files;
413
+ fileInput.files = files;
414
+ updateFileLabel();
415
+ }
416
+
417
+ // Update file label when file is selected
418
+ fileInput.addEventListener('change', updateFileLabel);
419
+
420
+ function updateFileLabel() {
421
+ const file = fileInput.files[0];
422
+ if (file) {
423
+ const label = fileInputWrapper.querySelector('.file-input-label');
424
+ label.innerHTML = `
425
+ πŸ“„ ${file.name}
426
+ <span class="file-input-sublabel">Size: ${formatFileSize(file.size)} β€’ Ready to upload</span>
427
+ `;
428
+ }
429
+ }
430
+
431
+ function formatFileSize(bytes) {
432
+ if (bytes === 0) return '0 Bytes';
433
+ const k = 1024;
434
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
435
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
436
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
437
+ }
438
+
439
+ // Simulate upload progress
440
+ function simulateProgress() {
441
+ let progress = 0;
442
+ progressContainer.style.display = 'block';
443
+
444
+ const interval = setInterval(() => {
445
+ progress += Math.random() * 15;
446
+ if (progress > 95) {
447
+ progress = 95;
448
+ }
449
+
450
+ progressFill.style.width = progress + '%';
451
+ progressText.textContent = `Uploading... ${Math.round(progress)}%`;
452
+
453
+ if (progress >= 95) {
454
+ clearInterval(interval);
455
+ }
456
+ }, 200);
457
+
458
+ return interval;
459
+ }
460
+
461
+ function completeProgress() {
462
+ progressFill.style.width = '100%';
463
+ progressText.textContent = 'Upload complete! 100%';
464
+
465
+ setTimeout(() => {
466
+ progressContainer.style.display = 'none';
467
+ progressFill.style.width = '0%';
468
+ }, 2000);
469
+ }
470
+
471
+ form.addEventListener('submit', async (e) => {
472
+ e.preventDefault();
473
+
474
+ if (!fileInput.files[0]) {
475
+ result.innerHTML = '<strong style="color: #ff6b6b;">Please select a file to upload.</strong>';
476
+ result.className = 'result error';
477
+ result.style.display = 'block';
478
+ return;
479
+ }
480
+
481
+ uploadBtn.disabled = true;
482
+ uploadBtn.textContent = 'πŸ”„ Uploading...';
483
+ uploadBtn.classList.add('pulse-animation');
484
+ result.style.display = 'none';
485
+
486
+ const progressInterval = simulateProgress();
487
+
488
+ try {
489
+ const formData = new FormData(form);
490
+
491
+ // Simulate API call - replace with actual endpoint
492
+ await new Promise(resolve => setTimeout(resolve, 2000 + Math.random() * 3000));
493
+
494
+ // Mock response - replace with actual API response
495
+ const mockResponse = {
496
+ viewLink: `https://filesnest.com/f/${Math.random().toString(36).substr(2, 8)}`,
497
+ fileName: fileInput.files[0].name,
498
+ fileSize: formatFileSize(fileInput.files[0].size)
499
+ };
500
+
501
+ clearInterval(progressInterval);
502
+ completeProgress();
503
+
504
+ result.innerHTML = `
505
+ <div style="text-align: center;">
506
+ <div style="font-size: 2rem; margin-bottom: 15px;">πŸŽ‰</div>
507
+ <strong style="color: #4caf50; font-size: 1.2rem;">Upload Successful!</strong>
508
+ <div style="margin: 15px 0; padding: 15px; background: rgba(76, 175, 80, 0.1); border-radius: 8px;">
509
+ <div style="margin-bottom: 8px;"><strong>File:</strong> ${mockResponse.fileName}</div>
510
+ <div style="margin-bottom: 15px;"><strong>Size:</strong> ${mockResponse.fileSize}</div>
511
+ <div><strong>Permanent Link:</strong></div>
512
+ <a href="${mockResponse.viewLink}" target="_blank" class="result-link" style="font-size: 1.1rem;">${mockResponse.viewLink}</a>
513
+ </div>
514
+ <div style="color: #9d8bcc; font-size: 0.9rem;">Your file is now permanently hosted and accessible worldwide! 🌍</div>
515
+ </div>
516
+ `;
517
+ result.className = 'result';
518
+ result.style.display = 'block';
519
+
520
+ } catch (error) {
521
+ clearInterval(progressInterval);
522
+ progressContainer.style.display = 'none';
523
+
524
+ result.innerHTML = `
525
+ <strong style="color: #ff6b6b;">Upload Failed</strong>
526
+ <div style="margin-top: 10px; color: #ffb3b3;">Please try again or contact support if the problem persists.</div>
527
+ `;
528
+ result.className = 'result error';
529
+ result.style.display = 'block';
530
+ } finally {
531
+ uploadBtn.disabled = false;
532
+ uploadBtn.textContent = 'πŸš€ Upload to FilesNest';
533
+ uploadBtn.classList.remove('pulse-animation');
534
+ }
535
+ });
536
+ </script>
537
+ </body>
538
+ </html>