Files
ttvfx/components/Header.tsx
T
twotalesanimation 6c464d6dfb Add real studio content: Festo F1 film, filmography, service stills
From the Dec 2024 company profile: Pretoria location, founding year, service
list with stills, and 14 film/series credits with posters. Festo F1 spot
transcoded for web (cropped letterbox, 14 MB, faststart).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 18:40:45 +02:00

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-sm font-light tracking-[0.22em] whitespace-nowrap uppercase md:text-lg md:tracking-[0.3em]">
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>
);
}