'use strict'; const views = { overview: {file:'egonet-method',title:'整体 Method',height:1100,caption:'实线为当前实例 Pretrain 主路径;虚线标出 SFT 或独立扩展。K、Depth、外参和 visibility 分开表示。'}, stages: {file:'egonet-stages',title:'Pretrain → SFT',height:1000,caption:'Stage 1 单通道 GT 中心纯采样;Stage 2 引入佩戴者左右角色与 T8 时序。迁移共享视觉、空间 MoT、兼容 heads 和归一化。'}, geometry: {file:'egonet-geometry',title:'相机与表征',height:930,caption:'固定真实或 preset 相机,预测 middle MCP UV、虚拟距离与旋转。输出完整 camera-space MANO;ray map 由 C 计算,不是预测输出。'} }; let selected='overview'; const buttons=[...document.querySelectorAll('[data-view]')]; const image=document.querySelector('#method-image'); const dialog=document.querySelector('#zoom-dialog'); function select(view,updateURL=true){ if(!views[view])view='overview';selected=view;const entry=views[view]; image.src=`figures/${entry.file}.svg`;image.height=entry.height;image.alt=`EgoNet ${entry.title}:${entry.caption}`; document.querySelector('#figure-caption').textContent=entry.caption; document.querySelector('#figure-panel').setAttribute('aria-labelledby',`tab-${view}`); for(const button of buttons){const active=button.dataset.view===view;button.setAttribute('aria-selected',String(active));button.tabIndex=active?0:-1;} for(const ext of ['svg','pdf','png'])document.querySelector(`#download-${ext}`).href=`figures/${entry.file}.${ext}`; if(updateURL){const url=new URL(location.href);url.searchParams.set('view',view);history.replaceState(null,'',url);} } for(const button of buttons){ button.addEventListener('click',()=>select(button.dataset.view)); button.addEventListener('keydown',event=>{ const keys=['ArrowLeft','ArrowRight','Home','End'];if(!keys.includes(event.key))return;event.preventDefault(); let next=buttons.indexOf(button);next=event.key==='Home'?0:event.key==='End'?buttons.length-1:(next+(event.key==='ArrowRight'?1:-1)+buttons.length)%buttons.length; select(buttons[next].dataset.view);buttons[next].focus(); }); } document.querySelector('#zoom').addEventListener('click',()=>{ document.querySelector('#zoom-image').src=image.src;document.querySelector('#zoom-image').alt=image.alt; document.querySelector('#zoom-title').textContent=views[selected].title;dialog.showModal(); }); document.querySelector('#zoom-close').addEventListener('click',()=>dialog.close()); dialog.addEventListener('click',event=>{if(event.target===dialog)dialog.close();}); select(new URLSearchParams(location.search).get('view')||'overview',false);