/* admin-upgrades.css — /admin/upgrades (federation F8 item 3): renditions the
   madnetwork holds that outrank ours. One card per finding, built around a
   two-row compare so "yours" and "offered" sit on the same axis and the claimed
   figures can never be mistaken for measured ones. Buttons, .view-tabs, .modal
   and .linklike come from app.css + admin-shell.css. */

.upg-toolbar {
  display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
  margin: var(--space-4) 0;
}
.upg-spacer { flex: 1; }
.upg-count { font-size: 13px; }

.upg-list { display: grid; gap: var(--space-3); }

.upg-card {
  border: 1px solid var(--border); border-radius: var(--radius);
  background: var(--surface); padding: var(--space-3);
  display: grid; gap: var(--space-3);
}
/* A decided finding recedes without disappearing — the tabs are how you go
   looking for it, the dimming is how you know it is not waiting on you. */
.upg-card.is-dismissed, .upg-card.is-materialized { opacity: 0.72; }

.upg-head { display: flex; align-items: flex-start; gap: var(--space-3); flex-wrap: wrap; }
.upg-name { flex: 1; min-width: 200px; }
.upg-title { font-weight: 600; }
.upg-sub { font-size: 12.5px; color: var(--text-muted); }
.upg-link { font-size: 12.5px; white-space: nowrap; }

.upg-compare { border-collapse: collapse; width: 100%; font-size: 13px; }
.upg-compare th {
  text-align: left; font-weight: 600; font-size: 11.5px; text-transform: uppercase;
  letter-spacing: 0.04em; color: var(--text-muted);
  padding: 0 var(--space-3) 4px 0; border-bottom: 1px solid var(--border);
}
.upg-compare td { padding: var(--space-2) var(--space-3) var(--space-2) 0; vertical-align: top; }
.upg-side { color: var(--text-muted); width: 5.5rem; }
.upg-compare .mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; }
.upg-compare tr.is-offered td { font-weight: 500; }

/* "claimed" is not decoration: every remote quality figure is the origin's
   assertion about bytes nobody here has verified yet. */
.upg-claimed {
  margin-left: var(--space-2); font-size: 10.5px; text-transform: uppercase;
  letter-spacing: 0.04em; color: var(--warning);
  border: 1px solid color-mix(in srgb, var(--warning) 45%, transparent);
  border-radius: 999px; padding: 1px 6px; vertical-align: 1px;
}

.upg-meta {
  display: flex; flex-wrap: wrap; gap: var(--space-3);
  font-size: 12px; color: var(--text-muted);
}
.upg-evidence { color: var(--text); }
.upg-source { color: var(--text); }
/* A node nobody has heard from lately may still hold it — dimmed, never hidden
   (docs/architecture/federation.md §Availability), and the swarm looks for
   holders by hash anyway. */
.upg-source--stale { color: var(--text-muted); font-style: italic; }

.upg-actions { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.upg-status { font-size: 12.5px; color: var(--text-muted); flex: 1; }

.upg-actions .btn-primary { background: var(--accent); border-color: var(--accent); color: #fff; }
.upg-actions .btn-primary:hover:not(:disabled) { background: var(--accent-dim); border-color: var(--accent-dim); }
.upg-actions .btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }

@media (max-width: 640px) {
  .upg-side { width: 4.5rem; }
  .upg-compare { font-size: 12.5px; }
}
