1f3af8f7f5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
82 lines
2.7 KiB
TypeScript
82 lines
2.7 KiB
TypeScript
"use client";
|
|
|
|
import Link from "next/link";
|
|
import { useEffect, useState } from "react";
|
|
import Fox from "./Fox";
|
|
import { nav } from "@/content/site";
|
|
|
|
export default function Header() {
|
|
const [scrolled, setScrolled] = useState(false);
|
|
const [open, setOpen] = useState(false);
|
|
|
|
useEffect(() => {
|
|
const onScroll = () => setScrolled(window.scrollY > 24);
|
|
onScroll();
|
|
window.addEventListener("scroll", onScroll, { passive: true });
|
|
return () => window.removeEventListener("scroll", onScroll);
|
|
}, []);
|
|
|
|
useEffect(() => {
|
|
document.body.style.overflow = open ? "hidden" : "";
|
|
}, [open]);
|
|
|
|
return (
|
|
<header
|
|
className={`fixed inset-x-0 top-0 z-50 transition-colors duration-500 ${
|
|
scrolled || open ? "border-b border-line bg-ink/80 backdrop-blur-md" : "border-b border-transparent"
|
|
}`}
|
|
>
|
|
<div className="mx-auto flex h-16 max-w-7xl items-center justify-between px-5 md:h-20 md:px-8">
|
|
<Link href="/" className="flex items-center gap-3" onClick={() => setOpen(false)}>
|
|
<Fox className="h-7 w-7 text-fg md:h-8 md:w-8" />
|
|
<span className="font-display text-base font-light tracking-[0.3em] uppercase md:text-lg">
|
|
Two Tales <span className="text-accent">VFX</span>
|
|
</span>
|
|
</Link>
|
|
|
|
<nav className="hidden items-center gap-10 md:flex" aria-label="Main">
|
|
{nav.map((item) => (
|
|
<Link
|
|
key={item.href}
|
|
href={item.href}
|
|
className="font-mono text-xs tracking-[0.2em] text-muted uppercase transition-colors hover:text-fg"
|
|
>
|
|
{item.label}
|
|
</Link>
|
|
))}
|
|
</nav>
|
|
|
|
<button
|
|
type="button"
|
|
className="relative h-10 w-10 md:hidden"
|
|
aria-label={open ? "Close menu" : "Open menu"}
|
|
aria-expanded={open}
|
|
onClick={() => setOpen((v) => !v)}
|
|
>
|
|
<span
|
|
className={`absolute right-2 left-2 h-px bg-fg transition-transform duration-300 ${open ? "rotate-45" : "-translate-y-1.5"}`}
|
|
/>
|
|
<span
|
|
className={`absolute right-2 left-2 h-px bg-fg transition-transform duration-300 ${open ? "-rotate-45" : "translate-y-1.5"}`}
|
|
/>
|
|
</button>
|
|
</div>
|
|
|
|
{open && (
|
|
<nav className="flex h-[calc(100dvh-4rem)] flex-col gap-2 px-5 pt-10 md:hidden" aria-label="Mobile">
|
|
{nav.map((item) => (
|
|
<Link
|
|
key={item.href}
|
|
href={item.href}
|
|
onClick={() => setOpen(false)}
|
|
className="font-display text-4xl font-light tracking-wider uppercase"
|
|
>
|
|
{item.label}
|
|
</Link>
|
|
))}
|
|
</nav>
|
|
)}
|
|
</header>
|
|
);
|
|
}
|