Skip to content

Commit a18a41b

Browse files
authored
Merge pull request #67 from UoaWDCC/feat-hamburger-nav
HAMBURGER mahburger
2 parents bd34262 + 2135566 commit a18a41b

File tree

2 files changed

+92
-9
lines changed

2 files changed

+92
-9
lines changed

src/app/(frontend)/styles.css

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,25 @@
134134
@apply bg-background text-foreground;
135135
}
136136
}
137+
138+
.hamburger-line {
139+
@apply block h-[3px] w-full bg-tansa-cream rounded transition-all duration-300 ease-out;
140+
}
141+
142+
/* Transform animation when menu is open */
143+
.open .hamburger-line:nth-child(1) {
144+
@apply translate-y-2 rotate-45;
145+
}
146+
147+
.open .hamburger-line:nth-child(2) {
148+
@apply opacity-0;
149+
}
150+
151+
.open .hamburger-line:nth-child(3) {
152+
@apply -translate-y-2.5 -rotate-45;
153+
}
154+
155+
/* Change to BLUE when open */
156+
.open .hamburger-line {
157+
@apply bg-tansa-blue;
158+
}

src/components/Header.tsx

Lines changed: 70 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
import Link from 'next/link'
33
import React, { useState, useEffect } from 'react'
44
import Image from 'next/image'
5-
import { ArrowRight, MoveRight, PawPrint } from 'lucide-react'
5+
import { ArrowRight, MoveRight, PawPrint, Menu, X} from 'lucide-react'
66
import { usePathname, useRouter } from 'next/navigation'
77

88
const Header = () => {
99
const pathname = usePathname()
1010
const router = useRouter()
1111
const [loadingPath, setLoadingPath] = useState<string | null>(null)
12+
const [menuOpen, setMenuOpen] = useState(false)
1213

1314
const navItems = [
1415
{ href: '/', label: 'Home' },
@@ -22,6 +23,7 @@ const Header = () => {
2223
if (pathname !== href) {
2324
setLoadingPath(href)
2425
router.push(href)
26+
setMenuOpen(false)
2527
}
2628
}
2729

@@ -31,11 +33,12 @@ const Header = () => {
3133
}, [pathname])
3234

3335
return (
34-
<header className="sticky top-0 z-50 px-4 py-4 bg-tansa-blue">
36+
<header className="sticky top-0 z-40 px-6 py-5 bg-tansa-blue">
3537
<div className="flex items-center justify-between w-full">
3638
{/*Left Side Element*/}
3739
<Link href="/" className="flex-1">
38-
<div className="flex items-center space-x-6 group">
40+
{/*Desktop Logo*/}
41+
<div className="hidden md:flex items-center space-x-6 group">
3942
<div className="h-16 w-16 rounded-full flex items-center justify-center transition-transform duration-300 group-hover:scale-110">
4043
<Image
4144
src="/TANSA-LOGO.svg"
@@ -55,6 +58,18 @@ const Header = () => {
5558
</h2>
5659
</div>
5760
</div>
61+
{/*Mobile Logo*/}
62+
<div className="flex items-center space-x-2 mb-8">
63+
<Image
64+
src="/TANSA-LOGO.svg"
65+
alt="TANSA bear logo"
66+
width={40}
67+
height={40}
68+
/>
69+
<h1 className="text-sm font-semibold text-tansa-cream">
70+
Taiwanese and New Zealand<br />Students' Association
71+
</h1>
72+
</div>
5873
</Link>
5974

6075
{/* Navigation */}
@@ -87,19 +102,18 @@ const Header = () => {
87102
</ul>
88103
</nav>
89104

90-
{/* Right Side Elements */}
91-
<div className="flex-1 flex justify-end">
92-
<div className="flex items-center space-x-4">
93-
{/* Snowflake Icon */}
105+
{/* Right Side Elements*/}
106+
<div className="flex items-center">
107+
{/* Desktop Right Side */}
108+
<div className="hidden md:flex items-center space-x-4">
94109
<Link
95110
href="https://linktr.ee/tansa.ausa"
96-
target="blank"
111+
target="_blank"
97112
className="text-white transition-all duration-300 hover:scale-110"
98113
>
99114
<Image src="/icons/linktree.svg" width={20} height={20} alt="LinkTree" />
100115
</Link>
101116

102-
{/* Join Us Button */}
103117
<Link
104118
href="/sign-up"
105119
className="bg-tansa-cream text-tansa-blue px-3 py-2 rounded-full font-bold transition-transform duration-200 group-hover:-translate-x-6 flex items-center group relative min-w-[110px]"
@@ -115,7 +129,54 @@ const Header = () => {
115129
</span>
116130
</Link>
117131
</div>
132+
{/* Mobile Hamburger */}
133+
<div className="md:hidden ml-2 pt-5 pb-11 pr-2 z-50 mx-auto">
134+
<button
135+
onClick={() => setMenuOpen(!menuOpen)}
136+
className={`group flex flex-col gap-1.5 w-8 h-8 justify-center items-center focus:outline-none ${
137+
menuOpen ? "open" : ""
138+
}`}
139+
>
140+
<span className="hamburger-line" />
141+
<span className="hamburger-line" />
142+
<span className="hamburger-line" />
143+
</button>
144+
</div>
118145
</div>
146+
{/* Mobile Dropdown Menu */}
147+
{menuOpen && (
148+
<div className="md:hidden absolute top-0 left-0 right-0 bg-tansa-cream shadow-lg z-40 px-6 pt-8 pb-8 transform transition-all duration-500 ease-out">
149+
150+
{/* Mobile Logo */}
151+
<div className="flex items-center space-x-2 mb-8">
152+
<Image
153+
src="/TANSA-LOGO.svg"
154+
alt="TANSA bear logo"
155+
width={40}
156+
height={40}
157+
/>
158+
<h1 className="text-sm font-semibold text-tansa-blue">
159+
Taiwanese and New Zealand<br />Students' Association
160+
</h1>
161+
</div>
162+
163+
<ul className="flex flex-col items-start space-y-6 text-lg text-tansa-blue font-semibold">
164+
{/* Links */}
165+
{navItems
166+
.filter((item) => item.href !== '/') // skip Home
167+
.map((item) => (
168+
<li key={item.href}>
169+
<button
170+
onClick={() => handleClick(item.href)}
171+
className="text-lg text-tansa-blue"
172+
>
173+
{item.label}
174+
</button>
175+
</li>
176+
))}
177+
</ul>
178+
</div>
179+
)}
119180
</div>
120181
</header>
121182
)

0 commit comments

Comments
 (0)