Freefall commited on
Commit
3a316b9
·
verified ·
1 Parent(s): a5178b8

Add 1 files

Browse files
Files changed (1) hide show
  1. index.html +329 -62
index.html CHANGED
@@ -17,7 +17,8 @@
17
  dark: '#0a0a1a',
18
  darker: '#050510',
19
  accent: '#ff00aa',
20
- glow: 'rgba(0, 255, 157, 0.3)'
 
21
  }
22
  },
23
  fontFamily: {
@@ -26,7 +27,49 @@
26
  boxShadow: {
27
  'cyber': '0 0 10px rgba(0, 255, 157, 0.7)',
28
  'cyber-sm': '0 0 5px rgba(0, 255, 157, 0.5)',
29
- 'cyber-lg': '0 0 15px rgba(0, 255, 157, 0.9)'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  }
31
  }
32
  }
@@ -34,12 +77,29 @@
34
  </script>
35
  <style>
36
  @import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap');
 
37
 
38
  body {
39
- font-family: 'Orbitron', sans-serif;
40
  background-color: #050510;
41
  color: #00ff9d;
42
  overflow-x: hidden;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  }
44
 
45
  .cyber-border {
@@ -400,15 +460,153 @@
400
  -ms-overflow-style: none;
401
  scrollbar-width: none;
402
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
403
  </style>
404
  </head>
405
  <body class="bg-cyber-darker text-cyber-primary">
 
 
 
 
406
  <!-- Drag and Drop Overlay -->
407
  <div id="drag-overlay" class="drag-overlay">
408
  <div class="text-center p-8 cyber-border rounded-lg bg-cyber-dark">
409
  <i class="fas fa-cloud-upload-alt text-6xl mb-4 text-cyber-accent"></i>
410
- <h2 class="text-2xl mb-2">Drop Media Here</h2>
411
- <p class="text-cyber-secondary">Images or Videos</p>
412
  </div>
413
  </div>
414
 
@@ -416,7 +614,7 @@
416
  <div id="settings-overlay" class="settings-overlay"></div>
417
  <div id="settings-panel" class="settings-panel">
418
  <div class="flex justify-between items-center mb-4 border-b border-cyber-primary pb-2">
419
- <h3 class="text-xl">Settings</h3>
420
  <button id="close-settings" class="text-cyber-primary hover:text-cyber-accent">
421
  <i class="fas fa-times"></i>
422
  </button>
@@ -424,37 +622,41 @@
424
 
425
  <div class="space-y-4">
426
  <div>
427
- <h4 class="text-lg mb-2">Mouse Wheel Behavior</h4>
428
- <label class="checkbox-container">Zoom with mouse wheel
429
  <input type="radio" name="wheel-behavior" value="zoom" checked>
430
  <span class="checkmark"></span>
431
  </label>
432
- <label class="checkbox-container">Navigate with mouse wheel
433
  <input type="radio" name="wheel-behavior" value="navigate">
434
  <span class="checkmark"></span>
435
  </label>
436
  </div>
437
 
438
  <div>
439
- <h4 class="text-lg mb-2">Slideshow Options</h4>
440
- <label class="checkbox-container">Skip videos during slideshow
441
  <input type="checkbox" id="skip-videos" checked>
442
  <span class="checkmark"></span>
443
  </label>
444
  </div>
445
 
446
  <div>
447
- <h4 class="text-lg mb-2">Appearance</h4>
448
- <label class="checkbox-container">Enable cyber effects
449
  <input type="checkbox" id="cyber-effects" checked>
450
  <span class="checkmark"></span>
451
  </label>
 
 
 
 
452
  </div>
453
  </div>
454
 
455
  <div class="mt-6 pt-4 border-t border-cyber-primary">
456
  <button id="save-settings" class="w-full bg-cyber-primary text-cyber-dark py-2 rounded hover:bg-cyber-secondary transition-all">
457
- Save Settings
458
  </button>
459
  </div>
460
  </div>
@@ -463,24 +665,24 @@
463
  <div class="container mx-auto p-4 max-w-6xl">
464
  <!-- Header -->
465
  <div class="flex justify-between items-center mb-6">
466
- <div>
467
- <h1 class="text-3xl font-bold cyber-text glow">WontView LeeT</h1>
468
- <p class="text-cyber-secondary text-sm">Cyber Media Viewer v1.0</p>
469
  </div>
470
  <div class="flex space-x-3">
471
  <div class="dropdown">
472
  <button id="open-files" class="cyber-button bg-cyber-dark px-4 py-2 rounded cyber-border hover:shadow-cyber">
473
- <i class="fas fa-folder-open mr-2"></i> Open <i class="fas fa-caret-down ml-1"></i>
474
  </button>
475
  <div class="dropdown-content">
476
- <a href="#" id="open-files-btn"><i class="fas fa-file-image mr-2"></i> Files</a>
477
- <a href="#" id="open-folder-btn"><i class="fas fa-folder mr-2"></i> Folder</a>
478
  </div>
479
  </div>
480
  <input type="file" id="file-input" class="hidden" multiple accept="image/*,video/*">
481
  <input type="file" id="folder-input" class="hidden" webkitdirectory directory multiple accept="image/*,video/*">
482
 
483
- <button id="settings-btn" class="cyber-button bg-cyber-dark px-4 py-2 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="Settings">
484
  <i class="fas fa-cog"></i>
485
  </button>
486
  </div>
@@ -493,12 +695,12 @@
493
  <div id="media-display" class="w-full h-full flex items-center justify-center relative">
494
  <div id="no-media" class="text-cyber-secondary text-center p-8">
495
  <i class="fas fa-images text-6xl mb-4 text-cyber-accent pulse"></i>
496
- <p class="text-xl mb-2">No media selected</p>
497
- <p class="text-sm">Drag & drop files or click "Open"</p>
498
- <p class="text-xs mt-4 text-cyber-secondary">Supports: JPG, PNG, GIF, MP4, WEBM</p>
499
  </div>
500
 
501
- <div id="image-container" class="hidden absolute inset-0 overflow-auto">
502
  <div id="image-wrapper" class="media-container">
503
  <img id="current-image" class="max-w-full max-h-full" src="" alt="">
504
  </div>
@@ -506,37 +708,37 @@
506
 
507
  <div id="video-container" class="hidden relative w-full h-full">
508
  <video id="current-video" class="max-w-full max-h-full" controls>
509
- Your browser does not support the video tag.
510
  </video>
511
  </div>
512
  </div>
513
 
514
  <!-- Navigation Arrows -->
515
- <div id="prev-btn" class="nav-arrow left tooltip" data-tooltip="Previous (←)">
516
  <i class="fas fa-chevron-left text-2xl"></i>
517
  </div>
518
- <div id="next-btn" class="nav-arrow right tooltip" data-tooltip="Next (→)">
519
  <i class="fas fa-chevron-right text-2xl"></i>
520
  </div>
521
 
522
  <!-- Zoom Controls -->
523
  <div id="zoom-controls" class="hidden absolute bottom-4 right-4 bg-cyber-dark bg-opacity-90 text-cyber-primary p-2 rounded cyber-border">
524
- <button id="zoom-in" class="p-2 hover:text-cyber-accent tooltip" data-tooltip="Zoom In (+)">
525
  <i class="fas fa-search-plus"></i>
526
  </button>
527
  <div class="h-px bg-cyber-primary my-1"></div>
528
- <button id="zoom-out" class="p-2 hover:text-cyber-accent tooltip" data-tooltip="Zoom Out (-)">
529
  <i class="fas fa-search-minus"></i>
530
  </button>
531
  <div class="h-px bg-cyber-primary my-1"></div>
532
- <button id="zoom-reset" class="p-2 hover:text-cyber-accent tooltip" data-tooltip="Reset Zoom (0)">
533
  <i class="fas fa-expand"></i>
534
  </button>
535
  </div>
536
 
537
  <!-- Video Controls -->
538
  <div id="video-controls" class="hidden absolute bottom-4 left-4 right-4 bg-cyber-dark bg-opacity-90 text-cyber-primary p-3 rounded cyber-border flex items-center justify-between">
539
- <button id="play-pause" class="p-2 hover:text-cyber-accent tooltip" data-tooltip="Play/Pause (Space)">
540
  <i class="fas fa-play" id="play-icon"></i>
541
  </button>
542
  <div class="flex-1 mx-4">
@@ -564,49 +766,49 @@
564
  <div class="flex flex-wrap items-center justify-between gap-4">
565
  <!-- Playback Controls -->
566
  <div class="flex items-center space-x-2">
567
- <button id="play-pause-bottom" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="Play/Pause (Space)">
568
- <i class="fas fa-play mr-1" id="play-icon-bottom"></i> Play
569
  </button>
570
- <button id="stop-bottom" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="Stop">
571
- <i class="fas fa-stop mr-1"></i> Stop
572
  </button>
573
- <button id="prev-bottom" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="Previous (←)">
574
- <i class="fas fa-step-backward mr-1"></i> Prev
575
  </button>
576
- <button id="next-bottom" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="Next (→)">
577
- <i class="fas fa-step-forward mr-1"></i> Next
578
  </button>
579
  </div>
580
 
581
  <!-- Slideshow Controls -->
582
  <div class="flex items-center space-x-4">
583
  <div class="flex items-center">
584
- <span class="text-sm mr-2">Speed:</span>
585
  <select id="slideshow-speed" class="bg-cyber-dark border border-cyber-primary rounded px-2 py-1 text-sm text-cyber-primary">
586
- <option value="1000">1 sec</option>
587
- <option value="2000" selected>2 sec</option>
588
- <option value="3000">3 sec</option>
589
- <option value="5000">5 sec</option>
590
- <option value="10000">10 sec</option>
591
  </select>
592
  </div>
593
- <button id="toggle-slideshow" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="Start Slideshow">
594
- <i class="fas fa-images mr-1"></i> Slideshow
595
  </button>
596
  </div>
597
 
598
  <!-- Display Options -->
599
  <div class="flex items-center space-x-4">
600
  <div class="flex items-center">
601
- <span class="text-sm mr-2">Size:</span>
602
  <select id="image-size" class="bg-cyber-dark border border-cyber-primary rounded px-2 py-1 text-sm text-cyber-primary">
603
- <option value="contain">Fit</option>
604
- <option value="cover">Fill</option>
605
- <option value="original">Original</option>
606
  </select>
607
  </div>
608
- <button id="toggle-sidebar" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="Toggle Thumbnails (T)">
609
- <i class="fas fa-th mr-1"></i> Thumbnails
610
  </button>
611
  </div>
612
  </div>
@@ -667,6 +869,8 @@
667
  const closeSettingsBtn = document.getElementById('close-settings');
668
  const saveSettingsBtn = document.getElementById('save-settings');
669
  const statusMessage = document.getElementById('status-message');
 
 
670
 
671
  // State variables
672
  let mediaFiles = [];
@@ -679,10 +883,14 @@
679
  let wheelBehavior = 'zoom'; // 'zoom' or 'navigate'
680
  let skipVideosInSlideshow = true;
681
  let cyberEffectsEnabled = true;
 
682
 
683
  // Initialize settings from localStorage
684
  loadSettings();
685
 
 
 
 
686
  // Event Listeners for file/folder opening
687
  openFilesBtn.addEventListener('click', () => fileInput.click());
688
  openFolderBtn.addEventListener('click', () => folderInput.click());
@@ -711,7 +919,7 @@
711
  // Check if it's a directory (Chrome only)
712
  const entry = items[0].webkitGetAsEntry();
713
  if (entry && entry.isDirectory) {
714
- statusMessage.textContent = "Please use the folder open option for directories";
715
  setTimeout(() => statusMessage.textContent = "", 3000);
716
  return;
717
  }
@@ -731,7 +939,7 @@
731
  currentIndex = 0;
732
  displayCurrentMedia();
733
  updateThumbnails();
734
- showStatusMessage(`Loaded ${files.length} files`);
735
  }
