diff --git a/attached_assets/image_1756463985155.png b/attached_assets/image_1756463985155.png new file mode 100644 index 0000000..b2c317c Binary files /dev/null and b/attached_assets/image_1756463985155.png differ diff --git a/client/src/components/video-card.tsx b/client/src/components/video-card.tsx index d6cd81a..76491ee 100644 --- a/client/src/components/video-card.tsx +++ b/client/src/components/video-card.tsx @@ -1,4 +1,4 @@ -import { Play } from "lucide-react"; +import { Play, Plus, ThumbsUp, ChevronDown } from "lucide-react"; import { type Video } from "@shared/schema"; import HLSPreviewThumbnail from "./hls-preview-thumbnail"; import { useState, useRef, useEffect } from "react"; @@ -47,7 +47,9 @@ function formatDate(date: Date | string): string { export default function VideoCard({ video, onClick, className = "" }: VideoCardProps) { const [isHovered, setIsHovered] = useState(false); const [showPreview, setShowPreview] = useState(false); + const [showPopup, setShowPopup] = useState(false); const hoverTimeoutRef = useRef(); + const popupTimeoutRef = useRef(); const videoRef = useRef(null); const hlsRef = useRef(null); @@ -87,17 +89,29 @@ export default function VideoCard({ video, onClick, className = "" }: VideoCardP hoverTimeoutRef.current = setTimeout(() => { setShowPreview(true); }, 800); // Start preview after 800ms hover + + // Show popup after additional delay + popupTimeoutRef.current = setTimeout(() => { + setShowPopup(true); + }, 1200); // Show popup after 1.2s hover } else { if (hoverTimeoutRef.current) { clearTimeout(hoverTimeoutRef.current); } + if (popupTimeoutRef.current) { + clearTimeout(popupTimeoutRef.current); + } setShowPreview(false); + setShowPopup(false); } return () => { if (hoverTimeoutRef.current) { clearTimeout(hoverTimeoutRef.current); } + if (popupTimeoutRef.current) { + clearTimeout(popupTimeoutRef.current); + } }; }, [isHovered]); @@ -159,7 +173,7 @@ export default function VideoCard({ video, onClick, className = "" }: VideoCardP return (
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} > @@ -232,6 +246,46 @@ export default function VideoCard({ video, onClick, className = "" }: VideoCardP {video.title}
+ + {/* Netflix-style popup overlay */} + {showPopup && ( +
+ {/* Action buttons */} +
+ + + + +
+ + {/* Video info */} +
+

{video.title}

+
+ HD + {formatDuration(video.duration)} +
+
+ Drama + + Thriller + + Action +
+
+
+ )} ); }