Mudrock10 commited on
Commit
bd2e9de
·
verified ·
1 Parent(s): 6cc31bd

Upload folder using huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +669 -451
index.html CHANGED
@@ -18,6 +18,7 @@
18
  --warning-color: #f59e0b;
19
  --error-color: #ef4444;
20
  --processing-color: #8b5cf6;
 
21
  }
22
 
23
  * {
@@ -30,8 +31,9 @@
30
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
31
  line-height: 1.6;
32
  color: var(--text-color);
33
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
34
  min-height: 100vh;
 
35
  }
36
 
37
  .container {
@@ -44,10 +46,11 @@
44
  header {
45
  background: rgba(255, 255, 255, 0.95);
46
  backdrop-filter: blur(10px);
47
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
48
  position: sticky;
49
  top: 0;
50
  z-index: 100;
 
51
  }
52
 
53
  .header-content {
@@ -61,6 +64,13 @@
61
  font-size: 1.5rem;
62
  font-weight: bold;
63
  color: var(--primary-color);
 
 
 
 
 
 
 
64
  }
65
 
66
  .built-with {
@@ -68,6 +78,9 @@
68
  color: var(--text-color);
69
  text-decoration: none;
70
  transition: color 0.3s ease;
 
 
 
71
  }
72
 
73
  .built-with:hover {
@@ -81,61 +94,105 @@
81
 
82
  .section {
83
  background: rgba(255, 255, 255, 0.95);
84
- border-radius: 15px;
85
- padding: 2rem;
86
  margin-bottom: 2rem;
87
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
88
  backdrop-filter: blur(10px);
 
 
 
 
 
 
 
89
  }
90
 
91
  .section-title {
92
- font-size: 2rem;
93
- margin-bottom: 1rem;
94
  color: var(--dark-color);
95
  position: relative;
96
  display: inline-block;
 
97
  }
98
 
99
  .section-title::after {
100
  content: '';
101
  position: absolute;
102
- bottom: -5px;
103
  left: 0;
104
  width: 100%;
105
- height: 3px;
106
  background: var(--primary-color);
107
  border-radius: 2px;
 
108
  }
109
 
110
  /* Video Upload Section */
111
  .upload-section {
112
- margin-bottom: 2rem;
113
  }
114
 
115
  .upload-container {
116
- border: 2px dashed var(--accent-color);
117
- border-radius: 12px;
118
- padding: 2rem;
119
  text-align: center;
120
  transition: all 0.3s ease;
121
- background: rgba(255, 255, 255, 0.5);
 
 
 
 
 
 
 
 
 
 
 
 
 
122
  }
123
 
124
  .upload-container:hover {
125
  border-color: var(--primary-color);
126
- background: rgba(255, 255, 255, 0.8);
 
127
  }
128
 
129
  .upload-icon {
130
- font-size: 3rem;
131
  color: var(--primary-color);
132
- margin-bottom: 1rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  }
134
 
135
  .file-input-wrapper {
136
  position: relative;
137
  display: inline-block;
138
- margin: 1rem 0;
 
139
  }
140
 
141
  .file-input {
@@ -148,122 +205,258 @@
148
 
149
  .file-input-label {
150
  display: inline-block;
151
- padding: 0.75rem 1.5rem;
152
  background: var(--primary-color);
153
  color: white;
154
- border-radius: 8px;
155
  cursor: pointer;
156
  transition: all 0.3s ease;
157
- font-weight: bold;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
  }
159
 
160
  .file-input-label:hover {
161
  background: var(--secondary-color);
162
- transform: translateY(-2px);
 
163
  }
164
 
165
  .video-preview {
166
- margin-top: 2rem;
167
  display: none;
 
168
  }
169
 
170
  .video-preview.active {
171
  display: block;
172
  }
173
 
 
 
 
 
 
 
 
 
 
 
 
174
  .video-container {
175
  position: relative;
176
- border-radius: 8px;
177
  overflow: hidden;
178
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
  }
180
 
181
  .video-controls {
182
- margin-top: 1rem;
183
  display: flex;
184
- gap: 1rem;
185
  flex-wrap: wrap;
186
  justify-content: center;
 
187
  }
188
 
189
  .height-control {
190
  display: flex;
191
  align-items: center;
192
- gap: 1rem;
193
- margin-top: 1rem;
 
 
 
 
194
  }
195
 
196
  .height-slider {
197
  flex: 1;
198
  max-width: 300px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
  }
200
 
201
  .height-value {
202
- min-width: 50px;
203
  text-align: center;
204
  font-weight: bold;
205
  color: var(--primary-color);
 
 
 
 
 
206
  }
207
 
208
  /* Processing Status */
209
  .processing-status {
210
- margin-top: 1.5rem;
211
- padding: 1rem;
212
- background: var(--light-color);
213
- border-radius: 8px;
214
  display: none;
 
 
215
  }
216
 
217
  .processing-status.active {
218
  display: block;
 
 
 
 
 
 
 
 
 
 
 
 
219
  }
220
 
221
  .status-header {
222
  display: flex;
223
  align-items: center;
224
- gap: 0.5rem;
225
- margin-bottom: 1rem;
226
  }
227
 
228
  .status-icon {
229
- font-size: 1.2rem;
 
 
230
  }
231
 
232
  .status-text {
233
- font-weight: bold;
234
  color: var(--processing-color);
 
 
 
 
 
 
 
235
  }
236
 
237
  .status-step {
238
- margin: 0.5rem 0;
239
- padding: 0.5rem;
240
  background: white;
241
- border-radius: 6px;
242
  display: flex;
243
  align-items: center;
244
- gap: 0.5rem;
245
  transition: all 0.3s ease;
 
 
246
  }
247
 
248
  .status-step.completed {
249
  background: rgba(16, 185, 129, 0.1);
250
  color: var(--success-color);
 
251
  }
252
 
253
  .status-step.active {
254
  background: rgba(139, 92, 246, 0.1);
255
  color: var(--processing-color);
256
- font-weight: bold;
 
 
257
  }
258
 
259
  .status-step-icon {
260
- width: 20px;
261
- height: 20px;
262
  border-radius: 50%;
263
  display: flex;
264
  align-items: center;
265
  justify-content: center;
266
- font-size: 0.8rem;
 
 
267
  }
268
 
269
  .status-step.completed .status-step-icon {
@@ -274,24 +467,68 @@
274
  .status-step.active .status-step-icon {
275
  background: var(--processing-color);
276
  color: white;
277
- animation: pulse 1s infinite;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
278
  }
279
 
280
  /* Diagram Section */
281
  .diagram-container {
 
282
  position: relative;
283
- margin: 2rem 0;
284
- overflow: hidden;
285
  }
286
 
287
  .diagram {
288
  display: grid;
289
- grid-template-columns: 1fr 1fr 1fr;
290
  grid-template-rows: auto 1fr auto;
291
- gap: 1rem;
292
  align-items: center;
293
  justify-items: center;
294
- margin-bottom: 2rem;
 
295
  }
296
 
297
  .blend-section {
@@ -299,61 +536,114 @@
299
  flex-direction: column;
300
  align-items: center;
301
  position: relative;
 
 
 
 
 
 
302
  }
303
 
304
  .blend-label {
305
  background: var(--primary-color);
306
  color: white;
307
- padding: 0.5rem 1.5rem;
308
- border-radius: 25px;
309
- font-weight: bold;
310
- margin-bottom: 1rem;
311
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  }
313
 
314
  .frame-container {
315
  display: flex;
316
  flex-direction: column;
317
  align-items: center;
318
- gap: 0.5rem;
319
  }
320
 
321
  .frame {
322
  width: 100%;
323
- height: 150px;
324
  background: #2d3748;
325
- border: 2px solid var(--accent-color);
326
- border-radius: 8px;
327
  position: relative;
328
  overflow: hidden;
329
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
330
  transition: all 0.3s ease;
331
- }
332
-
333
- .frame-content {
334
- width: 100%;
335
- height: 100%;
336
  display: flex;
337
  align-items: center;
338
  justify-content: center;
339
  color: white;
340
- font-size: 0.9rem;
341
  text-align: center;
342
  padding: 1rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
343
  }
344
 
345
  .frame.processing {
346
  border-color: var(--processing-color);
347
- background: rgba(139, 92, 246, 0.1);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
348
  }
349
 
350
  .target-frame {
351
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
352
- transform: scale(1.1);
353
- z-index: 10;
354
- box-shadow: 0 8px 15px rgba(0, 0, 0, 0.2);
355
  grid-column: 2;
356
  grid-row: 2;
 
357
  }
358
 
359
  .top-blend {
@@ -380,167 +670,310 @@
380
  display: flex;
381
  align-items: center;
382
  justify-content: center;
383
- margin: 1rem 0;
 
384
  }
385
 
386
  .arrow {
387
- width: 40px;
388
- height: 40px;
389
  background: var(--primary-color);
390
  color: white;
391
  border-radius: 50%;
392
  display: flex;
393
  align-items: center;
394
  justify-content: center;
395
- font-size: 1.2rem;
396
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
 
 
 
 
 
 
397
  }
398
 
399
  .output-frame {
400
  width: 100%;
401
- height: 200px;
402
  background: #1a202c;
403
- border: 3px solid var(--success-color);
404
- border-radius: 8px;
405
  position: relative;
406
  overflow: hidden;
407
- margin-top: 2rem;
408
- box-shadow: 0 8px 15px rgba(0, 0, 0, 0.2);
409
  display: none;
 
410
  }
411
 
412
  .output-frame.active {
413
  display: block;
414
  }
415
 
 
 
 
 
 
 
 
 
 
 
 
416
  .output-content {
417
  width: 100%;
418
  height: 100%;
419
  display: flex;
 
420
  align-items: center;
421
  justify-content: center;
422
  color: white;
423
- font-size: 1rem;
424
  text-align: center;
425
- padding: 1rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
426
  }
427
 
428
  /* Interactive Controls */
429
  .controls {
430
  display: flex;
431
  flex-wrap: wrap;
432
- gap: 1rem;
433
- margin: 2rem 0;
 
434
  }
435
 
436
  .control-btn {
437
- padding: 0.75rem 1.5rem;
438
  border: none;
439
- border-radius: 8px;
440
- font-weight: bold;
441
  cursor: pointer;
442
  transition: all 0.3s ease;
443
  display: flex;
444
  align-items: center;
445
- gap: 0.5rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
446
  }
447
 
448
  .control-btn.primary {
449
  background: var(--primary-color);
450
  color: white;
 
451
  }
452
 
453
  .control-btn.primary:hover:not(:disabled) {
454
  background: var(--secondary-color);
455
- transform: translateY(-2px);
456
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
457
  }
458
 
459
  .control-btn.secondary {
460
  background: var(--light-color);
461
  color: var(--dark-color);
 
462
  }
463
 
464
  .control-btn.secondary:hover:not(:disabled) {
465
  background: var(--accent-color);
466
  color: white;
 
 
467
  }
468
 
469
  .control-btn:disabled {
470
  opacity: 0.6;
471
  cursor: not-allowed;
 
472
  }
473
 
474
  /* Features Section */
475
  .features {
476
  display: grid;
477
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
478
- gap: 1.5rem;
479
- margin: 2rem 0;
480
  }
481
 
482
  .feature-card {
483
  background: white;
484
- border-radius: 12px;
485
- padding: 1.5rem;
486
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
487
  transition: transform 0.3s ease;
488
  }
489
 
490
  .feature-card:hover {
491
- transform: translateY(-5px);
492
- box-shadow: 0 10px 20px rgba(0, 0, 0, 0.15);
 
 
 
 
493
  }
494
 
495
  .feature-icon {
496
- font-size: 2rem;
497
  color: var(--primary-color);
498
- margin-bottom: 1rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
499
  }
500
 
501
  .feature-title {
502
- font-size: 1.2rem;
503
- margin-bottom: 0.5rem;
504
  color: var(--dark-color);
 
 
 
 
 
 
 
505
  }
506
 
507
- /* Animation */
508
- @keyframes pulse {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
509
  0% {
510
- transform: scale(1);
 
511
  }
512
-
513
  50% {
 
514
  transform: scale(1.05);
515
  }
516
-
 
 
517
  100% {
 
518
  transform: scale(1);
519
  }
520
  }
521
 
522
- .animate-pulse {
523
- animation: pulse 2s infinite;
 
 
 
 
 
524
  }
525
 
526
- @keyframes spin {
527
- 0% {
528
- transform: rotate(0deg);
529
- }
530
-
531
- 100% {
532
- transform: rotate(360deg);
533
- }
534
  }
535
 
536
- .spinner {
537
- border: 3px solid rgba(0, 0, 0, 0.1);
538
- border-left-color: var(--processing-color);
539
- border-radius: 50%;
540
- width: 40px;
541
- height: 40px;
542
- animation: spin 1s linear infinite;
543
- margin: 2rem auto;
544
  }
545
 
546
  /* Responsive */
@@ -580,82 +1013,64 @@
580
  }
581
 
582
  .section {
583
- padding: 1.5rem;
584
  }
585
 
586
  .height-slider {
587
  max-width: 100%;
588
  }
589
- }
590
 
591
- /* Progress Bar */
592
- .progress-container {
593
- width: 100%;
594
- background: var(--light-color);
595
- border-radius: 10px;
596
- height: 10px;
597
- margin: 1rem 0;
598
- overflow: hidden;
599
- display: none;
600
- }
601
-
602
- .progress-container.active {
603
- display: block;
604
  }
605
 
606
- .progress-bar {
607
- height: 100%;
608
- background: var(--processing-color);
609
- border-radius: 10px;
610
- width: 0%;
611
- transition: width 0.5s ease;
 
 
 
612
  }
613
 
614
- /* Info Cards */
615
- .info-card {
616
- background: rgba(255, 255, 255, 0.9);
617
- border-left: 4px solid var(--primary-color);
618
- padding: 1rem;
619
- margin: 1rem 0;
620
- border-radius: 0 8px 8px 0;
621
  }
622
 
623
- /* Footer */
624
- footer {
625
- background: rgba(255, 255, 255, 0.95);
626
- padding: 2rem 0;
627
- margin-top: 2rem;
628
  text-align: center;
 
 
 
629
  }
630
 
631
- /* Success Message */
632
- .success-message {
633
- display: none;
634
- padding: 1rem;
635
- background: rgba(16, 185, 129, 0.1);
636
- border: 2px solid var(--success-color);
637
- border-radius: 8px;
638
- margin-top: 1rem;
639
- text-align: center;
640
- color: var(--success-color);
641
- font-weight: bold;
642
  }
643
 
644
- .success-message.active {
645
- display: block;
646
- animation: fadeIn 0.5s ease;
 
 
647
  }
648
 
649
- @keyframes fadeIn {
650
- from {
651
- opacity: 0;
652
- transform: translateY(-10px);
653
- }
654
-
655
- to {
656
- opacity: 1;
657
- transform: translateY(0);
658
- }
659
  }
660
  </style>
661
  </head>
@@ -663,7 +1078,10 @@
663
  <body>
664
  <header>
665
  <div class="container header-content">
666
- <div class="logo">Video Extrapolation Framework</div>
 
 
 
667
  <a href="https://huggingface.co/spaces/akhaliq/anycoder" class="built-with" target="_blank">
668
  <i class="fas fa-code"></i> Built with anycoder
669
  </a>
@@ -675,8 +1093,7 @@
675
  <h1 class="section-title">Wide FOV Video Extrapolation</h1>
676
  <p class="info-card">
677
  With the popularity of immersive display systems that fill the viewer's field of view (FOV) entirely, demand for
678
- wide FOV content has increased.
679
- A video extrapolation technique based on reuse of existing videos is one of the most efficient ways to produce
680
  wide FOV content.
681
  </p>
682
 
@@ -686,14 +1103,14 @@
686
  <div class="upload-icon">
687
  <i class="fas fa-video"></i>
688
  </div>
689
- <p>Click to upload a video file or drag and drop</p>
690
  <div class="file-input-wrapper">
691
  <input type="file" id="videoFile" class="file-input" accept="video/*">
692
  <label for="videoFile" class="file-input-label">
693
  <i class="fas fa-upload"></i> Choose Video
694
  </label>
695
  </div>
696
- <p class="info-card" style="margin-top: 1rem;">
697
  Supported formats: MP4, AVI, MOV, WMV (Max file size: 100MB)
698
  </p>
699
  </div>
@@ -703,6 +1120,12 @@
703
  <video id="previewVideo" controls style="width: 100%; max-height: 400px;">
704
  Your browser does not support the video tag.
705
  </video>
 
 
 
 
 
 
706
  </div>
707
  <div class="height-control">
708
  <label for="heightSlider">Custom Height:</label>
@@ -722,37 +1145,63 @@
722
 
723
  <div class="processing-status" id="processingStatus">
724
  <div class="status-header">
725
- <i class="fas fa-spinner status-icon animate-pulse"></i>
726
  <span class="status-text">Processing Video...</span>
727
  </div>
728
- <div class="status-step active" id="step1">
729
- <div class="status-step-icon">1</div>
730
- <span>Initializing video analysis</span>
731
- </div>
732
- <div class="status-step" id="step2">
733
- <div class="status-step-icon">2</div>
734
- <span>Extracting 3D scene points</span>
735
- </div>
736
- <div class="status-step" id="step3">
737
- <div class="status-step-icon">3</div>
738
- <span>Matching viewpoints between frames</span>
739
- </div>
740
- <div class="status-step" id="step4">
741
- <div class="status-step-icon">4</div>
742
- <span>Applying blending algorithms</span>
743
- </div>
744
- <div class="status-step" id="step5">
745
- <div class="status-step-icon">5</div>
746
- <span>Generating wide FOV output</span>
 
 
 
 
 
 
 
747
  </div>
748
  </div>
749
 
750
  <div class="progress-container active" id="progressContainer">
751
  <div class="progress-bar" id="progressBar"></div>
 
 
 
 
752
  </div>
753
 
754
  <div class="success-message" id="successMessage">
755
- <i class="fas fa-check-circle"></i> Video processing completed successfully!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
756
  </div>
757
 
758
  <div class="diagram-container">
@@ -836,12 +1285,15 @@
836
 
837
  <div class="blend-arrow">
838
  <div class="arrow"><i class="fas fa-arrow-down"></i></div>
839
- <span style="margin: 0 1rem; font-weight: bold;">Blend</span>
840
  <div class="arrow"><i class="fas fa-arrow-down"></i></div>
841
  </div>
842
 
843
  <div class="output-frame" id="outputFrame">
844
- <div class="output-content">O<sub>target</sub> - Extrapolated Wide FOV Output</div>
 
 
 
845
  </div>
846
  </div>
847
  </section>
@@ -855,7 +1307,7 @@
855
  </div>
856
  <h3 class="feature-title">3D Scene Understanding</h3>
857
  <p>Utilizes three-dimensional scene points to match viewpoints between different frames, overcoming parallax
858
- challenges.</p>
859
  </div>
860
 
861
  <div class="feature-card">
@@ -864,7 +1316,7 @@
864
  </div>
865
  <h3 class="feature-title">Multi-Frame Integration</h3>
866
  <p>Integrates information from all frames in the input video into each frame for comprehensive scene
867
- understanding.</p>
868
  </div>
869
 
870
  <div class="feature-card">
@@ -872,244 +1324,10 @@
872
  <i class="fas fa-magic"></i>
873
  </div>
874
  <h3 class="feature-title">Advanced Blending</h3>
875
- <p>Intelligent blending algorithms create seamless extended views with natural transitions.</p>
 
876
  </div>
877
 
878
  <div class="feature-card">
879
  <div class="feature-icon">
880
- <i class="fas fa-chart-line"></i>
881
- </div>
882
- <h3 class="feature-title">Superior Results</h3>
883
- <p>Outperforms state-of-the-art techniques with more visually plausible extrapolation results.</p>
884
- </div>
885
- </div>
886
- </section>
887
-
888
- <section class="section">
889
- <h2 class="section-title">How It Works</h2>
890
- <div class="info-card">
891
- <h3 style="margin-bottom: 1rem;">Step-by-Step Process:</h3>
892
- <ol style="margin-left: 1.5rem;">
893
- <li>Upload your video file</li>
894
- <li>Adjust the preview height as needed</li>
895
- <li>Click "Process Video" to start extrapolation</li>
896
- <li>Watch the progress and status updates</li>
897
- <li>View the extrapolated wide FOV output</li>
898
- </ol>
899
- </div>
900
- </section>
901
- </main>
902
-
903
- <footer>
904
- <div class="container">
905
- <p>&copy; 2023 Video Extrapolation Framework. All rights reserved.</p>
906
- </div>
907
- </footer>
908
-
909
- <script>
910
- let uploadedVideo = null;
911
- let isProcessing = false;
912
- let progressInterval;
913
- let currentStep = 1;
914
-
915
- // Processing steps configuration
916
- const processingSteps = [
917
- { id: 'step1', name: 'Initializing video analysis', progress: 0 },
918
- { id: 'step2', name: 'Extracting 3D scene points', progress: 20 },
919
- { id: 'step3', name: 'Matching viewpoints between frames', progress: 40 },
920
- { id: 'step4', name: 'Applying blending algorithms', progress: 70 },
921
- { id: 'step5', name: 'Generating wide FOV output', progress: 90 }
922
- ];
923
-
924
- // Handle file upload
925
- document.getElementById('videoFile').addEventListener('change', function(e) {
926
- const file = e.target.files[0];
927
- if (file && file.type.startsWith('video/')) {
928
- uploadedVideo = file;
929
- displayVideoPreview(file);
930
- }
931
- });
932
-
933
- // Handle height slider
934
- document.getElementById('heightSlider').addEventListener('input', function(e) {
935
- const height = e.target.value;
936
- document.getElementById('heightValue').textContent = height + 'px';
937
- const video = document.getElementById('previewVideo');
938
- if (video) {
939
- video.style.maxHeight = height + 'px';
940
- }
941
- });
942
-
943
- function displayVideoPreview(file) {
944
- const videoPreview = document.getElementById('videoPreview');
945
- const previewVideo = document.getElementById('previewVideo');
946
-
947
- const videoURL = URL.createObjectURL(file);
948
- previewVideo.src = videoURL;
949
-
950
- videoPreview.classList.add('active');
951
-
952
- // Enable process button
953
- document.getElementById('processBtn').disabled = false;
954
- }
955
-
956
- function processVideo() {
957
- if (!uploadedVideo || isProcessing) return;
958
-
959
- isProcessing = true;
960
- document.getElementById('processBtn').disabled = true;
961
- document.getElementById('resetBtn').disabled = true;
962
-
963
- // Show processing status
964
- document.getElementById('processingStatus').classList.add('active');
965
- document.getElementById('progressContainer').classList.add('active');
966
-
967
- // Reset progress
968
- document.getElementById('progressBar').style.width = '0%';
969
- currentStep = 1;
970
-
971
- // Start processing simulation
972
- simulateProcessing();
973
- }
974
-
975
- function simulateProcessing() {
976
- const progressBar = document.getElementById('progressBar');
977
- const steps = processingSteps.length;
978
- let currentProgress = 0;
979
-
980
- // Animate frames during processing
981
- animateProcessingFrames();
982
-
983
- progressInterval = setInterval(() => {
984
- currentProgress += 2;
985
- progressBar.style.width = `${currentProgress}%`;
986
-
987
- // Check if we need to move to next step
988
- if (currentProgress >= processingSteps[currentStep - 1].progress) {
989
- moveToNextStep();
990
- }
991
-
992
- if (currentProgress >= 100) {
993
- clearInterval(progressInterval);
994
- completeProcessing();
995
- }
996
- }, 50);
997
- }
998
-
999
- function moveToNextStep() {
1000
- if (currentStep <= processingSteps.length) {
1001
- // Mark current step as completed
1002
- const currentStepElement = document.getElementById(processingSteps[currentStep - 1].id);
1003
- currentStepElement.classList.remove('active');
1004
- currentStepElement.classList.add('completed');
1005
-
1006
- // Move to next step
1007
- currentStep++;
1008
-
1009
- if (currentStep <= processingSteps.length) {
1010
- // Mark next step as active
1011
- const nextStepElement = document.getElementById(processingSteps[currentStep - 1].id);
1012
- nextStepElement.classList.add('active');
1013
- }
1014
- }
1015
- }
1016
-
1017
- function animateProcessingFrames() {
1018
- // Add processing class to all frames
1019
- const frames = document.querySelectorAll('.frame');
1020
- frames.forEach(frame => {
1021
- frame.classList.add('processing');
1022
- });
1023
-
1024
- // Animate target frame
1025
- const targetFrame = document.getElementById('targetFrame');
1026
- targetFrame.style.transform = 'scale(1)';
1027
- }
1028
-
1029
- function completeProcessing() {
1030
- isProcessing = false;
1031
- document.getElementById('processBtn').disabled = false;
1032
- document.getElementById('resetBtn').disabled = false;
1033
-
1034
- // Show success message
1035
- document.getElementById('successMessage').classList.add('active');
1036
-
1037
- // Show output frame
1038
- document.getElementById('outputFrame').classList.add('active');
1039
-
1040
- // Remove processing status after a delay
1041
- setTimeout(() => {
1042
- document.getElementById('processingStatus').classList.remove('active');
1043
- document.getElementById('progressContainer').classList.remove('active');
1044
-
1045
- // Reset frames
1046
- const frames = document.querySelectorAll('.frame');
1047
- frames.forEach(frame => {
1048
- frame.classList.remove('processing');
1049
- });
1050
-
1051
- const targetFrame = document.getElementById('targetFrame');
1052
- targetFrame.style.transform = 'scale(1.1)';
1053
- }, 2000);
1054
- }
1055
-
1056
- function resetUpload() {
1057
- clearInterval(progressInterval);
1058
- isProcessing = false;
1059
-
1060
- // Reset UI elements
1061
- document.getElementById('progressBar').style.width = '0%';
1062
- document.getElementById('processingStatus').classList.remove('active');
1063
- document.getElementById('progressContainer').classList.remove('active');
1064
- document.getElementById('successMessage').classList.remove('active');
1065
- document.getElementById('outputFrame').classList.remove('active');
1066
-
1067
- // Reset file input
1068
- document.getElementById('videoFile').value = '';
1069
- uploadedVideo = null;
1070
-
1071
- // Hide preview
1072
- document.getElementById('videoPreview').classList.remove('active');
1073
-
1074
- // Reset buttons
1075
- document.getElementById('processBtn').disabled = true;
1076
- document.getElementById('resetBtn').disabled = false;
1077
-
1078
- // Reset processing steps
1079
- processingSteps.forEach((step, index) => {
1080
- const stepElement = document.getElementById(step.id);
1081
- stepElement.classList.remove('active', 'completed');
1082
- if (index === 0) {
1083
- stepElement.classList.add('active');
1084
- }
1085
- });
1086
-
1087
- // Reset frames
1088
- const frames = document.querySelectorAll('.frame');
1089
- frames.forEach(frame => {
1090
- frame.classList.remove('processing');
1091
- });
1092
-
1093
- const targetFrame = document.getElementById('targetFrame');
1094
- targetFrame.style.transform = 'scale(1.1)';
1095
- }
1096
-
1097
- // Add some initial animation
1098
- window.addEventListener('load', () => {
1099
- setTimeout(() => {
1100
- // Animate frames on load
1101
- const frames = document.querySelectorAll('.frame');
1102
- frames.forEach((frame, index) => {
1103
- setTimeout(() => {
1104
- frame.style.transform = 'scale(1.05)';
1105
- setTimeout(() => {
1106
- frame.style.transform = 'scale(1)';
1107
- }, 300);
1108
- }, index * 100);
1109
- });
1110
- }, 500);
1111
- });
1112
- </script>
1113
- </body>
1114
-
1115
- </html>
 
18
  --warning-color: #f59e0b;
19
  --error-color: #ef4444;
20
  --processing-color: #8b5cf6;
21
+ --background-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
22
  }
23
 
24
  * {
 
31
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
32
  line-height: 1.6;
33
  color: var(--text-color);
34
+ background: var(--background-gradient);
35
  min-height: 100vh;
36
+ overflow-x: hidden;
37
  }
38
 
39
  .container {
 
46
  header {
47
  background: rgba(255, 255, 255, 0.95);
48
  backdrop-filter: blur(10px);
49
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
50
  position: sticky;
51
  top: 0;
52
  z-index: 100;
53
+ border-bottom: 1px solid rgba(0, 0, 0, 0.05);
54
  }
55
 
56
  .header-content {
 
64
  font-size: 1.5rem;
65
  font-weight: bold;
66
  color: var(--primary-color);
67
+ display: flex;
68
+ align-items: center;
69
+ gap: 0.5rem;
70
+ }
71
+
72
+ .logo-icon {
73
+ font-size: 1.8rem;
74
  }
75
 
76
  .built-with {
 
78
  color: var(--text-color);
79
  text-decoration: none;
80
  transition: color 0.3s ease;
81
+ display: flex;
82
+ align-items: center;
83
+ gap: 0.5rem;
84
  }
85
 
86
  .built-with:hover {
 
94
 
95
  .section {
96
  background: rgba(255, 255, 255, 0.95);
97
+ border-radius: 20px;
98
+ padding: 2.5rem;
99
  margin-bottom: 2rem;
100
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
101
  backdrop-filter: blur(10px);
102
+ border: 1px solid rgba(255, 255, 255, 0.8);
103
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
104
+ }
105
+
106
+ .section:hover {
107
+ transform: translateY(-2px);
108
+ box-shadow: 0 25px 50px rgba(0, 0, 0, 0.15);
109
  }
110
 
111
  .section-title {
112
+ font-size: 2.2rem;
113
+ margin-bottom: 1.5rem;
114
  color: var(--dark-color);
115
  position: relative;
116
  display: inline-block;
117
+ font-weight: 700;
118
  }
119
 
120
  .section-title::after {
121
  content: '';
122
  position: absolute;
123
+ bottom: -8px;
124
  left: 0;
125
  width: 100%;
126
+ height: 4px;
127
  background: var(--primary-color);
128
  border-radius: 2px;
129
+ box-shadow: 0 4px 8px rgba(59, 130, 246, 0.3);
130
  }
131
 
132
  /* Video Upload Section */
133
  .upload-section {
134
+ margin-bottom: 2.5rem;
135
  }
136
 
137
  .upload-container {
138
+ border: 3px dashed var(--accent-color);
139
+ border-radius: 16px;
140
+ padding: 3rem;
141
  text-align: center;
142
  transition: all 0.3s ease;
143
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.3) 0%, rgba(255, 255, 255, 0.1) 100%);
144
+ position: relative;
145
+ overflow: hidden;
146
+ }
147
+
148
+ .upload-container::before {
149
+ content: '';
150
+ position: absolute;
151
+ top: 0;
152
+ left: 0;
153
+ right: 0;
154
+ bottom: 0;
155
+ background: linear-gradient(135deg, rgba(102, 126, 234, 0.05) 0%, rgba(118, 75, 162, 0.05) 100%);
156
+ z-index: 0;
157
  }
158
 
159
  .upload-container:hover {
160
  border-color: var(--primary-color);
161
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.5) 0%, rgba(255, 255, 255, 0.2) 100%);
162
+ transform: scale(1.02);
163
  }
