@@ -18,6 +18,8 @@ import {
1818 Keyboard ,
1919 Scale ,
2020 BarChart3 ,
21+ Menu ,
22+ Sparkles ,
2123} from "lucide-react" ;
2224import { Button } from "@/components/ui/button" ;
2325import { Input } from "@/components/ui/input" ;
@@ -69,10 +71,10 @@ function SessionRow({
6971 < div
7072 onClick = { onOpen }
7173 className = { cn (
72- "group relative flex cursor-pointer items-center gap-2 rounded-lg border-l-2 px-2 py-2 text-sm transition-colors " ,
74+ "group relative flex cursor-pointer items-center gap-2 rounded-xl border px-2.5 py-2.5 text-sm transition-all " ,
7375 active
74- ? "border-primary bg-muted text-foreground"
75- : "border-transparent text-muted-foreground hover:border-border hover:bg-muted/60"
76+ ? "border-primary/25 bg-primary/10 text-foreground shadow-sm "
77+ : "border-transparent text-muted-foreground hover:border-border/70 hover:bg-muted/60"
7678 ) }
7779 >
7880 < MessageSquare className = "size-3.5 shrink-0" />
@@ -532,6 +534,9 @@ export default function Layout() {
532534 const [ shortcutsOpen , setShortcutsOpen ] = useState ( false ) ;
533535 const [ showOnboarding , setShowOnboarding ] = useState ( false ) ;
534536 const [ keybindings , setKeybindings ] = useState < Record < KeybindingAction , string > > ( DEFAULT_KEYBINDINGS ) ;
537+ const [ sidebarOpen , setSidebarOpen ] = useState ( false ) ;
538+
539+ useEffect ( ( ) => setSidebarOpen ( false ) , [ sessionId ] ) ;
535540
536541 useEffect ( ( ) => {
537542 if ( ! hasApi ) return ;
@@ -628,19 +633,26 @@ export default function Layout() {
628633 }
629634
630635 return (
631- < div className = "flex h-svh" >
632- < aside className = "flex w-64 shrink-0 flex-col border-r border-border bg-muted/40" >
633- < div className = "flex items-center justify-between px-3 py-3" >
634- < span className = "text-sm font-semibold tracking-tight" > { t . appName } </ span >
636+ < div className = "flex h-svh overflow-hidden" >
637+ { sidebarOpen && < button className = "fixed inset-0 z-30 bg-black/35 backdrop-blur-sm md:hidden" onClick = { ( ) => setSidebarOpen ( false ) } aria-label = "Close navigation" /> }
638+ < aside className = { cn (
639+ "surface-glass fixed inset-y-0 left-0 z-40 flex w-[18rem] shrink-0 flex-col border-r border-border/70 shadow-2xl transition-transform duration-200 md:static md:translate-x-0 md:shadow-none" ,
640+ sidebarOpen ? "translate-x-0" : "-translate-x-full"
641+ ) } >
642+ < div className = "flex items-center justify-between px-4 py-4" >
643+ < div className = "flex items-center gap-2.5" >
644+ < span className = "flex size-8 items-center justify-center rounded-xl bg-primary text-primary-foreground shadow-sm" > < Sparkles className = "size-4" /> </ span >
645+ < div > < span className = "block text-sm font-semibold tracking-tight" > { t . appName } </ span > < span className = "block text-[10px] font-medium uppercase tracking-[0.16em] text-muted-foreground" > AI workspace</ span > </ div >
646+ </ div >
635647 < ThemeToggle />
636648 </ div >
637649
638650 < div className = "flex flex-col gap-1.5 px-3 pb-3" >
639651 < Button
640652 onClick = { ( ) => handleNewChat ( ) }
641653 size = "sm"
642- variant = "outline "
643- className = "w-full justify-start gap-2"
654+ variant = "default "
655+ className = "h-9 w-full justify-start gap-2 rounded-xl shadow-sm "
644656 disabled = { ! hasApi }
645657 >
646658 < Plus className = "size-4" />
@@ -694,14 +706,14 @@ export default function Layout() {
694706 </ Button >
695707 </ div >
696708
697- < div className = "relative px-3 pb-2 " >
709+ < div className = "relative px-3 pb-3 pt-1 " >
698710 < Search className = "pointer-events-none absolute top-1/2 left-5 size-3.5 -translate-y-1/2 text-muted-foreground" />
699711 < Input
700712 value = { search }
701713 onChange = { ( e ) => setSearch ( e . target . value ) }
702714 placeholder = { t . searchChats }
703715 aria-label = { t . searchChats }
704- className = "h-8 pl-7 text-xs"
716+ className = "h-9 rounded-xl border-border/70 bg-background/70 pl-8 text-xs shadow-sm "
705717 />
706718 </ div >
707719
@@ -724,7 +736,7 @@ export default function Layout() {
724736 </ div >
725737 ) }
726738
727- < ScrollArea className = "flex-1 px-2" >
739+ < ScrollArea className = "flex-1 px-2.5 " >
728740 < div className = "flex flex-col gap-0.5 pb-2" >
729741 { projects . map ( ( project ) => (
730742 < ProjectGroup
@@ -757,7 +769,7 @@ export default function Layout() {
757769 </ div >
758770 </ ScrollArea >
759771
760- < div className = "flex border-t border-border p-2" >
772+ < div className = "flex border-t border-border/70 bg-background/30 p-2.5 " >
761773 < Button
762774 variant = "ghost"
763775 size = "sm"
@@ -780,7 +792,10 @@ export default function Layout() {
780792 </ div >
781793 </ aside >
782794
783- < main className = "flex-1 overflow-hidden" >
795+ < main className = "relative min-w-0 flex-1 overflow-hidden" >
796+ < Button variant = "outline" size = "icon" className = "surface-glass absolute left-3 top-3 z-30 shadow-md md:hidden" onClick = { ( ) => setSidebarOpen ( true ) } aria-label = "Open navigation" >
797+ < Menu className = "size-4" />
798+ </ Button >
784799 < Outlet />
785800 </ main >
786801
0 commit comments