|
| 1 | +import React, { ReactNode, useState } from 'react'; |
1 | 2 | import {
|
2 |
| - chakra, |
| 3 | + Link, |
| 4 | + Box, |
3 | 5 | Flex,
|
4 |
| - HStack, |
5 |
| - Image, |
6 |
| - Switch, |
7 | 6 | Text,
|
| 7 | + Switch, |
| 8 | + Image, |
| 9 | + Stack, |
8 | 10 | useColorMode,
|
| 11 | + HStack, |
| 12 | + BoxProps, |
9 | 13 | } from '@chakra-ui/react';
|
10 | 14 |
|
11 |
| -const Header = () => { |
| 15 | +const NavBar = () => { |
| 16 | + const [isOpen, setIsOpen] = useState<boolean>(false); |
12 | 17 | const { colorMode, toggleColorMode } = useColorMode();
|
| 18 | + const toggle = () => setIsOpen(!isOpen); |
| 19 | + |
13 | 20 | 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} /> |
30 | 49 | </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} |
32 | 159 | </Flex>
|
33 | 160 | );
|
34 | 161 | };
|
35 | 162 |
|
36 |
| -export default Header; |
| 163 | +export default NavBar; |
0 commit comments