164
 
165
  .upload-icon {
166
+ font-size: 4rem;
167
  color: var(--primary-color);
168
+ margin-bottom: 1.5rem;
169
+ position: relative;
170
+ z-index: 1;
171
+ animation: float 3s ease-in-out infinite;
172
+ }
173
+
174
+ @keyframes float {
175
+ 0%, 100% {
176
+ transform: translateY(0);
177
+ }
178
+ 50% {
179
+ transform: translateY(-10px);
180
+ }
181
+ }
182
+
183
+ .upload-text {
184
+ font-size: 1.2rem;
185
+ color: var(--dark-color);
186
+ margin-bottom: 1.5rem;
187
+ position: relative;
188
+ z-index: 1;
189
  }
190
 
191
  .file-input-wrapper {
192
  position: relative;
193
  display: inline-block;
194
+ margin: 1.5rem 0;
195
+ z-index: 1;
196
  }
197
 
198
  .file-input {
 
205
 
206
  .file-input-label {
207
  display: inline-block;
208
+ padding: 1rem 2rem;
209
  background: var(--primary-color);
210
  color: white;
211
+ border-radius: 12px;
212
  cursor: pointer;
213
  transition: all 0.3s ease;
214
+ font-weight: 600;
215
+ font-size: 1.1rem;
216
+ box-shadow: 0 4px 15px rgba(59, 130, 246, 0.3);
217
+ position: relative;
218
+ overflow: hidden;
219
+ }
220
+
221
+ .file-input-label::before {
222
+ content: '';
223
+ position: absolute;
224
+ top: 0;
225
+ left: -100%;
226
+ width: 100%;
227
+ height: 100%;
228
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
229
+ transition: left 0.5s;
230
+ }
231
+
232
+ .file-input-label:hover::before {
233
+ left: 100%;
234
  }
235
 
236
  .file-input-label:hover {
237
  background: var(--secondary-color);
238
+ transform: translateY(-3px);
239
+ box-shadow: 0 8px 25px rgba(30, 64, 175, 0.4);
240
  }
241
 
242
  .video-preview {
243
+ margin-top: 2.5rem;
244
  display: none;
245
+ animation: fadeIn 0.5s ease;
246
  }
247
 
248
  .video-preview.active {
249
  display: block;
250
  }
251
 
252
+ @keyframes fadeIn {
253
+ from {
254
+ opacity: 0;
255
+ transform: translateY(20px);
256
+ }
257
+ to {
258
+ opacity: 1;
259
+ transform: translateY(0);
260
+ }
261
+ }
262
+
263
  .video-container {
264
  position: relative;
265
+ border-radius: 12px;
266
  overflow: hidden;
267
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15);
268
+ background: var(--dark-color);
269
+ position: relative;
270
+ }
271
+
272
+ .video-container::before {
273
+ content: '';
274
+ position: absolute;
275
+ top: 0;
276
+ left: 0;
277
+ right: 0;
278
+ bottom: 0;
279
+ background: linear-gradient(135deg, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.1) 100%);
280
+ z-index: 1;
281
+ }
282
+
283
+ video {
284
+ width: 100%;
285
+ max-height: 400px;
286
+ display: block;
287
+ position: relative;
288
+ z-index: 2;
289
+ border-radius: 12px;
290
+ }
291
+
292
+ .video-overlay {
293
+ position: absolute;
294
+ top: 0;
295
+ left: 0;
296
+ right: 0;
297
+ bottom: 0;
298
+ display: flex;
299
+ align-items: center;
300
+ justify-content: center;
301
+ background: rgba(0, 0, 0, 0.3);
302
+ z-index: 3;
303
+ opacity: 0;
304
+ transition: opacity 0.3s ease;
305
+ border-radius: 12px;
306
+ }
307
+
308
+ .video-container:hover .video-overlay {
309
+ opacity: 1;
310
  }
