/* 95 Forward — Prospects. Two views under one tab:
· Master Prospect List (the one ranked list — sacred ranking)
· Candidates (connector-discovery batches, firmly OFF the ranked list) */
const PR = window.Ds95ForwardDesignSystem_31a0c4 || {};
/* ============================ MASTER PROSPECT LIST ============================ */
function MasterList({ go }) {
const D = window.POC_DATA;
const { Icon, Eyebrow } = window.POC;
const { ProspectRow, Tag, Button, Badge } = PR;
const [horizon, setHorizon] = React.useState("all");
const [rm, setRm] = React.useState("all");
const [entity, setEntity] = React.useState("all");
const [band, setBand] = React.useState("all");
const [top33, setTop33] = React.useState(false);
const top = D.prospects[0];
let rows = D.prospects.filter(p => {
if (horizon !== "all" && p.horizon !== horizon) return false;
if (rm === "mine" && p.manager !== D.user.name) return false;
if (entity !== "all" && p.kind !== entity) return false;
if (band === "90" && p.qpi < 90) return false;
if (band === "70" && (p.qpi < 70 || p.qpi >= 90)) return false;
if (band === "50" && (p.qpi < 50 || p.qpi >= 70)) return false;
if (band === "u50" && p.qpi >= 50) return false;
if (top33 && p.rank > 6) return false;
return true;
});
const HPILL = [["all", "All", null], ["today", "Today", "var(--horizon-today)"], ["tomorrow", "Tomorrow", "var(--horizon-tomorrow)"], ["forever", "Forever", "var(--horizon-forever)"]];
const Select = ({ value, onChange, options, label }) => (
{label}
onChange(e.target.value)} style={{ border: "none", background: "transparent", outline: "none", font: "inherit", color: "var(--text-strong)", cursor: "pointer" }}>
{options.map(([v, l]) => {l} )}
);
return (
{/* The next right move banner */}
{top.qpi}
/100
Your next right move
{top.name}
QPI 90+ — go see them today. Follow up in 18h.
go("prospect", { id: top.id })} iconLeft={ }>Plan the visit
{/* Horizon pills + meta */}
{HPILL.map(([id, l, c]) => setHorizon(id)}>{l} )}
{rows.length} on the list · ranked by QPI
{/* Secondary filters */}
setTop33(t => !t)} style={{ height: 30, padding: "0 12px", borderRadius: "var(--radius-sm)", cursor: "pointer", border: "1px solid " + (top33 ? "var(--blue-300)" : "var(--border-default)"), background: top33 ? "var(--blue-50)" : "var(--surface-card)", color: top33 ? "var(--blue-700)" : "var(--text-body)", font: "var(--fw-medium) var(--fs-caption) var(--font-sans)", display: "inline-flex", alignItems: "center", gap: 6 }}>
Top 33
More filters
{/* The one ranked list */}
{rows.map(p =>
go("prospect", { id: p.id })} />)}
{rows.length === 0 ? No prospects match these filters.
: null}
);
}
/* ============================ CANDIDATES ============================ */
function ConfidencePip({ level }) {
const map = { high: ["var(--sage-600)", 3, "High"], medium: ["var(--gold-600)", 2, "Medium"], low: ["var(--ink-400)", 1, "Low"] };
const [color, n, label] = map[level] || map.low;
return (
{[0, 1, 2].map(i => )}
{label} confidence
);
}
function CandidateCard({ c }) {
const { Icon } = window.POC;
const { Button, SourceTag } = PR;
const [status, setStatus] = React.useState(c.status);
const Evidence = ({ label, value }) => (
{label}
{value ? {value}
: }
);
if (status === "endorsed") {
return (
{c.name} — endorsed for intro
Intro requested. On a successful intro, promotes to the MPL with Sandra Kim as Natural Partner.
setStatus(c.status)}>Undo
);
}
return (
{c.name.split(" ").map(w => w[0]).slice(0, 2).join("")}
Hypothesis
setStatus("endorsed")} iconLeft={ }>Endorse for intro
Keep researching
Dismiss
);
}
function DiscoveryBatch({ batch, defaultOpen }) {
const D = window.POC_DATA;
const { Icon } = window.POC;
const [open, setOpen] = React.useState(!!defaultOpen);
const researching = batch.status === "researching";
return (
!researching && setOpen(o => !o)} style={{ display: "flex", alignItems: "center", gap: 14, width: "100%", textAlign: "left", padding: "16px 20px", border: "none", background: "transparent", cursor: researching ? "default" : "pointer" }}>
Introductions via {batch.connector}
for the {batch.initiative.split(" — ")[0]} · {researching ? "requested " + batch.requested : batch.count + " candidates"}
{researching ? (
Researching…
) : (
Ready
)}
{!researching ? : null}
{researching ? (
The copilot is searching public sources for people {batch.connector} could plausibly introduce, matched to this initiative. This runs for a few minutes — you'll get a "ready to review" note on Today when the batch lands.
) : open ? (
Showing 3 of {batch.count}. Each is a hypothesis for {batch.connector} to react to — not a verified prospect. They stay off the ranked list until a human and the connector validate them.
{batch.candidates.map((c, i) =>
)}
) : null}
);
}
function Candidates({ go }) {
const D = window.POC_DATA;
const { Icon, Eyebrow } = window.POC;
const { Button } = PR;
return (
The front of the referral funnel
Pick a connector and an initiative; the copilot researches who they could plausibly introduce. Candidates live here — never on the Master Prospect List — until validated. "No public connection found" is a fine, honest answer.
}>New introduction search
Discovery batches · by connector × initiative
2 tasks
{D.discovery.map((b, i) => )}
);
}
/* ============================ WRAPPER ============================ */
function Prospects({ route, go }) {
const { Icon } = window.POC;
const view = route === "candidates" ? "candidates" : "mpl";
const Toggle = () => (
{[["mpl", "Master Prospect List", "list-ordered"], ["candidates", "Candidates", "git-branch"]].map(([k, l, ic]) => (
go(k)} style={{
display: "inline-flex", alignItems: "center", gap: 8, padding: "13px 14px", border: "none", background: "none", cursor: "pointer",
font: (view === k ? "var(--fw-semibold)" : "var(--fw-medium)") + " var(--fs-small) var(--font-sans)",
color: view === k ? "var(--text-strong)" : "var(--text-muted)", borderBottom: "2px solid " + (view === k ? "var(--blue-600)" : "transparent"), marginBottom: -1,
}}>
{l}
{k === "candidates" ? 2 : null}
))}
);
return (
{view === "candidates" ? : }
);
}
window.POC = Object.assign(window.POC || {}, { Prospects });