` : ""}
${escapeHtml(title||"Untitled")}
${escapeHtml(source||"")}${pubDate?` • ${timeAgo(pubDate)}`:""}
${desc ? `

${escapeHtml(desc)}

` : ""} Read full story →
`; return el; } function renderData(data){ grid.innerHTML = ""; if (!data || !data.ok){ statusEl.textContent = "Could not load news."; return; } statusEl.textContent = ""; (data.items||[]).forEach(item => grid.appendChild(renderCard(item))); if ((data.items||[]).length === 0) statusEl.textContent = "No stories right now."; } async function loadNews(topic="all"){ statusEl.textContent = "Loading…"; grid.innerHTML = ""; const url = buildUrl({ topic, limit: 18 }); const renderOrFallback = (data) => { if (data && data.ok && (data.items||[]).length) { renderData(data); return; } if (topic !== "industry") { document.querySelectorAll('.newsFilters button').forEach(b=>b.classList.remove('is-active')); const btn = document.querySelector('.newsFilters [data-topic="industry"]'); if (btn) btn.classList.add('is-active'); loadNews("industry"); } else { statusEl.textContent = "No stories right now."; } }; try { const r = await fetch(url); renderOrFallback(await r.json()); } catch { // JSONP fallback if fetch is blocked const cb = "news_cb_" + Math.random().toString(36).slice(2); window[cb] = (data)=>{ renderOrFallback(data); cleanup(); }; function cleanup(){ delete window[cb]; if (s.parentNode) s.parentNode.removeChild(s); } const s = document.createElement("script"); s.src = buildUrl({ topic, limit: 18, callback: cb }); s.onerror = ()=>{ statusEl.textContent = "Still couldn't load news."; cleanup(); }; document.head.appendChild(s); } } document.querySelectorAll('.newsFilters button').forEach(btn=>{ btn.addEventListener('click', () => { document.querySelectorAll('.newsFilters button').forEach(b=>b.classList.remove('is-active')); btn.classList.add('is-active'); loadNews(btn.dataset.topic); }); }); loadNews(); // default: All (industry + local + outdoor)