.roster-wrap { max-width: var(--container-wide); margin: 0 auto; padding: 32px 20px 60px; }
.roster-header { margin-bottom: 24px; }
.roster-title {
  font-family: var(--font-display); font-size: clamp(30px, 5.5vw, 42px);
  font-weight: 800; letter-spacing: -.02em; margin-bottom: 6px;
}
.roster-sub { font-size: var(--text-base); color: var(--t2); }

/* Capped at 3 columns via the minmax-of-a-fraction trick — a track can't
   be narrower than 1/3 of the row, so auto-fill never lays out a 4th,
   while the 220px floor still lets it collapse to fewer columns on
   narrower viewports. */
.roster-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(max(220px, (100% - 2 * 14px) / 3), 1fr)); gap: 14px; margin-bottom: 22px; }

.roster-card {
  position: relative;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg);
  padding: 14px; display: flex; flex-direction: column; gap: 4px;
  transition: border-color var(--transition), transform var(--transition), box-shadow var(--transition);
}
.roster-card:hover { border-color: var(--accent-b); transform: translateY(-2px); box-shadow: 0 16px 32px -20px var(--shadow-strong); }
.roster-card-top { display: flex; align-items: flex-start; gap: 10px; margin-bottom: 6px; }
/* Avatar on the left; types-then-name stacked to its right, both left-
   aligned with each other — leaves the top-right corner clear for the
   (absolutely-positioned) Mega badge. */
.roster-card-avatar-col { display: flex; flex-direction: column; align-items: center; gap: 2px; flex-shrink: 0; }
.roster-card-info { display: flex; flex-direction: column; gap: 4px; min-width: 0; padding-right: 46px; }
.roster-card-types { display: flex; gap: 4px; flex-wrap: wrap; }
.roster-card-types .type-badge { font-size: 8px; padding: 1px 5px; }
.roster-card-name { font-size: var(--text-lg); font-weight: 800; line-height: 1.2; }

