/* ═══════════════════════════════════════════════════════════════════
COIN HEADER · identity + live price + 24h stats + correlation strip
═══════════════════════════════════════════════════════════════════ */
function CoinHeader({ coin, live }) {
const chgUp = live.chg >= 0;
return (
{/* identity */}
{coin.name}
{coin.sym}/USDT
RANK #{coin.rank}
MCAP $42.18B
{/* price block */}
${ST_fmt.price(live.price)}
{/* correlation strip */}
);
}
function ChangeBlock({ chg, chgAbs }) {
const up = chg >= 0;
return (
{chgAbs >= 0 ? '+' : ''}{ST_fmt.price(chgAbs)}
({ST_fmt.pct(chg, 2)})
);
}
function KvInline({ k, v }) {
return (
{k}
{v}
);
}
function GroupPill({ group }) {
const g = ST_GROUP[group];
return (
{group.toUpperCase()}
);
}
function CorrBlock({ dir, arrow, coins, c }) {
return (
{arrow} {dir}
{coins.map(({ sym, score }) => (
{sym}
ρ {score.toFixed(2)}
))}
);
}
/* ── Coin glyph (real-looking, per-coin gradient + monogram) ───────── */
function CoinGlyph({ sym, size = 32 }) {
// per-coin palette
const PAL = {
SOL: ['#9945FF', '#14F195'],
BTC: ['#F7931A', '#FFB13B'],
ETH: ['#627EEA', '#3C5BCB'],
BNB: ['#F0B90B', '#F8D33A'],
XRP: ['#23292F', '#5A6066'],
DOGE: ['#C2A633', '#E1C757'],
AVAX: ['#E84142', '#F8696A'],
SUI: ['#4DA2FF', '#80C0FF'],
NEAR: ['#000000', '#5F8AFA'],
APT: ['#0EA5E9', '#1E2A3A'],
};
const [a, b] = PAL[sym] || ['#5A6276', '#3D4458'];
const gid = `cg-${sym}`;
return (
);
}
window.CoinHeader = CoinHeader;
window.CoinGlyph = CoinGlyph;
window.GroupPill = GroupPill;