Skip to content

Commit

Permalink
Merge pull request #1 from helloroman/sidebar-final
Browse files Browse the repository at this point in the history
Sidebar final
  • Loading branch information
helloroman committed Oct 18, 2021
2 parents 01f2d6a + 1ba561a commit 29a5136
Show file tree
Hide file tree
Showing 4 changed files with 195 additions and 6 deletions.
4 changes: 4 additions & 0 deletions src/App.js
Expand Up @@ -9,6 +9,7 @@ import Welcome from "./components/Welcome/Welcome";
import {GlobalStyle} from "./assets/styles/GlobalStyles";
import InfiniteScroll from "./episodes/InfiniteLoading/InfiniteScroll";
import AccordionFaq from "./episodes/AccordionFaq/AccordionFaq";
import Sidebar from "./episodes/Sidebar/Sidebar";

const App = () => {
return (
Expand All @@ -23,6 +24,9 @@ const App = () => {
<Route path="/accordion-faq">
<AccordionFaq />
</Route>
<Route path="/sidebar">
<Sidebar />
</Route>
<Route path="/">
<Welcome />
</Route>
Expand Down
3 changes: 3 additions & 0 deletions src/assets/styles/GlobalStyles.js
Expand Up @@ -6,7 +6,10 @@ export const GlobalStyle = createGlobalStyle`
}
body {
padding: 0;
margin: 0;
max-width: 100%;
width: 100%;
overflow-x: hidden;
}
Expand Down
16 changes: 10 additions & 6 deletions src/components/Navigation/Navigation.js
Expand Up @@ -12,8 +12,8 @@ const Nav = styled.nav`
position: absolute;
right: 0;
top: 50px;
transform: translateX(${({isOpen}) => isOpen ? '0' : '100%'});
transition: transform 0.5s ease-in-out;
transform: translateX(${({isOpen}) => isOpen ? '0' : '100%'});
`;

const NavList = styled.ul`
Expand All @@ -26,9 +26,10 @@ const NavListItem = styled.li`
`;

const activeClassName = 'selected';
const StyledNavLink = styled(NavLink).attrs({
const StyledNavLink = styled(NavLink).attrs(props => ({
tabIndex: props.isOpen ? null : '-1',
activeClassName,
})`
}))`
font-family: 'IBM Plex Mono', monospace;
text-decoration: none;
color: black;
Expand Down Expand Up @@ -56,13 +57,16 @@ const Navigation = () => {
<NavButton onClick={() => setIsOpen(!isOpen)}>🍔</NavButton>
<NavList>
<NavListItem>
<StyledNavLink exact to="/">Home</StyledNavLink>
<StyledNavLink isOpen={isOpen} exact to="/">Home</StyledNavLink>
</NavListItem>
<NavListItem>
<StyledNavLink isOpen={isOpen} to="/infinite-scroll">Infinite Scroll</StyledNavLink>
</NavListItem>
<NavListItem>
<StyledNavLink to="/infinite-scroll">Infinite Scroll</StyledNavLink>
<StyledNavLink isOpen={isOpen} to="/accordion-faq">Accordion FAQ</StyledNavLink>
</NavListItem>
<NavListItem>
<StyledNavLink to="/accordion-faq">Accordion FAQ</StyledNavLink>
<StyledNavLink isOpen={isOpen} to="/sidebar">Sidebar</StyledNavLink>
</NavListItem>
</NavList>
</Nav>
Expand Down
178 changes: 178 additions & 0 deletions src/episodes/Sidebar/Sidebar.js
@@ -0,0 +1,178 @@
import React, {useState} from 'react';
import styled, {keyframes} from 'styled-components';

const AppearAnimation = keyframes`
from {
opacity: 0;
}
to {
opacity: 1;
}
`;

const Content = styled.div`
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: 20px;
margin: 100px 30px;
div {
width: 100%;
background-color: lightgray;
height: 20vh;
&:hover {
background-color: pink;
}
}
`;

const Navigation = styled.nav`
display: ${({isOpen}) => isOpen ? 'block' : 'none'};
width: 100%;
height: 100vh;
background-color: white;
position: absolute;
left: 0;
top: 0;
animation: 0.3s ease-in-out 1 forwards ${AppearAnimation};
@media (min-width: 720px) {
display: block;
width: 300px;
border-right: 3px solid black;
animation: none;
transition: transform 0.3s ease-in-out;
transform: translateX(${({isOpen}) => isOpen ? '0' : '-100%'});
}
ul {
list-style: none;
padding: 0;
margin: 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100%;
li {
margin: 20px 0;
a {
font-size: 25px;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
}
`;

const MenuToggleButton = styled.button`
width: 40px;
height: 40px;
z-index: 9999;
position: absolute;
top: 20px;
left: 20px;
overflow-x: hidden;
background-color: white;
border: 2px solid black;
@media (min-width: 720px) {
left: 0;
border-left: none;
transition: transform 0.3s ease-in-out;
transform: translateX(${({isOpen}) => isOpen ? '300px' : '0'});
}
span:first-child {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
transform: translateX(${({isOpen}) => isOpen ? 'calc(-100% - 2px)' : 0});
transition: transform ease-in-out 0.3s;
&::before, &::after {
position: absolute;
content: '';
width: 17px;
height: 3px;
background-color: black;
left: 50%;
}
&::before {
top: 13px;
transform: translate(-50%, -50%) rotate(45deg);
}
&::after {
bottom: 13px;
transform: translate(-50%, 50%) rotate(-45deg);
}
}
span:last-child {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: calc(100% + 2px);
transform: translateX(${({isOpen}) => isOpen ? 'calc(-100% - 2px)' : 0});
transition: transform ease-in-out 0.3s;
&::before, &::after {
position: absolute;
content: '';
width: 25px;
height: 3px;
background-color: black;
top: 50%;
left: 50%;
}
&::before {
transform: translate(-50%, -50%) rotate(45deg);
}
&::after {
transform: translate(-50%, -50%) rotate(-45deg);
}
}
`;

const Sidebar = () => {
const [isOpen, setIsOpen] = useState(false);

return (
<>
<MenuToggleButton isOpen={isOpen} onClick={() => setIsOpen(prevState => !prevState)}>
<span/>
<span/>
</MenuToggleButton>
<Navigation isOpen={isOpen}>
<ul>
<li><a tabIndex={isOpen ? null : '-1'} href="/">Lorem</a></li>
<li><a tabIndex={isOpen ? null : '-1'} href="/">Ipsum</a></li>
<li><a tabIndex={isOpen ? null : '-1'} href="/">Dolor</a></li>
<li><a tabIndex={isOpen ? null : '-1'} href="/">Sit</a></li>
<li><a tabIndex={isOpen ? null : '-1'} href="/">Amet</a></li>
</ul>
</Navigation>
<Content>
<div/>
<div/>
<div/>
<div/>
</Content>
</>
)
};

export default Sidebar

0 comments on commit 29a5136

Please sign in to comment.