736
  }
737
  });
@@ -787,6 +995,17 @@
787
  document.addEventListener('mouseup', endDrag);
788
  document.addEventListener('mouseleave', endDrag);
789
 
 
 
 
 
 
 
 
 
 
 
 
790
  // Keyboard shortcuts
791
  document.addEventListener('keydown', handleKeyboardShortcuts);
792
 
@@ -800,6 +1019,12 @@
800
  settingsOverlay.addEventListener('click', closeSettings);
801
  saveSettingsBtn.addEventListener('click', saveSettings);
802
 
 
 
 
 
 
 
803
  // Functions
804
  function handleFileSelection(e) {
805
  const files = Array.from(e.target.files);
@@ -810,7 +1035,7 @@
810
  currentIndex = 0;
811
  displayCurrentMedia();
812
  updateThumbnails();
813
- showStatusMessage(`Loaded ${mediaFiles.length} files`);
814
  }
815
  e.target.value = ''; // Reset input to allow selecting same files again
816
  }
@@ -1041,24 +1266,24 @@
1041
  if (mediaFiles.length === 0) return;
1042
 
1043
  isSlideshowRunning = true;
1044
- toggleSlideshowBtn.textContent = 'Stop Slideshow';
1045
  toggleSlideshowBtn.classList.remove('bg-cyber-dark');
