Menu Buskando
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(); } }); })();
`; const input = root.querySelector('.qs-input'); const results = root.querySelector('.qs-results'); const clearBtn = root.querySelector('.qs-clear'); // Helpers const apiRoot = () => { const tag = document.querySelector('link[rel="https://api.w.org/"]'); return (tag?.href ? tag.href.replace(/\/$/,'') : window.location.origin.replace(/\/$/,'') + '/wp-json'); }; const API = apiRoot(); const strip = h => { const d=document.createElement('div'); d.innerHTML=h||''; return (d.textContent||d.innerText||'').trim(); }; const fmtDate = iso => new Date(iso).toLocaleDateString('pt-BR',{day:'2-digit',month:'short',year:'numeric'}).replace('.',''); let pointer = -1; // item selecionado pelo teclado let currItems = []; // última lista renderizada function render(items, q){ currItems = items; pointer = -1; input.setAttribute('aria-expanded', items.length>0); if(!q){ results.innerHTML = ''; return; } if(items.length===0){ results.innerHTML = `
Nenhum resultado para “${q}”.
`; return; } results.innerHTML = items.map((p,i)=>{ const src = p.thumb || ''; return ` ${src ? `` : `
`}

${p.title}

${fmtDate(p.date)}
`; }).join('') + ` `; } // Debounce let t; const debounce = (fn,ms)=>{ clearTimeout(t); t=setTimeout(fn,ms); }; async function search(q){ if(!q || q.trim().lengthBuscando “${q}”…`; try{ // poucos itens → podemos usar _embed para pegar a imagem const url = `${API}/wp/v2/posts?status=publish&per_page=6&search=${encodeURIComponent(q)}&_embed&_fields=id,link,title,date,_embedded`; const list = await fetch(url,{cache:'no-store'}).then(r=>r.json()); const items = (list||[]).map(p=>{ const title = strip(p.title?.rendered)||'Sem título'; const em = p._embedded?.['wp:featuredmedia']?.[0]; const sz = em?.media_details?.sizes||{}; const thumb = sz?.thumbnail?.source_url || sz?.medium?.source_url || em?.source_url || ''; return { title, link: p.link, date: p.date, thumb }; }); render(items, q); }catch(e){ results.innerHTML = `
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([], ''); } }); })();
`).join('') }
`; const apiRoot = () => { const tag = document.querySelector('link[rel="https://api.w.org/"]'); return (tag?.href ? tag.href.replace(/\/$/,'') : window.location.origin.replace(/\/$/,'') + '/wp-json'); }; const strip = (h) => { const d=document.createElement('div'); d.innerHTML=h||''; return (d.textContent||d.innerText||'').trim(); }; const firstImgFrom = (html) => { const t=document.createElement('div'); t.innerHTML=html||''; const img=t.querySelector('img'); if(!img) return ''; return img.getAttribute('data-src') || img.getAttribute('data-lazy-src') || img.getAttribute('src') || ''; }; const formatDate = (iso) => new Date(iso).toLocaleDateString('pt-BR',{day:'2-digit',month:'short',year:'numeric'}); const API = apiRoot(); const postsUrl = `${API}/wp/v2/posts?status=publish&per_page=${PER_PAGE}&_fields=id,link,title,date,content,featured_media`; fetch(postsUrl) .then(r=>r.json()) .then(async (posts) => { // Busca as mídias por ID (em lotes) const ids = [...new Set(posts.map(p=>p.featured_media).filter(id => id && id > 0))]; const mediaMap = {}; const chunk = (arr, n) => arr.reduce((a,_,i)=> (i%n? a[a.length-1].push(arr[i]) : a.push([arr[i]]), a), []); const batches = chunk(ids, 50); for (const idsBatch of batches) { const mediaUrl = `${API}/wp/v2/media?include=${idsBatch.join(',')}&per_page=${idsBatch.length}&_fields=id,source_url,media_details.sizes`; const res = await fetch(mediaUrl).then(r=>r.json()); res.forEach(m=>{ const sz = m.media_details?.sizes || {}; mediaMap[m.id] = sz.medium_large?.source_url || sz.large?.source_url || sz.full?.source_url || m.source_url || ''; }); } // Render const cards = posts.map(p=>{ const title = strip(p.title?.rendered) || 'Sem título'; const link = p.link || '#'; const date = formatDate(p.date); let src = mediaMap[p.featured_media] || firstImgFrom(p.content?.rendered) || ''; const imageHTML = src ? `${title}` : `
${(title[0]||'P').toUpperCase()}
`; return `
${imageHTML}

${title}

${date}
Ler agora
`; }).join(''); root.innerHTML = `
${cards}
`; }) .catch(()=>{ root.innerHTML = `

Não foi possível carregar as postagens agora.

`; }); })();