311
 
312
  .video-controls {
313
+ margin-top: 1.5rem;
314
  display: flex;
315
+ gap: 1.5rem;
316
  flex-wrap: wrap;
317
  justify-content: center;
318
+ align-items: center;
319
  }
320
 
321
  .height-control {
322
  display: flex;
323
  align-items: center;
324
+ gap: 1.5rem;
325
+ margin-top: 1.5rem;
326
+ background: var(--light-color);
327
+ padding: 1rem 1.5rem;
328
+ border-radius: 12px;
329
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05);
330
  }
331
 
332
  .height-slider {
333
  flex: 1;
334
  max-width: 300px;
335
+ height: 8px;
336
+ background: var(--light-color);
337
+ border-radius: 4px;
338
+ outline: none;
339
+ -webkit-appearance: none;
340
+ appearance: none;
341
+ }
342
+
343
+ .height-slider::-webkit-slider-thumb {
344
+ -webkit-appearance: none;
345
+ appearance: none;
346
+ width: 20px;
347
+ height: 20px;
348
+ background: var(--primary-color);
349
+ border-radius: 50%;
350
+ cursor: pointer;
351
+ box-shadow: 0 2px 10px rgba(59, 130, 246, 0.3);
352
+ transition: all 0.3s ease;
353
+ }
354
+
355
+ .height-slider::-webkit-slider-thumb:hover {
356
+ transform: scale(1.2);
357
+ box-shadow: 0 4px 15px rgba(59, 130, 246, 0.5);
358
  }
