style(web/swarm): align Swarm pages with shared page-header primitive

This commit is contained in:
2026-04-22 17:59:27 -04:00
parent fcfc4eba3b
commit bff350400f
4 changed files with 52 additions and 30 deletions

View File

@@ -91,9 +91,14 @@ const AgentEnrollment: React.FC = () => {
const ss = (remainingSecs % 60).toString().padStart(2, '0');
return (
<div className="dashboard">
<div className="dashboard-header">
<h1><UserPlus size={28} /> Agent Enrollment</h1>
<div className="dashboard swarm-root">
<div className="page-header">
<div className="page-title-group">
<h1><UserPlus size={18} /> AGENT ENROLLMENT</h1>
<span className="page-sub">
issue a one-shot bootstrap URL for a new swarm worker
</span>
</div>
</div>
{!result ? (

View File

@@ -166,29 +166,21 @@ const RemoteUpdates: React.FC = () => {
}
return (
<div className="dashboard">
<div
className="section-header"
style={{
display: 'flex', justifyContent: 'space-between', alignItems: 'center',
border: '1px solid var(--border-color)', backgroundColor: 'var(--secondary-color)',
marginBottom: '24px',
}}
>
<div style={{ display: 'flex', alignItems: 'center', gap: '12px' }}>
<Package size={20} />
<h2 style={{ margin: 0 }}>REMOTE UPDATES WORKER FLEET</h2>
<div className="dashboard swarm-root">
<div className="page-header">
<div className="page-title-group">
<h1><Package size={18} /> REMOTE UPDATES</h1>
<span className="page-sub">
push updater bundles to enrolled workers · {hosts.length} WORKER{hosts.length === 1 ? '' : 'S'}
</span>
</div>
<button
onClick={() => setShowFleetModal(true)}
disabled={fleetBusy || hosts.length === 0}
style={{
display: 'flex', alignItems: 'center', gap: '8px',
border: '1px solid var(--accent-color)', color: 'var(--accent-color)',
}}
className="control-btn primary"
>
{fleetBusy ? <RefreshCw size={14} className="spin" /> : <Upload size={14} />}
{fleetBusy ? 'PUSHING...' : 'PUSH TO ALL'}
{fleetBusy ? 'PUSHING' : 'PUSH TO ALL'}
</button>
</div>

View File

@@ -1,16 +1,34 @@
.dashboard-header {
.swarm-root .page-header {
display: flex;
align-items: center;
align-items: flex-end;
justify-content: space-between;
gap: 24px;
padding-bottom: 16px;
margin-bottom: 24px;
border-bottom: 1px solid var(--panel-border);
}
.dashboard-header h1 {
.swarm-root .page-title-group {
display: flex;
flex-direction: column;
gap: 6px;
}
.swarm-root .page-header h1 {
display: flex;
align-items: center;
gap: 12px;
font-size: 1.4rem;
letter-spacing: 2px;
gap: 10px;
font-size: 1.3rem;
letter-spacing: 4px;
font-weight: 700;
margin: 0;
color: var(--matrix);
}
.swarm-root .page-sub {
font-size: 0.7rem;
opacity: 0.5;
letter-spacing: 1px;
}
.panel {

View File

@@ -90,12 +90,19 @@ const SwarmHosts: React.FC = () => {
}
};
const online = hosts.filter((h) => h.status === 'online').length;
return (
<div className="dashboard">
<div className="dashboard-header">
<h1><HardDrive size={28} /> SWARM Hosts</h1>
<div className="dashboard swarm-root">
<div className="page-header">
<div className="page-title-group">
<h1><HardDrive size={18} /> SWARM HOSTS</h1>
<span className="page-sub">
{loading ? 'LOADING…' : `${hosts.length} ENROLLED · ${online} ONLINE`}
</span>
</div>
<button onClick={fetchHosts} className="control-btn" disabled={loading}>
<RefreshCw size={16} /> Refresh
<RefreshCw size={14} /> REFRESH
</button>
</div>