1046
  toggleSlideshowBtn.classList.add('bg-cyber-accent', 'text-cyber-dark');
1047
 
1048
  const speed = parseInt(slideshowSpeedSelect.value);
1049
  slideshowInterval = setInterval(goToNext, speed);
1050
 
1051
- showStatusMessage('Slideshow started');
1052
  }
1053
 
1054
  function stopSlideshow() {
1055
  isSlideshowRunning = false;
1056
  clearInterval(slideshowInterval);
1057
- toggleSlideshowBtn.textContent = 'Slideshow';
1058
  toggleSlideshowBtn.classList.remove('bg-cyber-accent', 'text-cyber-dark');
1059
  toggleSlideshowBtn.classList.add('bg-cyber-dark');
1060
 
1061
- showStatusMessage('Slideshow stopped');
1062
  }
1063
 
1064
  function toggleThumbnailSidebar() {
@@ -1174,20 +1399,24 @@
1174
  wheelBehavior = document.querySelector('input[name="wheel-behavior"]:checked').value;
1175
  skipVideosInSlideshow = document.getElementById('skip-videos').checked;
1176
  cyberEffectsEnabled = document.getElementById('cyber-effects').checked;
 
1177
 
1178
  localStorage.setItem('wheelBehavior', wheelBehavior);
1179
  localStorage.setItem('skipVideosInSlideshow', skipVideosInSlideshow);
1180
  localStorage.setItem('cyberEffectsEnabled', cyberEffectsEnabled);
 
1181
 
1182
  applyCyberEffects();
 
1183
  closeSettings();
1184
- showStatusMessage('Settings saved');
1185
  }
1186
 
1187
  function loadSettings() {
1188
  const savedWheelBehavior = localStorage.getItem('wheelBehavior');
1189
  const savedSkipVideos = localStorage.getItem('skipVideosInSlideshow');
1190
  const savedCyberEffects = localStorage.getItem('cyberEffectsEnabled');
 
1191
 
1192
  if (savedWheelBehavior) {
1193
  wheelBehavior = savedWheelBehavior;
@@ -1204,6 +1433,12 @@
1204
  document.getElementById('cyber-effects').checked = cyberEffectsEnabled;
1205
  }
1206
 
 
 
 
 
 
 
1207
  applyCyberEffects();
1208
  }
1209
 
@@ -1216,6 +1451,38 @@
1216
  document.querySelectorAll('.cyber-text').forEach(el => el.classList.remove('cyber-text'));
1217
  }
1218
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1219
  });
1220
  </script>
1221
  <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=Freefall/media-viewer-pro" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
 
17
  dark: '#0a0a1a',
18
  darker: '#050510',
19
  accent: '#ff00aa',
