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) {

🎥 Video Gallery

${shareableVideos.length} video${shareableVideos.length === 1 ? '' : 's'} available

+ ${shareableVideos.length > 0 ? ` +
+ +
+ ` : ''}
-
+
${emptyState}