11import { Link } from "react-router-dom" ;
22import ThemeToggle from "./ThemeToggle" ;
3+ import { ChevronDown } from "lucide-react" ;
4+ import { useState , useRef , useEffect } from "react" ;
35
46export default function Navbar ( { theme, setTheme } ) {
7+ const [ userOpen , setUserOpen ] = useState ( false ) ;
8+ const userRef = useRef ( null ) ;
9+
10+ useEffect ( ( ) => {
11+ function handleClickOutside ( e ) {
12+ if ( userRef . current && ! userRef . current . contains ( e . target ) ) {
13+ setUserOpen ( false ) ;
14+ }
15+ }
16+ document . addEventListener ( "mousedown" , handleClickOutside ) ;
17+ return ( ) => document . removeEventListener ( "mousedown" , handleClickOutside ) ;
18+ } , [ ] ) ;
519
620 return (
721 < header className = "fixed top-0 z-50 w-full px-6" >
@@ -34,25 +48,9 @@ export default function Navbar({ theme, setTheme }) {
3448 { /* Center: Navigation */ }
3549 < div className = "hidden md:flex gap-6 text-lg font-medium" >
3650 < Link
37- key = "home"
38- to = "/"
39- className = "
40- text-slate-600 dark:text-slate-300
41- hover:text-cyan-500 dark:hover:text-cyan-400
42- relative
43- after:absolute after:bottom-[-6px] after:left-0
44- after:w-0 after:h-[2px]
45- after:bg-cyan-500 dark:after:bg-cyan-400
46- after:transition-all after:duration-300
47- hover:after:w-full
48- "
49- >
50- Home
51- </ Link >
52- < Link
53- key = "Blogs"
54- to = "/blogs"
55- className = "
51+ key = "home"
52+ to = "/"
53+ className = "
5654 text-slate-600 dark:text-slate-300
5755 hover:text-cyan-500 dark:hover:text-cyan-400
5856 relative
@@ -62,13 +60,13 @@ export default function Navbar({ theme, setTheme }) {
6260 after:transition-all after:duration-300
6361 hover:after:w-full
6462 "
65- >
66- Blogs
63+ >
64+ Home
6765 </ Link >
6866 < Link
69- key = "User "
70- to = "/user "
71- className = "
67+ key = "Blogs "
68+ to = "/blogs "
69+ className = "
7270 text-slate-600 dark:text-slate-300
7371 hover:text-cyan-500 dark:hover:text-cyan-400
7472 relative
@@ -78,13 +76,67 @@ export default function Navbar({ theme, setTheme }) {
7876 after:transition-all after:duration-300
7977 hover:after:w-full
8078 "
81- >
82- User
79+ >
80+ Blogs
8381 </ Link >
82+
83+ { /* User Dropdown */ }
84+ < div className = "relative" ref = { userRef } >
85+ < button
86+ onClick = { ( ) => setUserOpen ( ! userOpen ) }
87+ className = "
88+ flex items-center gap-1
89+ text-slate-600 dark:text-slate-300
90+ hover:text-cyan-500 dark:hover:text-cyan-400
91+ relative
92+ after:absolute after:bottom-[-6px] after:left-0
93+ after:w-0 after:h-[2px]
94+ after:bg-cyan-500 dark:after:bg-cyan-400
95+ after:transition-all after:duration-300
96+ hover:after:w-full
97+ "
98+ >
99+ User_name
100+ < ChevronDown
101+ size = { 14 }
102+ className = { `transition-transform duration-200 ${
103+ userOpen ? "rotate-180" : ""
104+ } `}
105+ />
106+ </ button >
107+
108+ < div
109+ className = { `
110+ absolute right-0 mt-4 w-48
111+ rounded-xl
112+
113+ bg-white/60 dark:bg-slate-900/60
114+ backdrop-blur-2xl
115+
116+ border border-slate-200/40 dark:border-slate-800/40
117+ shadow-lg
118+ overflow-hidden
119+ z-50
120+
121+ transition-all duration-200 ease-out
122+ transform
123+ ${
124+ userOpen
125+ ? "opacity-100 scale-100 translate-y-0 pointer-events-auto"
126+ : "opacity-0 scale-95 -translate-y-2 pointer-events-none"
127+ }
128+ ` }
129+ >
130+ < DropdownItem to = "/profile" label = "Profile" />
131+ < DropdownItem to = "/dashboard" label = "Dashboard" />
132+ < DropdownItem to = "/dashboard/blogs/new" label = "Create Blog" />
133+ </ div >
134+ </ div >
135+
84136 < Link
85- key = "Contact"
86- to = "/contact"
87- className = "
137+ key = "Contact"
138+ to = "/contact"
139+ className = "
88140 text-slate-600 dark:text-slate-300
89141 hover:text-cyan-500 dark:hover:text-cyan-400
90142 relative
@@ -94,13 +146,13 @@ export default function Navbar({ theme, setTheme }) {
94146 after:transition-all after:duration-300
95147 hover:after:w-full
96148 "
97- >
98- Contact Us
149+ >
150+ Contact Us
99151 </ Link >
100152 < Link
101- key = "about"
102- to = "/about"
103- className = "
153+ key = "about"
154+ to = "/about"
155+ className = "
104156 text-slate-600 dark:text-slate-300
105157 hover:text-cyan-500 dark:hover:text-cyan-400
106158 relative
@@ -110,8 +162,8 @@ export default function Navbar({ theme, setTheme }) {
110162 after:transition-all after:duration-300
111163 hover:after:w-full
112164 "
113- >
114- About Us
165+ >
166+ About Us
115167 </ Link >
116168 </ div >
117169
@@ -137,4 +189,20 @@ export default function Navbar({ theme, setTheme }) {
137189 </ nav >
138190 </ header >
139191 ) ;
192+
193+ function DropdownItem ( { to, label } ) {
194+ return (
195+ < Link
196+ to = { to }
197+ className = "
198+ block px-4 py-2
199+ text-slate-700 dark:text-slate-300
200+ hover:bg-slate-100 dark:hover:bg-slate-800
201+ transition-colors
202+ "
203+ >
204+ { label }
205+ </ Link >
206+ ) ;
207+ }
140208}
0 commit comments