Skip to content

Commit db17007

Browse files
committed
Improvements to the section dividers
1 parent b4735c2 commit db17007

4 files changed

Lines changed: 56 additions & 24 deletions

File tree

apps/webapp/app/components/navigation/EnvironmentSelector.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export function EnvironmentSelector({
9191
isOpen={isMenuOpen}
9292
overflowHidden
9393
fullWidth
94-
className={cn("h-8 overflow-hidden py-1 pl-0.5", className)}
94+
className={cn("h-8 overflow-hidden py-1 pl-1.5", className)}
9595
>
9696
<span className="flex items-center gap-1.5 text-sm text-text-bright">
9797
<EnvironmentIcon environment={environment} className="size-5 shrink-0" />

apps/webapp/app/components/navigation/SideMenu.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ export function SideMenu({
156156
<div
157157
className={cn(
158158
"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-14" : "w-56"
159+
isCollapsed ? "w-12" : "w-56"
160160
)}
161161
>
162162
<CollapseToggle isCollapsed={isCollapsed} onToggle={() => setIsCollapsed(!isCollapsed)} />
@@ -240,7 +240,7 @@ export function SideMenu({
240240
</div>
241241
</div>
242242

243-
<div>
243+
<div className="space-y-px">
244244
<SideMenuItem
245245
name="Tasks"
246246
icon={TaskIconSmall}

apps/webapp/app/components/navigation/SideMenuItem.tsx

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,32 @@ export function SideMenuItem({
4848
className="flex min-w-0 flex-1 items-center justify-between overflow-hidden"
4949
initial={false}
5050
animate={{
51-
opacity: isCollapsed ? 0 : 1,
5251
width: isCollapsed ? 0 : "auto",
5352
}}
5453
transition={{ duration: 0.15, ease: "easeOut" }}
5554
>
56-
<span className="truncate text-2sm">{name}</span>
57-
{badge && <div className="ml-1 flex shrink-0 items-center gap-1">{badge}</div>}
55+
<motion.span
56+
className="truncate text-2sm"
57+
initial={false}
58+
animate={{
59+
opacity: isCollapsed ? 0 : 1,
60+
}}
61+
transition={{ duration: 0.15, ease: "easeOut" }}
62+
>
63+
{name}
64+
</motion.span>
65+
{badge && (
66+
<motion.div
67+
className="ml-1 flex shrink-0 items-center gap-1"
68+
initial={false}
69+
animate={{
70+
opacity: isCollapsed ? 0 : 1,
71+
}}
72+
transition={{ duration: 0.15, ease: "easeOut" }}
73+
>
74+
{badge}
75+
</motion.div>
76+
)}
5877
</motion.div>
5978
</Link>
6079
);

apps/webapp/app/components/navigation/SideMenuSection.tsx

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,27 +30,39 @@ export function SideMenuSection({
3030
}, [isCollapsed, onCollapseToggle]);
3131

3232
return (
33-
<div>
34-
<motion.div
35-
className="flex cursor-pointer items-center gap-1 overflow-hidden rounded-sm py-1 pl-1.5 text-text-dimmed transition hover:bg-charcoal-750 hover:text-text-bright"
36-
onClick={handleToggle}
37-
initial={false}
38-
animate={{
39-
height: isSideMenuCollapsed ? 0 : "auto",
40-
opacity: isSideMenuCollapsed ? 0 : 1,
41-
marginBottom: isSideMenuCollapsed ? 0 : undefined,
42-
}}
43-
transition={{ duration: 0.15, ease: "easeOut" }}
44-
>
45-
<h2 className="text-xs whitespace-nowrap">{title}</h2>
33+
<div className="overflow-hidden">
34+
{/* Header container - stays in DOM to preserve height */}
35+
<div className="relative">
36+
{/* Header - fades out when sidebar is collapsed */}
4637
<motion.div
47-
initial={isCollapsed}
48-
animate={{ rotate: isCollapsed ? -90 : 0 }}
49-
transition={{ duration: 0.2 }}
38+
className="flex cursor-pointer items-center gap-1 overflow-hidden rounded-sm py-1 pl-1.5 text-text-dimmed transition hover:bg-charcoal-750 hover:text-text-bright"
39+
onClick={isSideMenuCollapsed ? undefined : handleToggle}
40+
style={{ cursor: isSideMenuCollapsed ? "default" : "pointer" }}
41+
initial={false}
42+
animate={{
43+
opacity: isSideMenuCollapsed ? 0 : 1,
44+
}}
45+
transition={{ duration: 0.15, ease: "easeOut" }}
5046
>
51-
<ToggleArrowIcon className="size-2" />
47+
<h2 className="text-xs whitespace-nowrap">{title}</h2>
48+
<motion.div
49+
initial={isCollapsed}
50+
animate={{ rotate: isCollapsed ? -90 : 0 }}
51+
transition={{ duration: 0.2 }}
52+
>
53+
<ToggleArrowIcon className="size-2" />
54+
</motion.div>
5255
</motion.div>
53-
</motion.div>
56+
{/* Divider - absolutely positioned, visible when sidebar is collapsed */}
57+
<motion.div
58+
className="absolute left-2 right-2 top-1 w-full h-px bg-grid-bright"
59+
initial={false}
60+
animate={{
61+
opacity: isSideMenuCollapsed ? 1 : 0,
62+
}}
63+
transition={{ duration: 0.15, ease: "easeOut" }}
64+
/>
65+
</div>
5466
<AnimatePresence initial={false}>
5567
<motion.div
5668
initial={isCollapsed ? "collapsed" : "expanded"}
@@ -73,6 +85,7 @@ export function SideMenuSection({
7385
style={{ overflow: "hidden" }}
7486
>
7587
<motion.div
88+
className="space-y-px"
7689
variants={{
7790
expanded: {
7891
translateY: 0,

0 commit comments

Comments
 (0)