From 5ca4daa1e94eabce1c56a940d82089b4597d646f Mon Sep 17 00:00:00 2001 From: sebastjanartic <45803536-sebastjanartic@users.noreply.replit.com> Date: Fri, 29 Aug 2025 15:03:05 +0000 Subject: [PATCH] Improve video carousel to allow smooth scrolling between videos Update the video carousel to use a smooth sliding animation, allowing videos to move one by one. Adjust initial rendering and wrapping logic for seamless infinite scrolling. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 2eb1084e-b728-4449-9231-f1665924c8d5 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/8cc42625-c1f5-4e43-99bd-77f2c4dedee2/2eb1084e-b728-4449-9231-f1665924c8d5/QCN70f2 --- client/src/components/netflix-grid.tsx | 90 ++++++++++++++++---------- 1 file changed, 55 insertions(+), 35 deletions(-) diff --git a/client/src/components/netflix-grid.tsx b/client/src/components/netflix-grid.tsx index d54f443..25e0c7a 100644 --- a/client/src/components/netflix-grid.tsx +++ b/client/src/components/netflix-grid.tsx @@ -141,14 +141,12 @@ function CategoryRow({ category, onVideoClick }: CategoryRowProps) { const videosToShow = 5; // Show 5 videos at a time const scroll = (direction: 'left' | 'right') => { - const totalVideos = category.videos.length; - if (direction === 'right') { - // Move to next video in circle: 1→2→3...→10→1 - setCurrentIndex(prev => (prev + 1) % totalVideos); + // Move one video to the right - smooth sliding like geese + setCurrentIndex(prev => prev + 1); } else { - // Move to previous video in circle: 1→10→9...→2→1 - setCurrentIndex(prev => prev === 0 ? totalVideos - 1 : prev - 1); + // Move one video to the left - smooth sliding like geese + setCurrentIndex(prev => prev - 1); } }; @@ -164,11 +162,25 @@ function CategoryRow({ category, onVideoClick }: CategoryRowProps) { }, 800); // Auto scroll every 800ms }; - // Always start with video 1 at first position + // Initialize in middle section for smooth infinite scroll useEffect(() => { - setCurrentIndex(0); + if (category.videos.length > 0) { + setCurrentIndex(category.videos.length); // Start in middle section for smooth wrapping + } }, [category.videos.length]); + // Handle seamless infinite scroll wrapping + useEffect(() => { + const totalVideos = category.videos.length; + if (currentIndex >= totalVideos * 2) { + // Seamlessly jump from end to middle + setCurrentIndex(totalVideos); + } else if (currentIndex < 0) { + // Seamlessly jump from beginning to middle + setCurrentIndex(totalVideos - 1); + } + }, [currentIndex, category.videos.length]); + // Always show both buttons useEffect(() => { setShowLeftButton(true); @@ -271,33 +283,41 @@ function CategoryRow({ category, onVideoClick }: CategoryRowProps) { - {/* Simple carousel that shows current videos */} -
- {Array.from({ length: videosToShow }, (_, index) => { - const videoIndex = (currentIndex + index) % category.videos.length; - const video = category.videos[videoIndex]; - return ( -
- {/* Top 10 Number overlay for first category */} - {category.title.includes("Top 10") && ( -
- {videoIndex + 1} -
- )} - -
- ); - })} + {/* Smooth sliding carousel - videos move like geese one by one */} +
+
+ {/* Create infinite loop by tripling the videos */} + {[...category.videos, ...category.videos, ...category.videos].map((video, index) => { + const actualIndex = index % category.videos.length; + return ( +
+ {/* Top 10 Number overlay for first category */} + {category.title.includes("Top 10") && ( +
+ {actualIndex + 1} +
+ )} + +
+ ); + })} +