NEXON / frontend /src /components /TopNavBar.jsx
Antigravity
Add openenv-core dependency and server entry point
08c0cf7
import React from 'react';
import { useApp } from '../context/AppContext';
const TopNavBar = () => {
const { sessionData, isConnected, sendCommand } = useApp();
const status = sessionData?.status || 'STANDBY';
const isRunning = sessionData?.active && status !== 'COMPLETED';
const isStandby = status === 'STANDBY' || status === 'READY';
return (
<header className="fixed top-0 w-full z-50 flex justify-between items-center px-6 h-16 bg-surface/60 backdrop-blur-xl border-b border-primary/10 shadow-[0_0_40px_rgba(0,212,255,0.04)]">
<div className="flex items-center gap-8">
<span className="text-2xl font-black tracking-tighter text-primary font-headline">NEXUS</span>
<div className="h-8 w-px bg-outline-variant/20 hidden md:block"></div>
<div className="hidden md:flex flex-col">
<span className="text-[10px] font-mono text-outline-variant tracking-widest uppercase">System Status</span>
<div className="text-sm font-mono text-tertiary">{status}</div>
</div>
</div>
<div className="flex items-center gap-6">
<div className="flex gap-2">
{/* START - clickable when standby */}
<button
onClick={() => sendCommand({ action: 'start' })}
disabled={isRunning}
className={`flex items-center gap-2 px-4 py-1.5 rounded-full border text-xs font-bold transition-all ${isRunning
? 'bg-surface-container text-slate-600 border-slate-700 cursor-not-allowed'
: 'bg-tertiary/10 border-tertiary/20 text-tertiary hover:bg-tertiary/20 active:scale-95'}`}
>
<span className="material-symbols-outlined text-sm">play_arrow</span> START
</button>
{/* PAUSE/RESUME - clickable when running */}
<button
onClick={() => sendCommand({ action: 'pause' })}
disabled={!isRunning}
className={`flex items-center gap-2 px-4 py-1.5 rounded-full border text-xs font-bold transition-all ${!isRunning
? 'bg-surface-container text-slate-600 border-slate-700 cursor-not-allowed'
: status === 'PAUSED'
? 'bg-secondary text-surface border-secondary active:scale-95'
: 'bg-secondary/10 border-secondary/20 text-secondary hover:bg-secondary/20 active:scale-95'}`}
>
<span className="material-symbols-outlined text-sm">{status === 'PAUSED' ? 'play_arrow' : 'pause'}</span>
{status === 'PAUSED' ? 'RESUME' : 'PAUSE'}
</button>
{/* FORCE END - clickable when running */}
<button
onClick={() => sendCommand({ action: 'force_end' })}
disabled={!isRunning}
className={`flex items-center gap-2 px-4 py-1.5 rounded-full border text-xs font-bold transition-all ${!isRunning
? 'bg-surface-container text-slate-600 border-slate-700 cursor-not-allowed'
: 'bg-[#f59e0b]/10 border-[#f59e0b]/20 text-[#f59e0b] hover:bg-[#f59e0b]/20 active:scale-95'}`}
>
<span className="material-symbols-outlined text-sm">stop_circle</span> FORCE END
</button>
{/* RESET - always clickable */}
<button
onClick={() => sendCommand({ action: 'reset' })}
className="flex items-center gap-2 px-4 py-1.5 rounded-full bg-error/10 border border-error/20 text-error text-xs font-bold hover:bg-error/20 transition-all active:scale-95"
>
<span className="material-symbols-outlined text-sm">restart_alt</span> RESET
</button>
</div>
<div className="flex items-center gap-2 ml-4">
<div className={`w-2 h-2 rounded-full animate-pulse shadow-[0_0_8px_#66fa8c] ${isConnected ? 'bg-tertiary' : 'bg-error'}`}></div>
<span className={`text-[10px] font-mono font-bold tracking-widest uppercase ${isConnected ? 'text-tertiary' : 'text-error'}`}>
{isConnected ? 'CONNECTED' : 'DISCONNECTED'}
</span>
</div>
</div>
</header>
);
};
export default TopNavBar;