/* P.E.S.T Web App — Members showcase + modal (with referral links/badges) */ function RefBadges({ refs, projects, className }) { if (!refs || refs.length === 0) return null; return (
{refs.slice(0, 3).map((r, i) => { const proj = projects.find((p) => p.id === r.projectId); if (!proj) return null; return (
{proj.logo ? {proj.name} : {proj.name[0]}}
); })}
); } function MemberCard({ m, refs, projects, onOpen }) { const badges = window.memberBadges(m); return (
onOpen(m)}> {badges.length > 0 && (
{badges.map((b) => {window.BADGE_META[b].short})}
)}
{m.nick}
{window.roleLabel(m)}
); } function DiscordPill({ user }) { const [copied, setCopied] = useState(false); return ( ); } function MemberModal({ m, onClose }) { const store = useStore(); const [idx, setIdx] = useState(0); useEffect(() => { const k = (e) => e.key === "Escape" && onClose(); window.addEventListener("keydown", k); return () => window.removeEventListener("keydown", k); }, []); const socials = Object.keys(m.socials || {}).filter((s) => m.socials[s]); const badges = window.memberBadges(m); const pfp = (m.pfps && m.pfps[idx]) || (m.pfps && m.pfps[0]) || { name: "" }; const refs = (store.referralsByMember[m.nick] || []); const isMe = m.nick === store.user.nick; return (
e.stopPropagation()}>
{pfp.img ? {m.nick} :
{m.nick.slice(0, 2)}
}
{window.roleLabel(m)}
{m.nick}
PFP · {pfp.name}
{badges.length > 0 && (
{badges.map((b) => {window.BADGE_META[b].full})}
)} {window.honoraryBadges(m).length > 0 && (
{window.honoraryBadges(m).map((k) => { const B = window.HBADGE[k]; const I = B.icon; return {B.label}; })}
)}
{m.pfps && m.pfps.length > 1 && (
PFP Collection
{m.pfps.map((p, i) => ( ))}
)} {m.desc ?

{m.desc}

:

No bio yet.

} {(socials.length > 0 || m.discord) && (
Personal channels
{socials.map((s) => { const meta = window.A_SOCIAL[s]; const I = meta.icon; return {meta.label}; })} {m.discord && }
)}
Referral links {refs.length > 0 && · support {isMe ? "you" : m.nick}}
{refs.length === 0 ? (
{isMe ? "You haven't added any referral links yet." : "No referral links shared."}
) : (
{refs.map((r, i) => { const proj = store.projects.find((p) => p.id === r.projectId); if (!proj) return null; return (
{proj.name} {(proj.categories && proj.categories.join(" · ")) || proj.category || ""}
Use ref
); })}
)}
); } function Members() { const store = useStore(); const [open, setOpen] = useState(null); const data = window.sortMembers(store.members); return (
Core Members

The inner circle

Thirty nodes of trust. Tap a member to see their channels — and the referral links they share with the hive.

{data.map((m, i) => ( ))}
{open && setOpen(null)} />}
); } window.Members = Members; window.MemberModal = MemberModal;