/* ============================================================================
VIEW 4 — PERFORMANCE LEDGER (does the engine actually work?)
============================================================================ */
const { useMemo:useMemoLedger } = React;
function KpiCard({ label, value, accent, sub, big }){
return (
{accent &&
}
{label}
{value}
{sub &&
{sub}}
);
}
/* tiny win/loss distribution bar for 1w returns */
function HitBar({ rows }){
const sorted = [...rows].sort((a,b)=>a.ret_1w-b.ret_1w);
const max = Math.max(...rows.map(r=>Math.abs(r.ret_1w)))||1;
return (
{sorted.map(r=>{
const pos = r.ret_1w>=0;
return (
{r.ticker} {fmtPct(r.ret_1w)}
);
})}
);
}
function PerformanceLedger({ rows }){
const k = useMemoLedger(()=>ledgerKpis(rows),[rows]);
const [sortKey, setSortKey] = React.useState("recommended_at");
const [dir, setDir] = React.useState(-1);
const sorted = useMemoLedger(()=>{
return [...rows].sort((a,b)=>{
const av=a[sortKey], bv=b[sortKey];
if(typeof av==="string") return avbv?dir:0;
return (av-bv)*dir;
});
},[rows,sortKey,dir]);
const setSort = (key)=>{ if(sortKey===key) setDir(d=>-d); else { setSortKey(key); setDir(-1); } };
const cols = [
{k:"ticker", label:"Ticker", align:"left"},
{k:"recommended_at", label:"Recommended", align:"left"},
{k:"tier", label:"Tier", align:"left"},
{k:"entry", label:"Entry", align:"right"},
{k:"ret_1d", label:"1D", align:"right"},
{k:"ret_1w", label:"1W", align:"right"},
{k:"ret_1m", label:"1M", align:"right"},
{k:"status", label:"Status", align:"left"},
];
return (
Performance Ledger
Forward returns on past verdicts · {k.n} records
{/* KPIs */}
=60?"#15bd80":k.hit>=50?"#b9870c":"#ee3f5f"} sub="% positive after 1 week" big />
=0?"#17a86a":"#ee3f5f"} sub="mean across records" big />
{/* distribution */}
1-Week return distribution
win
loss
{/* table */}
{cols.map(c=>(
| setSort(c.k)}
className={"select-none cursor-pointer text-[10.5px] uppercase tracking-[0.1em] font-medium py-3 px-4 hover:text-white transition-colors "+(c.align==="right"?"text-right":"text-left")}
style={{color: sortKey===c.k?"var(--accent)":"var(--muted)"}}>
{c.label}
{sortKey===c.k && {dir<0?"▼":"▲"}}
|
))}
{sorted.map(r=>(
| {r.ticker} |
{r.recommended_at} |
|
{fmtPrice(r.entry)} |
|
0?"rgba(70,211,154,0.1)":"rgba(245,85,109,0.1)"}}>
|
|
{r.status}
|
))}
Illustrative track record for demonstration — past performance does not guarantee future results.
);
}
Object.assign(window, { PerformanceLedger });