1
1
import React , { useState } from "react" ;
2
2
import Link from "next/link" ;
3
- import styled from "styled-components" ;
3
+ import styled , { css } from "styled-components" ;
4
+
5
+ interface OpenMenuProps {
6
+ isOpen : boolean ;
7
+ }
4
8
5
9
const Navbar = styled . nav `
6
10
position: fixed;
@@ -47,23 +51,61 @@ const HamburgerLines = styled.div`
47
51
height: 23px;
48
52
width: 35px;
49
53
position: absolute;
50
- top: 5px ;
54
+ top: 15px ;
51
55
left: 20px;
52
56
z-index: 2;
53
57
}
54
58
` ;
55
59
56
- const Line = styled . span `
60
+ const LineOne = styled . span < OpenMenuProps > `
61
+ @media (max-width: 768px) {
62
+ display: block;
63
+ height: 4px;
64
+ width: 100%;
65
+ border-radius: 10px;
66
+ background: #333;
67
+ transform-origin: 0% 0%;
68
+ transition: transform 0.4s ease-in-out;
69
+ ${ ( { isOpen } ) =>
70
+ isOpen &&
71
+ css `
72
+ transform: rotate(35deg);
73
+ ` }
74
+ }
75
+ ` ;
76
+ const LineTwo = styled . span < OpenMenuProps > `
57
77
@media (max-width: 768px) {
58
78
display: block;
59
79
height: 4px;
60
80
width: 100%;
61
81
border-radius: 10px;
62
82
background: #333;
83
+ transition: transform 0.2s ease-in-out;
84
+ ${ ( { isOpen } ) =>
85
+ isOpen &&
86
+ css `
87
+ transform: scaleY(0);
88
+ ` }
89
+ }
90
+ ` ;
91
+ const LineThree = styled . span < OpenMenuProps > `
92
+ @media (max-width: 768px) {
93
+ display: block;
94
+ height: 4px;
95
+ width: 100%;
96
+ border-radius: 10px;
97
+ background: #333;
98
+ transform-origin: 0% 100%;
99
+ transition: transform 0.4s ease-in-out;
100
+ ${ ( { isOpen } ) =>
101
+ isOpen &&
102
+ css `
103
+ transform: rotate(-35deg);
104
+ ` }
63
105
}
64
106
` ;
65
107
66
- const MenuItems = styled . ul `
108
+ const MenuItems = styled . ul < OpenMenuProps > `
67
109
order: 2;
68
110
display: flex;
69
111
@media (max-width: 768px) {
@@ -75,9 +117,15 @@ const MenuItems = styled.ul`
75
117
display: flex;
76
118
flex-direction: column;
77
119
margin-left: -40px;
120
+ margin-top: 0;
78
121
padding-left: 50px;
79
122
transition: transform 0.5s ease-in-out;
80
123
box-shadow: 5px 0px 10px 0px #aaa;
124
+ ${ ( { isOpen } ) =>
125
+ isOpen &&
126
+ css `
127
+ transform: translateX(0);
128
+ ` }
81
129
}
82
130
` ;
83
131
@@ -131,15 +179,22 @@ const Logo = styled.h1`
131
179
` ;
132
180
133
181
const LinkMenu : React . FC = ( ) => {
182
+ const [ isOpen , setIsOpen ] = useState ( false ) ;
134
183
return (
135
- < Navbar className = "navbar" >
136
- < NavbarContainer className = "navbar-container container" >
137
- < HamburgerLines className = "hamburger-lines" >
138
- < Line className = "line line1" > </ Line >
139
- < Line className = "line line2" > </ Line >
140
- < Line className = "line line3" > </ Line >
184
+ < Navbar >
185
+ < NavbarContainer >
186
+ < HamburgerLines
187
+ onClick = { ( ) => {
188
+ setIsOpen ( ! isOpen ) ;
189
+ console . log ( "clicked" , isOpen ) ;
190
+ } }
191
+ >
192
+ < LineOne isOpen = { isOpen } > </ LineOne >
193
+ < LineTwo isOpen = { isOpen } > </ LineTwo >
194
+ < LineThree isOpen = { isOpen } > </ LineThree >
141
195
</ HamburgerLines >
142
- < MenuItems >
196
+
197
+ < MenuItems isOpen = { isOpen } >
143
198
< MenuItem >
144
199
< MenuItemLink href = "#home" > Home</ MenuItemLink >
145
200
</ MenuItem >
0 commit comments