@@ -4,50 +4,118 @@ import { useState, useEffect } from "react";
4
4
import Image from "next/image" ;
5
5
import Link from "next/link" ;
6
6
import logo from "../../public/logo.png" ;
7
+ import { Sun , Moon , Menu , X } from "lucide-react" ;
7
8
8
9
export default function Header ( ) {
9
10
const [ darkMode , setDarkMode ] = useState ( false ) ;
11
+ const [ mobileMenuOpen , setMobileMenuOpen ] = useState ( false ) ;
10
12
11
13
useEffect ( ( ) => {
12
- if ( darkMode ) {
14
+ // Check system preference initially
15
+ const prefersDark = window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches ;
16
+ setDarkMode ( prefersDark ) ;
17
+
18
+ if ( prefersDark ) {
13
19
document . documentElement . classList . add ( "dark" ) ;
14
20
} else {
15
21
document . documentElement . classList . remove ( "dark" ) ;
16
22
}
17
- } , [ darkMode ] ) ;
23
+ } , [ ] ) ;
18
24
19
- const toggleDarkMode = ( ) => setDarkMode ( ! darkMode ) ;
25
+ const toggleDarkMode = ( ) => {
26
+ setDarkMode ( ! darkMode ) ;
27
+ if ( darkMode ) {
28
+ document . documentElement . classList . remove ( "dark" ) ;
29
+ } else {
30
+ document . documentElement . classList . add ( "dark" ) ;
31
+ }
32
+ } ;
20
33
21
34
return (
22
- < header className = "w-full flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 shadow-sm" >
23
- < div className = "flex items-center space-x-4" >
24
- < Image
25
- src = { logo }
26
- alt = "FluentAI Logo"
27
- width = { 50 }
28
- height = { 50 }
29
- className = "transition-transform duration-300 hover:rotate-12"
30
- />
31
- < h1 className = "text-2xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-blue-500 to-teal-400" >
32
- FluentAI
33
- </ h1 >
35
+ < header className = "sticky top-0 z-50 w-full bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-700 shadow-sm transition-all duration-300" >
36
+ < div className = "max-w-6xl mx-auto px-4 sm:px-6 lg:px-8" >
37
+ < div className = "flex items-center justify-between h-16" >
38
+ < div className = "flex items-center space-x-4" >
39
+ < Link href = "/" className = "flex items-center space-x-3" >
40
+ < div className = "relative w-10 h-10 transition-transform duration-300 hover:rotate-12" >
41
+ < Image
42
+ src = { logo }
43
+ alt = "FluentAI Logo"
44
+ className = "object-contain"
45
+ fill
46
+ sizes = "2.5rem"
47
+ priority
48
+ />
49
+ </ div >
50
+ < h1 className = "text-2xl font-bold gradient-text" >
51
+ FluentAI
52
+ </ h1 >
53
+ </ Link >
54
+ </ div >
55
+
56
+ { /* Desktop navigation */ }
57
+ < nav className = "hidden md:flex items-center space-x-8" >
58
+ < Link
59
+ href = "/"
60
+ className = "text-gray-600 dark:text-gray-300 hover:text-blue-500 dark:hover:text-blue-400 font-medium transition-colors"
61
+ >
62
+ Home
63
+ </ Link >
64
+ < Link
65
+ href = "/library"
66
+ className = "text-gray-600 dark:text-gray-300 hover:text-blue-500 dark:hover:text-blue-400 font-medium transition-colors"
67
+ >
68
+ Library
69
+ </ Link >
70
+ < button
71
+ onClick = { toggleDarkMode }
72
+ className = "p-2 rounded-full bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300
73
+ hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors duration-300"
74
+ aria-label = "Toggle Dark Mode"
75
+ >
76
+ { darkMode ? < Sun size = { 20 } /> : < Moon size = { 20 } /> }
77
+ </ button >
78
+ </ nav >
79
+
80
+ { /* Mobile menu button */ }
81
+ < div className = "md:hidden flex items-center" >
82
+ < button
83
+ onClick = { toggleDarkMode }
84
+ className = "p-2 rounded-full bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300
85
+ hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors duration-300 mr-2"
86
+ aria-label = "Toggle Dark Mode"
87
+ >
88
+ { darkMode ? < Sun size = { 18 } /> : < Moon size = { 18 } /> }
89
+ </ button >
90
+ < button
91
+ onClick = { ( ) => setMobileMenuOpen ( ! mobileMenuOpen ) }
92
+ className = "p-2 rounded-md text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"
93
+ >
94
+ { mobileMenuOpen ? < X size = { 24 } /> : < Menu size = { 24 } /> }
95
+ </ button >
96
+ </ div >
97
+ </ div >
34
98
</ div >
35
- < div className = "flex items-center space-x-6" >
36
- < Link href = "/" className = "text-gray-600 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100" >
37
- Home
38
- </ Link >
39
- < Link href = "/library" className = "text-gray-600 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100" >
40
- Library
41
- </ Link >
99
+
100
+ { /* Mobile menu */ }
101
+ < div className = { `md:hidden transition-all duration-300 ease-in-out ${ mobileMenuOpen ? 'max-h-36 opacity-100' : 'max-h-0 opacity-0 overflow-hidden' } ` } >
102
+ < div className = "px-4 pt-2 pb-4 space-y-2 bg-white dark:bg-gray-900 shadow-lg" >
103
+ < Link
104
+ href = "/"
105
+ className = "block py-2 text-gray-600 dark:text-gray-300 hover:text-blue-500 dark:hover:text-blue-400 font-medium"
106
+ onClick = { ( ) => setMobileMenuOpen ( false ) }
107
+ >
108
+ Home
109
+ </ Link >
110
+ < Link
111
+ href = "/library"
112
+ className = "block py-2 text-gray-600 dark:text-gray-300 hover:text-blue-500 dark:hover:text-blue-400 font-medium"
113
+ onClick = { ( ) => setMobileMenuOpen ( false ) }
114
+ >
115
+ Library
116
+ </ Link >
117
+ </ div >
42
118
</ div >
43
- < button
44
- onClick = { toggleDarkMode }
45
- className = "px-4 py-2 rounded-full bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors duration-300 flex items-center space-x-2"
46
- aria-label = "Toggle Dark Mode"
47
- >
48
- { darkMode ? "🌞 Light Mode" : "🌙 Dark Mode" }
49
- </ button >
50
119
</ header >
51
120
) ;
52
121
}
53
-
0 commit comments