359
 
360
  .height-value {
361
+ min-width: 60px;
362
  text-align: center;
363
  font-weight: bold;
364
  color: var(--primary-color);
365
+ font-size: 1.1rem;
366
+ background: white;
367
+ padding: 0.5rem 1rem;
368
+ border-radius: 8px;
369
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
370
  }
371
 
372
  /* Processing Status */
373
  .processing-status {
374
+ margin-top: 2rem;
375
+ padding: 1.5rem;
376
+ background: linear-gradient(135deg, var(--light-color) 0%, white 100%);
377
+ border-radius: 16px;
378
  display: none;
379
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
380
+ border: 1px solid rgba(0, 0, 0, 0.05);
381
  }
382
 
383
  .processing-status.active {
384
  display: block;
385
+ animation: slideIn 0.5s ease;
386
+ }
387
+
388
+ @keyframes slideIn {
389
+ from {
390
+ opacity: 0;
391
+ transform: translateX(-20px);
392
+ }
393
+ to {
394
+ opacity: 1;
395
+ transform: translateX(0);
396
+ }
397
  }
398
 
399
  .status-header {
400
  display: flex;
401
  align-items: center;
402
+ gap: 1rem;
403
+ margin-bottom: 1.5rem;
404
  }
405
 
406
  .status-icon {
407
+ font-size: 1.5rem;
408
+ color: var(--processing-color);
409
+ animation: spin 2s linear infinite;
410
  }
