God Agent OS
feat(v11): Complete God Mode upgrade - Theme, Language, Computer Use, Real Backend
bbcfe72 | 'use client' | |
| import { useState, useRef, useEffect } from 'react' | |
| import { Menu, Zap, Settings, Bell, Activity, Sun, Moon, Globe, ChevronDown, Cpu, MonitorPlay } from 'lucide-react' | |
| import { useAppStore, type Theme, type Locale } from '@/store/useAppStore' | |
| const THEMES: { id: Theme; label: string; en: string; my: string; icon: string }[] = [ | |
| { id: 'dark', label: 'Dark', en: 'Dark', my: 'မှောင်', icon: '🌑' }, | |
| { id: 'amoled', label: 'AMOLED', en: 'AMOLED', my: 'AMOLED', icon: '⬛' }, | |
| { id: 'neon', label: 'Neon', en: 'Neon', my: 'Neon', icon: '💜' }, | |
| { id: 'glass', label: 'Glass', en: 'Glass', my: 'ဖန်ထည်', icon: '🔮' }, | |
| ] | |
| const LOCALES: { id: Locale; flag: string; label: string }[] = [ | |
| { id: 'en', flag: '🇬🇧', label: 'English' }, | |
| { id: 'my', flag: '🇲🇲', label: 'မြန်မာ' }, | |
| ] | |
| export default function TopBar() { | |
| const { | |
| sidebarOpen, setSidebarOpen, | |
| theme, setTheme, | |
| locale, setLocale, | |
| setCurrentPage, currentPage, | |
| isComputerUseOpen, setComputerUseOpen, | |
| } = useAppStore() | |
| const [themeOpen, setThemeOpen] = useState(false) | |
| const [langOpen, setLangOpen] = useState(false) | |
| const themeRef = useRef<HTMLDivElement>(null) | |
| const langRef = useRef<HTMLDivElement>(null) | |
| // Close dropdowns on outside click | |
| useEffect(() => { | |
| function handler(e: MouseEvent) { | |
| if (themeRef.current && !themeRef.current.contains(e.target as Node)) setThemeOpen(false) | |
| if (langRef.current && !langRef.current.contains(e.target as Node)) setLangOpen(false) | |
| } | |
| document.addEventListener('mousedown', handler) | |
| return () => document.removeEventListener('mousedown', handler) | |
| }, []) | |
| const currentTheme = THEMES.find(t => t.id === theme) || THEMES[0] | |
| const currentLocale = LOCALES.find(l => l.id === locale) || LOCALES[0] | |
| return ( | |
| <header | |
| className="h-12 flex items-center justify-between px-3 shrink-0 z-50" | |
| style={{ background: 'var(--surface-1)', borderBottom: '1px solid var(--border)' }} | |
| > | |
| {/* Left */} | |
| <div className="flex items-center gap-3"> | |
| <button | |
| onClick={() => setSidebarOpen(!sidebarOpen)} | |
| className="p-1.5 rounded-lg hover:bg-white/5 transition-colors" | |
| title="Toggle Sidebar" | |
| > | |
| <Menu size={16} style={{ color: 'var(--text-secondary)' }} /> | |
| </button> | |
| <div className="flex items-center gap-2"> | |
| <div className="w-7 h-7 rounded-lg flex items-center justify-center shadow-lg" | |
| style={{ background: 'linear-gradient(135deg, var(--accent), #4f46e5)' }}> | |
| <Zap size={14} className="text-white" /> | |
| </div> | |
| <div className="hidden sm:block"> | |
| <span className="text-sm font-bold" style={{ color: 'var(--text-primary)' }}> | |
| {locale === 'my' ? 'GOD AGENT OS' : 'GOD AGENT OS'} | |
| </span> | |
| <span | |
| className="text-[10px] ml-1.5 px-1.5 py-0.5 rounded-full font-semibold" | |
| style={{ background: 'rgba(124,58,237,0.15)', border: '1px solid rgba(124,58,237,0.3)', color: '#c4b5fd' }} | |
| > | |
| v11 · God Mode | |
| </span> | |
| </div> | |
| </div> | |
| </div> | |
| {/* Center - Status */} | |
| <div className="hidden md:flex items-center gap-3"> | |
| <div | |
| className="flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-medium" | |
| style={{ background: 'rgba(34,197,94,0.1)', border: '1px solid rgba(34,197,94,0.2)', color: '#4ade80' }} | |
| > | |
| <div className="w-1.5 h-1.5 rounded-full bg-green-400 animate-pulse" /> | |
| <Activity size={10} /> | |
| <span>{locale === 'my' ? 'Backend Online' : 'Backend Online'}</span> | |
| </div> | |
| <div className="flex items-center gap-1.5 px-3 py-1 rounded-full text-xs" | |
| style={{ background: 'rgba(124,58,237,0.1)', border: '1px solid rgba(124,58,237,0.2)', color: '#a78bfa' }}> | |
| <Cpu size={10} /> | |
| <span>16 Agents · 22 Spaces</span> | |
| </div> | |
| </div> | |
| {/* Right - Controls */} | |
| <div className="flex items-center gap-1"> | |
| {/* Computer Use Toggle (Manus-style) */} | |
| <button | |
| onClick={() => setComputerUseOpen(!isComputerUseOpen)} | |
| className="flex items-center gap-1.5 px-2.5 py-1.5 rounded-lg text-xs font-medium transition-all" | |
| style={{ | |
| background: isComputerUseOpen ? 'rgba(124,58,237,0.15)' : 'transparent', | |
| color: isComputerUseOpen ? '#a78bfa' : 'var(--text-muted)', | |
| border: isComputerUseOpen ? '1px solid rgba(124,58,237,0.25)' : '1px solid transparent', | |
| }} | |
| title={locale === 'my' ? 'Computer ကြည့်ရန်' : 'Computer Use View'} | |
| > | |
| <MonitorPlay size={14} /> | |
| <span className="hidden sm:inline"> | |
| {locale === 'my' ? 'Computer' : 'Computer Use'} | |
| </span> | |
| </button> | |
| {/* Language Toggle */} | |
| <div className="relative" ref={langRef}> | |
| <button | |
| onClick={() => { setLangOpen(!langOpen); setThemeOpen(false) }} | |
| className="flex items-center gap-1 px-2 py-1.5 rounded-lg hover:bg-white/5 transition-colors text-xs" | |
| style={{ color: 'var(--text-secondary)' }} | |
| title="Language" | |
| > | |
| <Globe size={13} /> | |
| <span className="hidden sm:inline">{currentLocale.flag}</span> | |
| <ChevronDown size={10} /> | |
| </button> | |
| {langOpen && ( | |
| <div | |
| className="absolute right-0 top-full mt-1 py-1 rounded-xl shadow-xl z-50 min-w-[130px] animate-fade-in" | |
| style={{ background: 'var(--surface-3)', border: '1px solid var(--border)' }} | |
| > | |
| {LOCALES.map(l => ( | |
| <button | |
| key={l.id} | |
| onClick={() => { setLocale(l.id); setLangOpen(false) }} | |
| className="w-full flex items-center gap-2.5 px-3 py-2 text-xs hover:bg-white/5 transition-colors" | |
| style={{ color: locale === l.id ? 'var(--accent-bright)' : 'var(--text-secondary)' }} | |
| > | |
| <span>{l.flag}</span> | |
| <span>{l.label}</span> | |
| {locale === l.id && <span className="ml-auto text-[10px]">✓</span>} | |
| </button> | |
| ))} | |
| </div> | |
| )} | |
| </div> | |
| {/* Theme Toggle */} | |
| <div className="relative" ref={themeRef}> | |
| <button | |
| onClick={() => { setThemeOpen(!themeOpen); setLangOpen(false) }} | |
| className="flex items-center gap-1 px-2 py-1.5 rounded-lg hover:bg-white/5 transition-colors text-xs" | |
| style={{ color: 'var(--text-secondary)' }} | |
| title="Theme" | |
| > | |
| <span>{currentTheme.icon}</span> | |
| <ChevronDown size={10} /> | |
| </button> | |
| {themeOpen && ( | |
| <div | |
| className="absolute right-0 top-full mt-1 py-1 rounded-xl shadow-xl z-50 min-w-[140px] animate-fade-in" | |
| style={{ background: 'var(--surface-3)', border: '1px solid var(--border)' }} | |
| > | |
| <div className="px-3 py-1.5 text-[10px] font-semibold uppercase tracking-wider" style={{ color: 'var(--text-muted)' }}> | |
| {locale === 'my' ? 'အပြင်အဆင်' : 'Theme'} | |
| </div> | |
| {THEMES.map(t => ( | |
| <button | |
| key={t.id} | |
| onClick={() => { setTheme(t.id); setThemeOpen(false) }} | |
| className="w-full flex items-center gap-2.5 px-3 py-2 text-xs hover:bg-white/5 transition-colors" | |
| style={{ color: theme === t.id ? 'var(--accent-bright)' : 'var(--text-secondary)' }} | |
| > | |
| <span>{t.icon}</span> | |
| <span>{locale === 'my' ? t.my : t.en}</span> | |
| {theme === t.id && <span className="ml-auto text-[10px]">✓</span>} | |
| </button> | |
| ))} | |
| </div> | |
| )} | |
| </div> | |
| {/* Notifications */} | |
| <button | |
| className="p-1.5 rounded-lg hover:bg-white/5 transition-colors" | |
| style={{ color: 'var(--text-muted)' }} | |
| title="Notifications" | |
| > | |
| <Bell size={15} /> | |
| </button> | |
| {/* Settings */} | |
| <button | |
| onClick={() => setCurrentPage('settings')} | |
| className="p-1.5 rounded-lg hover:bg-white/5 transition-colors" | |
| style={{ | |
| color: currentPage === 'settings' ? 'var(--accent-bright)' : 'var(--text-muted)', | |
| background: currentPage === 'settings' ? 'rgba(124,58,237,0.1)' : 'transparent', | |
| }} | |
| title="Settings" | |
| > | |
| <Settings size={15} /> | |
| </button> | |
| </div> | |
| </header> | |
| ) | |
| } | |