2023-10-12 09:56:13 +02:00
|
|
|
import { Link, useLocation } from "react-router-dom";
|
2024-01-02 23:04:17 +01:00
|
|
|
import { useState, useEffect } from "react";
|
|
|
|
|
import { Divide as Hamburger } from "hamburger-react";
|
2022-07-27 16:36:16 +02:00
|
|
|
|
2022-07-27 13:42:38 +02:00
|
|
|
function Header() {
|
2022-07-27 18:34:46 +02:00
|
|
|
const [isOpen, setOpen] = useState(false);
|
2024-01-02 23:04:17 +01:00
|
|
|
|
2022-07-27 19:26:06 +02:00
|
|
|
const menuTimeout = 400;
|
2023-10-12 09:56:13 +02:00
|
|
|
const location = useLocation();
|
2022-07-27 18:34:46 +02:00
|
|
|
|
2024-01-02 23:04:17 +01:00
|
|
|
useEffect(() => {
|
|
|
|
|
document.body.style.overflow = isOpen ? "hidden" : "unset";
|
|
|
|
|
}, [isOpen]);
|
|
|
|
|
|
2023-10-12 09:56:13 +02:00
|
|
|
const menu = [
|
2024-01-02 23:04:17 +01:00
|
|
|
{ link: "/#about", title: ".me()" },
|
|
|
|
|
{ link: "/#experience", title: ".experience()" },
|
|
|
|
|
{ link: "/#contact", title: ".contact()" },
|
2023-10-12 09:56:13 +02:00
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const menuUI = menu.map((item) => {
|
|
|
|
|
let className = "drop-shadow-light hover:drop-shadow-doublelight";
|
|
|
|
|
if (location.pathname === item.link) {
|
|
|
|
|
className += " text-white";
|
|
|
|
|
} else {
|
|
|
|
|
className += " text-white/40";
|
|
|
|
|
}
|
|
|
|
|
return (
|
2024-01-02 23:04:17 +01:00
|
|
|
<li className="my-10 text-xl md:my-0 md:text-base" key={item.link}>
|
|
|
|
|
<Link
|
|
|
|
|
className={className}
|
|
|
|
|
onClick={() => {
|
|
|
|
|
setOpen(false);
|
|
|
|
|
}}
|
|
|
|
|
to={item.link}
|
|
|
|
|
>
|
2023-10-12 09:56:13 +02:00
|
|
|
{item.title}
|
2022-07-27 19:26:06 +02:00
|
|
|
</Link>
|
2023-10-12 09:56:13 +02:00
|
|
|
</li>
|
|
|
|
|
);
|
|
|
|
|
});
|
2022-07-27 18:34:46 +02:00
|
|
|
|
2024-01-05 21:57:43 +01:00
|
|
|
const headerClasses = ["sticky", "top-0", "z-40", "backdrop-blur-md", "h-16"];
|
2024-01-02 23:04:17 +01:00
|
|
|
const logoClasses = ["hover:drop-shadow-light"];
|
|
|
|
|
const overlayMenu = [
|
|
|
|
|
"bg-black/90",
|
|
|
|
|
"z-50",
|
|
|
|
|
"fixed",
|
|
|
|
|
"left-0",
|
|
|
|
|
"right-0",
|
|
|
|
|
"top-16",
|
|
|
|
|
"h-screen",
|
|
|
|
|
"backdrop-blur-sm",
|
|
|
|
|
"p-2",
|
|
|
|
|
];
|
|
|
|
|
if (isOpen) {
|
|
|
|
|
headerClasses.push("bg-black/90");
|
|
|
|
|
logoClasses.push("drop-shadow-yellow");
|
|
|
|
|
} else {
|
|
|
|
|
headerClasses.push("bg-bgColor/90");
|
|
|
|
|
logoClasses.push("drop-shadow-doublelight");
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-27 16:36:16 +02:00
|
|
|
return (
|
2024-01-02 23:04:17 +01:00
|
|
|
<>
|
|
|
|
|
{isOpen && (
|
|
|
|
|
<div className={overlayMenu.join(" ")}>
|
|
|
|
|
<div className=" h-[calc(100vh-20rem)] flex flex-col justify-center">
|
|
|
|
|
<ul>{menuUI}</ul>
|
2022-07-27 16:36:16 +02:00
|
|
|
</div>
|
2024-01-02 23:04:17 +01:00
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
<header className={headerClasses.join(" ")}>
|
|
|
|
|
<div className="container mx-auto h-full">
|
|
|
|
|
<nav className="flex items-center h-full px-2">
|
2024-01-05 21:57:43 +01:00
|
|
|
<div className="flex-none text-3xl md:text-4xl font-black font-headline ">
|
2024-01-02 23:04:17 +01:00
|
|
|
<Link className={logoClasses.join(" ")} to="/#start">
|
2024-01-08 19:09:49 +01:00
|
|
|
MW.
|
2024-01-02 23:04:17 +01:00
|
|
|
</Link>
|
|
|
|
|
</div>
|
2022-07-27 18:34:46 +02:00
|
|
|
|
2024-01-02 23:04:17 +01:00
|
|
|
<div className="grow"></div>
|
|
|
|
|
<div className="flex-none hidden md:block ">
|
|
|
|
|
<ul className="flex flex-row gap-4 text-lg">{menuUI}</ul>
|
|
|
|
|
</div>
|
|
|
|
|
<div className="flex-none block md:hidden">
|
|
|
|
|
<Hamburger toggled={isOpen} toggle={setOpen} duration={0.9} />
|
|
|
|
|
</div>
|
|
|
|
|
</nav>
|
|
|
|
|
</div>
|
|
|
|
|
</header>
|
|
|
|
|
</>
|
2022-07-27 16:36:16 +02:00
|
|
|
);
|
2022-07-27 13:42:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default Header;
|