${t.viewMode==="ai"?"AI-grouped summaries from multiple sources":"Latest headlines from multiple sources"}
${d}
${t.viewMode==="ai"?'':""}
${s}
`}async function g(){t.loading=!0,t.error=null,a();try{const e=await fetch("/api/news");if(!e.ok)throw new Error("Failed to fetch news");const o=await e.json(),l=o.feeds.flatMap(s=>s.items).sort((s,r)=>new Date(r.pubDate)-new Date(s.pubDate));t.articles=l,t.loading=!1,o.errors&&o.errors.length>0&&console.warn("Some feeds failed:",o.errors)}catch(e){t.error=e.message,t.loading=!1}a()}async function p(){t.loading=!0,t.error=null,a();try{const e=await fetch("/api/grouped-news");if(!e.ok)throw new Error("Failed to fetch grouped news");const o=await e.json();t.groups=o.groups,t.loading=!1}catch(e){t.error=e.message,t.loading=!1}a()}window.setFilter=function(e){t.filter=e,a()};window.setViewMode=function(e){t.viewMode=e,e==="ai"&&t.groups.length===0?p():a()};window.refresh=function(){t.viewMode==="ai"?p():g()};window.clearCacheAndRefresh=async function(){t.loading=!0,t.error=null,a();try{const e=await fetch("/api/grouped-news?refresh=true");if(!e.ok)throw new Error("Failed to fetch grouped news");const o=await e.json();t.groups=o.groups,t.loading=!1}catch(e){t.error=e.message,t.loading=!1}a()};window.fetchNews=g;window.fetchGroupedNews=p;window.enterCarMode=async function(){if(t.carMode=!0,t.carModeIndex=0,a(),t.groups.length===0)try{const e=await fetch("/api/grouped-news");if(!e.ok)throw new Error("Failed to fetch grouped news");const o=await e.json();t.groups=o.groups,a()}catch(e){console.error("Failed to load grouped news for car mode:",e)}h()};window.exitCarMode=function(){t.carMode=!1,m(),a()};window.carModeNext=function(){t.groups.length!==0&&(t.carModeIndex=(t.carModeIndex+1)%t.groups.length,m(),a(),h())};window.carModePrev=function(){t.groups.length!==0&&(t.carModeIndex=(t.carModeIndex-1+t.groups.length)%t.groups.length,m(),a(),h())};function h(){m(),t.carModeInterval=setInterval(()=>{t.groups.length>0&&(t.carModeIndex=(t.carModeIndex+1)%t.groups.length,a())},5e3)}function m(){t.carModeInterval&&(clearInterval(t.carModeInterval),t.carModeInterval=null)}document.addEventListener("keydown",e=>{if(t.carMode)switch(e.key){case"Escape":window.exitCarMode();break;case"ArrowRight":case" ":window.carModeNext();break;case"ArrowLeft":window.carModePrev();break}});g();setInterval(()=>{t.viewMode==="ai"?p():g()},300*1e3);