1
- "use client"
1
+ "use client" ;
2
2
3
3
import Link from "next/link" ;
4
- import { motion } from "framer- motion" ;
4
+ import { motion , useMotionValueEvent , useScroll } from "motion/react " ;
5
5
6
6
import { navLinks , socials } from "@/lib/constants" ;
7
7
import Logo from "./logo" ;
8
8
import MobileNav from "./mobile-nav" ;
9
+ import { useState } from "react" ;
10
+ import { ThemeSwitch } from "../theme/theme-switch" ;
9
11
10
12
const Header = ( ) => {
13
+ const [ hidden , setHidden ] = useState ( false ) ;
14
+
15
+ const { scrollY } = useScroll ( ) ;
16
+
17
+ useMotionValueEvent ( scrollY , "change" , ( latest : number ) => {
18
+ const prev = scrollY . getPrevious ( ) || 0 ;
19
+
20
+ if ( latest > prev && latest > 100 ) {
21
+ setHidden ( true ) ;
22
+ } else {
23
+ setHidden ( false ) ;
24
+ }
25
+ } ) ;
11
26
return (
12
27
< >
13
28
< motion . header
14
- initial = { { translateY : - 100 } }
15
- animate = { { translateY : 0 } }
29
+ variants = { {
30
+ visible : { y : 0 } ,
31
+ hidden : { y : - 200 } ,
32
+ } }
33
+ initial = { { y : - 200 } }
34
+ animate = { hidden ? "hidden" : "visible" }
16
35
transition = { { duration : 0.2 } }
17
- className = "relative z-[999] pt-10 hidden px-4 md:block"
36
+ className = "hidden px-4 md:block sticky top-5 w-full z-50 "
18
37
>
19
38
< div className = "container mx-auto flex h-16 w-full max-w-[1024px] items-center justify-between rounded-full border-[1px] border-white/25 bg-white/25 px-8 backdrop-blur-md dark:border-[#5E5E5E]/20 dark:bg-[#18181D]/30" >
20
39
< div className = "flex items-center gap-10" >
@@ -44,7 +63,7 @@ const Header = () => {
44
63
</ nav >
45
64
</ div >
46
65
< div className = "flex items-center gap-4" >
47
- < div className = "flex gap-6 text-onyx/70 dark:text-white/70" >
66
+ < div className = "flex gap-6 text-onyx/70 dark:text-white/70 items-center " >
48
67
{ socials . map ( ( social ) => (
49
68
< Link
50
69
key = { `header-social-${ social . name } ` }
@@ -56,10 +75,13 @@ const Header = () => {
56
75
< social . icon className = "size-6" />
57
76
</ Link >
58
77
) ) }
78
+ < ThemeSwitch variant = "ghost" />
59
79
</ div >
60
80
</ div >
61
81
</ div >
62
82
</ motion . header >
83
+
84
+ { /* Logo on the top in mobile view */ }
63
85
< Link
64
86
href = "/"
65
87
aria-label = "Vignesh Gupta Logo"
@@ -71,6 +93,8 @@ const Header = () => {
71
93
className = "block mx-auto md:hidden opacity-60"
72
94
/>
73
95
</ Link >
96
+
97
+ { /* Mobile navigation bar */ }
74
98
< MobileNav />
75
99
</ >
76
100
) ;
0 commit comments