/* Results → By campaign: the per-campaign cards as a matched pair.
   Plain CSS because the Tailwind build is precompiled (no new utilities). */

.obs-cards {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1rem;
  align-items: stretch;
}

@media (min-width: 768px) {
  /* minmax(0, 1fr): a long campaign name or a wide A/B table can no longer
     push its column wider than its neighbour's. */
  .obs-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.obs-card {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

/* Title on its own line, chips under it — the header is the same height on
   every card whatever the name's length. */
.obs-card-head {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
}

.obs-card-title {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow: hidden;
  line-height: 1.375rem;
  min-height: calc(2 * 1.375rem);
  overflow-wrap: anywhere;
}

.obs-card-chips {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0.375rem;
}

.obs-card-body {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
}

/* The spacer takes the slack above the follow-ups + A/B panels, so they sit at the
   foot and line up across the pair even when one card carries an extra line
   (AI-filtered count, follow-ups). The panel keeps its own mt-4 gap. */
.obs-card-spacer { flex: 1 1 auto; }
