Skip to content
This repository was archived by the owner on Dec 26, 2023. It is now read-only.

Commit a468809

Browse files
authored
Header component (#214)
Add Header component
1 parent 74ded3f commit a468809

File tree

2 files changed

+155
-24
lines changed

2 files changed

+155
-24
lines changed
Lines changed: 150 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,163 @@
1+
import React, { ReactNode, useState } from 'react';
12
import {
2-
chakra,
3+
Link,
4+
Box,
35
Flex,
4-
HStack,
5-
Image,
6-
Switch,
76
Text,
7+
Switch,
8+
Image,
9+
Stack,
810
useColorMode,
11+
HStack,
12+
BoxProps,
913
} from '@chakra-ui/react';
1014

11-
const Header = () => {
15+
const NavBar = () => {
16+
const [isOpen, setIsOpen] = useState<boolean>(false);
1217
const { colorMode, toggleColorMode } = useColorMode();
18+
const toggle = () => setIsOpen(!isOpen);
19+
1320
return (
14-
<Flex alignItems={'center'} justify="space-between" w={'full'}>
15-
<Flex alignItems="center">
16-
<Image
17-
width="4rem"
18-
h="4rem"
19-
src={`/D_D_logo-${colorMode === 'dark' ? 'dark' : 'light'}.svg`}
20-
alt="logo"
21-
/>
22-
<Text
23-
ml={'1.25rem'}
24-
fontWeight="bold"
25-
variant="medium"
26-
color={colorMode === 'dark' ? '#FFFFFF' : '#000000'}
27-
>
28-
Developer DAO
29-
</Text>
21+
<NavBarContainer>
22+
<Flex
23+
alignItems="center"
24+
justifyContent="space-between"
25+
flex={1}
26+
width="100%"
27+
>
28+
<Box>
29+
<Flex alignItems="center">
30+
<Image
31+
w="4rem"
32+
h="4rem"
33+
src={`/D_D_logo-${colorMode === 'dark' ? 'dark' : 'light'}.svg`}
34+
alt="logo"
35+
/>
36+
<Text
37+
ml={'1.25rem'}
38+
mr={{ base: '1rem', sm: '3rem' }}
39+
fontWeight="bold"
40+
variant="medium"
41+
color={colorMode === 'dark' ? '#FFFFFF' : '#000000'}
42+
display={{ base: 'block', md: 'none', lg: 'block' }}
43+
>
44+
Developer DAO
45+
</Text>
46+
</Flex>
47+
</Box>
48+
<MenuToggle toggle={toggle} isOpen={isOpen} />
3049
</Flex>
31-
<Switch onChange={toggleColorMode} colorScheme="blackAlpha" />
50+
<HStack
51+
spacing={{ base: 4, xl: 10 }}
52+
display={{ base: isOpen ? 'flex' : 'none', md: 'flex' }}
53+
flexShrink={1}
54+
width={{ base: '100%', md: 'auto' }}
55+
>
56+
<MenuLinks isOpen={isOpen} />
57+
<Switch
58+
size="md"
59+
display={{ base: 'none', md: 'block' }}
60+
onChange={toggleColorMode}
61+
colorScheme="blackAlpha"
62+
/>
63+
</HStack>
64+
</NavBarContainer>
65+
);
66+
};
67+
68+
const CloseIcon = () => (
69+
<svg width="24" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
70+
<title>Close</title>
71+
<path
72+
fill="white"
73+
d="M9.00023 7.58599L13.9502 2.63599L15.3642 4.04999L10.4142 8.99999L15.3642 13.95L13.9502 15.364L9.00023 10.414L4.05023 15.364L2.63623 13.95L7.58623 8.99999L2.63623 4.04999L4.05023 2.63599L9.00023 7.58599Z"
74+
/>
75+
</svg>
76+
);
77+
78+
const MenuIcon = () => (
79+
<svg
80+
width="24px"
81+
viewBox="0 0 20 20"
82+
xmlns="http://www.w3.org/2000/svg"
83+
fill="white"
84+
>
85+
<title>Menu</title>
86+
<path d="M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z" />
87+
</svg>
88+
);
89+
90+
const MenuToggle = ({
91+
toggle,
92+
isOpen,
93+
}: {
94+
toggle: () => void;
95+
isOpen: boolean;
96+
}) => {
97+
return (
98+
<Box
99+
display={{ base: 'auto', md: 'none' }}
100+
onClick={toggle}
101+
cursor="pointer"
102+
justifyContent={'flex-end'}
103+
>
104+
{isOpen ? <CloseIcon /> : <MenuIcon />}
105+
</Box>
106+
);
107+
};
108+
109+
const MenuItem = ({
110+
children,
111+
to = '/',
112+
...rest
113+
}: {
114+
children: ReactNode;
115+
to: string;
116+
}) => {
117+
return (
118+
<Link href={to}>
119+
<Text display="block" fontSize={'20px'} {...rest}>
120+
{children}
121+
</Text>
122+
</Link>
123+
);
124+
};
125+
126+
const MenuLinks = ({ isOpen }: { isOpen: boolean }) => {
127+
return (
128+
<Box display={{ base: isOpen ? 'flex' : 'none', md: 'block' }}>
129+
<Stack
130+
spacing={[0, '16px', null, '24px', '44px']}
131+
justify={{ base: 'space-between', md: 'flex-end' }}
132+
direction={{ base: 'column', md: 'row' }}
133+
pt={[8, 4, 0, 0]}
134+
>
135+
<MenuItem to="/">Latest Updates</MenuItem>
136+
<MenuItem to="/how">Events</MenuItem>
137+
<MenuItem to="/DAO Wiki">DAO Wiki </MenuItem>
138+
<MenuItem to="/pricing">Job Board </MenuItem>
139+
<MenuItem to="/pricing">Projects </MenuItem>
140+
</Stack>
141+
</Box>
142+
);
143+
};
144+
145+
const NavBarContainer = ({ children }: { children: ReactNode }) => {
146+
return (
147+
<Flex
148+
as="nav"
149+
align="center"
150+
justify="space-between"
151+
flexDir={{ base: 'column', md: 'row' }}
152+
wrap="wrap"
153+
w="100%"
154+
mb={8}
155+
py={1}
156+
px={3}
157+
>
158+
{children}
32159
</Flex>
33160
);
34161
};
35162

36-
export default Header;
163+
export default NavBar;

frontend/src/layout/Page/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ function Page({ children }: { children?: object }) {
3434
</Text>
3535
</Flex>
3636
</Marquee>
37-
<Stack paddingY="2.06rem" paddingX="5rem" spacing={10}>
37+
<Stack
38+
paddingY="2.06rem"
39+
paddingX={{ base: '16px', md: '4px', lg: '48px' }}
40+
spacing={10}
41+
>
3842
<Header />
3943
{children}
4044
</Stack>

0 commit comments

Comments
 (0)