diff --git a/packages/ui/src/components/layout/Header.tsx b/packages/ui/src/components/layout/Header.tsx index 1dfd17bd..180a79de 100644 --- a/packages/ui/src/components/layout/Header.tsx +++ b/packages/ui/src/components/layout/Header.tsx @@ -655,7 +655,6 @@ export const Header: React.FC = ({ const { t } = useI18n(); const setSessionSwitcherOpen = useUIStore((state) => state.setSessionSwitcherOpen); const toggleSidebar = useUIStore((state) => state.toggleSidebar); - const setRightSidebarOpen = useUIStore((state) => state.setRightSidebarOpen); const toggleBottomTerminal = useUIStore((state) => state.toggleBottomTerminal); const toggleRightSidebar = useUIStore((state) => state.toggleRightSidebar); const openContextOverview = useUIStore((state) => state.openContextOverview); @@ -1344,6 +1343,45 @@ export const Header: React.FC = ({ const desktopHeaderIconButtonClass = DESKTOP_HEADER_ICON_BUTTON_CLASS; const mobileHeaderIconButtonClass = MOBILE_HEADER_ICON_BUTTON_CLASS; + const mobileActiveHeaderItem = React.useMemo(() => { + if (isMobileRateLimitsOpen) { + return 'services'; + } + if (leftDrawerOpen) { + return 'sessions'; + } + if (rightDrawerOpen) { + return 'git'; + } + return activeMainTab; + }, [activeMainTab, isMobileRateLimitsOpen, leftDrawerOpen, rightDrawerOpen]); + + const closeMobileHeaderPanels = React.useCallback(() => { + setIsMobileRateLimitsOpen(false); + if (leftDrawerOpen && onToggleLeftDrawer) { + onToggleLeftDrawer(); + } + if (rightDrawerOpen && onToggleRightDrawer) { + onToggleRightDrawer(); + } + if (!onToggleLeftDrawer && isSessionSwitcherOpen) { + setSessionSwitcherOpen(false); + } + }, [isSessionSwitcherOpen, leftDrawerOpen, onToggleLeftDrawer, onToggleRightDrawer, rightDrawerOpen, setSessionSwitcherOpen]); + + const handleMobileLeftDrawerToggle = React.useCallback(() => { + if (!leftDrawerOpen) { + setIsMobileRateLimitsOpen(false); + } + onToggleLeftDrawer?.(); + }, [leftDrawerOpen, onToggleLeftDrawer]); + + const handleMobileRightDrawerToggle = React.useCallback(() => { + if (!rightDrawerOpen) { + setIsMobileRateLimitsOpen(false); + } + onToggleRightDrawer?.(); + }, [onToggleRightDrawer, rightDrawerOpen]); const desktopPaddingClass = React.useMemo(() => { if ((isDesktopApp && isMacPlatform && !isDesktopWindowFullscreen) || isTabletStandalonePwa) { @@ -1629,7 +1667,8 @@ export const Header: React.FC = ({ if (num >= 1 && num <= tabs.length) { e.preventDefault(); if (isMobile) { - setRightSidebarOpen(false); + blurActiveElement(); + closeMobileHeaderPanels(); } setActiveMainTab(tabs[num - 1].id); } @@ -1637,7 +1676,7 @@ export const Header: React.FC = ({ }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); - }, [isMobile, setActiveMainTab, setRightSidebarOpen, tabs]); + }, [blurActiveElement, closeMobileHeaderPanels, isMobile, setActiveMainTab, tabs]); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { @@ -1943,10 +1982,10 @@ export const Header: React.FC = ({ {onToggleLeftDrawer ? ( )} - {isSessionSwitcherOpen && ( + {!onToggleLeftDrawer && isSessionSwitcherOpen && ( {t('header.sessions.title')} )} - {/* Hide tabs and right-side buttons when sessions sidebar is open */} - {!isSessionSwitcherOpen && ( + {(!isSessionSwitcherOpen || Boolean(onToggleLeftDrawer)) && ( <>
@@ -2000,7 +2038,7 @@ export const Header: React.FC = ({ onClick={() => { if (isMobile) { blurActiveElement(); - setRightSidebarOpen(false); + closeMobileHeaderPanels(); } setActiveMainTab(tab.id); }} @@ -2010,7 +2048,7 @@ export const Header: React.FC = ({ className={cn( mobileHeaderIconButtonClass, 'relative rounded-lg', - isActive && 'bg-interactive-selection text-interactive-selection-foreground' + mobileActiveHeaderItem === tab.id && 'bg-interactive-selection text-interactive-selection-foreground' )} > {isDiffTab ? ( @@ -2057,6 +2095,14 @@ export const Header: React.FC = ({ { + if (open) { + if (leftDrawerOpen && onToggleLeftDrawer) { + onToggleLeftDrawer(); + } + if (rightDrawerOpen && onToggleRightDrawer) { + onToggleRightDrawer(); + } + } setIsMobileRateLimitsOpen(open); if (open && quotaResults.length === 0) { fetchAllQuotas(); @@ -2069,7 +2115,10 @@ export const Header: React.FC = ({ @@ -2082,10 +2131,11 @@ export const Header: React.FC = ({
-
+
= ({
diff --git a/packages/ui/src/components/ui/dropdown-menu.tsx b/packages/ui/src/components/ui/dropdown-menu.tsx index 0125e0cc..942fa3dd 100644 --- a/packages/ui/src/components/ui/dropdown-menu.tsx +++ b/packages/ui/src/components/ui/dropdown-menu.tsx @@ -94,6 +94,7 @@ type ContentProps = { side?: "top" | "right" | "bottom" | "left"; alignOffset?: number; portalToBody?: boolean; + positionerClassName?: string; style?: React.CSSProperties; className?: string; children?: React.ReactNode; @@ -107,6 +108,7 @@ function DropdownMenuContent({ side, alignOffset, portalToBody = false, + positionerClassName, style, children, onCloseAutoFocus, @@ -122,7 +124,7 @@ function DropdownMenuContent({ align={align} side={side} alignOffset={alignOffset} - className="z-50" + className={cn("z-50", positionerClassName)} >