55 BeakerIcon ,
66 BellAlertIcon ,
77 ChartBarIcon ,
8- ChevronLeftIcon ,
98 ChevronRightIcon ,
109 ClockIcon ,
1110 Cog8ToothIcon ,
@@ -28,6 +27,7 @@ import { motion } from "framer-motion";
2827import { useEffect , useRef , useState , type ReactNode } from "react" ;
2928import simplur from "simplur" ;
3029import { ConcurrencyIcon } from "~/assets/icons/ConcurrencyIcon" ;
30+ import { DropdownIcon } from "~/assets/icons/DropdownIcon" ;
3131import { BranchEnvironmentIconSmall } from "~/assets/icons/EnvironmentIcons" ;
3232import { ListCheckedIcon } from "~/assets/icons/ListCheckedIcon" ;
3333import { LogsIcon } from "~/assets/icons/LogsIcon" ;
@@ -88,13 +88,12 @@ import { Dialog, DialogTrigger } from "../primitives/Dialog";
8888import { Paragraph } from "../primitives/Paragraph" ;
8989import {
9090 Popover ,
91- PopoverArrowTrigger ,
9291 PopoverContent ,
9392 PopoverMenuItem ,
94- PopoverTrigger ,
93+ PopoverTrigger
9594} from "../primitives/Popover" ;
9695import { TextLink } from "../primitives/TextLink" ;
97- import { Tooltip , TooltipContent , TooltipProvider , TooltipTrigger } from "../primitives/Tooltip" ;
96+ import { SimpleTooltip , Tooltip , TooltipContent , TooltipProvider , TooltipTrigger } from "../primitives/Tooltip" ;
9897import { ShortcutsAutoOpen } from "../Shortcuts" ;
9998import { UserProfilePhoto } from "../UserProfilePhoto" ;
10099import { V4Badge } from "../V4Badge" ;
@@ -155,18 +154,18 @@ export function SideMenu({
155154 return (
156155 < div
157156 className = { cn (
158- "relative grid h-full grid-rows-[2.5rem_1fr_auto] border-r border-grid-bright bg-background-bright transition-all duration-200" ,
159- isCollapsed ? "w-12 " : "w-56"
157+ "relative grid h-full grid-cols-[100%] grid- rows-[2.5rem_1fr_auto] border-r border-grid-bright bg-background-bright transition-all duration-200" ,
158+ isCollapsed ? "w-[2.75rem] " : "w-56"
160159 ) }
161160 >
162161 < CollapseToggle isCollapsed = { isCollapsed } onToggle = { ( ) => setIsCollapsed ( ! isCollapsed ) } />
163162 < div
164163 className = { cn (
165- "flex items-center overflow-hidden border-b px-1 py-1 transition duration-300" ,
166- showHeaderDivider ? "border-grid-bright" : "border-transparent"
164+ "flex min-w-0 items-center overflow-hidden border-b px-1 py-1 transition duration-300" ,
165+ showHeaderDivider || isCollapsed ? "border-grid-bright" : "border-transparent"
167166 ) }
168167 >
169- < div className = "min-w-0 flex-1" >
168+ < div className = { cn ( "min-w-0" , ! isCollapsed && " flex-1") } >
170169 < ProjectSelector
171170 organizations = { organizations }
172171 organization = { organization }
@@ -198,9 +197,9 @@ export function SideMenu({
198197 className = "overflow-hidden overflow-y-auto pt-2 scrollbar-thin scrollbar-track-transparent scrollbar-thumb-charcoal-600"
199198 ref = { borderRef }
200199 >
201- < div className = { cn ( "mb-6 flex flex-col gap-4 overflow-hidden" , isCollapsed ? " px-0.5" : "px-1" ) } >
202- < div className = "space-y-1" >
203- < SideMenuHeader title = { "Environment" } isCollapsed = { isCollapsed } />
200+ < div className = "mb-6 flex w-full flex-col gap-4 overflow-hidden px-1" >
201+ < div className = "w-full space-y-1" >
202+ < SideMenuHeader title = { "Environment" } isCollapsed = { isCollapsed } collapsedTitle = "Env" />
204203 < div className = "flex items-center" >
205204 < EnvironmentSelector
206205 organization = { organization }
@@ -240,7 +239,7 @@ export function SideMenu({
240239 </ div >
241240 </ div >
242241
243- < div className = "space-y-px" >
242+ < div className = "w-full space-y-px" >
244243 < SideMenuItem
245244 name = "Tasks"
246245 icon = { TaskIconSmall }
@@ -459,52 +458,51 @@ function ProjectSelector({
459458 setOrgMenuOpen ( false ) ;
460459 } , [ navigation . location ?. pathname ] ) ;
461460
462- const triggerContent = (
463- < span className = "flex items-center gap-1.5 overflow-hidden" >
464- < Avatar avatar = { organization . avatar } size = { 1.25 } orgName = { organization . title } />
465- < motion . span
466- className = "flex items-center gap-1.5 overflow-hidden"
467- initial = { false }
468- animate = { {
469- opacity : isCollapsed ? 0 : 1 ,
470- width : isCollapsed ? 0 : "auto" ,
471- } }
472- transition = { { duration : 0.15 , ease : "easeOut" } }
473- >
474- < SelectorDivider />
475- < span className = "truncate text-2sm font-normal text-text-bright" >
476- { project . name ?? "Select a project" }
477- </ span >
478- </ motion . span >
479- </ span >
480- ) ;
481-
482461 return (
483462 < Popover onOpenChange = { ( open ) => setOrgMenuOpen ( open ) } open = { isOrgMenuOpen } >
484- { isCollapsed ? (
485- < TooltipProvider disableHoverableContent >
486- < Tooltip >
487- < TooltipTrigger asChild >
488- < PopoverTrigger className = "flex h-8 w-full items-center justify-center rounded px-1.5 transition-colors hover:bg-charcoal-750" >
489- { triggerContent }
490- </ PopoverTrigger >
491- </ TooltipTrigger >
492- < TooltipContent side = "right" className = "text-xs" >
493- { organization . title } / { project . name }
494- </ TooltipContent >
495- </ Tooltip >
496- </ TooltipProvider >
497- ) : (
498- < PopoverArrowTrigger
499- isOpen = { isOrgMenuOpen }
500- overflowHidden
501- className = "h-8 w-full justify-between py-1 pl-1.5"
502- >
503- { triggerContent }
504- </ PopoverArrowTrigger >
505- ) }
463+ < SimpleTooltip
464+ button = {
465+ < PopoverTrigger
466+ className = { cn (
467+ "group flex h-8 items-center rounded pl-[0.4375rem] transition-colors hover:bg-charcoal-750" ,
468+ isCollapsed ? "justify-center pr-0.5" : "w-full justify-between pr-1"
469+ ) }
470+ >
471+ < span className = "flex min-w-0 flex-1 items-center gap-1.5 overflow-hidden" >
472+ < Avatar avatar = { organization . avatar } size = { 1.25 } orgName = { organization . title } />
473+ < span
474+ className = { cn (
475+ "flex min-w-0 items-center gap-1.5 overflow-hidden transition-all duration-200" ,
476+ isCollapsed ? "max-w-0 opacity-0" : "max-w-[200px] opacity-100"
477+ ) }
478+ >
479+ < SelectorDivider />
480+ < span className = "truncate text-2sm font-normal text-text-bright" >
481+ { project . name ?? "Select a project" }
482+ </ span >
483+ </ span >
484+ </ span >
485+ < span
486+ className = { cn (
487+ "overflow-hidden transition-all duration-200" ,
488+ isCollapsed ? "max-w-0 opacity-0" : "max-w-[16px] opacity-100"
489+ ) }
490+ >
491+ < DropdownIcon className = "size-4 min-w-4 text-text-dimmed transition group-hover:text-text-bright" />
492+ </ span >
493+ </ PopoverTrigger >
494+ }
495+ content = { `${ organization . title } / ${ project . name } ` }
496+ side = "right"
497+ sideOffset = { 8 }
498+ hidden = { ! isCollapsed }
499+ buttonClassName = "!h-8"
500+ asChild
501+ />
506502 < PopoverContent
507503 className = "min-w-[16rem] overflow-y-auto p-0 scrollbar-thin scrollbar-track-transparent scrollbar-thumb-charcoal-600"
504+ side = { isCollapsed ? "right" : "bottom" }
505+ sideOffset = { isCollapsed ? 8 : 4 }
508506 align = "start"
509507 style = { { maxHeight : `calc(var(--radix-popover-content-available-height) - 10vh)` } }
510508 >
0 commit comments