11"use client" ;
2+ import { useState } from "react" ;
23import { usePathname } from "next/navigation" ;
34import Link from "next/link" ;
45import Image from "next/image" ;
@@ -8,17 +9,24 @@ import { cx } from "lib/cx";
89export const TopNavBar = ( ) => {
910 const pathName = usePathname ( ) ;
1011 const isHomePage = pathName === "/" ;
12+ const [ isMenuOpen , setIsMenuOpen ] = useState ( false ) ;
13+
14+ const navItems = [
15+ [ "/resume-builder" , "Builder" ] ,
16+ [ "/resume-parser" , "Parser" ] ,
17+ ] ;
1118
1219 return (
1320 < header
1421 aria-label = "Site Header"
1522 className = { cx (
16- "flex h-[var(--top-nav-bar-height)] items-center border-b-2 border-gray-100 px-3 lg:px-12" ,
23+ "relative border-b-2 border-gray-100 px-3 lg:px-12" ,
1724 isHomePage && "bg-dot"
1825 ) }
1926 >
20- < div className = "flex h-10 w-full items-center justify-between" >
21- < Link href = "/" >
27+ < div className = "flex h-[var(--top-nav-bar-height)] items-center justify-between" >
28+ { /* Logo */ }
29+ < Link href = "/" onClick = { ( ) => setIsMenuOpen ( false ) } >
2230 < span className = "sr-only" > OpenResume</ span >
2331 < Image
2432 src = { logoSrc }
@@ -27,14 +35,13 @@ export const TopNavBar = () => {
2735 priority
2836 />
2937 </ Link >
38+
39+ { /* Desktop Navigation */ }
3040 < nav
3141 aria-label = "Site Nav Bar"
32- className = "flex items-center gap-2 text-sm font-medium"
42+ className = "hidden items-center gap-2 text-sm font-medium md:flex "
3343 >
34- { [
35- [ "/resume-builder" , "Builder" ] ,
36- [ "/resume-parser" , "Parser" ] ,
37- ] . map ( ( [ href , text ] ) => (
44+ { navItems . map ( ( [ href , text ] ) => (
3845 < Link
3946 key = { text }
4047 className = "rounded-md px-1.5 py-2 text-gray-500 hover:bg-gray-100 focus-visible:bg-gray-100 lg:px-4"
@@ -53,7 +60,51 @@ export const TopNavBar = () => {
5360 />
5461 </ div >
5562 </ nav >
63+
64+ { /* Hamburger Button (Mobile/Tablet) */ }
65+ < button
66+ type = "button"
67+ className = "flex flex-col gap-1 p-2 md:hidden"
68+ aria-label = "Toggle navigation menu"
69+ aria-expanded = { isMenuOpen }
70+ onClick = { ( ) => setIsMenuOpen ( ! isMenuOpen ) }
71+ >
72+ < span className = "block h-0.5 w-6 bg-gray-700" > </ span >
73+ < span className = "block h-0.5 w-6 bg-gray-700" > </ span >
74+ < span className = "block h-0.5 w-6 bg-gray-700" > </ span >
75+ </ button >
5676 </ div >
77+
78+ { /* Mobile Navigation Menu */ }
79+ { isMenuOpen && (
80+ < nav
81+ aria-label = "Mobile Site Navigation"
82+ className = "absolute left-0 top-full z-50 w-full border-b-2 border-gray-100 bg-white shadow-md md:hidden"
83+ >
84+ < div className = "flex flex-col px-3 py-2" >
85+ { navItems . map ( ( [ href , text ] ) => (
86+ < Link
87+ key = { text }
88+ href = { href }
89+ onClick = { ( ) => setIsMenuOpen ( false ) }
90+ className = "rounded-md px-3 py-3 text-gray-500 hover:bg-gray-100"
91+ >
92+ { text }
93+ </ Link >
94+ ) ) }
95+
96+ < div className = "px-3 py-2" >
97+ < iframe
98+ src = "https://ghbtns.com/github-btn.html?user=xitanggg& repo = open - resume & type = star & count = true "
99+ width = "100"
100+ height = "20"
101+ className = "overflow-hidden border-none"
102+ title = "GitHub"
103+ />
104+ </ div >
105+ </ div >
106+ </ nav >
107+ ) }
57108 </ header >
58109 ) ;
59- } ;
110+ } ;
0 commit comments