@@ -10,35 +10,33 @@ import { auth } from "../../utils/firebase";
1010import toast from "react-hot-toast" ;
1111
1212// icon
13- import { FiPower , FiX } from "react-icons/fi" ;
13+ import { FiMenu , FiPower , FiX , FiLogIn , FiSearch , FiPlus , FiTwitter } from "react-icons/fi" ;
14+ import { BiSortDown } from "react-icons/bi" ;
1415import ImgLogo from '../../public/images/img-logo.svg'
1516
1617// Bootstrap
1718import Button from "react-bootstrap/Button" ;
1819import InputGroup from 'react-bootstrap/InputGroup' ;
1920import FormControl from 'react-bootstrap/FormControl' ;
2021import DropdownButton from 'react-bootstrap/DropdownButton' ;
21- import Dropdown from 'react-bootstrap/Dropdown'
22-
23- import { FiSearch , FiPlus , FiTwitter } from "react-icons/fi" ;
22+ import Dropdown from 'react-bootstrap/Dropdown' ;
23+ import Navbar from 'react-bootstrap/Navbar' ;
2424
2525// Styled Component
2626import styled from "styled-components" ;
2727
2828// CreateShape Component
2929import { CreateShape } from ".." ;
3030
31- const AppHeader = styled . div `
32- position: fixed;
33- z-index: 1;
34- top: 0;
35- right: 0;
36- display: flex;
37- justify-content: space-between;
38- align-items: flex-start;
39- width: 100%;
31+ const AppHeader = styled ( Navbar ) `
4032 padding: 0.6rem 0.8rem;
4133 background-color: var(--color-brand);
34+
35+ .navbar-brand {
36+ @media (max-width: 767px) {
37+ width: 36px;
38+ }
39+ }
4240` ;
4341
4442const Logo = styled . h1 `
@@ -52,13 +50,33 @@ const Logo = styled.h1`
5250 margin: 2px 0 0 -8px;
5351 line-height: 1;
5452 cursor: pointer;
53+
54+ @media (max-width: 767px) {
55+ width: 26px;
56+ margin: -2px 0 0 0;
57+ background-size: cover;
58+ background-position: center left;
59+ }
5560` ;
5661
5762const NavbarSearchInputContainer = styled . div `
5863 display: flex;
5964 align-items: center;
60- max-width: 560px;
61- width: 60% !important;
65+ max-width: 420px;
66+ width: 64% !important;
67+
68+ @media (min-width: 1280px) {
69+ max-width: 560px;
70+ }
71+
72+ @media (max-width: 991px) {
73+ // max-width: 420px;
74+ flex: 1;
75+ }
76+
77+ @media (max-width: 767px) {
78+ // max-width: 320px;
79+ }
6280` ;
6381
6482const NavbarSearchInput = styled ( InputGroup ) `
@@ -117,6 +135,12 @@ const UserThumbName = styled.div`
117135 white-space: nowrap;
118136 overflow: hidden;
119137 text-overflow: ellipsis;
138+
139+ @media (max-width: 991px) {
140+ max-width: unset;
141+ overflow: unset;
142+ text-overflow: unset;
143+ }
120144` ;
121145
122146const LogoutButton = styled ( Button ) `
@@ -126,6 +150,51 @@ const LogoutButton = styled(Button)`
126150const LoginBar = styled . div `
127151 display: flex;
128152 align-items: center;
153+
154+ @media (max-width: 991px) {
155+ justify-content: flex-end;
156+ border-top: solid 1px rgba(var(--color-neutral-10-rgb), 0.2);
157+ margin: 0.4rem 0 0 0;
158+ padding: 0.8rem 0.8rem 0.4rem 0;
159+ flex-wrap: wrap !important;
160+ }
161+
162+ @media (max-width: 767px) {
163+ flex-direction: column;
164+ grid-gap: 0.6rem;
165+ align-items: stretch;
166+ .login-element {
167+
168+ }
169+ }
170+ ` ;
171+
172+ const UserMeta = styled . div `
173+ display: flex;
174+ align-self: center;
175+ ` ;
176+
177+ const LoginSeperator = styled . div `
178+ width: 1px;
179+ height: 1.8rem;
180+ background-color: rgba(var(--color-neutral-10-rgb), 0.4);
181+ margin: 0 0.2rem 0 0.7rem;
182+ align-self: center;
183+ ` ;
184+
185+ const LoginBarBefore = styled . div `
186+ display: flex;
187+ align-items: center;
188+ grid-gap: 0.2em;
189+
190+ @media (max-width: 991px) {
191+ justify-content: flex-end;
192+ border: solid 1px rgba(var(--color-neutral-10-rgb), 0.2);
193+ border-left-width: 0;
194+ border-right-width: 0;
195+ margin: 0.4rem 0;
196+ padding: 0.6rem 0;
197+ }
129198` ;
130199
131200
@@ -175,13 +244,14 @@ const Header = ({
175244 }
176245
177246 return (
178- < AppHeader >
179- < Link href = "/" >
180- < Logo >
181- < div className = "sr-only" > TryShape</ div >
182- </ Logo >
183- </ Link >
184-
247+ < AppHeader sticky = "top" expand = "lg" >
248+ < Navbar . Brand >
249+ < Link href = "/" >
250+ < Logo >
251+ < div className = "sr-only" > TryShape</ div >
252+ </ Logo >
253+ </ Link >
254+ </ Navbar . Brand >
185255 < NavbarSearchInputContainer >
186256 < NavbarSearchInput >
187257 < NavbarSearchInputText id = "basic-addon1" > < FiSearch color = 'white' size = '18px' /> </ NavbarSearchInputText >
@@ -194,76 +264,93 @@ const Header = ({
194264 />
195265 { searchTerm && < CloseIcon title = "Clear Search Query" color = '#ffffff' size = '24px' onClick = { ( ) => setSearchTerm ( '' ) } /> }
196266 </ NavbarSearchInput >
197- < DropdownButton variant = "outline-secondary" size = "sm" id = "dropdown-basic-button" title = { `Sort by ${ sort } ` } className = "border-0" >
198- < Dropdown . Item
199- href = "#"
200- active = { sort === 'oldest' }
201- onClick = { ( ) => setSort ( 'oldest' ) } >
202- Oldest
203- </ Dropdown . Item >
204- < Dropdown . Item
205- href = "#"
206- active = { sort === 'popularity' }
207- onClick = { ( ) => setSort ( 'popularity' ) } >
208- Popularity
209- </ Dropdown . Item >
210- < Dropdown . Item
211- href = "#"
212- active = { sort === 'recent' }
213- onClick = { ( ) => setSort ( 'recent' ) } >
214- Recent
215- </ Dropdown . Item >
216- </ DropdownButton >
267+ < Dropdown >
268+ < Dropdown . Toggle variant = "outline-secondary" size = "sm" id = "dropdown-basic" className = "border-0" >
269+ < BiSortDown className = 'mr-0 d-lg-none' size = "1.4rem" />
270+ < span className = 'd-none d-lg-inline' >
271+ { `Sort by ${ sort } ` }
272+ </ span >
273+ </ Dropdown . Toggle >
274+ < Dropdown . Menu >
275+ < Dropdown . Item
276+ href = "#"
277+ active = { sort === 'oldest' }
278+ onClick = { ( ) => setSort ( 'oldest' ) } >
279+ Oldest
280+ </ Dropdown . Item >
281+ < Dropdown . Item
282+ href = "#"
283+ active = { sort === 'popularity' }
284+ onClick = { ( ) => setSort ( 'popularity' ) } >
285+ Popularity
286+ </ Dropdown . Item >
287+ < Dropdown . Item
288+ href = "#"
289+ active = { sort === 'recent' }
290+ onClick = { ( ) => setSort ( 'recent' ) } >
291+ Recent
292+ </ Dropdown . Item >
293+ </ Dropdown . Menu >
294+ </ Dropdown >
217295 </ NavbarSearchInputContainer >
218-
219- { ( user . email || user . displayName ) ? (
220- < >
221- < LoginBar >
222- < Button variant = "outline-secondary" size = "sm" className = "mr-1" onClick = { tweet } >
223- < FiTwitter />
224- Tweet it
225- </ Button >
226- < Button variant = "primary" size = "sm" className = "mr-3" onClick = { ( ) => setShowCreateShape ( true ) } >
227- < FiPlus />
228- Add Shape
229- </ Button >
230- < UserThumb >
231- < img
232- src = {
233- user . photoURL
234- ? user . photoURL
235- : `https://unavatar.vercel.app/${ user . email } `
236- }
237- alt = "profile"
238- />
239- < UserThumbName > { user . displayName ? user . displayName : "User" } </ UserThumbName >
240- </ UserThumb >
241- < LogoutButton onClick = { signOut } variant = "link" className = "btn-icon p-0 ml-2" >
242- < FiPower color = 'var(--color-neutral-10' size = "18px" />
243- < div className = "sr-only" > Sign Out</ div >
244- </ LogoutButton >
245-
246- </ LoginBar >
247- </ >
248- ) : (
249- < >
250- < Button variant = "outline-secondary" size = "sm" className = "mr-1" onClick = { tweet } >
251- < FiTwitter />
252- Tweet it
253- </ Button >
254- < Button variant = "outline-secondary" size = "sm" onClick = { ( ) => setOpen ( true ) } >
255- < div > Sign In</ div >
256- </ Button >
257- </ >
258- ) }
259- < CreateShape
260- show = { showCreateShape }
261- handleClose = { closeModal }
262- edit = { false }
263- user = { user }
264- shapeAction = { shapeAction }
265- setShapeAction = { setShapeAction }
266- />
296+ < Navbar . Toggle >
297+ < FiMenu color = "var(--color-neutral-10" size = "24px" />
298+ </ Navbar . Toggle >
299+ < Navbar . Collapse className = "justify-content-end" >
300+ { ( user . email || user . displayName ) ? (
301+ < >
302+ < LoginBar >
303+ < Button variant = "outline-secondary" size = "sm" className = "mr-1 login-element" onClick = { tweet } >
304+ < FiTwitter />
305+ Tweet it
306+ </ Button >
307+ < Button variant = "primary" size = "sm" className = "mr-md-3 login-element" onClick = { ( ) => setShowCreateShape ( true ) } >
308+ < FiPlus />
309+ Add Shape
310+ </ Button >
311+ < UserMeta className = "login-element" >
312+ < UserThumb >
313+ < img
314+ src = {
315+ user . photoURL
316+ ? user . photoURL
317+ : `https://unavatar.vercel.app/${ user . email } `
318+ }
319+ alt = "profile"
320+ />
321+ < UserThumbName > { user . displayName ? user . displayName : "User" } </ UserThumbName >
322+ </ UserThumb >
323+ < LoginSeperator />
324+ < LogoutButton onClick = { signOut } variant = "link" className = "btn-icon p-0 ml-2" >
325+ < FiPower color = 'var(--color-neutral-10' size = "18px" />
326+ < div className = "sr-only" > Sign Out</ div >
327+ </ LogoutButton >
328+ </ UserMeta >
329+ </ LoginBar >
330+ </ >
331+ ) : (
332+ < >
333+ < LoginBarBefore >
334+ < Button variant = "outline-secondary" size = "sm" className = "mr-1" onClick = { tweet } >
335+ < FiTwitter />
336+ Tweet it
337+ </ Button >
338+ < Button variant = "outline-secondary" size = "sm" onClick = { ( ) => setOpen ( true ) } >
339+ < FiLogIn />
340+ Sign In
341+ </ Button >
342+ </ LoginBarBefore >
343+ </ >
344+ ) }
345+ < CreateShape
346+ show = { showCreateShape }
347+ handleClose = { closeModal }
348+ edit = { false }
349+ user = { user }
350+ shapeAction = { shapeAction }
351+ setShapeAction = { setShapeAction }
352+ />
353+ </ Navbar . Collapse >
267354 </ AppHeader >
268355 ) ;
269356} ;
0 commit comments