// 移动版 · 头部 + 底部 Tab 栏 const mIcon = { fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round', strokeLinejoin: 'round', viewBox: '0 0 24 24' }; function MIconTask({ s = 22 }) { return ; } function MIconGate({ s = 22 }) { return ; } function MIconEvent({ s = 22 }) { return ; } function MIconGit({ s = 22 }) { return ; } function MobileMark({ scale = 1.6 }) { const ref = React.useRef(null); React.useEffect(() => { const MAP = ['.....LLLLL.....','...LLLLLLLLL...','..GGGGGGGGGGG..','..GGEEGGGEEGG..','..GGEEGGGEEGG..','..GGGGGGGGGGG..','...GGGGGGGGG...','...G..G.G..G...','...G..G.G..G...','..G...G.G...G..','..D...D.D...D..','.D...D...D...D.']; const INK = { L: '#79ec94', G: '#5fdd7d', D: '#2e6b3d', E: '#070908' }; const ctx = ref.current.getContext('2d'); MAP.forEach((row, y) => [...row].forEach((ch, x) => { if (INK[ch]) { ctx.fillStyle = INK[ch]; ctx.fillRect(x, y, 1, 1); } })); }, []); return ; } function MobileHeader({ project, counts }) { const { CountBadge } = window.MaestroDesignSystem_a6a290; return (
{project.name}
{project.branch} · {project.autonomy}
); } function MobileTabBar({ tab, setTab, gateCount }) { const tabs = [ { id: 'tasks', label: '任务', icon: MIconTask }, { id: 'gates', label: '审批', icon: MIconGate, badge: gateCount }, { id: 'events', label: '事件', icon: MIconEvent }, { id: 'projects', label: '项目', icon: MIconGit }, ]; return ( ); } Object.assign(window, { MaestroMobHeader: MobileHeader, MaestroMobTabBar: MobileTabBar });