';
});
}
function cardHTML(label,val,chNum,sub){
var c = chNum!=null ? cls(chNum) : '';
var chHtml = chNum!=null ? '
'+arr(chNum)+pct(chNum)+'
' : (sub?'
'+sub+'
':'');
return '
'+label+'
'+val+'
'+chHtml+(chNum!=null&&sub?'
'+sub+'
':'')+'
';
}
function fngPlaceholder(){
return '
Miedo & Codicia
···
';
}
/* ══ 3) FEAR & GREED INDEX ══ */
function loadFearGreed(){
fetch('https://api.alternative.me/fng/?limit=1')
.then(function(r){return r.json();})
.then(function(res){
var d=res.data[0];
var val=parseInt(d.value,10);
var labelEs={
'Extreme Fear':['Miedo Extremo','fng-extreme-fear'],
'Fear':['Miedo','fng-fear'],
'Neutral':['Neutral','fng-neutral'],
'Greed':['Codicia','fng-greed'],
'Extreme Greed':['Codicia Extrema','fng-extreme-greed']
};
var lab = labelEs[d.value_classification] || [d.value_classification,'fng-neutral'];
var slot=document.getElementById('cx-fng-slot');
if(slot){
slot.innerHTML='
Miedo & Codicia
'+
'
'+val+''+lab[0]+'
';
}
})
.catch(function(){
var slot=document.getElementById('cx-fng-slot');
if(slot) slot.innerHTML='
Miedo & Codicia
—
';
});
}
/* ══ 4) TRENDING ══ */
function loadTrending(){
fetch('https://api.coingecko.com/api/v3/search/trending')
.then(function(r){return r.json();})
.then(function(res){
var items=(res.coins||[]).slice(0,8);
if(!items.length){document.getElementById('cx-trending').innerHTML='Sin datos';return;}
document.getElementById('cx-trending').innerHTML=items.map(function(it){
var c=it.item;
return '
'+c.name+'#'+(c.market_cap_rank||'—')+'
';
}).join('');
})
.catch(function(){
document.getElementById('cx-trending').innerHTML='No disponible en este momento';
});
}
/* ══ 5) GAINERS / LOSERS (derivado de COINS, sin llamada extra) ══ */
function renderGainersLosers(){
var withCh = COINS.filter(function(c){return c.ch24h!=null;});
var sorted = withCh.slice().sort(function(a,b){return b.ch24h-a.ch24h;});
var gainers = sorted.slice(0,5);
var losers = sorted.slice(-5).reverse();
function row(c){
return '