20
+ glow: 'rgba(0, 255, 157, 0.3)',
21
+ matrix: '#00ff41'
22
  }
23
  },
24
  fontFamily: {
 
27
  boxShadow: {
28
  'cyber': '0 0 10px rgba(0, 255, 157, 0.7)',
29
  'cyber-sm': '0 0 5px rgba(0, 255, 157, 0.5)',
30
+ 'cyber-lg': '0 0 15px rgba(0, 255, 157, 0.9)',
31
+ 'matrix': '0 0 8px #00ff41'
32
+ },
33
+ animation: {
34
+ 'matrix-flicker': 'matrix-flicker 0.5s infinite alternate',
35
+ 'scanline': 'scanline 8s linear infinite',
36
+ 'glitch': 'glitch 2s infinite alternate',
37
+ 'text-flicker': 'text-flicker 3s infinite alternate'
38
+ },
39
+ keyframes: {
40
+ 'matrix-flicker': {
41
+ '0%': { opacity: '0.1' },
42
+ '2%': { opacity: '0.1' },
43
+ '4%': { opacity: '0.5' },
44
+ '19%': { opacity: '0.5' },
45
+ '21%': { opacity: '0.1' },
46
+ '23%': { opacity: '1' },
47
+ '80%': { opacity: '0.5' },
48
+ '100%': { opacity: '0.1' }
49
+ },
50
+ 'scanline': {
51
+ '0%': { transform: 'translateY(-100%)' },
52
+ '100%': { transform: 'translateY(100%)' }
53
+ },
54
+ 'glitch': {
55
+ '0%': { textShadow: '2px 0 #00ff9d, -2px 0 #ff00aa' },
56
+ '50%': { textShadow: '4px 0 #00ff9d, -4px 0 #ff00aa' },
57
+ '100%': { textShadow: '2px 0 #00ff9d, -2px 0 #ff00aa' }
58
+ },
59
+ 'text-flicker': {
60
+ '0%': { opacity: '0.1' },
61
+ '2%': { opacity: '1' },
62
+ '8%': { opacity: '0.1' },
63
+ '9%': { opacity: '1' },
64
+ '12%': { opacity: '0.1' },
65
+ '20%': { opacity: '1' },
66
+ '25%': { opacity: '0.3' },
67
+ '30%': { opacity: '1' },
68
+ '70%': { opacity: '0.7' },
69
+ '72%': { opacity: '0.2' },
70
+ '77%': { opacity: '0.9' },
71
+ '100%': { opacity: '0.9' }
72
+ }
73
  }
74
  }
75
  }
 
77
  </script>
78
  <style>
79
  @import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700&display=swap');
80
+ @import url('https://fonts.googleapis.com/css2?family=Share+Tech+Mono&display=swap');
81
 
82
  body {
83
+ font-family: 'Share Tech Mono', monospace;
84
  background-color: #050510;
85
  color: #00ff9d;
86
  overflow-x: hidden;
87
+ position: relative;
88
+ }
89
+
90
+ body::before {
91
+ content: "";
92
+ position: fixed;
93
+ top: 0;
94
+ left: 0;
95
+ width: 100%;
96
+ height: 100%;
97
+ background:
98
+ linear-gradient(rgba(0, 255, 157, 0.03) 1px, transparent 1px),
99
+ linear-gradient(90deg, rgba(0, 255, 157, 0.03) 1px, transparent 1px);
100
+ background-size: 20px 20px;
101
+ pointer-events: none;
102
+ z-index: -1;
103
  }
104
 
105
  .cyber-border {
 
460
  -ms-overflow-style: none;
461
  scrollbar-width: none;
462
  }
