D4 Part 2: hub style.css v2 + template sweep

- style.css: slate tokens -> the canonical navy block + @font-face
  (self-hosted, latin-ext for Hungarian customer names); single 2px
  radius; hairline table rows (--line-soft dividers, density kept);
  status classes re-expressed per the design-system addendum:
  .status-badge = outline tag + CSS ::before dot keyed by the raw
  status the templates emit (ok=blue, warn/blocked/stale=amber,
  down/fail=red, pending/disabled=quiet neutral); .status-dot =
  class-based 8px dot; severity badges stay filled amber/red
  (exceptions stay loud); config badges = filled informational chips
  in v2 colors; row tint only for warn/down (warn-dim/crit-dim).
- Two-tone brand heading on all 8 'Felhom Hub' pages
  (<h1>Felhom <span>Hub</span></h1>, span = blue-bright).
- app_detail chart retinted: avg #2EA8F5 (primary data), peak #8E7CE8
  (secondary DATA series — not status red), catalog-limit line #E0A93E
  (threshold marker); legend/tick/grid -> v2 literals.
- customer_unified: JS status-message colors (success -> blue-bright,
  error -> crit), all inline slate hexes -> tokens.
- Login page inline HTML retinted (#0088cc -> #0083D8).
- Grep gate: every slate hex (#0f172a #1e293b #334155 #60a5fa #4ade80
  #facc15 #f87171 #94a3b8 #64748b #475569 #e2e8f0) at ZERO across
  hub/internal/web (non-test); statusIcon 0; inline statusColor
  style 0. go build/vet/test green; api/ + store/ untouched.
This commit is contained in:
2026-07-02 22:38:37 +02:00
parent bc8d54df6a
commit c136308aad
11 changed files with 263 additions and 188 deletions
@@ -272,7 +272,7 @@
{{if index . "last_sync_error"}}
<div class="info-item">
<span class="label">Szinkron hiba</span>
<span class="value" style="color: #f87171">{{index . "last_sync_error"}}</span>
<span class="value" style="color: var(--crit)">{{index . "last_sync_error"}}</span>
</div>
{{end}}
</div>
@@ -439,9 +439,9 @@
<span class="value">
v{{.LatestVersion}}
{{if .UpdateAvailable}}
<span style="color: #4ade80; margin-left: 0.3em;">● update available</span>
<span style="color: var(--blue-bright); margin-left: 0.3em;">● update available</span>
{{else}}
<span style="color: #94a3b8; margin-left: 0.3em;">— up to date</span>
<span style="color: var(--text-2); margin-left: 0.3em;">— up to date</span>
{{end}}
</span>
</div>
@@ -449,24 +449,24 @@
{{if .ControllerURL}}
<div class="info-item">
<span class="label">Controller URL</span>
<span class="value"><a href="{{.ControllerURL}}" target="_blank" style="color: #60a5fa;">{{.ControllerURL}}</a></span>
<span class="value"><a href="{{.ControllerURL}}" target="_blank" style="color: var(--blue-bright);">{{.ControllerURL}}</a></span>
</div>
{{end}}
</div>
<!-- Phase 2 managed-update floor (operator-enforced minimum) -->
<div class="info-grid" style="margin-top: 0.75rem; border-top: 1px solid #334155; padding-top: 0.75rem;">
<div class="info-grid" style="margin-top: 0.75rem; border-top: 1px solid var(--line); padding-top: 0.75rem;">
<div class="info-item">
<span class="label">Effective floor (min. version)</span>
<span class="value">
{{if .EffectiveFloor}}v{{.EffectiveFloor}}
{{if .BelowFloor}}<span style="color: #f59e0b; margin-left: 0.3em;">● below floor — will auto-update</span>
{{else}}<span style="color: #94a3b8; margin-left: 0.3em;">— at/above floor</span>{{end}}
{{else}}<span style="color: #94a3b8;">none (Phase 2 inert)</span>{{end}}
{{else}}<span style="color: var(--text-2); margin-left: 0.3em;">— at/above floor</span>{{end}}
{{else}}<span style="color: var(--text-2);">none (Phase 2 inert)</span>{{end}}
</span>
</div>
<div class="info-item">
<span class="label">Global floor</span>
<span class="value">{{if .GlobalFloor}}v{{.GlobalFloor}}{{else}}<span style="color: #94a3b8;">unset</span>{{end}}</span>
<span class="value">{{if .GlobalFloor}}v{{.GlobalFloor}}{{else}}<span style="color: var(--text-2);">unset</span>{{end}}</span>
</div>
</div>
<form method="POST" action="/customers/{{.CustomerID}}/floor" style="margin-top: 0.5rem; display: flex; gap: 0.5rem; align-items: center; flex-wrap: wrap;">
@@ -474,7 +474,7 @@
<label style="font-size: 0.85em; color: #cbd5e1;">Per-customer override</label>
<input type="text" name="min_controller_version" value="{{.FloorOverride}}" placeholder="e.g. 0.87.0 (blank = use global)" style="padding: 0.3em 0.5em; font-size: 0.85em; width: 14em;">
<button class="btn btn-outline btn-sm" type="submit">Save floor</button>
<span style="font-size: 0.8em; color: #94a3b8;">Boxes below the effective floor auto-update on their next report. Blank clears the override.</span>
<span style="font-size: 0.8em; color: var(--text-2);">Boxes below the effective floor auto-update on their next report. Blank clears the override.</span>
</form>
<p class="text-muted" style="margin-top: 0.75em; font-size: 0.8em;">
Controller updates are agent-driven (the version floor above) and config is delivered by the
@@ -705,12 +705,12 @@
if (data.ok) {
msg.textContent = data.message || 'Geo-korlátozás eltávolítva';
msg.style.display = 'inline';
msg.style.color = '#4ade80';
msg.style.color = '#2EA8F5';
setTimeout(function() { location.reload(); }, 2000);
} else {
msg.textContent = data.error || 'Hiba történt';
msg.style.display = 'inline';
msg.style.color = '#f87171';
msg.style.color = '#E5534B';
btn.disabled = false;
btn.textContent = 'Összes geo-korlátozás eltávolítása';
}
@@ -718,7 +718,7 @@
.catch(function() {
msg.textContent = 'Kapcsolódási hiba';
msg.style.display = 'inline';
msg.style.color = '#f87171';
msg.style.color = '#E5534B';
btn.disabled = false;
btn.textContent = 'Összes geo-korlátozás eltávolítása';
});
@@ -753,7 +753,7 @@
position: relative;
width: 32px;
height: 18px;
background: #475569;
background: var(--bg-2);
border-radius: 9px;
transition: background 0.2s;
}
@@ -764,7 +764,7 @@
left: 2px;
width: 14px;
height: 14px;
background: #94a3b8;
background: var(--text-2);
border-radius: 50%;
transition: transform 0.2s, background 0.2s;
}
@@ -775,7 +775,7 @@
transform: translateX(14px);
background: #fff;
}
.toggle-label { color: #94a3b8; }
.toggle-label { color: var(--text-2); }
</style>
<script>
(function() {