Skip to content

Commit 50a3fb4

Browse files
committed
Add responsive navbar with hamburger menu for mobile and tablet devices
1 parent 4f8255a commit 50a3fb4

1 file changed

Lines changed: 60 additions & 9 deletions

File tree

src/app/components/TopNavBar.tsx

Lines changed: 60 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
"use client";
2+
import { useState } from "react";
23
import { usePathname } from "next/navigation";
34
import Link from "next/link";
45
import Image from "next/image";
@@ -8,17 +9,24 @@ import { cx } from "lib/cx";
89
export 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

Comments
 (0)