// Shell: sidebar + topbar, reused across artboards const Sidebar = ({ active = "teardown" }) => { const groups = [ { label: "工作流", items: [ { id:"dash", ic:"dash", label:"总览 Overview" }, { id:"collect", ic:"fire", label:"1 · 收集爆款" }, { id:"teardown", ic:"layers", label:"2 · 拆解爆款" }, { id:"remix", ic:"magic", label:"3 · 复刻爆款" }, { id:"qc", ic:"check", label:"4 · 质检合成" }, { id:"scrub", ic:"filter", label:"5 · 数据脱敏与扰乱" }, { id:"distribute", ic:"send", label:"6 · 分发爆款" }, ]}, { label: "资产", items: [ { id:"library", ic:"folder", label:"爆款存储库" }, { id:"templates", ic:"folder", label:"模板库" }, { id:"rule_packs", ic:"filter", label:"规则库" }, { id:"assets", ic:"layers", label:"分镜素材库" }, { id:"image_library", ic:"folder", label:"图片素材库" }, { id:"bgm_library", ic:"music", label:"背景音乐素材库" }, { id:"accounts", ic:"account", label:"账号矩阵" }, ]}, { label: "系统", items: [ { id:"models", ic:"zap", label:"模型管理" }, ]}, ]; return ( ); }; const SidebarFooter = () => { const user = Auth.getUser(); const name = (user && (user.nickname || user.username)) || ""; const avatar = (user && user.avatar) || ""; const initial = name ? name[0].toUpperCase() : "?"; return (
{avatar ? :
{initial}
}
{name || "未登录"} 在线
); }; const Topbar = ({ crumbs, right, status, updated }) => (
{crumbs.map((c,i)=>( {i>0 && /} {c} ))}
{status && {status}} {updated && {updated}}
{right}
); Object.assign(window, { Sidebar, Topbar });