';for(let d=1;d<=days;d++){const date=`${state.year}-${pad(state.month)}-${pad(d)}`, has=visible().some(r=>r.date===date);html+=`${d} `}$('#calendar').innerHTML=html;document.querySelectorAll('.day[data-date]').forEach(b=>b.onclick=()=>{state.selected=b.dataset.date;renderAll()})}
function card(r){return `${r.title} ${r.summary||'暂无摘要'}
${r.categoryName||categoryNames[r.category]||'报告'} ${(r.tags||[])[0]||'REPORT'} ↗
`}
function renderReports(){const date=state.selected;const rows=visible().filter(r=>!date||r.date===date);$('#selected-label').textContent=date?date.replaceAll('-',' / '):'选择一个日期';$('#selected-count').textContent=`${rows.length} REPORTS`;$('#report-list').innerHTML=rows.length?rows.map(card).join(''):'这一天还没有报告,或当前筛选条件下暂无匹配内容。
'}
function renderRecent(){const rows=[...visible()].sort((a,b)=>b.date.localeCompare(a.date)).slice(0,3);$('#recent-list').innerHTML=rows.length?rows.map(r=>`${r.date} · ${r.categoryName||categoryNames[r.category]}
${r.title} ${r.summary||'打开查看详细研究内容'}
READ REPORT ↗ `).join(''):'暂无报告
'}
function renderAll(){renderNav();renderCalendar();renderReports();renderRecent();$('#report-count').textContent=String(state.reports.length).padStart(2,'0');$('#category-count').textContent=String(new Set(state.reports.map(categoryKey)).size).padStart(2,'0');$('#sync-time').textContent=new Date().toLocaleTimeString('zh-CN',{hour:'2-digit',minute:'2-digit'});}
$('#prev-month').onclick=()=>{state.month--;if(state.month<1){state.month=12;state.year--}state.selected=null;renderAll()};$('#next-month').onclick=()=>{state.month++;if(state.month>12){state.month=1;state.year++}state.selected=null;renderAll()};$('#today-btn').onclick=()=>{const d=new Date();state.year=d.getFullYear();state.month=d.getMonth()+1;state.selected=formatDate(d);renderAll()};$('#all-reports').onclick=()=>{state.selected=null;renderAll()};$('#search-input').oninput=()=>renderAll();$('#footer-year').textContent=new Date().getFullYear();
fetch('data/reports.json').then(r=>r.json()).then(data=>{state.reports=data;const latest=[...data].sort((a,b)=>b.date.localeCompare(a.date))[0];if(latest){const d=new Date(`${latest.date}T00:00:00`);state.year=d.getFullYear();state.month=d.getMonth()+1;state.selected=latest.date}renderAll()}).catch(()=>{$('#report-list').innerHTML='索引文件暂不可用。请运行 scripts/build-index.mjs 后重新上传。
'});