463
+
464
+ /* Cyberpunk scanline effect */
465
+ .scanline {
466
+ position: fixed;
467
+ top: 0;
468
+ left: 0;
469
+ width: 100%;
470
+ height: 100%;
471
+ background: linear-gradient(
472
+ to bottom,
473
+ transparent 0%,
474
+ rgba(0, 255, 157, 0.05) 50%,
475
+ transparent 100%
476
+ );
477
+ background-size: 100% 8px;
478
+ pointer-events: none;
479
+ z-index: 9999;
480
+ animation: scanline 8s linear infinite;
481
+ }
482
+
483
+ /* Matrix rain effect */
484
+ .matrix-rain {
485
+ position: fixed;
486
+ top: 0;
487
+ left: 0;
488
+ width: 100%;
489
+ height: 100%;
490
+ overflow: hidden;
491
+ z-index: -1;
492
+ opacity: 0.1;
493
+ }
494
+
495
+ .matrix-column {
496
+ position: absolute;
497
+ top: 0;
498
+ width: 1em;
499
+ height: 100%;
500
+ color: #00ff41;
501
+ font-size: 1.2em;
502
+ writing-mode: vertical-rl;
503
+ text-orientation: mixed;
504
+ text-shadow: 0 0 5px #00ff41;
505
+ animation: matrix-flicker 0.5s infinite alternate;
506
+ }
507
+
508
+ /* Glitch effect */
509
+ .glitch-effect {
510
+ position: relative;
511
+ }
512
+
513
+ .glitch-effect::before, .glitch-effect::after {
514
+ content: attr(data-text);
515
+ position: absolute;
516
+ top: 0;
517
+ left: 0;
518
+ width: 100%;
519
+ height: 100%;
520
+ background: #0a0a1a;
521
+ }
522
+
523
+ .glitch-effect::before {
524
+ left: 2px;
525
+ text-shadow: -2px 0 #ff00aa;
526
+ clip: rect(44px, 450px, 56px, 0);
527
+ animation: glitch-anim-1 2s infinite linear alternate-reverse;
528
+ }
529
+
530
+ .glitch-effect::after {
531
+ left: -2px;
532
+ text-shadow: -2px 0 #00b8ff;
533
+ clip: rect(44px, 450px, 56px, 0);
534
+ animation: glitch-anim-2 2s infinite linear alternate-reverse;
535
+ }
536
+
537
+ @keyframes glitch-anim-1 {
538
+ 0% { clip: rect(32px, 9999px, 28px, 0); }
539
+ 10% { clip: rect(13px, 9999px, 37px, 0); }
540
+ 20% { clip: rect(45px, 9999px, 33px, 0); }
541
+ 30% { clip: rect(31px, 9999px, 94px, 0); }
542
+ 40% { clip: rect(58px, 9999px, 34px, 0); }
543
+ 50% { clip: rect(24px, 9999px, 23px, 0); }
544
+ 60% { clip: rect(64px, 9999px, 78px, 0); }
545
+ 70% { clip: rect(67px, 9999px, 62px, 0); }
546
+ 80% { clip: rect(55px, 9999px, 39px, 0); }
547
+ 90% { clip: rect(39px, 9999px, 96px, 0); }
548
+ 100% { clip: rect(82px, 9999px, 40px, 0); }
549
+ }
550
+
551
+ @keyframes glitch-anim-2 {
552
+ 0% { clip: rect(65px, 9999px, 119px, 0); }
553
+ 10% { clip: rect(79px, 9999px, 85px, 0); }
554
+ 20% { clip: rect(74px, 9999px, 14px, 0); }
555
+ 30% { clip: rect(27px, 9999px, 53px, 0); }
556
+ 40% { clip: rect(64px, 9999px, 40px, 0); }
557
+ 50% { clip: rect(61px, 9999px, 73px, 0); }
558
+ 60% { clip: rect(99px, 9999px, 103px, 0); }
559
+ 70% { clip: rect(34px, 9999px, 115px, 0); }
560
+ 80% { clip: rect(98px, 9999px, 54px, 0); }
561
+ 90% { clip: rect(43px, 9999px, 96px, 0); }
562
+ 100% { clip: rect(82px, 9999px, 26px, 0); }
563
+ }
564
+
565
+ /* Terminal style cursor */
566
+ .terminal-cursor {
567
+ display: inline-block;
568
+ width: 10px;
569
+ height: 20px;
570
+ background: #00ff9d;
571
+ animation: blink 1s step-end infinite;
572
+ vertical-align: middle;
573
+ margin-left: 3px;
574
+ }
575
+
576
+ @keyframes blink {
577
+ from, to { opacity: 1; }
578
+ 50% { opacity: 0; }
579
+ }
580
+
581
+ /* Responsive adjustments */
582
+ @media (max-width: 768px) {
583
+ .media-area {
584
+ height: 50vh;
585
+ }
586
+
587
+ .thumbnail {
588
+ width: 60px;
589
+ height: 60px;
590
+ }
591
+
592
+ .nav-arrow {
593
+ width: 30px;
594
+ height: 60px;
595
+ }
596
+ }
597
  </style>
598
  </head>
599
  <body class="bg-cyber-darker text-cyber-primary">
600
+ <!-- Cyberpunk effects -->
601
+ <div class="scanline"></div>
602
+ <div class="matrix-rain" id="matrix-rain"></div>
603
+
604
  <!-- Drag and Drop Overlay -->
605
  <div id="drag-overlay" class="drag-overlay">
606
  <div class="text-center p-8 cyber-border rounded-lg bg-cyber-dark">
607
  <i class="fas fa-cloud-upload-alt text-6xl mb-4 text-cyber-accent"></i>
608
+ <h2 class="text-2xl mb-2">DROP MEDIA HERE</h2>
609
+ <p class="text-cyber-secondary">IMAGES OR VIDEOS</p>
610
  </div>
611
  </div>
612
 
 
614
  <div id="settings-overlay" class="settings-overlay"></div>
615
  <div id="settings-panel" class="settings-panel">
616
  <div class="flex justify-between items-center mb-4 border-b border-cyber-primary pb-2">
617
+ <h3 class="text-xl">SYSTEM SETTINGS</h3>
618
  <button id="close-settings" class="text-cyber-primary hover:text-cyber-accent">
619
  <i class="fas fa-times"></i>
620
  </button>
 
622
 
623
  <div class="space-y-4">
624
  <div>
625
+ <h4 class="text-lg mb-2">MOUSE WHEEL BEHAVIOR</h4>
626
+ <label class="checkbox-container">ZOOM WITH MOUSE WHEEL
627
  <input type="radio" name="wheel-behavior" value="zoom" checked>
628
  <span class="checkmark"></span>
629
  </label>
630
+ <label class="checkbox-container">NAVIGATE WITH MOUSE WHEEL
631
  <input type="radio" name="wheel-behavior" value="navigate">
632
  <span class="checkmark"></span>
633
  </label>
634
  </div>
635
 
636
  <div>
637
+ <h4 class="text-lg mb-2">SLIDESHOW OPTIONS</h4>
638
+ <label class="checkbox-container">SKIP VIDEOS DURING SLIDESHOW
639
  <input type="checkbox" id="skip-videos" checked>
