import { useEffect, useId, useState } from "react"; import { NavLink, useLocation } from "react-router-dom"; import Icon from "./Icon"; import { useAdmin } from "./AdminSession"; import ThemeToggle from "./ThemeToggle"; const navItems = [ { label: "About", to: "/" }, { label: "Experience", to: "/experience" }, { label: "Skills", to: "/skills" }, { label: "Journal", to: "/blog" }, { label: "Contact", to: "/contact" }, ]; function Header({ name }) { const { isAdmin, checking, openSignIn } = useAdmin(); const [menuOpen, setMenuOpen] = useState(false); const navigationId = useId(); const location = useLocation(); useEffect(() => setMenuOpen(false), [location.pathname]); return (
{name}
); } function Footer({ name }) { const now = new Date(); const monthAndYear = new Intl.DateTimeFormat("en-US", { month: "short", year: "numeric", }).format(now); return ( ); } export default function Layout({ children, profile }) { const location = useLocation(); const name = profile?.display_name ?? "Alex Herlan"; const isAbout = location.pathname === "/"; useEffect(() => { let pressed = null; let origin = null; const clear = () => { pressed?.removeAttribute("data-pressed"); pressed = null; origin = null; }; const press = (event) => { clear(); if (!event.isPrimary || event.button !== 0) return; const control = event.target.closest?.(".button, .culture-link"); if (!control || control.matches(":disabled")) return; pressed = control; origin = { x: event.clientX, y: event.clientY }; pressed.setAttribute("data-pressed", "true"); }; const move = (event) => { if (origin && Math.hypot(event.clientX - origin.x, event.clientY - origin.y) > 10) clear(); }; window.addEventListener("pointerdown", press, { passive: true }); window.addEventListener("pointermove", move, { passive: true }); window.addEventListener("pointerup", clear); window.addEventListener("pointercancel", clear); window.addEventListener("blur", clear); return () => { clear(); window.removeEventListener("pointerdown", press); window.removeEventListener("pointermove", move); window.removeEventListener("pointerup", clear); window.removeEventListener("pointercancel", clear); window.removeEventListener("blur", clear); }; }, []); return (
Skip to content
{children}
); }