/* ============================================================================
VIEW 1 — TODAY'S VERDICTS (hero pick + rich ranked rows)
============================================================================ */
/* compact vertical mini-bars for the 8 signal sub-scores */
function SignalStrip({ factors, color, label=true }){
const keys = Object.keys(factors);
return (
{label &&
Signals
}
{keys.map(k=>{
const v = factors[k];
return (
{(FACTOR_LABELS[k]||k)} {v}
);
})}
);
}
function HeroPick({ v, onOpen }){
const t = tierOf(v.tier);
return (
#1 TODAY
Top conviction
{v.manipulation_flag &&
}
{/* left */}
{v.thesis}
Catalysts
{v.catalysts.length ? v.catalysts.map((c,i)=>{c})
: None identified}
Risks
{v.risks.map((c,i)=>{c})}
{/* right rail */}
);
}
function VerdictRow({ v, rank, onOpen }){
const t = tierOf(v.tier);
return (
);
}
function TodaysVerdicts({ verdicts, onOpen }){
const sorted = [...verdicts].sort((a,b)=> b.conviction - a.conviction);
const sum = verdictSummary(sorted);
const [hero, ...rest] = sorted;
return (
{/* summary stats */}
Market Open
Last run 06:40 ET
Fri · May 30, 2026
onOpen(hero.ticker)} />
{/* rich rows */}
Remaining ranked picks
{rest.length} more
{rest.map((v,i)=>(
onOpen(v.ticker)} />
))}
Illustrative tickers for demonstration — not investment advice.
);
}
Object.assign(window, { TodaysVerdicts, SignalStrip });