71 lines
2.4 KiB
TypeScript
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>
|
|
);
|
|
};
|