411
 
412
  .status-text {
413
+ font-weight: 700;
414
  color: var(--processing-color);
415
+ font-size: 1.2rem;
416
+ }
417
+
418
+ .status-steps {
419
+ display: grid;
420
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
421
+ gap: 1rem;
422
  }
423
 
424
  .status-step {
425
+ padding: 1rem;
 
426
  background: white;
427
+ border-radius: 12px;
428
  display: flex;
429
  align-items: center;
430
+ gap: 1rem;
431
  transition: all 0.3s ease;
432
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05);
433
+ border: 2px solid transparent;
434
  }
435
 
436
  .status-step.completed {
437
  background: rgba(16, 185, 129, 0.1);
438
  color: var(--success-color);
439
+ border-color: var(--success-color);
440
  }
441
 
442
  .status-step.active {
443
  background: rgba(139, 92, 246, 0.1);
444
  color: var(--processing-color);
445
+ border-color: var(--processing-color);
446
+ font-weight: 600;
447
+ transform: scale(1.02);
448
  }
449
 
450
  .status-step-icon {
451
+ width: 32px;
452
+ height: 32px;
453
  border-radius: 50%;
454
  display: flex;
455
  align-items: center;
456
  justify-content: center;
457
+ font-size: 1rem;
458
+ font-weight: bold;
459
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
460
  }
