mirror of
https://git.aramjonghu.dev/AramJonghu/aramjonghu-site.git
synced 2026-09-13 17:53:31 +02:00
feat(hamburger_menu): added mobile friendly hamburger menu
This commit is contained in:
Binary file not shown.
@@ -1,3 +1,4 @@
|
|||||||
|
import { useState } from "react";
|
||||||
import Aku from "../assets/images/aku.png";
|
import Aku from "../assets/images/aku.png";
|
||||||
|
|
||||||
interface NavItem {
|
interface NavItem {
|
||||||
@@ -21,6 +22,7 @@ interface HeaderProps {
|
|||||||
|
|
||||||
export default function Header({ theme }: HeaderProps) {
|
export default function Header({ theme }: HeaderProps) {
|
||||||
const { theme: currentTheme, toggleTheme } = theme;
|
const { theme: currentTheme, toggleTheme } = theme;
|
||||||
|
const [menuOpen, setMenuOpen] = useState(false);
|
||||||
|
|
||||||
const navItems: NavItem[] = [
|
const navItems: NavItem[] = [
|
||||||
{ label: "Nextcloud", url: "https://nextcloud.aramjonghu.dev" },
|
{ label: "Nextcloud", url: "https://nextcloud.aramjonghu.dev" },
|
||||||
@@ -39,16 +41,47 @@ export default function Header({ theme }: HeaderProps) {
|
|||||||
window.location.href = "/";
|
window.location.href = "/";
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
const closeMenu = () => {
|
||||||
<header className="bg-ctp-mantle flex justify-between items-center px-4 md:px-12 py-4 md:py-6 gap-4 md:gap-6 border-b border-ctp-lavender-800">
|
setMenuOpen(false);
|
||||||
<img
|
};
|
||||||
className="size-16 cursor-pointer"
|
|
||||||
src={Aku}
|
|
||||||
alt="Home"
|
|
||||||
onClick={goHome}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<nav className="flex flex-wrap gap-2 md:gap-3 items-start">
|
return (
|
||||||
|
<header className="bg-ctp-mantle flex flex-col md:flex-row justify-between items-start md:items-center px-4 md:px-12 py-4 md:py-6 gap-4 md:gap-6 border-b border-ctp-lavender-800">
|
||||||
|
<div className="grid grid-cols-3 items-center w-full md:hidden gap-4">
|
||||||
|
<img
|
||||||
|
className="size-16 cursor-pointer justify-self-start"
|
||||||
|
src={Aku}
|
||||||
|
alt="Home"
|
||||||
|
onClick={goHome}
|
||||||
|
/>
|
||||||
|
|
||||||
|
<button
|
||||||
|
className="theme-ui-btn ui-btn:hover font-[NerdFontSymbols] justify-self-center"
|
||||||
|
aria-label="Toggle menu"
|
||||||
|
aria-expanded={menuOpen}
|
||||||
|
onClick={() => setMenuOpen(!menuOpen)}
|
||||||
|
>
|
||||||
|
{menuOpen ? "\uf00d" : "\uf0c9"}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
className="theme-ui-btn ui-btn:hover text-lg font-[NerdFontSymbols] justify-self-end"
|
||||||
|
onClick={toggleTheme}
|
||||||
|
>
|
||||||
|
{currentTheme === "macchiato" ? "" : ""}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="hidden md:block">
|
||||||
|
<img
|
||||||
|
className="size-16 cursor-pointer"
|
||||||
|
src={Aku}
|
||||||
|
alt="Home"
|
||||||
|
onClick={goHome}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<nav className="hidden md:flex flex-wrap gap-2 md:gap-3 items-start">
|
||||||
{navItems.map((nav) => (
|
{navItems.map((nav) => (
|
||||||
<a
|
<a
|
||||||
key={nav.label}
|
key={nav.label}
|
||||||
@@ -59,7 +92,7 @@ export default function Header({ theme }: HeaderProps) {
|
|||||||
</a>
|
</a>
|
||||||
))}
|
))}
|
||||||
</nav>
|
</nav>
|
||||||
<nav className="flex flex-wrap gap-2 md:gap-3 items-end">
|
<nav className="hidden md:flex flex-wrap gap-2 md:gap-3 items-end">
|
||||||
{pageItems.map((page) => (
|
{pageItems.map((page) => (
|
||||||
<a
|
<a
|
||||||
key={page.label}
|
key={page.label}
|
||||||
@@ -71,7 +104,7 @@ export default function Header({ theme }: HeaderProps) {
|
|||||||
))}
|
))}
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div>
|
<div className="hidden md:block">
|
||||||
<button
|
<button
|
||||||
className="theme-ui-btn ui-btn:hover text-lg font-[NerdFontSymbols]"
|
className="theme-ui-btn ui-btn:hover text-lg font-[NerdFontSymbols]"
|
||||||
onClick={toggleTheme}
|
onClick={toggleTheme}
|
||||||
@@ -79,6 +112,38 @@ export default function Header({ theme }: HeaderProps) {
|
|||||||
{currentTheme === "macchiato" ? "" : ""}
|
{currentTheme === "macchiato" ? "" : ""}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
className={`md:hidden w-full overflow-hidden transition-all duration-150 ease-in-out ${
|
||||||
|
menuOpen
|
||||||
|
? "max-h-80 opacity-100 visible"
|
||||||
|
: "max-h-0 opacity-0 invisible"
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<nav className="flex flex-col gap-2 w-full max-w-sm mx-auto border-t border-ctp-lavender-800 pt-4">
|
||||||
|
{navItems.map((item) => (
|
||||||
|
<a
|
||||||
|
key={item.label}
|
||||||
|
href={item.url}
|
||||||
|
className="ui-btn ui-btn:hover px-2 py-1 w-full"
|
||||||
|
onClick={closeMenu}
|
||||||
|
>
|
||||||
|
{item.label}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
<div className="w-full border-t border-ctp-lavender-800 my-2" />
|
||||||
|
{pageItems.map((item) => (
|
||||||
|
<a
|
||||||
|
key={item.label}
|
||||||
|
href={item.url}
|
||||||
|
className="ui-btn ui-btn:hover px-2 py-1 w-full"
|
||||||
|
onClick={closeMenu}
|
||||||
|
>
|
||||||
|
{item.label}
|
||||||
|
</a>
|
||||||
|
))}
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user