// 移动版 · 头部 + 底部 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 ( {tabs.map((t) => { const active = tab === t.id; const Icon = t.icon; return ( setTab(t.id)} style={{ fontFamily: 'var(--mono)', background: 'transparent', border: 'none', cursor: 'pointer', display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 3, padding: '9px 0 10px', minHeight: 56, position: 'relative', color: active ? 'var(--green)' : 'var(--faint)', textShadow: active ? '0 0 10px rgba(95,221,125,.45)' : 'none', }}> {t.badge ? ( {t.badge} ) : null} {t.label} ); })} ); } Object.assign(window, { MaestroMobHeader: MobileHeader, MaestroMobTabBar: MobileTabBar });