461
 
462
  .status-step.completed .status-step-icon {
 
467
  .status-step.active .status-step-icon {
468
  background: var(--processing-color);
469
  color: white;
470
+ animation: pulse 1.5s infinite;
471
+ }
472
+
473
+ .status-step-name {
474
+ flex: 1;
475
+ }
476
+
477
+ .status-step-progress {
478
+ font-size: 0.9rem;
479
+ color: var(--text-color);
480
+ opacity: 0.7;
481
+ }
482
+
483
+ /* Progress Bar */
484
+ .progress-container {
485
+ width: 100%;
486
+ background: var(--light-color);
487
+ border-radius: 12px;
488
+ height: 12px;
489
+ margin: 1.5rem 0;
490
+ overflow: hidden;
491
+ display: none;
492
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
493
+ }
494
+
495
+ .progress-container.active {
496
+ display: block;
497
+ }
498
+
499
+ .progress-bar {
500
+ height: 100%;
501
+ background: linear-gradient(90deg, var(--processing-color) 0%, var(--accent-color) 100%);
502
+ border-radius: 12px;
503
+ width: 0%;
504
+ transition: width 0.5s ease;
505
+ box-shadow: 0 0 10px rgba(139, 92, 246, 0.5);
506
+ }
507
+
508
+ .progress-label {
509
+ display: flex;
510
+ justify-content: space-between;
511
+ margin-top: 0.5rem;
512
+ font-size: 0.9rem;
513
+ color: var(--text-color);
514
+ opacity: 0.7;
515
  }
516
 
517
  /* Diagram Section */
518
  .diagram-container {
519
+ margin: 3rem 0;
520
  position: relative;
 
 
521
  }
522
 
523
  .diagram {
524
  display: grid;
525
+ grid-template-columns: repeat(3, 1fr);
526
  grid-template-rows: auto 1fr auto;
527
+ gap: 1.5rem;
528
  align-items: center;
529
  justify-items: center;
530
+ margin-bottom: 2.5rem;
531
+ perspective: 1000px;
532
  }
533
 
534
  .blend-section {
 
536
  flex-direction: column;
537
  align-items: center;
538
  position: relative;
539
+ transform-style: preserve-3d;
540
+ transition: transform 0.3s ease;
541
+ }
542
+
543
+ .blend-section:hover {
544
+ transform: translateY(-5px);
545
  }
546
 
547
  .blend-label {
548
  background: var(--primary-color);
549
  color: white;
550
+ padding: 0.75rem 2rem;
551
+ border-radius: 30px;
552
+ font-weight: 700;
553
+ margin-bottom: 1.5rem;
554
+ box-shadow: 0 6px 15px rgba(59, 130, 246, 0.3);
555
+ font-size: 1.1rem;
556
+ position: relative;
557
+ overflow: hidden;
558
+ }
559
+
560
+ .blend-label::after {
561
+ content: '';
562
+ position: absolute;
563
+ top: 0;
564
+ left: -100%;
565
+ width: 100%;
566
+ height: 100%;
567
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
568
+ transition: left 0.8s;
569
+ }
570
+
571
+ .blend-section:hover .blend-label::after {
572
+ left: 100%;
573
  }
574
 
575
  .frame-container {
576
  display: flex;
577
  flex-direction: column;
578
  align-items: center;
579
+ gap: 0.75rem;
580
  }
581
 
582
  .frame {
583
  width: 100%;
584
+ height: 180px;
585
  background: #2d3748;
586
+ border: 3px solid var(--accent-color);
587
+ border-radius: 12px;
588
  position: relative;
589
  overflow: hidden;
590
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
591
  transition: all 0.3s ease;
 
 
 
 
 
592
  display: flex;
593
  align-items: center;
594
  justify-content: center;
595
  color: white;
596
+ font-size: 1rem;
597
  text-align: center;
598
  padding: 1rem;
599
+ position: relative;
600
+ }
601
+
602
+ .frame::before {
603
+ content: '';
604
+ position: absolute;
605
+ top: 0;
606
+ left: 0;
607
+ right: 0;
608
+ bottom: 0;
609
+ background: linear-gradient(135deg, rgba(0, 0, 0, 0.2) 0%, transparent 50%, rgba(0, 0, 0, 0.2) 100%);
610
+ z-index: 1;
611
+ }
612
+
613
+ .frame-content {
614
+ position: relative;
615
+ z-index: 2;
616
+ font-weight: 500;
617
  }
618
 
619
  .frame.processing {
620
  border-color: var(--processing-color);
621
+ background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(139, 92, 246, 0.05) 100%);
622
+ animation: shimmer 2s infinite;
623
+ }
624
+
625
+ @keyframes shimmer {
626
+ 0% {
627
+ background-position: -1000px 0;
628
+ }
629
+ 100% {
630
+ background-position: 1000px 0;
631
+ }
632
+ }
633
+
634
+ .frame.completed {
635
+ border-color: var(--success-color);
636
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.1) 0%, rgba(16, 185, 129, 0.05) 100%);
637
  }
638
 
639
  .target-frame {
640
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
641
+ transform: scale(1.15) rotateY(5deg);
642
+ z-index: 20;
643
+ box-shadow: 0 15px 35px rgba(0, 0, 0, 0.3);
644
  grid-column: 2;
645
  grid-row: 2;
646
+ border: 3px solid var(--success-color);
647
  }
648
 
649
  .top-blend {
 
670
  display: flex;
671
  align-items: center;
672
  justify-content: center;
673
+ margin: 2rem 0;
674
+ gap: 1rem;
675
  }
676
 
677
  .arrow {
678
+ width: 50px;
679
+ height: 50px;
680
  background: var(--primary-color);
681
  color: white;
682
  border-radius: 50%;
683
  display: flex;
684
  align-items: center;
685
  justify-content: center;
686
+ font-size: 1.5rem;
687
+ box-shadow: 0 6px 20px rgba(59, 130, 246, 0.4);
688
+ transition: all 0.3s ease;
689
+ }
690
+
691
+ .arrow:hover {
692
+ transform: scale(1.1);
693
+ box-shadow: 0 8px 25px rgba(59, 130, 246, 0.6);
694
  }
695
 
696
  .output-frame {
697
  width: 100%;
698
+ height: 250px;
699
  background: #1a202c;
700
+ border: 4px solid var(--success-color);
701
+ border-radius: 16px;
702
  position: relative;
703
  overflow: hidden;
704
+ margin-top: 2.5rem;
705
+ box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3);
706
  display: none;
707
+ animation: slideUp 0.5s ease;
708
  }
709
 
710
  .output-frame.active {
711
  display: block;
712
  }
713
 
714
+ @keyframes slideUp {
715
+ from {
716
+ opacity: 0;
717
+ transform: translateY(30px);
718
+ }
719
+ to {
720
+ opacity: 1;
721
+ transform: translateY(0);
722
+ }
723
+ }
724
+
725
  .output-content {
726
  width: 100%;
727
  height: 100%;
728
  display: flex;
729
+ flex-direction: column;
730
  align-items: center;
731
  justify-content: center;
732
  color: white;
733
+ font-size: 1.2rem;
734
  text-align: center;
735
+ padding: 1.5rem;
736
+ position: relative;
737
+ z-index: 2;
738
+ }
739
+
740
+ .output-badge {
741
+ background: var(--success-color);
742
+ color: white;
743
+ padding: 0.5rem 1.5rem;
744
+ border-radius: 20px;
745
+ font-weight: 600;
746
+ margin-bottom: 1rem;
747
+ box-shadow: 0 4px 15px rgba(16, 185, 129, 0.3);
748
+ animation: pulse 2s infinite;
749
  }
