/* P.E.S.T — Nav + 3 Hero variants */ const { useState, useEffect, useRef } = React; const EMBLEM = "assets/pest-emblem.png"; function Wordmark({ className }) { return (

P.E.S.T

); } function Acronym({ className }) { const words = ["Play", "Earn", "Strive", "Together"]; return (
{words.map((w, i) => ( {i > 0 && /} {w[0]}{w.slice(1)} ))}
); } function SocialLink({ kind, href, primary, label }) { const meta = window.SOCIAL_META[kind]; const I = meta.icon; const url = href && href !== "#" ? href : (window.PEST_LINKS && window.PEST_LINKS[kind]) || "#"; return ( {label || meta.label} ); } function Motto({ big }) { return (
WE ARE THE PLAGUE
); } /* Action button used for Launch App + Shop. - href = null -> shows a "Coming soon" tooltip (no navigation) - href = "..." -> becomes a live link. THIS is the only edit needed to go live later. */ function SoonAction({ label, icon: I, primary, block, href }) { const [show, setShow] = useState(false); const live = !!href; const cls = "btn nav-launch" + (primary ? " btn-primary" : " nav-secondary"); const inner = ({I ? : null} {label}); return (
!live && setShow(true)} onMouseLeave={() => setShow(false)} > {live ? ( {inner} ) : ( )} {!live && Coming soon}
); } const NAV_LINKS = [ ["#manifesto", "Manifesto"], ["#structure", "Structure"], ["#members", "Core Members"], ["#partners", "Partners"], ]; // === GO-LIVE: paste a URL into `href` when each product launches. No other change needed. === const NAV_ACTIONS = [ { key: "shop", label: "Shop", icon: window.Icon.shop, primary: false, href: null }, { key: "launch", label: "Launch App", icon: window.Icon.launch, primary: true, href: "https://app.pestdao.xyz" }, ]; function Nav() { const [scrolled, setScrolled] = useState(false); const [menu, setMenu] = useState(false); useEffect(() => { const on = () => setScrolled(window.scrollY > 40); on(); window.addEventListener("scroll", on); return () => window.removeEventListener("scroll", on); }, []); useEffect(() => { document.body.style.overflow = menu ? "hidden" : ""; return () => { document.body.style.overflow = ""; }; }, [menu]); return ( {menu && (
{NAV_LINKS.map(([href, label]) => ( setMenu(false)}>{label} ))}
{NAV_ACTIONS.map((a) => ( ))}
)}
); } const META_ROW = (
30 Core Members / Members / Global · DE-rooted / pestdao.xyz
); /* ---- Variant A: centered monument ---- */ function HeroA() { return (
A web3 hivemind
P.E.S.T emblem

One mind, many nodes. A tight-knit collective sharing web3 knowledge — signal over noise, trust over hype.

{META_ROW}
); } /* ---- Variant B: editorial split (banner-like) ---- */ function HeroB() { return (
A web3 hivemind

A tight-knit collective from across the globe — rooted in Germany, operating everywhere. We pool what we know and move as one organism through the web3 space.

{META_ROW}
P.E.S.T emblem // SIGNAL_FEED · ENCRYPTED
); } /* ---- Variant C: terminal / hivemind ---- */ function HeroC() { const lines = [ "establishing secure channel…", "30 core nodes online · hive synchronized", "knowledge pool: web3 · defi · alpha · onchain", "access: members welcome · core: earned by vote", ]; const [shown, setShown] = useState(0); useEffect(() => { if (shown >= lines.length) return; const t = setTimeout(() => setShown((s) => s + 1), 650); return () => clearTimeout(t); }, [shown]); return (
P.E.S.T emblem
pest@hive ~ // node_session
A web3 hivemind
{lines.slice(0, shown).map((l, i) => (
{l}
))} {shown < lines.length && }
); } function Hero({ variant }) { if (variant === "split") return ; if (variant === "terminal") return ; return ; } Object.assign(window, { Nav, Hero, SocialLink, Wordmark, EMBLEM });