11"use client" ;
22
33import {
4+ Drawer ,
5+ DrawerBody ,
6+ DrawerCloseButton ,
7+ DrawerContent ,
8+ DrawerHeader ,
9+ DrawerOverlay ,
10+ IconButton ,
411 Menu ,
512 MenuButton ,
613 MenuItem ,
714 MenuList ,
15+ VStack ,
16+ useDisclosure ,
817} from "@chakra-ui/react" ;
9- import { ChevronDownIcon } from "@chakra-ui/icons" ;
18+ import { ChevronDownIcon , HamburgerIcon } from "@chakra-ui/icons" ;
1019import { useStellarWallet } from "@/context/StellarWalletContext" ;
1120import NextLink from "next/link" ;
1221import { usePathname } from "next/navigation" ;
@@ -40,12 +49,21 @@ function Logo() {
4049 ) ;
4150}
4251
43- function NavLink ( { href, children } : { href : string ; children : React . ReactNode } ) {
52+ function NavLink ( {
53+ href,
54+ children,
55+ onClick,
56+ } : {
57+ href : string ;
58+ children : React . ReactNode ;
59+ onClick ?: ( ) => void ;
60+ } ) {
4461 const pathname = usePathname ( ) ;
4562 const isActive = pathname === href ;
4663 return (
4764 < NextLink
4865 href = { href }
66+ onClick = { onClick }
4967 className = { `text-sm transition-colors hover:text-[color:var(--chakra-colors-app-accent)] ${
5068 isActive
5169 ? "font-semibold text-[color:var(--chakra-colors-app-accent)]"
@@ -105,9 +123,46 @@ function formatCount(value: number | undefined | null): string {
105123 return value || value === 0 ? value . toLocaleString ( ) : "—" ;
106124}
107125
126+ function MobileNavDrawer ( {
127+ isOpen,
128+ onClose,
129+ isConnected,
130+ } : {
131+ isOpen : boolean ;
132+ onClose : ( ) => void ;
133+ isConnected : boolean ;
134+ } ) {
135+ return (
136+ < Drawer isOpen = { isOpen } placement = "right" onClose = { onClose } >
137+ < DrawerOverlay />
138+ < DrawerContent bg = "app.surface" >
139+ < DrawerCloseButton color = "app.text" />
140+ < DrawerHeader borderBottom = "1px solid" borderColor = "app.border" >
141+ < Logo />
142+ </ DrawerHeader >
143+ < DrawerBody pt = { 6 } >
144+ < VStack align = "stretch" spacing = { 5 } fontSize = "lg" >
145+ < NavLink href = "/" onClick = { onClose } > Home</ NavLink >
146+ { isConnected && < NavLink href = "/farm" onClick = { onClose } > Farm</ NavLink > }
147+ < NavLink href = "/history" onClick = { onClose } > History</ NavLink >
148+ { isConnected && < NavLink href = "/leaderboard" onClick = { onClose } > Leaderboard</ NavLink > }
149+ < NavLink href = "/contributors" onClick = { onClose } > Contributors</ NavLink >
150+ { MORE_LINKS . map ( ( link ) => (
151+ < NavLink key = { link . href } href = { link . href } onClick = { onClose } >
152+ { link . label }
153+ </ NavLink >
154+ ) ) }
155+ </ VStack >
156+ </ DrawerBody >
157+ </ DrawerContent >
158+ </ Drawer >
159+ ) ;
160+ }
161+
108162export default function Navbar ( ) {
109163 const { isConnected, publicKey } = useStellarWallet ( ) ;
110164 const { data : stats } = usePlatformStats ( ) ;
165+ const { isOpen, onOpen, onClose } = useDisclosure ( ) ;
111166
112167 return (
113168 < nav
@@ -120,12 +175,20 @@ export default function Navbar() {
120175 < div className = "mx-auto flex w-full max-w-[1400px] flex-col gap-3 px-4 py-4 lg:h-20 lg:min-h-20 lg:w-[95%] lg:flex-row lg:items-center lg:justify-between lg:gap-4 lg:px-0 lg:py-0" >
121176 < div className = "flex w-full items-center justify-between lg:w-auto" >
122177 < Logo />
123- < div className = "block lg:hidden" >
178+ < div className = "flex items-center gap-2 lg:hidden" >
124179 < ThemeToggle />
180+ < IconButton
181+ aria-label = "Open menu"
182+ icon = { < HamburgerIcon /> }
183+ variant = "ghost"
184+ color = "app.text"
185+ size = "sm"
186+ onClick = { onOpen }
187+ />
125188 </ div >
126189 </ div >
127190
128- < div className = "flex flex-wrap items-center gap-4 lg:gap-7" >
191+ < div className = "hidden items-center gap-4 lg:flex lg:gap-7" >
129192 < NavLink href = "/" > Home</ NavLink >
130193 { isConnected && < NavLink href = "/farm" > Farm</ NavLink > }
131194 < NavLink href = "/history" > History</ NavLink >
@@ -149,6 +212,8 @@ export default function Navbar() {
149212 </ div >
150213 </ div >
151214 </ div >
215+
216+ < MobileNavDrawer isOpen = { isOpen } onClose = { onClose } isConnected = { isConnected } />
152217 </ nav >
153218 ) ;
154219}
0 commit comments