/* ====== Shared: routing, Logo, Nav, Footer, helpers ====== */ const { useState, useEffect } = React; /* hash router: #/tentang -> "tentang", empty -> "home" */ function parseRoute() { const h = (location.hash || "").replace(/^#\/?/, "").trim(); return h || "home"; } function useRoute() { const [route, setRoute] = useState(parseRoute); useEffect(() => { const on = () => { setRoute(parseRoute()); window.scrollTo({ top: 0, behavior: "instant" }); }; window.addEventListener("hashchange", on); return () => window.removeEventListener("hashchange", on); }, []); return route; } function Logo({ light, lg, sub = true }) { return ( Logo GMN GMN {sub && Gajah Muda Nusantara} ); } function Eyebrow({ id, en, light, children }) { return ( {id || children}{en && · {en}} ); } function Placeholder({ label, red, style, className = "" }) { return (
{label && {label}}
); } const Arrow = () => ( ); function ProgIcon({ i }) { const paths = [ , , , , , , ]; return ( {paths[i % paths.length]} ); } const NAV_LINKS = [ ["tentang", "Tentang"], ["program", "Program"], ["galeri", "Galeri"], ["berita", "Berita"], ["pengurus", "Pengurus"], ["kontak", "Kontak"], ]; function Nav() { const route = useRoute(); const [open, setOpen] = useState(false); useEffect(() => { setOpen(false); }, [route]); return (
Pelajari Daftar Anggota
{open && (
{NAV_LINKS.map(([r, label]) => ( {label} ))} Daftar Anggota
)}
); } /* compact red header band for inner pages */ function PageHero({ eyebrow, en, title, sub }) { return (

{title}

{sub &&

{sub}

}
); } function Footer() { const cols = [ ["Organisasi", [["#/tentang", "Tentang Kami"], ["#/program", "Program"], ["#/pengurus", "Pengurus"], ["#/berita", "Berita"]]], ["Bergabung", [["daftar.html", "Daftar Anggota"], ["#/program", "Cara Bergabung"], ["#/galeri", "Galeri"], ["#/kontak", "Kontak"]]], ["Ikuti", [["#", "Instagram"], ["#", "TikTok"], ["#", "X / Twitter"], ["#", "YouTube"]]], ]; return ( ); } Object.assign(window, { useRoute, Logo, Eyebrow, Placeholder, Arrow, ProgIcon, Nav, PageHero, Footer });