640
  <span class="checkmark"></span>
641
  </label>
642
  </div>
643
 
644
  <div>
645
+ <h4 class="text-lg mb-2">APPEARANCE</h4>
646
+ <label class="checkbox-container">ENABLE CYBER EFFECTS
647
  <input type="checkbox" id="cyber-effects" checked>
648
  <span class="checkmark"></span>
649
  </label>
650
+ <label class="checkbox-container">ENABLE MATRIX RAIN
651
+ <input type="checkbox" id="matrix-rain-toggle" checked>
652
+ <span class="checkmark"></span>
653
+ </label>
654
  </div>
655
  </div>
656
 
657
  <div class="mt-6 pt-4 border-t border-cyber-primary">
658
  <button id="save-settings" class="w-full bg-cyber-primary text-cyber-dark py-2 rounded hover:bg-cyber-secondary transition-all">
659
+ SAVE SETTINGS
660
  </button>
661
  </div>
662
  </div>
 
665
  <div class="container mx-auto p-4 max-w-6xl">
666
  <!-- Header -->
667
  <div class="flex justify-between items-center mb-6">
668
+ <div class="glitch-effect" data-text="WONTV1EW L33T">
669
+ <h1 class="text-4xl font-bold cyber-text text-flicker">WONTV1EW L33T</h1>
670
+ <p class="text-cyber-secondary text-sm">CYBER MEDIA VIEWER v1.0<span class="terminal-cursor"></span></p>
671
  </div>
672
  <div class="flex space-x-3">
673
  <div class="dropdown">
674
  <button id="open-files" class="cyber-button bg-cyber-dark px-4 py-2 rounded cyber-border hover:shadow-cyber">
675
+ <i class="fas fa-folder-open mr-2"></i> OPEN <i class="fas fa-caret-down ml-1"></i>
676
  </button>
677
  <div class="dropdown-content">
678
+ <a href="#" id="open-files-btn"><i class="fas fa-file-image mr-2"></i> FILES</a>
679
+ <a href="#" id="open-folder-btn"><i class="fas fa-folder mr-2"></i> FOLDER</a>
680
  </div>
681
  </div>
682
  <input type="file" id="file-input" class="hidden" multiple accept="image/*,video/*">
683
  <input type="file" id="folder-input" class="hidden" webkitdirectory directory multiple accept="image/*,video/*">
684
 
685
+ <button id="settings-btn" class="cyber-button bg-cyber-dark px-4 py-2 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="SETTINGS">
686
  <i class="fas fa-cog"></i>
687
  </button>
688
  </div>
 
695
  <div id="media-display" class="w-full h-full flex items-center justify-center relative">
696
  <div id="no-media" class="text-cyber-secondary text-center p-8">
697
  <i class="fas fa-images text-6xl mb-4 text-cyber-accent pulse"></i>
698
+ <p class="text-xl mb-2">NO MEDIA DETECTED</p>
699
+ <p class="text-sm">DRAG & DROP FILES OR CLICK "OPEN"</p>
700
+ <p class="text-xs mt-4 text-cyber-secondary">SUPPORTS: JPG, PNG, GIF, MP4, WEBM</p>
701
  </div>
702
 
703
+ <div id="image-container" class="hidden absolute inset-0 overflow-auto cursor-grab">
704
  <div id="image-wrapper" class="media-container">
705
  <img id="current-image" class="max-w-full max-h-full" src="" alt="">
706
  </div>
 
708
 
709
  <div id="video-container" class="hidden relative w-full h-full">
710
  <video id="current-video" class="max-w-full max-h-full" controls>
711
+ YOUR BROWSER DOES NOT SUPPORT THE VIDEO TAG.
712
  </video>
713
  </div>
714
  </div>
715
 
716
  <!-- Navigation Arrows -->
717
+ <div id="prev-btn" class="nav-arrow left tooltip" data-tooltip="PREVIOUS (←)">
718
  <i class="fas fa-chevron-left text-2xl"></i>
719
  </div>
720
+ <div id="next-btn" class="nav-arrow right tooltip" data-tooltip="NEXT (→)">
721
  <i class="fas fa-chevron-right text-2xl"></i>
722
  </div>
723
 
724
  <!-- Zoom Controls -->
725
  <div id="zoom-controls" class="hidden absolute bottom-4 right-4 bg-cyber-dark bg-opacity-90 text-cyber-primary p-2 rounded cyber-border">
726
+ <button id="zoom-in" class="p-2 hover:text-cyber-accent tooltip" data-tooltip="ZOOM IN (+)">
727
  <i class="fas fa-search-plus"></i>
728
  </button>
729
  <div class="h-px bg-cyber-primary my-1"></div>
730
+ <button id="zoom-out" class="p-2 hover:text-cyber-accent tooltip" data-tooltip="ZOOM OUT (-)">
731
  <i class="fas fa-search-minus"></i>
732
  </button>
733
  <div class="h-px bg-cyber-primary my-1"></div>
734
+ <button id="zoom-reset" class="p-2 hover:text-cyber-accent tooltip" data-tooltip="RESET ZOOM (0)">
735
  <i class="fas fa-expand"></i>
736
  </button>
737
  </div>
738
 
739
  <!-- Video Controls -->
