Clean up server detail page: remove debug scaffolding, tighten hero

Now that the pipeline works end-to-end, the "RCON reply" panel with its
parsed-value grid and hex dump was pure debug scaffolding that ran on
every page load — it duplicated every field the hero already surfaces
and shoved a 13-line hex block into the fold. Deleted the whole
section; the on-demand raw dump lives inside the RCON diagnostic panel
(which still only renders when health isn't online, so it stays out of
the way on healthy servers).

Hero metadata compressed: status and last-seen pairs only render when
health isn't online, since the pulsing dot conveys "healthy + fresh"
better than a redundant text label. Mode pair hides when the gametype
isn't reported (Plutonium T5 doesn't include it in the status header).

Config panel hides the "held by beta" row when nothing is held —
matches how the deployment history section already only renders when
there's history.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-09-12 11:59:11 -04:00
co-authored by Claude Opus 4.7
parent 6aae72f508
commit dd4314df72
+13 -86
View File
@@ -223,9 +223,13 @@
</div>
<div class="hero-meta">
<span class="pair"><span class="k">map</span> <span class="v">{effectiveMap ?? '—'}</span></span>
<span class="pair"><span class="k">mode</span> <span class="v">{gametypeLabel(effectiveGametype) || '—'}</span></span>
<span class="pair"><span class="k">status</span> <span class="v health-{effectiveHealth}">{effectiveHealth}</span></span>
<span class="pair"><span class="k">last seen</span> <span class="v">{ago(effectiveSeen)}</span></span>
{#if gametypeLabel(effectiveGametype)}
<span class="pair"><span class="k">mode</span> <span class="v">{gametypeLabel(effectiveGametype)}</span></span>
{/if}
{#if effectiveHealth !== 'online'}
<span class="pair"><span class="k">status</span> <span class="v health-{effectiveHealth}">{effectiveHealth}</span></span>
<span class="pair"><span class="k">last seen</span> <span class="v">{ago(effectiveSeen)}</span></span>
{/if}
</div>
</section>
@@ -385,53 +389,6 @@
</section>
{/if}
{#if effectiveSnippet || effectiveEndpoint}
<section class="panel">
<div class="rcon-hdr">
<h2>RCON reply</h2>
{#if effectiveEndpoint}
<button class="probe-btn" onclick={probeRcon} disabled={probingRcon}>
{probingRcon ? 'probing rcon…' : 'probe rcon'}
</button>
{/if}
</div>
<div class="parsed-grid">
<div class="stat">
<div class="k">endpoint</div>
<div class="v mono">{effectiveEndpoint ? `${effectiveEndpoint.host}:${effectiveEndpoint.port}` : '—'}</div>
</div>
<div class="stat">
<div class="k">players</div>
<div class="v mono">{effectivePlayers ?? '—'}</div>
</div>
<div class="stat">
<div class="k">map</div>
<div class="v mono">{effectiveMap ?? '—'}</div>
</div>
<div class="stat">
<div class="k">gametype</div>
<div class="v mono">{effectiveGametype ?? '—'}</div>
</div>
<div class="stat">
<div class="k">roster parsed</div>
<div class="v mono">{effectiveRoster?.length ?? 0} row{(effectiveRoster?.length ?? 0) === 1 ? '' : 's'}</div>
</div>
<div class="stat">
<div class="k">last seen</div>
<div class="v mono">{ago(effectiveSeen)}</div>
</div>
</div>
{#if effectiveSnippet}
<div class="raw-hdr">raw reply ({effectiveSnippet.split('\n').length} lines)</div>
<pre class="snippet">{effectiveSnippet}</pre>
{:else}
<div class="raw-hdr dim">no reply captured yet — click <strong>probe rcon</strong> above</div>
{/if}
</section>
{/if}
<section class="panel">
<h2>Roster</h2>
<PlayerRoster roster={effectiveRoster} health={effectiveHealth} />
@@ -463,10 +420,12 @@
<div class="k">game_port</div>
<div class="v mono">{server.game_port ?? '(unresolved)'}</div>
</div>
<div class="stat">
<div class="k">held by beta</div>
<div class="v mono">{server.held.length === 0 ? '—' : server.held.map((h) => h.target).join(', ')}</div>
</div>
{#if server.held.length > 0}
<div class="stat">
<div class="k">held by beta</div>
<div class="v mono">{server.held.map((h) => h.target).join(', ')}</div>
</div>
{/if}
</div>
</section>
@@ -827,38 +786,6 @@
border-radius: var(--r-sm);
}
.rcon-hdr {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
}
.rcon-hdr h2 { margin: 0; }
.parsed-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
gap: 8px;
margin-bottom: 14px;
}
.raw-hdr {
font-family: var(--font-body);
font-size: 10px;
text-transform: uppercase;
letter-spacing: 1.2px;
color: var(--ink-500);
margin: 0 0 6px;
}
.raw-hdr.dim {
padding: 12px 14px;
text-transform: none;
letter-spacing: 0;
font-size: 12px;
background: var(--cherry-875);
border: 1px dashed var(--cherry-700);
border-radius: var(--r-sm);
}
.raw-hdr strong { color: var(--cream); }
.snippet-details {
margin-top: 10px;
font-family: var(--font-mono);