| import { TooltipAnchor } from '@librechat/client'; |
| import { useLocalize } from '~/hooks'; |
| import { cn } from '~/utils'; |
|
|
| export default function NavToggle({ |
| onToggle, |
| navVisible, |
| isHovering, |
| setIsHovering, |
| side = 'left', |
| className = '', |
| translateX = true, |
| }: { |
| onToggle: () => void; |
| navVisible: boolean; |
| isHovering: boolean; |
| setIsHovering: (isHovering: boolean) => void; |
| side?: 'left' | 'right'; |
| className?: string; |
| translateX?: boolean; |
| }) { |
| const localize = useLocalize(); |
| const transition = { |
| transition: 'transform 0.3s ease, opacity 0.2s ease', |
| }; |
|
|
| const rotationDegree = 15; |
| const rotation = isHovering || !navVisible ? `${rotationDegree}deg` : '0deg'; |
| const topBarRotation = side === 'right' ? `-${rotation}` : rotation; |
| const bottomBarRotation = side === 'right' ? rotation : `-${rotation}`; |
|
|
| return ( |
| <div |
| className={cn( |
| className, |
| '-translate-y-1/2 transition-transform', |
| navVisible ? 'rotate-0' : 'rotate-180', |
| navVisible && translateX ? 'translate-x-[260px]' : 'translate-x-0', |
| )} |
| onMouseEnter={() => setIsHovering(true)} |
| onMouseLeave={() => setIsHovering(false)} |
| > |
| <TooltipAnchor |
| side={side === 'right' ? 'left' : 'right'} |
| aria-label={side === 'left' ? localize('com_ui_chat_history') : localize('com_ui_controls')} |
| aria-expanded={navVisible} |
| aria-controls={side === 'left' ? 'chat-history-nav' : 'controls-nav'} |
| id={`toggle-${side}-nav`} |
| onClick={onToggle} |
| role="button" |
| description={ |
| navVisible ? localize('com_nav_close_sidebar') : localize('com_nav_open_sidebar') |
| } |
| className="flex items-center justify-center" |
| tabIndex={0} |
| > |
| <span className="" data-state="closed"> |
| <div |
| className="flex h-[72px] w-8 items-center justify-center" |
| style={{ ...transition, opacity: isHovering ? 1 : 0.25 }} |
| > |
| <div className="flex h-6 w-6 flex-col items-center"> |
| {/* Top bar */} |
| <div |
| className="h-3 w-1 rounded-full bg-black dark:bg-white" |
| style={{ |
| ...transition, |
| transform: `translateY(0.15rem) rotate(${topBarRotation}) translateZ(0px)`, |
| }} |
| /> |
| {/* Bottom bar */} |
| <div |
| className="h-3 w-1 rounded-full bg-black dark:bg-white" |
| style={{ |
| ...transition, |
| transform: `translateY(-0.15rem) rotate(${bottomBarRotation}) translateZ(0px)`, |
| }} |
| /> |
| </div> |
| </div> |
| </span> |
| </TooltipAnchor> |
| </div> |
| ); |
| } |
|
|