/* P.E.S.T — content sections: Manifesto, Structure, Members + Modal, Partners, Footer */
const { useState: useS, useEffect: useE } = React;
function useReveal() {
useE(() => {
const els = document.querySelectorAll(".reveal");
const io = new IntersectionObserver(
(entries) => entries.forEach((e) => e.isIntersecting && e.target.classList.add("in")),
{ threshold: 0.12 }
);
els.forEach((el) => io.observe(el));
return () => io.disconnect();
});
}
/* ---------- Manifesto ---------- */
function Manifesto() {
const pts = [
{ n: "01", h: "Hivemind", p: "We think together. Knowledge flows freely between nodes — what one learns, the hive learns." },
{ n: "02", h: "Trust", p: "Core members share the highest level of trust. It is the foundation everything else is built on." },
{ n: "03", h: "Open Door", p: "Anyone who wants to join is welcome as a Member. A seat at the core, however, is earned." },
{ n: "04", h: "Global, DE-rooted", p: "Members span the globe, but our roots and working language are German. English is our shared front door." },
];
return (
Manifesto
P.E.S.T is a single mind running on many people —
a collective that turns shared web3 knowledge into an edge no one holds alone.
{pts.map((x) => (
{x.n} {x.h}
{x.p}
))}
);
}
/* ---------- Structure ---------- */
function Structure() {
const all = window.PEST_DATA.members;
const coCount = all.filter((m) => m.role === "co-leader").length;
const coreCount = all.length;
const tiers = [
{ rank: "01", name: "Leader", count: "1", desc: "Sets direction and holds the hive together.", t1: true },
{ rank: "02", name: "Co-Leader", count: String(coCount), desc: "Right hands to the Leader — operations and steering." },
{ rank: "03", name: "Core-Member", count: String(coreCount), desc: "The trusted inner circle. Earned, never given." },
{ rank: "04", name: "Member", count: "∞", desc: "The wider hive. Open to everyone who wants in." },
];
return (
Structure
Four tiers, one organism
{tiers.map((t, i) => (
{t.rank}
{t.name}
{t.desc}
{t.count}
))}
New Core-Members are elected by the existing Core — an absolute majority is
required. There is no fixed cap on the core; trust sets the pace.
Special designations
Held in addition to a Core-Member's seat — earned for what they bring to the hive.
Oracle
Members who consistently stand out — sharp calls, signal, and insight that lifts the whole hive.
Genetic Coder
Keepers of the machine — responsible for P.E.S.T's IT infrastructure, tooling and the tech that runs underneath.
);
}
/* ---------- Members ---------- */
// Sort order: Leader -> Co-Leader -> Genetic Coder -> Oracle -> rest (stable within group)
function sortPriority(m) {
if (m.role === "leader") return 0;
if (m.role === "co-leader") return 1;
if ((m.tags || []).includes("genetic-coder")) return 2;
if ((m.tags || []).includes("oracle")) return 3;
return 4;
}
function sortMembers(list) {
return list
.map((m, i) => [m, i])
.sort((a, b) => sortPriority(a[0]) - sortPriority(b[0]) || window.badgePriority(a[0]) - window.badgePriority(b[0]) || a[1] - b[1])
.map((x) => x[0]);
}
const BADGE_META = {
leader: { full: "Leader", short: "Leader", cls: "lead" },
"co-leader": { full: "Co-Leader", short: "Co-Lead", cls: "co" },
oracle: { full: "Oracle", short: "Oracle", cls: "oracle" },
"genetic-coder": { full: "Genetic Coder", short: "Coder", cls: "gcoder" },
};
function memberBadges(m) {
const b = [];
if (m.role === "leader") b.push("leader");
if (m.role === "co-leader") b.push("co-leader");
(m.tags || []).forEach((t) => BADGE_META[t] && b.push(t));
return b;
}
function roleLabel(m) {
if (m.role === "leader") return "Leader";
if (m.role === "co-leader") return "Co-Leader";
if ((m.tags || []).includes("oracle")) return "Oracle";
if ((m.tags || []).includes("genetic-coder")) return "Genetic Coder";
return "Core-Member";
}
function HMedals({ m, big }) {
const hb = window.honoraryBadges ? window.honoraryBadges(m) : [];
if (!hb.length) return null;
return (
{hb.map((k) => {
const B = window.HBADGE[k]; const I = B.icon;
return ;
})}
);
}
function Avatar({ m, pfp, big }) {
const initials = m.nick.slice(0, 2);
const img = pfp && pfp.img;
return (
{img ? : {initials}}
);
}
function MemberCard({ m, onOpen }) {
const badges = memberBadges(m);
return (