diff --git a/worker/video-server-enhanced.js b/worker/video-server-enhanced.js
index 56d0d81..45ef644 100644
--- a/worker/video-server-enhanced.js
+++ b/worker/video-server-enhanced.js
@@ -610,6 +610,30 @@ async function handlePublicGallery(bucket, kv, corsHeaders) {
header { text-align: center; margin-bottom: 40px; padding: 20px; }
h1 { font-size: 2.5rem; margin-bottom: 10px; }
.subtitle { color: #aaa; font-size: 1.1rem; }
+ .controls {
+ display: flex;
+ justify-content: center;
+ gap: 15px;
+ margin-top: 20px;
+ flex-wrap: wrap;
+ }
+ .sort-select {
+ padding: 10px 20px;
+ background: #1a1a1a;
+ border: 1px solid #3a3a3a;
+ border-radius: 6px;
+ color: white;
+ font-size: 0.95rem;
+ cursor: pointer;
+ transition: border-color 0.2s;
+ }
+ .sort-select:hover {
+ border-color: #3ea6ff;
+ }
+ .sort-select:focus {
+ outline: none;
+ border-color: #3ea6ff;
+ }
.video-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
@@ -631,15 +655,30 @@ async function handlePublicGallery(bucket, kv, corsHeaders) {
position: relative;
width: 100%;
aspect-ratio: 16/9;
- background: #000;
+ background: linear-gradient(90deg, #1a1a1a 0%, #2a2a2a 50%, #1a1a1a 100%);
+ background-size: 200% 100%;
+ animation: shimmer 1.5s infinite;
cursor: pointer;
overflow: hidden;
}
+ @keyframes shimmer {
+ 0% { background-position: -200% 0; }
+ 100% { background-position: 200% 0; }
+ }
+ .video-thumbnail.loaded {
+ animation: none;
+ background: #000;
+ }
.video-thumbnail video {
width: 100%;
height: 100%;
object-fit: cover;
pointer-events: none;
+ opacity: 0;
+ transition: opacity 0.3s;
+ }
+ .video-thumbnail video.loaded {
+ opacity: 1;
}
.play-overlay {
position: absolute;
@@ -706,11 +745,33 @@ async function handlePublicGallery(bucket, kv, corsHeaders) {
${shareableVideos.length} video${shareableVideos.length === 1 ? '' : 's'} available🎥 Video Gallery