Unstick the header and give service pills their own row
All checks were successful
Deploy / deploy (push) Successful in 51s

Letting the six pills share row one with the brand and clock meant that
once they stopped fitting, the header wrapped into ragged rows and
orphaned the clock onto a line of its own. Commit to two deliberate rows
at every width instead: identity and controls on top, pills centered on
a full-width row beneath. The <=700px block already did exactly this, so
this promotes that established pattern to all widths and drops the rules
it no longer needs to restate.

Also drops position:sticky — a status bar isn't worth permanent screen
real estate, and the header now scrolls away with the page.

Verified at 1554/1000/375px: brand and controls share a row, 0 pills
clipped, no horizontal page overflow, position computes to static.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Barely Removable 2026-08-26 14:32:52 -07:00
parent 18c7719cd7
commit fd973dd3f7

View file

@ -1,18 +1,21 @@
/* ── Header ─────────────────────────────────────────── */ /* ── Header ─────────────────────────────────────────── */
/* Two deliberate rows at every width: identity + controls on top,
service pills on their own full-width row beneath. Letting the pills
share row one made the header wrap into ragged rows and orphan the
clock as soon as the six of them stopped fitting. Scrolls away with
the page — a status bar isn't worth permanent screen real estate. */
header { header {
background: var(--surface); background: var(--surface);
border-bottom: 1px solid var(--border); border-bottom: 1px solid var(--border);
padding: 0.75rem 1.5rem; padding: 0.75rem 1.5rem;
display: flex; display: flex;
align-items: center; align-items: center;
gap: var(--gap); gap: 0.75rem var(--gap);
flex-wrap: wrap; flex-wrap: wrap;
position: sticky;
top: 0;
z-index: 100;
} }
.brand { .brand {
order: 1;
display: flex; display: flex;
align-items: center; align-items: center;
gap: 0.65rem; gap: 0.65rem;
@ -28,14 +31,15 @@ header {
white-space: nowrap; white-space: nowrap;
} }
/* Service status pills — wrap onto as many rows as needed so every /* Service status pills — own row, wrapping among themselves so every
service stays visible at any window width. Never scroll or clip: service stays visible at any width. Never scroll or clip: a hidden
a hidden pill is a service you can't see the status of. */ pill is a service whose status you can't see. */
.svc-strip { .svc-strip {
order: 3;
display: flex; display: flex;
align-items: center; align-items: center;
gap: 0.4rem; gap: 0.4rem;
flex: 1 1 auto; flex: 0 0 100%;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
min-width: 0; min-width: 0;
@ -69,6 +73,7 @@ header {
.status-light.down { background: var(--danger); box-shadow: 0 0 0 3px var(--danger-dim); } .status-light.down { background: var(--danger); box-shadow: 0 0 0 3px var(--danger-dim); }
.header-right { .header-right {
order: 2;
display: flex; display: flex;
align-items: center; align-items: center;
gap: 0.75rem; gap: 0.75rem;
@ -587,12 +592,12 @@ footer .version {
.row.cols-3 > :first-child { grid-column: auto; } .row.cols-3 > :first-child { grid-column: auto; }
} }
@media (max-width: 700px) { @media (max-width: 700px) {
/* Row order and the full-width pill row are set in the base rules. */
header { padding: 0.7rem 1rem; gap: 0.6rem; } header { padding: 0.7rem 1rem; gap: 0.6rem; }
.brand { order: 1; flex: 1 1 auto; min-width: 0; } .brand { flex: 1 1 auto; }
.brand h1 { font-size: var(--fs-base); } .brand h1 { font-size: var(--fs-base); }
.header-right { order: 2; }
.header-clock { display: none; } .header-clock { display: none; }
.svc-strip { order: 3; width: 100%; flex: 1 0 100%; justify-content: flex-start; } .svc-strip { justify-content: flex-start; }
main { padding: 1rem; } main { padding: 1rem; }
.card-body { padding: 0.9rem; } .card-body { padding: 0.9rem; }
.card-header { padding: 0.75rem 0.9rem; } .card-header { padding: 0.75rem 0.9rem; }