@@ -4,45 +4,162 @@ import Link from 'next/link'
44import Image from 'next/image'
55import { useState } from 'react'
66import mainMenu from '@/data/mainMenu.json'
7+ import social from '@/data/social.json'
78
89export default function Navbar ( ) {
910 const [ isOpen , setIsOpen ] = useState ( false )
1011
1112 return (
12- < div className = "relative" >
13- < div className = "absolute top-0 flex items-start w-full" >
14- < div className = "bg-blue h-[244px] w-full 2xl:block hidden" > </ div >
15- < div className = "w-full 2xl:shrink-0" >
16- < Image
17- className = "hidden w-full mt-3 xl:mt-0 lg:block"
18- src = "/illustrations/home-bg-2.svg"
19- alt = "Hero background"
20- width = { 2000 }
21- height = { 600 }
22- priority
23- />
24- < Image
25- className = "absolute inset-0 block object-cover object-center w-full md:-top-28 sm:-top-24 -top-10 lg:hidden"
26- src = "/illustrations/m-bg-hero.svg"
27- alt = "hero background for mobile"
28- width = { 800 }
29- height = { 600 }
30- priority
31- />
13+ < >
14+ < div className = "relative" >
15+ < div className = "absolute top-0 flex items-start w-full" >
16+ < div className = "bg-blue h-[244px] w-full 2xl:block hidden" > </ div >
17+ < div className = "w-full 2xl:shrink-0" >
18+ < Image
19+ className = "hidden w-full mt-3 xl:mt-0 lg:block"
20+ src = "/illustrations/home-bg-2.svg"
21+ alt = "Hero background"
22+ width = { 2000 }
23+ height = { 600 }
24+ priority
25+ />
26+ < Image
27+ className = "absolute inset-0 block object-cover object-center w-full md:-top-28 sm:-top-24 -top-10 lg:hidden"
28+ src = "/illustrations/m-bg-hero.svg"
29+ alt = "hero background for mobile"
30+ width = { 800 }
31+ height = { 600 }
32+ priority
33+ />
34+ </ div >
35+ < div className = "bg-blue h-[595px] w-full 2xl:block hidden" > </ div >
36+ </ div >
37+
38+ < div className = "container pt-16" >
39+ < div className = "fixed inset-x-0 top-0 z-30 w-full pb-3 bg-blue" >
40+ < div className = "container relative mx-auto max-w-7xl" >
41+ < nav className = "flex items-center justify-between pt-5 pb-3" >
42+ < Link href = "/" >
43+ < Image src = "/images/logo.svg" alt = "logo" width = { 120 } height = { 28 } className = "h-5 sm:h-7 w-auto" />
44+ </ Link >
45+
46+ < div className = "items-center hidden xl:flex gap-9" >
47+ < div className = "flex items-center gap-9" >
48+ { mainMenu . map ( ( item , index ) => {
49+ if ( ! item . visibleInNavigation ) return null
50+
51+ return (
52+ < div key = { index } className = "nav-item group relative" >
53+ { item . children ? (
54+ < >
55+ < button className = "flex items-center justify-between nav-link" >
56+ { item . name }
57+ < svg className = "ml-1 w-4 h-4" xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 20 20" fill = "currentColor" >
58+ < path fillRule = "evenodd" d = "M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clipRule = "evenodd" />
59+ </ svg >
60+ </ button >
61+ < div className = "hidden absolute left-1/2 z-10 mt-5 flex w-screen max-w-max -translate-x-1/2 px-4 group-hover:block" >
62+ < div className = "dropdownBox w-screen max-w-md flex-auto overflow-hidden bg-blue text-sm leading-6 shadow-lg ring-1 ring-gray-900/5 rounded-lg" >
63+ < div className = "p-4" >
64+ { item . children . map ( ( child , childIndex ) => (
65+ < div key = { childIndex } className = "group relative flex gap-x-6 rounded-lg p-4 hover:bg-gray-50" >
66+ < div >
67+ < Link href = { child . link } className = "nav-link whitespace-nowrap" >
68+ { child . name }
69+ < span className = "absolute inset-0" > </ span >
70+ </ Link >
71+ </ div >
72+ </ div >
73+ ) ) }
74+ </ div >
75+ </ div >
76+ </ div >
77+ </ >
78+ ) : (
79+ < Link href = { item . link } className = "nav-link inline-flex items-center" >
80+ { item . name }
81+ </ Link >
82+ ) }
83+ </ div >
84+ )
85+ } ) }
86+ </ div >
87+
88+ < div >
89+ < div className = "flex items-center gap-2" >
90+ < svg xmlns = "http://www.w3.org/2000/svg" fill = "none" viewBox = "0 0 24 24" strokeWidth = "1.5" stroke = "currentColor" className = "w-5 h-5 text-green" >
91+ < path strokeLinecap = "round" strokeLinejoin = "round" d = "M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418" />
92+ </ svg >
93+ < div className = "flex items-center gap-1" >
94+ < span className = "bg-green rounded-full px-2 py-[3px] text-xs font-medium leading-none text-center text-blue" > EN</ span >
95+ < Link href = "/de" className = "bg-transparent rounded-full px-2 py-[3px] text-xs font-medium leading-none text-center hover:bg-white/20 transition-all ease-in-out duration-150 text-white" > DE</ Link >
96+ </ div >
97+ </ div >
98+ </ div >
99+
100+ < div className = "flex items-center gap-5" >
101+ { social . map ( ( item , index ) => (
102+ < a
103+ key = { index }
104+ href = { item . link }
105+ aria-label = { item . name }
106+ target = "_blank"
107+ rel = "noopener noreferrer"
108+ className = "focus:outline-none"
109+ >
110+ < span className = "iconify nav-icon" data-icon = { item . icon } > </ span >
111+ </ a >
112+ ) ) }
113+ </ div >
114+ </ div >
115+
116+ < button
117+ className = "xl:hidden"
118+ onClick = { ( ) => setIsOpen ( ! isOpen ) }
119+ >
120+ < Image
121+ src = "/illustrations/burger-menu.svg"
122+ alt = "menu"
123+ width = { 32 }
124+ height = { 32 }
125+ className = "w-8"
126+ />
127+ </ button >
128+ </ nav >
129+ </ div >
130+ </ div >
32131 </ div >
33- < div className = "bg-blue h-[595px] w-full 2xl:block hidden" > </ div >
34132 </ div >
35133
36- < div className = "container pt-16" >
37- < div className = "fixed inset-x-0 top-0 z-30 w-full pb-3 bg-blue" >
38- < div className = "container relative mx-auto max-w-7xl" >
39- < nav className = "flex items-center justify-between pt-5 pb-3" >
134+ { /* Mobile Menu */ }
135+ { isOpen && (
136+ < div className = "fixed inset-0 top-0 z-30 h-full bg-blue xl:hidden" >
137+ < div className = "relative w-full h-screen" >
138+ < Image
139+ className = "absolute inset-0 object-cover w-full h-full"
140+ alt = "menu background"
141+ src = "/illustrations/menu-bg.svg"
142+ width = { 800 }
143+ height = { 1000 }
144+ priority
145+ />
146+ < nav className = "container relative flex items-center justify-between pt-4 pb-3 mx-auto sm:pt-5 max-w-7xl" >
40147 < Link href = "/" >
41148 < Image src = "/images/logo.svg" alt = "logo" width = { 120 } height = { 28 } className = "h-5 sm:h-7 w-auto" />
42149 </ Link >
43-
44- < div className = "items-center hidden xl:flex gap-9" >
45- < div className = "flex items-center gap-9" >
150+ < button className = "xl:hidden" onClick = { ( ) => setIsOpen ( false ) } >
151+ < Image
152+ className = "w-7"
153+ alt = "close button icon"
154+ src = "/illustrations/close.svg"
155+ width = { 28 }
156+ height = { 28 }
157+ />
158+ </ button >
159+ </ nav >
160+ < div className = "flex flex-col sm:items-center justify-between py-12 sm:px-12 px-8 gap-24 relative h-[calc(100vh-70px)]" >
161+ < div className = "flex flex-col gap-11 sm:items-center" >
162+ < div className = "flex flex-col sm:items-center gap-7" >
46163 { mainMenu . map ( ( item , index ) => {
47164 if ( ! item . visibleInNavigation ) return null
48165
@@ -57,7 +174,7 @@ export default function Navbar() {
57174 </ svg >
58175 </ button >
59176 < div className = "hidden absolute left-1/2 z-10 mt-5 flex w-screen max-w-max -translate-x-1/2 px-4 group-hover:block" >
60- < div className = "dropdownBox w-screen max-w-md flex-auto overflow-hidden bg-blue text-sm leading-6 shadow-lg ring-1 ring-gray-900/5 rounded-lg " >
177+ < div className = "dropdownBox w-screen max-w-md flex-auto overflow-hidden bg-blue text-sm leading-6 shadow-lg ring-1 ring-gray-900/5" >
61178 < div className = "p-4" >
62179 { item . children . map ( ( child , childIndex ) => (
63180 < div key = { childIndex } className = "group relative flex gap-x-6 rounded-lg p-4 hover:bg-gray-50" >
@@ -74,43 +191,42 @@ export default function Navbar() {
74191 </ div >
75192 </ >
76193 ) : (
77- < Link href = { item . link } className = "nav-link inline-flex items-center" >
194+ < Link href = { item . link } className = "nav-link inline-flex items-center" onClick = { ( ) => setIsOpen ( false ) } >
78195 { item . name }
79196 </ Link >
80197 ) }
81198 </ div >
82199 )
83200 } ) }
84201 </ div >
85-
86- < div >
87- < div className = "flex items-center gap-2" >
88- < svg xmlns = "http://www.w3.org/2000/svg" fill = "none" viewBox = "0 0 24 24" strokeWidth = "1.5" stroke = "currentColor" className = "w-5 h-5 text-green" >
89- < path strokeLinecap = "round" strokeLinejoin = "round" d = "M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418" />
90- </ svg >
91- < div className = "flex items-center gap-1" >
92- < span className = "bg-green rounded-full px-2 py-[3px] text-xs font-medium leading-none text-center text-blue" > EN</ span >
93- < Link href = "/de" className = "bg-transparent rounded-full px-2 py-[3px] text-xs font-medium leading-none text-center hover:bg-white/20 transition-all ease-in-out duration-150 text-white" > DE</ Link >
94- </ div >
202+ < div className = "flex items-center gap-4" >
203+ < svg xmlns = "http://www.w3.org/2000/svg" fill = "none" viewBox = "0 0 24 24" strokeWidth = "1.5" stroke = "currentColor" className = "w-5 h-5 text-green" >
204+ < path strokeLinecap = "round" strokeLinejoin = "round" d = "M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418" />
205+ </ svg >
206+ < div className = "flex items-center gap-3" >
207+ < span className = "bg-green rounded-full px-2 py-[3px] text-xs font-medium leading-none text-center text-blue" > EN</ span >
208+ < Link href = "/de" className = "bg-transparent rounded-full px-2 py-[3px] text-xs font-medium leading-none text-center hover:bg-white/20 transition-all ease-in-out duration-150 text-white" > DE</ Link >
95209 </ div >
96210 </ div >
97211 </ div >
98-
99- < button
100- className = "xl:hidden"
101- onClick = { ( ) => setIsOpen ( ! isOpen ) }
102- >
103- < Image
104- src = { isOpen ? "/illustrations/close.svg" : "/illustrations/burger-menu.svg" }
105- alt = "menu"
106- width = { 32 }
107- height = { 32 }
108- />
109- </ button >
110- </ nav >
212+ < div className = "flex items-center gap-6" >
213+ { social . map ( ( item , index ) => (
214+ < a
215+ key = { index }
216+ href = { item . link }
217+ aria-label = { item . name }
218+ target = "_blank"
219+ rel = "noopener noreferrer"
220+ className = "focus:outline-none"
221+ >
222+ < span className = "iconify nav-icon" data-icon = { item . icon } > </ span >
223+ </ a >
224+ ) ) }
225+ </ div >
226+ </ div >
111227 </ div >
112228 </ div >
113- </ div >
114- </ div >
229+ ) }
230+ </ >
115231 )
116232}
0 commit comments