Atualizado: ${fmtTime(new Date())}
`;
}
// ===== Desktop: animação CSS com faixa duplicada e largura mínima =====
function setupDesktop(){
const win = el.querySelector('.ct-window');
const rail = el.querySelector('.ct-rail');
// Garante que a base cubra ao menos a janela (evita parecer “repetir” cedo demais)
let base = rail.innerHTML;
rail.innerHTML = base;
while (rail.scrollWidth = janela (pra ter conteúdo contínuo)
let base = rail.innerHTML;
rail.innerHTML = base;
while (rail.scrollWidth rail.scrollWidth + win.clientWidth;
const pxPerSec = ()=> totalDist() / speedMobileSec;
function step(ts){
if(!last) last = ts;
const dt = (ts - last)/1000;
last = ts;
x -= pxPerSec() * dt;
if (x { x = win.clientWidth; rail.style.transform = `translateX(${x}px)`; };
window.addEventListener('resize', onResize);
window.addEventListener('orientationchange', onResize);
requestAnimationFrame(step);
}
// ===== Monta itens e inicia =====
async function fetchQuotes(){
try{
const res = await fetch(apiUrl(), { cache: 'no-store' });
const data = await res.json();
const items = pairs.map(p=>{
const key = p.replace('-',''); // USD-BRL -> USDBRL
const q = data[key];
if(!q) return '';
const bid = parseFloat(q.bid || q.ask || 0);
const pct = parseFloat(q.pctChange || 0);
const up = pct >= 0;
return `
${p}
•
${fmtBRL(bid)}
•
${up?'▲':'▼'}${pct.toFixed(2)}%
`;
}).join('') || `
Sem cotações no momento.`;
renderShell(items);
// escolhe engine conforme viewport
if (isMobile()) setupMobile();
else setupDesktop();
}catch(e){
renderShell(`
Não foi possível carregar as cotações.`);
}
}
fetchQuotes();
setInterval(fetchQuotes, refreshMin * 60 * 1000);
// Se mudar o tamanho, refaz a engine
let vw = isMobile();
window.addEventListener('resize', ()=>{
const now = isMobile();
if (now !== vw){
vw = now;
fetchQuotes();
}
});
})();
Nenhum resultado para “${q}”.
`;
return;
}
results.innerHTML = items.map((p,i)=>{
const src = p.thumb || '';
return `
Erro ao buscar. Tente novamente.
`;
}
}
// Eventos
input.addEventListener('input', e=> debounce(()=>search(e.target.value), 250));
input.addEventListener('focus', ()=>{ if(input.value.trim().length>=2) search(input.value); });
clearBtn.addEventListener('click', ()=>{ input.value=''; input.focus(); render([], ''); });
// Teclado
root.addEventListener('keydown', e=>{
const itemsEls = Array.from(results.querySelectorAll('.qs-item'));
if(!itemsEls.length) return;
if(e.key==='ArrowDown'){ e.preventDefault(); pointer = (pointer+1) % itemsEls.length; itemsEls.forEach((el,i)=>el.setAttribute('aria-selected', i===pointer)); itemsEls[pointer].scrollIntoView({block:'nearest'}); }
if(e.key==='ArrowUp'){ e.preventDefault(); pointer = (pointer-1+itemsEls.length) % itemsEls.length; itemsEls.forEach((el,i)=>el.setAttribute('aria-selected', i===pointer)); itemsEls[pointer].scrollIntoView({block:'nearest'}); }
if(e.key==='Enter'){
if(pointer>=0){ e.preventDefault(); window.location.href = itemsEls[pointer].getAttribute('href'); }
else if(input.value.trim()){ window.location.href = `${window.location.origin}/?s=${encodeURIComponent(input.value.trim())}`; }
}
if(e.key==='Escape'){ input.blur(); render([], ''); }
});
})();
Não foi possível carregar as postagens agora.
`; });
})();