` : ""}
${escapeHtml(title||"Untitled")}
`;
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)
${escapeHtml(source||"")}${pubDate?` • ${timeAgo(pubDate)}`:""}
${desc ? `${escapeHtml(desc)}
` : ""} Read full story →