diff options
-rw-r--r-- | components/navbar.tsx | 16 | ||||
-rw-r--r-- | pages/index.tsx | 3 | ||||
-rw-r--r-- | pages/search.tsx | 3 | ||||
-rw-r--r-- | styles/layout.css | 62 | ||||
-rw-r--r-- | styles/navbar.css | 44 |
5 files changed, 124 insertions, 4 deletions
diff --git a/components/navbar.tsx b/components/navbar.tsx index 35949f4..b5549c0 100644 --- a/components/navbar.tsx +++ b/components/navbar.tsx @@ -2,6 +2,7 @@ import { CSSProperties, ReactNode } from 'react'; import HomeRoundedIcon from '@material-ui/icons/HomeRounded'; import SearchRoundedIcon from '@material-ui/icons/SearchRounded'; +import MenuIcon from '@material-ui/icons/Menu'; export function NavbarItem(props: { icon?: ReactNode; @@ -30,7 +31,7 @@ export function NavbarItem(props: { export default function Navbar(props: { page?: string; }) { - return <div style={{ marginBottom: 24 }}> + return <div className="globalLinks" style={{ marginBottom: 24 }}> <NavbarItem active={props.page == 'home'} icon={<HomeRoundedIcon />} @@ -47,3 +48,16 @@ export default function Navbar(props: { /> </div>; } + +export function MobileNavbar() { + return <div className="mobileNav"> + <a className="home button small" href="/"><HomeRoundedIcon /></a> + <a className="search button small" href="/search"><SearchRoundedIcon/></a> + <div className="mainButton button" onClick={() => { + document.getElementsByClassName("mobileNav")[0].classList.toggle("open"); + document.getElementsByClassName("navAreaWrapper")[0].classList.toggle("navVisible"); + }}> + <MenuIcon style={{ "fill": "var(--oxford-blue)" }} /> + </div> + </div>; +} diff --git a/pages/index.tsx b/pages/index.tsx index ab0f6ff..7f4c5fe 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,7 +1,7 @@ import Button from '../components/button'; import PostCard from '../components/card'; import Chapters, { chapter } from '../components/chapters'; -import Navbar, { NavbarItem } from '../components/navbar'; +import Navbar, { NavbarItem, MobileNavbar } from '../components/navbar'; import Seperator from '../components/seperator'; import { ArticleMeta, getStaticProps as getBlogPage, RenderedArticle } from './post/[id]'; import { PostsInfo } from './search'; @@ -51,6 +51,7 @@ export default function Home(props: { /> </div> </div> + <MobileNavbar/> <div className='contentWrapper'> {props.posts.map((post, index) => { return <> diff --git a/pages/search.tsx b/pages/search.tsx index 8daff50..b95d70e 100644 --- a/pages/search.tsx +++ b/pages/search.tsx @@ -1,7 +1,7 @@ import Fuse from 'fuse.js'; import { useEffect, useState } from 'react'; -import Navbar from '../components/navbar'; +import Navbar, { MobileNavbar } from '../components/navbar'; import Tags from '../components/tag'; import SearchOutlinedIcon from '@material-ui/icons/SearchOutlined'; @@ -149,6 +149,7 @@ export default function SearchPage() { <Navbar page='search' /> </div> </div> + <MobileNavbar/> <div className='contentWrapper'> <SearchBar searchFunction={() => { diff --git a/styles/layout.css b/styles/layout.css index 6715681..b4e2a76 100644 --- a/styles/layout.css +++ b/styles/layout.css @@ -20,7 +20,10 @@ grid-column: 2; grid-row: 1; } -.titleWrapper > * { margin: 0; } +.titleWrapper > * { + margin: 0; + word-break: break-word; +} .navAreaWrapper { grid-column: 1; @@ -64,3 +67,60 @@ grid-template-columns: repeat( auto-fit, minmax(250px, 1fr) ); } +.mobileNav { + display: none; +} + +@media screen and (max-device-width: 550px) { + .navAreaWrapper { + grid-column: none; + grid-row: none; + } + + .centeredPage { + grid-template-columns: 0 1fr; + gap: var(--page-margins) 0; + padding: 0 12px; + } + + .navAreaWrapper { + position: fixed; + inset: 0px 0px 0px 0px; + + z-index: 2; + + transition-property: opacity; + transition-duration: .1s; + + opacity: 0; + pointer-events: none; + backdrop-filter: blur(50px); + background-color: #161B3300; + } + + .navAreaWrapper.navVisible { + pointer-events: initial; + opacity: 1; + } + + .navAreaWrapper .globalLinks { + display: none; + } + + .navAreaWrapper > .sticky { + position: absolute; + inset: 0px 0px 0px 0px; + + padding: 24px; + overflow-y: scroll; + } + + .mobileNav { + display: inline-block; + position: fixed; + bottom: 24px; + right: 24px; + z-index: 5; + } +} + diff --git a/styles/navbar.css b/styles/navbar.css index 607c3d7..c73c829 100644 --- a/styles/navbar.css +++ b/styles/navbar.css @@ -101,3 +101,47 @@ color: var(--oxford-blue) } } + +.mobileNav { + width: 48px; + text-align: center; + line-height: 0; +} + +.mobileNav .button:last-child { + margin-bottom: 0; +} + +.mobileNav .button { + padding: 12px; + background-color: var(--fire-opal); + display: inline-block !important; + min-width: 0; + border-radius: 24px; + margin: 0; + box-shadow: 0 4px 10px -2px rgba(0, 0, 0, 25%); + + width: 24px; + height: 24px; + position: relative; +} + +.mobileNav .button > svg { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.mobileNav .button.small { + padding: 6px; + background-color: var(--purple-navy); + margin-bottom: 12px; + + opacity: 0; + transition: opacity .3s; +} + +.mobileNav.open .button.small { + opacity: 1; +} |