740
  <div id="video-controls" class="hidden absolute bottom-4 left-4 right-4 bg-cyber-dark bg-opacity-90 text-cyber-primary p-3 rounded cyber-border flex items-center justify-between">
741
+ <button id="play-pause" class="p-2 hover:text-cyber-accent tooltip" data-tooltip="PLAY/PAUSE (SPACE)">
742
  <i class="fas fa-play" id="play-icon"></i>
743
  </button>
744
  <div class="flex-1 mx-4">
 
766
  <div class="flex flex-wrap items-center justify-between gap-4">
767
  <!-- Playback Controls -->
768
  <div class="flex items-center space-x-2">
769
+ <button id="play-pause-bottom" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="PLAY/PAUSE (SPACE)">
770
+ <i class="fas fa-play mr-1" id="play-icon-bottom"></i> PLAY
771
  </button>
772
+ <button id="stop-bottom" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="STOP">
773
+ <i class="fas fa-stop mr-1"></i> STOP
774
  </button>
775
+ <button id="prev-bottom" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="PREVIOUS (←)">
776
+ <i class="fas fa-step-backward mr-1"></i> PREV
777
  </button>
778
+ <button id="next-bottom" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="NEXT (→)">
779
+ <i class="fas fa-step-forward mr-1"></i> NEXT
780
  </button>
781
  </div>
782
 
783
  <!-- Slideshow Controls -->
784
  <div class="flex items-center space-x-4">
785
  <div class="flex items-center">
786
+ <span class="text-sm mr-2">SPEED:</span>
787
  <select id="slideshow-speed" class="bg-cyber-dark border border-cyber-primary rounded px-2 py-1 text-sm text-cyber-primary">
788
+ <option value="1000">1 SEC</option>
789
+ <option value="2000" selected>2 SEC</option>
790
+ <option value="3000">3 SEC</option>
791
+ <option value="5000">5 SEC</option>
792
+ <option value="10000">10 SEC</option>
793
  </select>
794
  </div>
795
+ <button id="toggle-slideshow" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="START SLIDESHOW">
796
+ <i class="fas fa-images mr-1"></i> SLIDESHOW
797
  </button>
798
  </div>
799
 
800
  <!-- Display Options -->
801
  <div class="flex items-center space-x-4">
802
  <div class="flex items-center">
803
+ <span class="text-sm mr-2">SIZE:</span>
804
  <select id="image-size" class="bg-cyber-dark border border-cyber-primary rounded px-2 py-1 text-sm text-cyber-primary">
805
+ <option value="contain">FIT</option>
806
+ <option value="cover">FILL</option>
807
+ <option value="original">ORIGINAL</option>
808
  </select>
809
  </div>
810
+ <button id="toggle-sidebar" class="cyber-button bg-cyber-dark px-3 py-1 rounded cyber-border hover:shadow-cyber tooltip" data-tooltip="TOGGLE THUMBNAILS (T)">
811
+ <i class="fas fa-th mr-1"></i> THUMBNAILS
812
  </button>
813
  </div>
814
  </div>
 
869
  const closeSettingsBtn = document.getElementById('close-settings');
870
  const saveSettingsBtn = document.getElementById('save-settings');
871
  const statusMessage = document.getElementById('status-message');
872
+ const matrixRainToggle = document.getElementById('matrix-rain-toggle');
873
+ const matrixRainContainer = document.getElementById('matrix-rain');
874
 
875
  // State variables
876
  let mediaFiles = [];
 
883
  let wheelBehavior = 'zoom'; // 'zoom' or 'navigate'
884
  let skipVideosInSlideshow = true;
885
  let cyberEffectsEnabled = true;
886
+ let matrixRainEnabled = true;
887
 
888
  // Initialize settings from localStorage
889
  loadSettings();
890
 
891
+ // Initialize matrix rain
892
+ initMatrixRain();
893
+
894
  // Event Listeners for file/folder opening
895
  openFilesBtn.addEventListener('click', () => fileInput.click());
896
  openFolderBtn.addEventListener('click', () => folderInput.click());
 
919
  // Check if it's a directory (Chrome only)
920
  const entry = items[0].webkitGetAsEntry();
921
  if (entry && entry.isDirectory) {
922
+ statusMessage.textContent = "PLEASE USE THE FOLDER OPEN OPTION FOR DIRECTORIES";
923
  setTimeout(() => statusMessage.textContent = "", 3000);
924
  return;
925
  }
 
939
  currentIndex = 0;
940
  displayCurrentMedia();
941
  updateThumbnails();
942
+ showStatusMessage(`LOADED ${files.length} FILES`);
943
  }
944
  }
945
  });
 
995
  document.addEventListener('mouseup', endDrag);
996
  document.addEventListener('mouseleave', endDrag);
997
 
998
+ // Right mouse drag for panning
999
+ imageContainer.addEventListener('contextmenu', (e) => e.preventDefault());
1000
+ imageContainer.addEventListener('mousedown', (e) => {
1001
+ if (e.button === 2 && zoomLevel > 1) { // Right click
1002
+ isDragging = true;
1003
+ startX = e.clientX - translateX;
1004
+ startY = e.clientY - translateY;
1005
+ imageContainer.style.cursor = 'grabbing';
1006
+ }
1007
+ });
1008
+
1009
  // Keyboard shortcuts
1010
  document.addEventListener('keydown', handleKeyboardShortcuts);
1011
 
 
1019
  settingsOverlay.addEventListener('click', closeSettings);
