/* 95 Forward — Prospect detail. "The whole picture — and the next right move." Overview (the QPI signature) · Knowledge Base · Strategy · Visits & Asks. */ const PD = window.Ds95ForwardDesignSystem_31a0c4 || {}; /* ---- shared rail used on Overview ---- */ function NextMoveRail({ p, go }) { const { Icon, Eyebrow } = window.POC; const { Card, Button } = PD; const D = window.POC_DATA; const H = D.hartwell; return (
The next move
{p.dueSoon ? : null} {p.dueSoon ? "Follow up by tomorrow" : p.cadence}

{p.id === "p1" ? "Tom can open the door this week. Fast and good beats slow and perfect." : "Keep the relationship warm — the next conversation is what moves this forward."}

Recent activity
{(p.id === "p1" ? H.timeline : [ { when: "Last week", what: "Added to the " + p.initiative.split(" — ")[0] + " initiative.", who: "Dana R." }, { when: "2 weeks ago", what: "Qualified and scored — entered the ranked list.", who: "Copilot" }, ]).map((t, i, arr) => (
{i < arr.length - 1 ? : null}
{t.what}
{t.when} · {t.who}
))}
); } /* ---- What we know fact row ---- */ function FactRow({ label, value, source, ai }) { const { SourceTag } = PD; return (
{label}
{value ? (
{value} {ai ? Copilot : null} {source ? : null}
) : {}} />}
); } /* ============================ OVERVIEW ============================ */ function OverviewTab({ p, go }) { const D = window.POC_DATA; const { Eyebrow } = window.POC; const { Card, QPIScore, AISuggestion } = PD; const H = D.hartwell; const parts = D.qpiParts[p.id]; const isHart = p.id === "p1"; return (
{/* THE SIGNATURE */}
Qualified Prospect Index Updated 6h ago
{}} />
{/* From your copilot */} {isHart ? (
From your copilot · {H.suggestions.length} to review
{H.suggestions.map(s => ( {}} onEdit={() => {}} onDismiss={() => {}}>{s.text} ))}
) : ( From your copilot

No open suggestions right now. The copilot is watching public sources and will propose updates as it finds them — you'll always approve before anything changes.

)} {/* What we know */}
What we know Gaps are invitations, not errors
{(isHart ? H.facts : [ { label: "Estimated capacity", value: parts.capacity.source ? "Being confirmed" : null, source: parts.capacity.source }, { label: "Giving focus", value: p.subtitle.split(" · ")[0], source: "Logged · " + p.manager.split(" ")[0] + "." }, { label: "Last gift", value: D.constituents.find(c => c.prospectId === p.id) ? D.constituents.find(c => c.prospectId === p.id).lastGift : "—", source: "Gift records" }, { label: "Wealth screen", value: null, source: null }, ]).map((f, i) => )}
); } /* ============================ KNOWLEDGE BASE ============================ */ function KBTab({ p }) { const D = window.POC_DATA; const { Eyebrow, Icon } = window.POC; const { Card, SourceTag, RoleChip } = PD; const isOrg = p.kind !== "person"; const isHart = p.id === "p1"; const kb = D.hartwell.kb; const Row = ({ label, value, source, last }) => (
{label}
{value} {source ? : null}
); if (!isHart) { return ( Knowledge base

No research worksheet yet for {p.name}. This is where the case-readiness picture comes together — capacity, the relationship, connectors, and the gaps worth filling.

); } return (
The research worksheet
Connectors
{kb.connectors.map((c, i) => (
{c.role}
{c.path}
))}
{/* Research gaps — calm invitations */} Research gaps
{kb.gaps.map((g, i) => (
{g} Ask the copilot
))}
{isOrg ? ( Relationship map
Who decides — and the warm path to each.
{kb.relationshipMap.decisionMakers.map((d, i) => (
{d.name}
{d.role}
{d.power}
{d.path.startsWith("Unknown") ? {d.path} : ↳ {d.path}}
))}
) : null}
); } /* ============================ STRATEGY ============================ */ function StrategyTab({ p }) { const D = window.POC_DATA; const { Eyebrow, Icon } = window.POC; const { Card } = PD; const isHart = p.id === "p1"; const s = D.hartwell.strategy; if (!isHart) { return ( Strategy

No strategy drafted yet for {p.name}. Relationship goals, hooks, likely objections, and the plan to warm the path will live here — the copilot can draft a first pass for you to shape.

); } const Block = ({ title, children }) => ( {title}
{children}
); const Chips = ({ items, color }) => (
{items.map((h, i) => {h})}
); return (

{s.goals}

{s.objections.map((o, i) =>
{o}
)}

{s.predisposition}

{s.presentation}

{s.nextSteps.map((n, i) => (
{i + 1} {n}
))}
); } /* ============================ VISITS & ASKS ============================ */ function VisitsAsksTab({ p, go }) { const D = window.POC_DATA; const { Eyebrow, Icon } = window.POC; const { Card, Button, HorizonTag, Badge } = PD; const isHart = p.id === "p1"; const H = D.hartwell; if (!isHart) { return ( Visits & asks

No visits logged yet for {p.name}. Plan the first conversation and the history — goals, debriefs, asks, and referrals — will build here.

); } const outcomeTone = { Commitment: "success", Roadmap: "info", Decline: "neutral" }; return (
{/* Visits */}
Visits
{H.visits.map((v, i) => (
{v.status === "planned" ? Planned : {v.when}} {v.goal}
Present: {v.present} · Priority: {v.priority}
{v.debrief ?

{v.debrief}

: null} {v.outcome ?
{v.outcome}Next: {v.next}
: null}
))}
{/* Asks */}
Asks
{H.asks.map((a, i) => (
{a.amount} {a.outcome} {a.numbers}
{a.type} · funds {a.initiative}

{a.detail}

))}
{/* Referrals */}
Referrals captured
{H.referrals.map((r, i) => (
{r.name} from {r.from}
Use your name? {r.useName} {r.willNote} {r.rel}
))}
); } /* ============================ DETAIL SHELL ============================ */ function ProspectDetail({ params, go }) { const D = window.POC_DATA; const { Icon } = window.POC; const { RoleChip, HorizonTag, Badge, Avatar } = PD; const p = D.prospects.find(x => x.id === (params && params.id)) || D.prospects[0]; const [tab, setTab] = React.useState("overview"); React.useEffect(() => { setTab("overview"); }, [params && params.id]); const kindLabel = { person: "Individual", company: "Company", foundation: "Foundation" }[p.kind]; const TABS = [["overview", "Overview"], ["kb", "Knowledge base"], ["strategy", "Strategy"], ["visits", "Visits & asks"]]; return (
{/* Header */}

{p.name}

{kindLabel} #{p.rank} on the list
{p.subtitle}
{p.manager ? : null} {p.partner ? : null}
{/* Tabs */}
{TABS.map(([k, l]) => ( ))}
{tab === "overview" ? : tab === "kb" ? : tab === "strategy" ? : }
); } window.POC = Object.assign(window.POC || {}, { ProspectDetail });