/* 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}
) : (
setShow((s) => !s)} aria-label={label + " — coming soon"}>{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 (
setMenu(false)}>
P.E.S.T
{NAV_LINKS.map(([href, label]) => (
{label}
))}
{NAV_ACTIONS.map((a) => (
))}
setMenu((m) => !m)} aria-label="Menu">
{menu ? : }
{menu && (
)}
);
}
const META_ROW = (
30 Core Members
/
∞ Members
/
Global · DE-rooted
/
pestdao.xyz
);
/* ---- Variant A: centered monument ---- */
function HeroA() {
return (
A web3 hivemind
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}
// 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 (
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 });