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 */}
-