750
 
751
  /* Interactive Controls */
752
  .controls {
753
  display: flex;
754
  flex-wrap: wrap;
755
+ gap: 1.5rem;
756
+ margin: 3rem 0;
757
+ justify-content: center;
758
  }
759
 
760
  .control-btn {
761
+ padding: 1rem 2rem;
762
  border: none;
763
+ border-radius: 12px;
764
+ font-weight: 600;
765
  cursor: pointer;
766
  transition: all 0.3s ease;
767
  display: flex;
768
  align-items: center;
769
+ gap: 0.75rem;
770
+ font-size: 1.1rem;
771
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
772
+ position: relative;
773
+ overflow: hidden;
774
+ }
775
+
776
+ .control-btn::before {
777
+ content: '';
778
+ position: absolute;
779
+ top: 50%;
780
+ left: 50%;
781
+ width: 0;
782
+ height: 0;
783
+ background: rgba(255, 255, 255, 0.2);
784
+ border-radius: 50%;
785
+ transform: translate(-50%, -50%);
786
+ transition: width 0.6s, height 0.6s;
787
+ }
788
+
789
+ .control-btn:active::before {
790
+ width: 300px;
791
+ height: 300px;
792
  }
793
 
794
  .control-btn.primary {
795
  background: var(--primary-color);
796
  color: white;
797
+ box-shadow: 0 6px 20px rgba(59, 130, 246, 0.4);
798
  }
799
 
800
  .control-btn.primary:hover:not(:disabled) {
801
  background: var(--secondary-color);
802
+ transform: translateY(-3px);
803
+ box-shadow: 0 8px 25px rgba(30, 64, 175, 0.5);
804
  }
805
 
806
  .control-btn.secondary {
807
  background: var(--light-color);
808
  color: var(--dark-color);
809
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05);
810
  }
811
 
812
  .control-btn.secondary:hover:not(:disabled) {
813
  background: var(--accent-color);
814
  color: white;
815
+ transform: translateY(-3px);
816
+ box-shadow: 0 8px 25px rgba(96, 165, 250, 0.4);
817
  }
818
 
819
  .control-btn:disabled {
820
  opacity: 0.6;
821
  cursor: not-allowed;
822
+ transform: none !important;
823
  }
824
 
825
  /* Features Section */
826
  .features {
827
  display: grid;
828
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
829
+ gap: 2rem;
830
+ margin: 3rem 0;
831
  }
832
 
833
  .feature-card {
834
  background: white;
835
+ border-radius: 16px;
836
+ padding: 2rem;
837
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
838
+ transition: all 0.3s ease;
839
+ border: 1px solid rgba(0, 0, 0, 0.05);
840
+ position: relative;
841
+ overflow: hidden;
842
+ }
843
+
844
+ .feature-card::before {
845
+ content: '';
846
+ position: absolute;
847
+ top: 0;
848
+ left: 0;
849
+ right: 0;
850
+ height: 4px;
851
+ background: var(--primary-color);
852
+ transform: scaleX(0);
853
  transition: transform 0.3s ease;
854
  }
855
 
856
  .feature-card:hover {
857
+ transform: translateY(-10px);
858
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
859
+ }
860
+
861
+ .feature-card:hover::before {
862
+ transform: scaleX(1);
863
  }
864
 
865
  .feature-icon {
866
+ font-size: 2.5rem;
867
  color: var(--primary-color);
868
+ margin-bottom: 1.5rem;
869
+ position: relative;
870
+ }
871
+
872
+ .feature-icon::after {
873
+ content: '';
874
+ position: absolute;
875
+ bottom: -10px;
876
+ left: 50%;
877
+ transform: translateX(-50%);
878
+ width: 50px;
879
+ height: 3px;
880
+ background: var(--primary-color);
881
+ border-radius: 2px;
882
  }
883
 
884
  .feature-title {
885
+ font-size: 1.4rem;
886
+ margin-bottom: 1rem;
887
  color: var(--dark-color);
888
+ font-weight: 700;
889
+ }
890
+
891
+ .feature-description {
892
+ color: var(--text-color);
893
+ opacity: 0.8;
894
+ line-height: 1.8;
895
  }
896
 
897
+ /* Info Cards */
898
+ .info-card {
899
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.9) 0%, rgba(255, 255, 255, 0.7) 100%);
900
+ border-left: 5px solid var(--primary-color);
901
+ padding: 1.5rem;
902
+ margin: 2rem 0;
903
+ border-radius: 0 12px 12px 0;
904
+ box-shadow: 0 8px 25px rgba(0, 0, 0, 0.08);
905
+ position: relative;
906
+ overflow: hidden;
907
+ }
908
+
909
+ .info-card::before {
910
+ content: '';
911
+ position: absolute;
912
+ top: 0;
913
+ left: 0;
914
+ right: 0;
915
+ height: 3px;
916
+ background: var(--primary-color);
917
+ animation: shimmer 3s infinite;
918
+ }
919
+
920
+ /* Success Message */
921
+ .success-message {
922
+ display: none;
923
+ padding: 1.5rem;
924
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.1) 0%, rgba(16, 185, 129, 0.05) 100%);
925
+ border: 2px solid var(--success-color);
926
+ border-radius: 16px;
927
+ margin: 2rem 0;
928
+ text-align: center;
929
+ color: var(--success-color);
930
+ font-weight: 600;
931
+ font-size: 1.2rem;
932
+ box-shadow: 0 10px 30px rgba(16, 185, 129, 0.2);
933
+ animation: bounceIn 0.5s ease;
934
+ }
935
+
936
+ .success-message.active {
937
+ display: block;
938
+ }
939
+
940
+ @keyframes bounceIn {
941
  0% {
942
+ opacity: 0;
943
+ transform: scale(0.3);
944
  }
 
945
  50% {
946
+ opacity: 1;
947
  transform: scale(1.05);
948
  }
949
+ 70% {
950
+ transform: scale(0.9);
951
+ }
952
  100% {
953
+ opacity: 1;
954
  transform: scale(1);
955
  }
956
  }
957
 
958
+ /* Footer */
959
+ footer {
960
+ background: rgba(255, 255, 255, 0.95);
961
+ padding: 3rem 0;
962
+ margin-top: 3rem;
963
+ text-align: center;
964
+ border-top: 1px solid rgba(0, 0, 0, 0.05);
965
  }
966
 
967
+ .footer-content {
968
+ display: flex;
969
+ flex-direction: column;
970
+ gap: 1rem;
 
 
 
 
971
  }
972
 
973
+ .footer-logo {
974
+ font-size: 1.2rem;
975
+ color: var(--text-color);
976
+ opacity: 0.8;
 
 
 
 
977
  }
978
 
979
  /* Responsive */
 
1013
  }
1014
 
1015
  .section {
1016
+ padding: 2rem 1.5rem;
1017
  }
1018
 
1019
  .height-slider {
1020
  max-width: 100%;
1021
  }
 
1022
 
1023
+ .feature-card {
1024
+ padding: 1.5rem;
1025
+ }
 
 
 
 
 
 
 
 
 
 
1026
  }
1027
 
1028
+ /* Loading Spinner */
1029
+ .spinner {
1030
+ border: 4px solid rgba(0, 0, 0, 0.1);
1031
+ border-left-color: var(--processing-color);
1032
+ border-radius: 50%;
1033
+ width: 50px;
1034
+ height: 50px;
1035
+ animation: spin 1s linear infinite;
1036
+ margin: 2rem auto;
1037
  }
