/* ============================================================================
VIEW 2 — TICKER DETAIL (full breakdown for one pick)
============================================================================ */
function Panel({ title, right, children, className="" }){
return (
{title}
{right}
{children}
);
}
function SocialStat({ label, value, sub, accent }){
return (
{label}
{value}
{sub && {sub}}
);
}
function TickerDetail({ v, onBack, onPrev, onNext }){
if(!v) return null;
const t = tierOf(v.tier);
const sparkColor = v.change_pct>=0 ? "#17a86a" : "#ee3f5f";
// split risks/catalysts into bull/bear framing
return (
{/* breadcrumb / nav */}
{/* header band */}
{v.ticker}
{v.manipulation_flag &&
}
{v.company}
{v.sector}
{fmtPrice(v.price)}
{/* main grid */}
{/* left col: thesis + bull/bear */}
{v.thesis}
{v.catalysts.length}}>
{v.catalysts.length ? v.catalysts.map((c,i)=>(
)) :
No catalysts identified — hollow setup.}
{v.risks.length}}>
{v.risks.map((c,i)=>(
))}
entry · stop · targets}>
{/* right col: radar + analyst + social */}
8 signals}>
avg tgt {fmtPrice(v.analyst.avg_target)}}>
Implied upside
=v.price?"#17a86a":"#ee3f5f"}}>
{fmtPct((v.analyst.avg_target/v.price-1)*100)}
Coverage
{v.analyst.strong_buy+v.analyst.buy+v.analyst.hold+v.analyst.sell}
300?"#ee3f5f":"#17a86a"} sub="vs 7d avg" />
{v.manipulation_flag &&
Velocity + sentiment extreme vs. zero fundamentals — coordinated promotion likely.
}
);
}
Object.assign(window, { TickerDetail });