|
| 1 | +import * as React from "react" |
| 2 | +import Link from "next/link" |
| 3 | +import { Icon } from "reflexjs" |
| 4 | + |
| 5 | +export function Navbar({ branding, links, ...props }) { |
| 6 | + const [showMenu, setShowMenu] = React.useState(false) |
| 7 | + |
| 8 | + return ( |
| 9 | + <header py="6" {...props}> |
| 10 | + <div variant="container"> |
| 11 | + <div display="flex" alignItems="center"> |
| 12 | + {branding && ( |
| 13 | + <Link href="/" passHref> |
| 14 | + <a |
| 15 | + display="flex" |
| 16 | + alignItems="center" |
| 17 | + _hover={{ |
| 18 | + color: "primary", |
| 19 | + }} |
| 20 | + > |
| 21 | + {branding.icon && <Icon name={branding.icon} size="5" mr="2" />} |
| 22 | + <span fontWeight="semibold" fontSize="3xl|2xl"> |
| 23 | + {branding.name} |
| 24 | + </span> |
| 25 | + </a> |
| 26 | + </Link> |
| 27 | + )} |
| 28 | + <NavLinks links={links} display="none|grid" /> |
| 29 | + <button |
| 30 | + display="flex|none" |
| 31 | + p="2" |
| 32 | + size="14" |
| 33 | + ml="auto" |
| 34 | + onClick={() => setShowMenu(!showMenu)} |
| 35 | + > |
| 36 | + <Icon name="menu-alt" size="10" /> |
| 37 | + </button> |
| 38 | + </div> |
| 39 | + </div> |
| 40 | + <div |
| 41 | + position="absolute" |
| 42 | + zIndex="1000" |
| 43 | + bg="background" |
| 44 | + top="24" |
| 45 | + left="4" |
| 46 | + right="4" |
| 47 | + px="4" |
| 48 | + rounded="xl" |
| 49 | + overflow="scroll" |
| 50 | + boxShadow="3xl" |
| 51 | + border="1px solid" |
| 52 | + borderColor="border" |
| 53 | + transform={`scale(${showMenu ? 1 : 0.95})`} |
| 54 | + visibility={showMenu ? "visible" : "hidden"} |
| 55 | + opacity={showMenu ? 1 : 0} |
| 56 | + transition="all .25s ease-in" |
| 57 | + transformOrigin="100% 0" |
| 58 | + maxHeight="95vh" |
| 59 | + display="block|none" |
| 60 | + > |
| 61 | + <NavLinks links={links} py="8" /> |
| 62 | + </div> |
| 63 | + </header> |
| 64 | + ) |
| 65 | +} |
| 66 | + |
| 67 | +export function NavLinks({ links, ...props }) { |
| 68 | + return links.length ? ( |
| 69 | + <div |
| 70 | + display="grid" |
| 71 | + col={`1|repeat(${links.length}, auto)`} |
| 72 | + gap="8|10|12" |
| 73 | + ml="auto" |
| 74 | + {...props} |
| 75 | + > |
| 76 | + {links.map((link, index) => ( |
| 77 | + <Link key={index} href={link.href} passHref> |
| 78 | + <a |
| 79 | + variant="text" |
| 80 | + textAlign="left|center" |
| 81 | + fontSize="xl|md" |
| 82 | + px="4|0" |
| 83 | + _hover={{ |
| 84 | + color: "primary", |
| 85 | + }} |
| 86 | + > |
| 87 | + {link.title} |
| 88 | + </a> |
| 89 | + </Link> |
| 90 | + ))} |
| 91 | + </div> |
| 92 | + ) : null |
| 93 | +} |
0 commit comments