From 75897776e005c2ce65379735eaddd4d4ab0c1741 Mon Sep 17 00:00:00 2001 From: Hazem Krimi Date: Fri, 8 Jan 2021 19:04:30 +0100 Subject: [PATCH] Add mobile nav --- components/MobileNav.tsx | 64 ++++++++++++++++++++++++++++++++++++++++ components/Nav.tsx | 36 +++++++++++++++++++++- 2 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 components/MobileNav.tsx diff --git a/components/MobileNav.tsx b/components/MobileNav.tsx new file mode 100644 index 0000000..4199f9a --- /dev/null +++ b/components/MobileNav.tsx @@ -0,0 +1,64 @@ +import { FC, useContext } from 'react'; +import { DarkModeContext } from './DarkMode'; +import styled from 'styled-components'; +import IconButton from './IconButton'; +import Button from './Button'; + +interface Props { + open: boolean; + close: () => void; +} + +interface StyledProps { + dark: boolean; + open: boolean; +} + +const Bar = styled.nav` + position: fixed; + z-index: 2; + top: 0; + right: 0; + transform-origin: right; + transform: ${({ open }) => (open ? 'translateX(0%)' : 'translateX(100%)')}; + width: 80%; + height: 100vh; + background: ${({ theme, dark }) => (dark ? theme.colors.dark.text : theme.colors.light.text)}; + transition: transform 250ms ease-in-out; + display: grid; + grid-template-rows: auto; + row-gap: 0.3rem; + padding: 1rem 1rem 5rem 1rem; + + .close { + justify-self: flex-end; + align-self: flex-start; + margin-top: 0.5rem; + } + + .mobile { + color: ${({ theme, dark }) => + dark ? theme.colors.light.text : theme.colors.dark.text} !important; + margin: 0rem 1rem; + } +`; + +const MobileNav: FC = ({ open, close }) => { + const { dark, toggle } = useContext(DarkModeContext); + + return ( + +
+ +
+ + + + +
+ ); +}; + +export default MobileNav; diff --git a/components/Nav.tsx b/components/Nav.tsx index b599c89..a0d6433 100644 --- a/components/Nav.tsx +++ b/components/Nav.tsx @@ -1,10 +1,11 @@ -import { FC, useContext } from 'react'; +import { FC, useContext, useState } from 'react'; import { DarkModeContext } from './DarkMode'; import styled from 'styled-components'; import Image from 'next/image'; import Button from './Button'; import IconButton from './IconButton'; import { useRouter } from 'next/router'; +import MobileNav from './MobileNav'; const Bar = styled.nav` user-select: none; @@ -16,12 +17,20 @@ const Bar = styled.nav` h2 { font-size: 1.7rem; + + @media (max-width: 768px) { + font-size: 1.2rem; + } } div { display: grid; align-items: center; column-gap: 1rem; + + @media (max-width: 768px) { + column-gap: 0.5rem; + } } .logo { @@ -33,10 +42,25 @@ const Bar = styled.nav` .buttons { grid-template-columns: repeat(5, auto); justify-content: flex-end; + + @media (max-width: 768px) { + display: none; + } + } + + .mobile-buttons { + display: none; + + @media (max-width: 768px) { + display: grid; + grid-template-columns: repeat(2, auto); + justify-content: flex-end; + } } `; const Nav: FC = () => { + const [mobileNavOpen, setMobileNavOpen] = useState(false); const { dark, toggle } = useContext(DarkModeContext); const router = useRouter(); @@ -55,6 +79,16 @@ const Nav: FC = () => { Resume +
+ + setMobileNavOpen(true)} + /> +
+ setMobileNavOpen(false)} /> ); };