1020
  saveSettingsBtn.addEventListener('click', saveSettings);
1021
 
1022
+ // Matrix rain toggle
1023
+ matrixRainToggle.addEventListener('change', (e) => {
1024
+ matrixRainEnabled = e.target.checked;
1025
+ toggleMatrixRain(matrixRainEnabled);
1026
+ });
1027
+
1028
  // Functions
1029
  function handleFileSelection(e) {
1030
  const files = Array.from(e.target.files);
 
1035
  currentIndex = 0;
1036
  displayCurrentMedia();
1037
  updateThumbnails();
1038
+ showStatusMessage(`LOADED ${mediaFiles.length} FILES`);
1039
  }
1040
  e.target.value = ''; // Reset input to allow selecting same files again
1041
  }
 
1266
  if (mediaFiles.length === 0) return;
1267
 
1268
  isSlideshowRunning = true;
1269
+ toggleSlideshowBtn.textContent = 'STOP SLIDESHOW';
1270
  toggleSlideshowBtn.classList.remove('bg-cyber-dark');
1271
  toggleSlideshowBtn.classList.add('bg-cyber-accent', 'text-cyber-dark');
1272
 
1273
  const speed = parseInt(slideshowSpeedSelect.value);
1274
  slideshowInterval = setInterval(goToNext, speed);
1275
 
1276
+ showStatusMessage('SLIDESHOW STARTED');
1277
  }
1278
 
1279
  function stopSlideshow() {
1280
  isSlideshowRunning = false;
1281
  clearInterval(slideshowInterval);
1282
+ toggleSlideshowBtn.textContent = 'SLIDESHOW';
1283
  toggleSlideshowBtn.classList.remove('bg-cyber-accent', 'text-cyber-dark');
1284
  toggleSlideshowBtn.classList.add('bg-cyber-dark');
1285
 
1286
+ showStatusMessage('SLIDESHOW STOPPED');
1287
  }
1288
 
1289
  function toggleThumbnailSidebar() {
 
1399
  wheelBehavior = document.querySelector('input[name="wheel-behavior"]:checked').value;
1400
  skipVideosInSlideshow = document.getElementById('skip-videos').checked;
1401
  cyberEffectsEnabled = document.getElementById('cyber-effects').checked;
1402
+ matrixRainEnabled = document.getElementById('matrix-rain-toggle').checked;
1403
 
1404
  localStorage.setItem('wheelBehavior', wheelBehavior);
1405
  localStorage.setItem('skipVideosInSlideshow', skipVideosInSlideshow);
1406
  localStorage.setItem('cyberEffectsEnabled', cyberEffectsEnabled);
1407
+ localStorage.setItem('matrixRainEnabled', matrixRainEnabled);
1408
 
1409
  applyCyberEffects();
1410
+ toggleMatrixRain(matrixRainEnabled);
1411
  closeSettings();
1412
+ showStatusMessage('SETTINGS SAVED');
1413
  }
1414
 
1415
  function loadSettings() {
1416
  const savedWheelBehavior = localStorage.getItem('wheelBehavior');
1417
  const savedSkipVideos = localStorage.getItem('skipVideosInSlideshow');
1418
  const savedCyberEffects = localStorage.getItem('cyberEffectsEnabled');
1419
+ const savedMatrixRain = localStorage.getItem('matrixRainEnabled');
1420
 
1421
  if (savedWheelBehavior) {
1422
  wheelBehavior = savedWheelBehavior;
 
1433
  document.getElementById('cyber-effects').checked = cyberEffectsEnabled;
1434
  }
1435
 
1436
+ if (savedMatrixRain !== null) {
1437
+ matrixRainEnabled = savedMatrixRain === 'true';
1438
+ document.getElementById('matrix-rain-toggle').checked = matrixRainEnabled;
1439
+ toggleMatrixRain(matrixRainEnabled);
1440
+ }
1441
+
1442
  applyCyberEffects();
1443
  }
1444
 
 
1451
  document.querySelectorAll('.cyber-text').forEach(el => el.classList.remove('cyber-text'));
1452
  }
1453
  }
1454
+
1455
+ function initMatrixRain() {
1456
+ const chars = "01アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン";
1457
+ const columns = Math.floor(window.innerWidth / 20);
1458
+
1459
+ for (let i = 0; i < columns; i++) {
1460
+ const column = document.createElement('div');
1461
+ column.className = 'matrix-column';
1462
+ column.style.left = `${i * 20}px`;
1463
+ column.style.animationDelay = `${Math.random() * 2}s`;
1464
+
1465
+ // Create random characters
1466
+ let content = '';
1467
+ const rows = Math.floor(window.innerHeight / 24) + 1;
1468
+ for (let j = 0; j < rows; j++) {
1469
+ content += chars[Math.floor(Math.random() * chars.length)];
1470
+ }
1471
+
1472
+ column.textContent = content;
1473
+ matrixRainContainer.appendChild(column);
1474
+ }
1475
+
1476
+ toggleMatrixRain(matrixRainEnabled);
1477
+ }
1478
+
1479
+ function toggleMatrixRain(enabled) {
1480
+ if (enabled) {
1481
+ matrixRainContainer.style.display = 'block';
1482
+ } else {
1483
+ matrixRainContainer.style.display = 'none';
1484
+ }
1485
+ }
1486
  });
1487
  </script>
1488
  <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=Freefall/media-viewer-pro" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>