const state={reports:[],category:'all',year:2026,month:8,selected:null}; const $=s=>document.querySelector(s); const pad=n=>String(n).padStart(2,'0'); const categoryNames={all:'全部报告',daily:'每日复盘',intraday:'盘中项目',sector:'行业观察',stock:'个股跟踪'}; function formatDate(d){return `${d.getFullYear()}-${pad(d.getMonth()+1)}-${pad(d.getDate())}`} function categoryKey(r){return r.category||'all'} function visible(){const q=($('#search-input').value||'').trim().toLowerCase();return state.reports.filter(r=>(state.category==='all'||categoryKey(r)===state.category)&&(!q||`${r.title} ${r.summary} ${(r.tags||[]).join(' ')}`.toLowerCase().includes(q)))} function renderNav(){const counts=state.reports.reduce((a,r)=>(a[categoryKey(r)]=(a[categoryKey(r)]||0)+1,a),{});$('#category-nav').innerHTML=Object.entries(categoryNames).map(([key,name])=>`${name}${key==='all'?state.reports.length:counts[key]||0}`).join('');document.querySelectorAll('.nav-item').forEach(a=>a.onclick=e=>{e.preventDefault();state.category=a.dataset.category;renderAll()})} function renderCalendar(){const first=new Date(state.year,state.month-1,1), start=(first.getDay()+6)%7, days=new Date(state.year,state.month,0).getDate();$('#calendar-title').textContent=`${state.year}年${pad(state.month)}月`;let html='';for(let i=0;i';for(let d=1;d<=days;d++){const date=`${state.year}-${pad(state.month)}-${pad(d)}`, has=visible().some(r=>r.date===date);html+=``}$('#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 后重新上传。
'});