Files
peroxy_site/components/Navbar.tsx
Rei bc51e625b4
All checks were successful
continuous-integration/drone/push Build is passing
dynamic markdown
2022-12-27 17:33:00 +01:00

71 lines
2.4 KiB
TypeScript

import Link from "next/link";
import { IoMenu as MenuIcon, IoClose as CloseIcon } from "react-icons/io5";
import { useState } from "react";
import { motion, AnimatePresence } from "framer-motion";
const links = [
{ name: "blog", href: "/blog" },
{ name: "projects", href: "/projects" },
{ name: "github", href: "https://github.com/kookroach" },
];
export const Navbar = () => {
const [showMenu, setShowMenu] = useState(false);
return (
<nav className="lg:p-4 p-2 lg:py-10 mx-6 flex flex-row justify-between">
<Link
href="/"
id="logo"
className="flex flex-row gap-2 items-end transition-all ease-in duration-100 text-action hover:text-secondary"
>
<div className="font-bold text-4xl font-mono">peroxy</div>
</Link>
<div className="hidden lg:flex flex-row gap-10 items-center font-medium font-mono">
{links.map(({ name, href }) => (
<Link href={href} key={name}>
<button className="px-10 py-1 rounded-sm bg-primary hover:bg-primary/50 transition-all duration-150 ease-out">
{name}
</button>
</Link>
))}
</div>
<div className="lg:hidden flex">
<button onClick={() => setShowMenu(true)} className="text-2xl">
<MenuIcon />
</button>
<AnimatePresence>
{showMenu && (
<>
<motion.div
className="absolute left-0 top-0 h-screen w-screen bg-black/70 z-10"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
/>
<motion.div
className={`z-40 absolute w-1/2 bg-blue-900
right-0 top-0 px-10 py-6 h-screen`}
initial={{ x: 100 }}
animate={{ x: 0 }}
exit={{ x: 100 }}
transition={{ duration: 0.3 }}
>
<button onClick={() => setShowMenu(false)} className="text-2xl">
<CloseIcon />
</button>
<div className="flex flex-col gap-10 mt-10 font-bold font-mono">
{links.map(({ name, href }) => (
<Link href={href} key={name}>
<button>{name}</button>
</Link>
))}
</div>
</motion.div>
</>
)}
</AnimatePresence>
</div>
</nav>
);
};