1
- import React from 'react'
1
+ import React , { useState , useEffect } from 'react'
2
2
import { Link } from 'gatsby'
3
3
import styled from '@emotion/styled'
4
+ import { Global , css } from '@emotion/core'
4
5
import { breakpoints , colors } from '../utils/variables'
5
6
import Hamburger from '../resources/hamburger.svg'
6
7
import Multiply from '../resources/multiply.svg'
@@ -12,6 +13,10 @@ const StyledNav = styled.div`
12
13
top : 0 ;
13
14
left : 0 ;
14
15
right : 0 ;
16
+
17
+ .white {
18
+ background : # fff ;
19
+ }
15
20
}
16
21
17
22
.nav {
@@ -23,15 +28,6 @@ const StyledNav = styled.div`
23
28
@media (max-width: ${ breakpoints . xmd } ) {
24
29
flex-direction : column;
25
30
padding-top : 0 ;
26
-
27
- .navIsRendered {
28
- display: flex;
29
- }
30
-
31
- .navIsNotRendered {
32
- display: none;
33
- }
34
-
35
31
& __header {
36
32
display : flex;
37
33
justify-content : space-between;
@@ -77,6 +73,10 @@ const StyledNav = styled.div`
77
73
width : 100% ;
78
74
z-index : 1000 ;
79
75
76
+ @media (min-width: ${ breakpoints . xmd } ) {
77
+ padding-top : 2.5rem ;
78
+ }
79
+
80
80
@media (max-width: ${ breakpoints . xmd } ) {
81
81
height : 95vh ;
82
82
flex-direction : column;
@@ -142,60 +142,93 @@ const StyledNav = styled.div`
142
142
.active {
143
143
color : ${ colors . blue } ;
144
144
}
145
+
146
+ @media (max-width: ${ breakpoints . xmd } ) {
147
+ .shown {
148
+ display : flex;
149
+ }
150
+
151
+ .hidden {
152
+ display : none;
153
+ }
154
+ }
145
155
`
146
156
147
- class Nav extends React . Component {
157
+ const Nav = ( { shouldRenderLogo } ) => {
158
+ const [ isNavRendered , setIsNavRendered ] = useState ( false )
148
159
149
- state = {
150
- isNavRendered : false ,
160
+ const unLock = ( ) => {
161
+ if ( window . innerWidth <= '700' ) {
162
+ setIsNavRendered ( false )
163
+ }
151
164
}
152
165
153
- toggleNavigation = ( ) => {
154
- this . setState ( { isNavRendered : ! this . state . isNavRendered } )
166
+ useEffect ( ( ) => {
167
+ window . addEventListener ( 'resize' , unLock )
168
+
169
+ return ( ) => {
170
+ window . removeEventListener ( 'resize' , unLock )
171
+ }
172
+ } )
173
+
174
+ const toggleNavigation = ( ) => {
175
+ setIsNavRendered ( ! isNavRendered )
155
176
}
156
177
157
- render ( ) {
158
- const { shouldRenderLogo } = this . props
159
- return (
160
- < StyledNav >
161
- < nav className = "nav" style = { this . state . isNavRendered ? { background : '#fff' , height : '100vh' } : { } } >
162
- < div className = "nav__header" >
163
- { shouldRenderLogo ?
164
- < Link to = "/" className = "logo-container" >
165
- < img className = "logo" src = { TheiaLogoDark } alt = "theia logo" />
166
- </ Link > : < span aria-hidden = { true } > </ span >
178
+ return (
179
+ < StyledNav >
180
+ < Global
181
+ styles = { css `
182
+ html {
183
+ overflow-y : ${ isNavRendered ? 'hidden' : 'scroll' } ;
167
184
}
168
- < div className = "nav__button-container" >
169
- < button
170
- className = "nav__button"
171
- aria-label = "Navigation Toggle"
172
- onClick = { this . toggleNavigation }
173
- >
174
- { this . state . isNavRendered ? < img src = { Multiply } alt = "close menu icon" /> : < img src = { Hamburger } alt = "hamburger menu icon" /> }
175
- </ button >
176
- </ div >
185
+ ` }
186
+ />
187
+ < nav className = { `${ isNavRendered ? 'white' : '' } ` } >
188
+ < div className = "nav__header" >
189
+ { shouldRenderLogo ?
190
+ < Link to = "/" className = "logo-container" >
191
+ < img className = "logo" src = { TheiaLogoDark } alt = "theia logo" />
192
+ </ Link > : < span aria-hidden = { true } > </ span >
193
+ }
194
+ < div className = "nav__button-container" >
195
+ < button
196
+ className = "nav__button"
197
+ aria-label = "Navigation Toggle"
198
+ onClick = { toggleNavigation }
199
+ >
200
+ { isNavRendered ? < img src = { Multiply } alt = "close menu icon" /> : < img src = { Hamburger } alt = "hamburger menu icon" /> }
201
+ </ button >
177
202
</ div >
178
- < ul className = { `nav__items ${ this . state . isNavRendered ? 'navIsRendered' : 'navIsNotRendered' } ` } >
179
- < li className = "nav__item" >
180
- < Link to = "/#features" className = "nav__link" > Features</ Link >
181
- </ li >
182
- < li className = "nav__item" >
183
- < Link to = "/docs/" className = "nav__link" activeClassName = "active" > Documentation</ Link >
184
- </ li >
185
- < li className = "nav__item" >
186
- < a href = "https://spectrum.chat/theia" target = "_blank" rel = "noopener" className = "nav__link" > Community</ a >
187
- </ li >
188
- < li className = "nav__item" >
189
- < a href = "https://www.typefox.io/theia/" className = "nav__link" target = "_blank" rel = "noopener" > Support</ a >
190
- </ li >
191
- < li className = "nav__item" >
192
- < a href = "https://www.typefox.io/trainings/" className = "nav__link" target = "_blank" rel = "noopener" > Training</ a >
193
- </ li >
194
- </ ul >
195
- </ nav >
196
- </ StyledNav >
197
- )
198
- }
203
+ </ div >
204
+ < ul className = { `nav__items ${ isNavRendered ? 'shown' : 'hidden' } ` } >
205
+ < li className = "nav__item" >
206
+ < Link
207
+ to = "/#features"
208
+ className = "nav__link"
209
+ onClick = { ( ) => {
210
+ setIsNavRendered ( false )
211
+ } }
212
+ >
213
+ Features
214
+ </ Link >
215
+ </ li >
216
+ < li className = "nav__item" >
217
+ < Link to = "/docs/" className = "nav__link" activeClassName = "active" > Documentation</ Link >
218
+ </ li >
219
+ < li className = "nav__item" >
220
+ < a href = "https://spectrum.chat/theia" target = "_blank" rel = "noopener" className = "nav__link" > Community</ a >
221
+ </ li >
222
+ < li className = "nav__item" >
223
+ < a href = "https://www.typefox.io/theia/" className = "nav__link" target = "_blank" rel = "noopener" > Support</ a >
224
+ </ li >
225
+ < li className = "nav__item" >
226
+ < a href = "https://www.typefox.io/trainings/" className = "nav__link" target = "_blank" rel = "noopener" > Training</ a >
227
+ </ li >
228
+ </ ul >
229
+ </ nav >
230
+ </ StyledNav >
231
+ )
199
232
}
200
233
201
234
export default Nav
0 commit comments