import {weekly,mergeNews} from './noticias-semana.mjs?v=20261015'; import {selectPhoto} from './noticias-imagens.mjs'; // Radar Carboni: noticias oficiais consultadas pelo Cron Job, sem chamadas externas no navegador. const tv=document.querySelector('.radar-tv'); if(tv){ const stage=tv.querySelector('#tv-stage'),dotBox=tv.querySelector('.tv-dots'),pause=tv.querySelector('#tv-pause'),edition=tv.querySelector('.tv-edition'),foot=tv.querySelector('.tv-footnote'); let slides=[...tv.querySelectorAll('.tv-slide')],dots=[...tv.querySelectorAll('[data-tv-index]')],current=0,timer=null; const motion=matchMedia('(prefers-reduced-motion: reduce)');let paused=motion.matches; function show(index){if(!slides.length)return;current=(index+slides.length)%slides.length;slides.forEach((s,i)=>s.hidden=i!==current);dots.forEach((d,i)=>d.setAttribute('aria-pressed',String(i===current)));} function sync(){clearInterval(timer);tv.classList.toggle('tv-paused',paused||document.hidden);pause.textContent=paused?'Reproduzir':'Pausar';pause.setAttribute('aria-pressed',String(paused));tv.querySelector('#tv-play-status').textContent=paused?'Rotação pausada':'Troca automática de notícias';if(!paused&&!document.hidden&&slides.length>1)timer=setInterval(()=>show(current+1),14000);} function manual(i){paused=true;show(i);sync();} tv.querySelector('#tv-prev').addEventListener('click',()=>manual(current-1));tv.querySelector('#tv-next').addEventListener('click',()=>manual(current+1)); dotBox.addEventListener('click',e=>{const b=e.target.closest('[data-tv-index]');if(b)manual(Number(b.dataset.tvIndex));}); pause.addEventListener('click',()=>{paused=!paused;sync();});stage.addEventListener('focusin',()=>{paused=true;sync();});stage.addEventListener('keydown',e=>{if(e.key==='ArrowRight'||e.key==='ArrowLeft'){e.preventDefault();manual(current+(e.key==='ArrowRight'?1:-1));}}); document.addEventListener('visibilitychange',sync);motion.addEventListener('change',()=>{if(motion.matches)paused=true;sync();});sync(); const format=new Intl.DateTimeFormat('pt-BR',{timeZone:'America/Sao_Paulo',day:'2-digit',month:'2-digit',year:'numeric'}); const checkedFormat=new Intl.DateTimeFormat('pt-BR',{timeZone:'America/Sao_Paulo',day:'2-digit',month:'2-digit',year:'numeric',hour:'2-digit',minute:'2-digit'}); function node(tag,cls,text){const el=document.createElement(tag);if(cls)el.className=cls;if(text)el.textContent=text;return el;} function validItem(i){if(!i||typeof i.title!=='string'||!i.title.trim()||i.title.length>500||typeof i.url!=='string'||i.source!=='CFC')return false;try{const u=new URL(i.url);return u.protocol==='https:'&&['cfc.org.br','www.cfc.org.br'].includes(u.hostname)&&!u.username&&!u.password&&!u.port&&Number.isFinite(Date.parse(i.published_at))&&Date.parse(i.published_at)<=Date.now()+300000;}catch{return false;}} let activeData=null; async function loadNews(){ try{ const controller=new AbortController(),timeout=setTimeout(()=>controller.abort(),10000);let response; try{response=await fetch('/noticias/dados.json?t='+Math.floor(Date.now()/60000),{cache:'no-store',signal:controller.signal});}finally{clearTimeout(timeout);} if(!response.ok)throw Error('Arquivo indisponível'); const data=await response.json(); if(data.schema!==1||!Array.isArray(data.items)||!data.items.length||data.items.length>5||!data.items.every(validItem)||!Number.isFinite(Date.parse(data.checked_at)))throw Error('Dados inválidos'); // Evita remover uma noticia enquanto o visitante usa seu link. if(stage.contains(document.activeElement)||dotBox.contains(document.activeElement))return; activeData=mergeNews(data);render(activeData); }catch{ if(activeData){foot.textContent='Não foi possível consultar uma atualização agora. Última consulta à fonte: '+checkedFormat.format(new Date(activeData.checked_at))+' (Brasília). Notícias anteriores preservadas.';} else{render(weekly);foot.textContent='Edição revisada em 15/10/2026. Consulta automática indisponível; notícias desta edição preservadas.';} } } function render(data){ const style=document.querySelector('#radar-auto-style')||node('style');style.id='radar-auto-style';style.textContent=`.tv-slide.radar-auto{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.radar-auto .tv-copy{padding:clamp(24px,3vw,44px);min-height:320px;display:flex;flex-direction:column;justify-content:center}.radar-auto .tv-copy h3{font-size:clamp(24px,2.4vw,36px)}.radar-auto .tv-source{align-self:flex-start}.radar-auto .tv-visual{display:flex;flex-direction:column;background:#202020;min-height:0}.radar-auto .tv-visual>img{position:static;display:block;width:100%;height:350px;object-fit:cover}.radar-auto .radar-credit{position:static;display:block;padding:12px 16px;font-size:12px;line-height:1.5;color:#eee;background:#202020}.radar-credit a{color:#dfc28e;text-decoration:underline}.radar-auto .radar-brand{align-items:center;justify-content:center;gap:12px;padding:32px;background:#202020;color:#dfc28e}.radar-auto .radar-brand>img{width:150px;height:150px;object-fit:contain}.radar-brand p{font-size:20px;letter-spacing:.08em}.radar-brand small{font-size:14px;color:#ddd}@media(max-width:720px){.tv-slide.radar-auto{grid-template-columns:minmax(0,1fr)}.radar-auto .tv-visual>img{height:230px}.radar-auto .radar-brand>img{height:100px;width:100px}.radar-auto .radar-brand{padding:24px}.radar-auto .tv-copy{min-height:0;padding:24px}}`;if(!style.isConnected)document.head.append(style); const entries=data.items.map((item,i)=>{ const article=node('article','tv-slide radar-auto');article.id='tv-slide-'+i;article.setAttribute('role','group');article.setAttribute('aria-roledescription','slide');article.setAttribute('aria-label',item.title);article.hidden=i!==0; const copy=node('div','tv-copy'),meta=node('div','tv-meta'),time=node('time',null,format.format(new Date(item.published_at)));time.dateTime=item.published_at; meta.append(node('span',null,item.source==='CFC'?'Conselho Federal de Contabilidade':item.source),time); const link=node('a','tv-source','Leia na fonte oficial ↗');link.href=item.url;link.target='_blank';link.rel='noopener noreferrer'; copy.append(meta,node('h3',null,item.title),node('p',null,item.summary||'Consulte o conteúdo completo e as orientações na fonte oficial.'),link); const visual=node('div','tv-visual'),photo=selectPhoto(item.title); function brand(){visual.className='tv-visual radar-brand';const logo=node('img');logo.src='/assets/carboni-transparente.png';logo.alt='Contabilidade Carboni';logo.width=150;logo.height=150;visual.replaceChildren(logo,node('p',null,'RADAR CARBONI'),node('small',null,'Notícias da contabilidade'));} if(photo){const img=node('img');img.src='/assets/noticias/'+photo.file;img.alt=photo.alt;img.width=photo.width;img.height=photo.height;img.loading=i===0?'eager':'lazy';img.addEventListener('error',brand,{once:true}); const credit=node('div','radar-credit');credit.append(document.createTextNode('Foto: '+photo.author+' · ')); const original=node('a',null,'Fonte'),license=node('a',null,photo.license);original.href=photo.source;license.href=photo.licenseUrl; for(const a of [original,license]){a.target='_blank';a.rel='noopener noreferrer';} credit.append(original,document.createTextNode(' · '),license);visual.append(img,credit); }else brand(); article.append(visual,copy);return article; }); const buttons=data.items.map((item,i)=>{const b=node('button');b.type='button';b.dataset.tvIndex=String(i);b.setAttribute('aria-label','Mostrar notícia: '+item.title);b.setAttribute('aria-pressed',String(i===0));return b;}); clearInterval(timer);stage.replaceChildren(...entries);dotBox.replaceChildren(...buttons);slides=entries;dots=buttons;current=0; edition.textContent='Radar contábil · Fontes oficiais'; const old=Date.now()-Date.parse(data.checked_at)>172800000; foot.textContent=(old?'Atualização pendente. ':'')+'Última consulta ao feed CFC: '+checkedFormat.format(new Date(data.checked_at))+' (Brasília). Seleção Agência Senado revisada em 15/10/2026; feed CFC automático. Cada notícia mantém sua data original.'; const ticker=tv.querySelector('.ticker-flow');if(ticker)ticker.replaceChildren(...[...data.items,...data.items].map(i=>node('span',null,i.title))); // Os créditos das fotos da edição manual permanecem disponíveis no HTML. show(0);sync(); } loadNews();setInterval(loadNews,1200000); }