1038
 
1039
+ /* Stats Display */
1040
+ .stats-display {
1041
+ display: flex;
1042
+ justify-content: space-around;
1043
+ margin: 2rem 0;
1044
+ flex-wrap: wrap;
1045
+ gap: 1.5rem;
1046
  }
1047
 
1048
+ .stat-item {
1049
+ background: white;
1050
+ padding: 1.5rem;
1051
+ border-radius: 12px;
1052
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);
1053
  text-align: center;
1054
+ flex: 1;
1055
+ min-width: 150px;
1056
+ transition: transform 0.3s ease;
1057
  }
1058
 
1059
+ .stat-item:hover {
1060
+ transform: translateY(-5px);
 
 
 
 
 
 
 
 
 
1061
  }
1062
 
1063
+ .stat-value {
1064
+ font-size: 2rem;
1065
+ font-weight: 700;
1066
+ color: var(--primary-color);
1067
+ margin-bottom: 0.5rem;
1068
  }
1069
 
1070
+ .stat-label {
1071
+ color: var(--text-color);
1072
+ opacity: 0.8;
1073
+ font-size: 0.9rem;
 
 
 
 
 
 
1074
  }
1075
  </style>
1076
  </head>
 
1078
  <body>
1079
  <header>
1080
  <div class="container header-content">
1081
+ <div class="logo">
1082
+ <i class="fas fa-video logo-icon"></i>
1083
+ Video Extrapolation Framework
1084
+ </div>
1085
  <a href="https://huggingface.co/spaces/akhaliq/anycoder" class="built-with" target="_blank">
1086
  <i class="fas fa-code"></i> Built with anycoder
1087
  </a>
 
1093
  <h1 class="section-title">Wide FOV Video Extrapolation</h1>
1094
  <p class="info-card">
1095
  With the popularity of immersive display systems that fill the viewer's field of view (FOV) entirely, demand for
1096
+ wide FOV content has increased. A video extrapolation technique based on reuse of existing videos is one of the most efficient ways to produce
 
1097
  wide FOV content.
1098
  </p>
1099
 
 
1103
  <div class="upload-icon">
1104
  <i class="fas fa-video"></i>
1105
  </div>
1106
+ <p class="upload-text">Click to upload a video file or drag and drop</p>
1107
  <div class="file-input-wrapper">
1108
  <input type="file" id="videoFile" class="file-input" accept="video/*">
1109
  <label for="videoFile" class="file-input-label">
1110
  <i class="fas fa-upload"></i> Choose Video
1111
  </label>
1112
  </div>
1113
+ <p class="info-card" style="margin-top: 1.5rem;">
1114
  Supported formats: MP4, AVI, MOV, WMV (Max file size: 100MB)
1115
  </p>
1116
  </div>
 
1120
  <video id="previewVideo" controls style="width: 100%; max-height: 400px;">
1121
  Your browser does not support the video tag.
1122
  </video>
1123
+ <div class="video-overlay">
1124
+ <div style="text-align: center; color: white;">
1125
+ <i class="fas fa-play-circle" style="font-size: 3rem; margin-bottom: 1rem;"></i>
1126
+ <p>Hover to control playback</p>
1127
+ </div>
1128
+ </div>
1129
  </div>
1130
  <div class="height-control">
1131
  <label for="heightSlider">Custom Height:</label>
 
1145
 
1146
  <div class="processing-status" id="processingStatus">
1147
  <div class="status-header">
1148
+ <i class="fas fa-spinner status-icon"></i>
1149
  <span class="status-text">Processing Video...</span>
1150
  </div>
1151
+ <div class="status-steps">
1152
+ <div class="status-step active" id="step1">
1153
+ <div class="status-step-icon">1</div>
1154
+ <div class="status-step-name">Initializing video analysis</div>
1155
+ <div class="status-step-progress">0%</div>
1156
+ </div>
1157
+ <div class="status-step" id="step2">
1158
+ <div class="status-step-icon">2</div>
1159
+ <div class="status-step-name">Extracting 3D scene points</div>
1160
+ <div class="status-step-progress">0%</div>
1161
+ </div>
1162
+ <div class="status-step" id="step3">
1163
+ <div class="status-step-icon">3</div>
1164
+ <div class="status-step-name">Matching viewpoints between frames</div>
1165
+ <div class="status-step-progress">0%</div>
1166
+ </div>
1167
+ <div class="status-step" id="step4">
1168
+ <div class="status-step-icon">4</div>
1169
+ <div class="status-step-name">Applying blending algorithms</div>
1170
+ <div class="status-step-progress">0%</div>
1171
+ </div>
1172
+ <div class="status-step" id="step5">
1173
+ <div class="status-step-icon">5</div>
1174
+ <div class="status-step-name">Generating wide FOV output</div>
1175
+ <div class="status-step-progress">0%</div>
1176
+ </div>
1177
  </div>
1178
  </div>
1179
 
1180
  <div class="progress-container active" id="progressContainer">
1181
  <div class="progress-bar" id="progressBar"></div>
1182
+ <div class="progress-label">
1183
+ <span>0%</span>
1184
+ <span>100%</span>
1185
+ </div>
1186
  </div>
1187
 
1188
  <div class="success-message" id="successMessage">
1189
+ <i class="fas fa-check-circle"></i> Video processing completed successfully! Wide FOV content generated.
1190
+ </div>
1191
+
1192
+ <div class="stats-display" id="statsDisplay" style="display: none;">
1193
+ <div class="stat-item">
1194
+ <div class="stat-value" id="frameCount">0</div>
1195
+ <div class="stat-label">Total Frames</div>
1196
+ </div>
1197
+ <div class="stat-item">
1198
+ <div class="stat-value" id="processingTime">0s</div>
1199
+ <div class="stat-label">Processing Time</div>
1200
+ </div>
1201
+ <div class="stat-item">
1202
+ <div class="stat-value" id="fovExtension">0°</div>
1203
+ <div class="stat-label">FOV Extension</div>
1204
+ </div>
1205
  </div>
1206
 
1207
  <div class="diagram-container">
 
1285
 
1286
  <div class="blend-arrow">
1287
  <div class="arrow"><i class="fas fa-arrow-down"></i></div>
1288
+ <span style="margin: 0 1rem; font-weight: 700; font-size: 1.2rem;">Blend</span>
1289
  <div class="arrow"><i class="fas fa-arrow-down"></i></div>
1290
  </div>
1291
 
1292
  <div class="output-frame" id="outputFrame">
1293
+ <div class="output-content">
1294
+ <div class="output-badge">COMPLETE</div>
1295
+ O<sub>target</sub> - Extrapolated Wide FOV Output
1296
+ </div>
1297
  </div>
1298
  </div>
1299
  </section>
 
1307
  </div>
1308
  <h3 class="feature-title">3D Scene Understanding</h3>
1309
  <p>Utilizes three-dimensional scene points to match viewpoints between different frames, overcoming parallax
1310
+ challenges with advanced computer vision algorithms.</p>
1311
  </div>
1312
 
1313
  <div class="feature-card">
 
1316
  </div>
1317
  <h3 class="feature-title">Multi-Frame Integration</h3>
1318
  <p>Integrates information from all frames in the input video into each frame for comprehensive scene
1319
+ understanding and seamless transitions.</p>
1320
  </div>
1321
 
1322
  <div class="feature-card">
 
1324
  <i class="fas fa-magic"></i>
1325
  </div>
1326
  <h3 class="feature-title">Advanced Blending</h3>
1327
+ <p>Intelligent blending algorithms create seamless extended views with natural transitions and realistic
1328
+ perspective correction.</p>
1329
  </div>
1330
 
1331
  <div class="feature-card">
1332
  <div class="feature-icon">
1333
+ <i class="fas fa