diff --git a/app/globals.css b/app/globals.css index 810c4fd..3b73464 100644 --- a/app/globals.css +++ b/app/globals.css @@ -434,6 +434,12 @@ nav:where(.sticky, .fixed), color: white; cursor: pointer; transition: all 0.2s ease; + -webkit-tap-highlight-color: transparent; + touch-action: manipulation; + user-select: none; + -webkit-user-select: none; + position: relative; + z-index: 10; } .btn-icon:hover { diff --git a/components/player/MobileVideoPlayer.tsx b/components/player/MobileVideoPlayer.tsx index 55e4607..93aa53f 100644 --- a/components/player/MobileVideoPlayer.tsx +++ b/components/player/MobileVideoPlayer.tsx @@ -372,14 +372,28 @@ export function MobileVideoPlayer({ }; const toggleFullscreen = () => { - if (!containerRef.current) return; + if (!containerRef.current || !videoRef.current) return; if (!isFullscreen) { - if (containerRef.current.requestFullscreen) { + // iOS Safari uses video element's webkitEnterFullscreen + if ((videoRef.current as any).webkitEnterFullscreen) { + try { + (videoRef.current as any).webkitEnterFullscreen(); + } catch (err) { + console.warn('iOS fullscreen error:', err); + } + } else if (containerRef.current.requestFullscreen) { containerRef.current.requestFullscreen(); } } else { - if (document.exitFullscreen) { + // iOS Safari uses video element's webkitExitFullscreen + if ((videoRef.current as any).webkitExitFullscreen) { + try { + (videoRef.current as any).webkitExitFullscreen(); + } catch (err) { + console.warn('iOS exit fullscreen error:', err); + } + } else if (document.exitFullscreen) { document.exitFullscreen(); } } @@ -387,11 +401,30 @@ export function MobileVideoPlayer({ useEffect(() => { const handleFullscreenChange = () => { - setIsFullscreen(!!document.fullscreenElement); + setIsFullscreen(!!document.fullscreenElement || !!(videoRef.current as any)?.webkitDisplayingFullscreen); + }; + + const handleWebkitFullscreenChange = () => { + setIsFullscreen(!!(videoRef.current as any)?.webkitDisplayingFullscreen); }; document.addEventListener('fullscreenchange', handleFullscreenChange); - return () => document.removeEventListener('fullscreenchange', handleFullscreenChange); + document.addEventListener('webkitfullscreenchange', handleFullscreenChange); + + // iOS Safari specific events + if (videoRef.current) { + videoRef.current.addEventListener('webkitbeginfullscreen', handleWebkitFullscreenChange); + videoRef.current.addEventListener('webkitendfullscreen', handleWebkitFullscreenChange); + } + + return () => { + document.removeEventListener('fullscreenchange', handleFullscreenChange); + document.removeEventListener('webkitfullscreenchange', handleFullscreenChange); + if (videoRef.current) { + videoRef.current.removeEventListener('webkitbeginfullscreen', handleWebkitFullscreenChange); + videoRef.current.removeEventListener('webkitendfullscreen', handleWebkitFullscreenChange); + } + }; }, []); const togglePictureInPicture = async () => { @@ -493,7 +526,7 @@ export function MobileVideoPlayer({ {/* Controls */}
{/* Left: Play + Time */}
- @@ -535,11 +579,20 @@ export function MobileVideoPlayer({ {/* Right: More + Fullscreen */}
{/* More Menu Button */} -
+
{/* Fullscreen Button */} -