diff --git a/components/player/desktop/DesktopMoreMenu.tsx b/components/player/desktop/DesktopMoreMenu.tsx index fe34519..45c1fa5 100644 --- a/components/player/desktop/DesktopMoreMenu.tsx +++ b/components/player/desktop/DesktopMoreMenu.tsx @@ -85,29 +85,13 @@ export function DesktopMoreMenu({ if (!buttonRef.current || !containerRef.current) return; if (!isRotated) { - // Normal Mode: Non-rotated, potentially non-fullscreen - // Use Viewport Coordinates (getBoundingClientRect) and Portal to Document Body - const buttonRect = buttonRef.current.getBoundingClientRect(); - const viewportHeight = window.innerHeight; - - const spaceBelow = viewportHeight - buttonRect.bottom - 10; - const spaceAbove = buttonRect.top - 10; - - const estimatedMenuHeight = 450; - const actualMenuHeight = menuRef.current?.offsetHeight || estimatedMenuHeight; - - const openUpward = spaceBelow < Math.min(actualMenuHeight, 300) && spaceAbove > spaceBelow; - const maxHeight = openUpward - ? Math.min(spaceAbove, actualMenuHeight) - : Math.min(spaceBelow, viewportHeight * 0.7); - + // Normal Mode: Non-rotated (Portrait on Mobile) + // Center the menu on screen for better visibility and touch access setMenuPosition({ - top: openUpward - ? buttonRect.top - 10 - : buttonRect.bottom + 10, - left: buttonRect.right, // Align right edge (transform handled in CSS) - maxHeight: `${maxHeight}px`, - openUpward: openUpward + top: window.innerHeight / 2, + left: window.innerWidth / 2, + maxHeight: '80vh', + openUpward: false }); } else { // Rotated Mode: Use Container Coordinates (offset loop) and Portal to Container @@ -188,18 +172,13 @@ export function DesktopMoreMenu({ ref={menuRef} className={`absolute z-[2147483647] bg-[var(--glass-bg)] backdrop-blur-[25px] saturate-[180%] rounded-[var(--radius-2xl)] border border-[var(--glass-border)] shadow-[var(--shadow-md)] p-1.5 sm:p-2 w-fit min-w-[200px] sm:min-w-[240px] animate-in fade-in zoom-in-95 duration-200 overflow-y-auto`} style={{ - top: isRotated - ? (menuPosition.openUpward ? 'auto' : `${menuPosition.top}px`) - : (menuPosition.openUpward - ? 'auto' - : `${menuPosition.top}px`), - bottom: isRotated - ? (menuPosition.openUpward ? `calc(100% - ${menuPosition.top}px + 10px)` : 'auto') - : (menuPosition.openUpward - ? `${window.innerHeight - menuPosition.top}px` - : 'auto'), + top: `${menuPosition.top}px`, // Always use absolute top left: `${menuPosition.left}px`, + // If not rotated (Centered), translate -50% -50% to center + // If rotated (Side), translate -100% 0 (or whatever previous logic was) + transform: !isRotated ? 'translate(-50%, -50%)' : 'translateX(-100%)', maxHeight: menuPosition.maxHeight, + bottom: 'auto' }} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave} diff --git a/components/player/desktop/DesktopRightControls.tsx b/components/player/desktop/DesktopRightControls.tsx index d18bc08..9ccf388 100644 --- a/components/player/desktop/DesktopRightControls.tsx +++ b/components/player/desktop/DesktopRightControls.tsx @@ -27,7 +27,7 @@ export function DesktopRightControls({ onShowCastMenu }: DesktopRightControlsProps) { return ( -
+
{/* Picture-in-Picture */} { isPiPSupported && ( diff --git a/components/player/desktop/DesktopSpeedMenu.tsx b/components/player/desktop/DesktopSpeedMenu.tsx index 2e14bc8..bbe7ead 100644 --- a/components/player/desktop/DesktopSpeedMenu.tsx +++ b/components/player/desktop/DesktopSpeedMenu.tsx @@ -52,32 +52,13 @@ export function DesktopSpeedMenu({ if (!buttonRef.current || !containerRef.current) return; if (!isRotated) { - // Normal Mode: Non-rotated, potentially non-fullscreen - // Use Viewport Coordinates (getBoundingClientRect) and Portal to Document Body - // This allows the menu to break out of the video container (overflow issue) - const buttonRect = buttonRef.current.getBoundingClientRect(); - // We want it to be positioned relative to the viewport - // buttonRect.top/left are already viewport coordinates - const viewportHeight = window.innerHeight; - - const spaceBelow = viewportHeight - buttonRect.bottom - 10; - const spaceAbove = buttonRect.top - 10; - - const estimatedMenuHeight = 250; - const actualMenuHeight = menuRef.current?.offsetHeight || estimatedMenuHeight; - - const openUpward = spaceBelow < Math.min(actualMenuHeight, 200) && spaceAbove > spaceBelow; - const maxHeight = openUpward - ? Math.min(spaceAbove, actualMenuHeight) - : Math.min(spaceBelow, viewportHeight * 0.7); - + // Normal Mode: Non-rotated (Portrait on Mobile) + // Center the menu on screen for better visibility and touch access setMenuPosition({ - top: openUpward - ? buttonRect.top - 10 // Bottom of menu at top of button - : buttonRect.bottom + 10, // Top of menu at bottom of button - left: buttonRect.right, // Align right edge (transform handled in CSS) - maxHeight: `${maxHeight}px`, - openUpward: openUpward + top: window.innerHeight / 2, + left: window.innerWidth / 2, + maxHeight: '80vh', + openUpward: false }); } else { // Rotated Mode: Fullscreen/Landscape forced @@ -161,19 +142,13 @@ export function DesktopSpeedMenu({ ref={menuRef} className={`absolute z-[2147483647] bg-[var(--glass-bg)] backdrop-blur-[25px] saturate-[180%] rounded-[var(--radius-2xl)] border border-[var(--glass-border)] shadow-[var(--shadow-md)] p-1 sm:p-1.5 w-fit min-w-[3.5rem] sm:min-w-[4.5rem] animate-in fade-in zoom-in-95 duration-200 overflow-y-auto`} style={{ - top: isRotated - ? (menuPosition.openUpward ? 'auto' : `${menuPosition.top}px`) - : (menuPosition.openUpward - ? 'auto' // Set via bottom if openUpward - : `${menuPosition.top}px`), - bottom: isRotated - ? (menuPosition.openUpward ? `calc(100% - ${menuPosition.top}px + 10px)` : 'auto') - : (menuPosition.openUpward - ? `${window.innerHeight - menuPosition.top}px` // Use calculated viewport top to derive bottom - : 'auto'), + top: `${menuPosition.top}px`, // Always use absolute top left: `${menuPosition.left}px`, - transform: 'translateX(-100%)', + // If not rotated (Centered), translate -50% -50% to center + // If rotated (Side), translate -100% 0 (or whatever previous logic was) + transform: !isRotated ? 'translate(-50%, -50%)' : 'translateX(-100%)', maxHeight: menuPosition.maxHeight, + bottom: 'auto' }} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}