/* 06-opportunities.css
   opportunities

   Split out of styles.css. The numeric prefix is load-bearing: the server
   loads styles.css first, then styles/*.css alphabetically, and the cascade
   here is the original file's order. Renaming these out of sequence changes
   which rule wins.

   A few blocks are filed by position rather than by subject — the mobile
   header sits inside launch, a shared chart rule inside game stats — because
   moving them would reorder the cascade. Worth relocating one at a time with
   a visual check, not in bulk.
   ======================================================================== */

/* ===========================================================================
   Opportunities V11
   ======================================================================== */

.opportunities {
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.opportunities__eyebrow {
  color: var(--accent);
  font-size: 8px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
}

.opportunities__controls h2 {
  margin: 3px 0 0;
  color: var(--ink);
  font-size: 20px;
  font-weight: 600;
}

.opportunities__cards {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: 9px;
  background: var(--surface);
}

.opportunities__card {
  min-width: 0;
  padding: 13px 15px;
  border-right: 1px solid var(--line);
}

.opportunities__card:last-child {
  border-right: 0;
}

.opportunities__card > span {
  display: block;
  color: var(--ink-faint);
  font-size: 8px;
  font-weight: 600;
  letter-spacing: .05em;
  text-transform: uppercase;
}

.opportunities__card strong {
  display: block;
  margin-top: 4px;
  overflow: hidden;
  color: var(--ink);
  font-size: 21px;
  font-weight: 600;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.opportunities__card:first-child strong {
  color: var(--positive);
}

.opportunities__card small {
  display: block;
  margin-top: 3px;
  overflow: hidden;
  color: var(--ink-faint);
  font-size: 8px;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.opportunities__targets {
  min-width: 0;
}

.opportunities__controls {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 16px;
  padding: 11px 14px;
  border: 1px solid var(--line);
  border-bottom: 0;
  border-radius: 9px 9px 0 0;
  background: var(--surface);
}

.opportunities__filter {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 3px;
  padding: 3px;
  border: 1px solid var(--line);
  border-radius: 7px;
  background: var(--surface-sunk);
}

.opportunities__filter button {
  min-height: 27px;
  padding: 0 9px;
  border: 0;
  border-radius: 5px;
  background: transparent;
  color: var(--ink-faint);
  font: inherit;
  font-size: 9px;
  cursor: pointer;
}

.opportunities__filter button:hover {
  color: var(--ink-soft);
}

.opportunities__filter button[aria-pressed="true"] {
  background: var(--surface);
  color: var(--accent);
  box-shadow: inset 0 0 0 1px var(--line-strong);
}

.opportunities__targets > div:last-child > .panel {
  border-radius: 0 0 9px 9px;
}

.opportunities__table {
  min-width: 0;
}

.opportunities__empty,
.opportunities__empty-panel {
  display: flex;
  min-height: 120px;
  align-items: center;
  justify-content: center;
  color: var(--ink-faint);
  font-size: 10px;
}

.opportunities__method {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 12px 14px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: var(--surface-sunk);
  color: var(--ink-faint);
  font-size: 9px;
  line-height: 1.55;
}

.opportunities__method strong {
  flex: 0 0 auto;
  color: var(--ink-soft);
  font-weight: 600;
}

table.data tbody tr.is-clickable {
  cursor: pointer;
}

table.data tbody tr.is-clickable:focus-visible td {
  outline: 1px solid var(--accent);
  outline-offset: -1px;
}

@media (max-width: 1180px) {
  .opportunities__cards {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }

  .opportunities__card {
    border-bottom: 1px solid var(--line);
  }

  .opportunities__card:nth-child(3n) {
    border-right: 0;
  }

  .opportunities__card:nth-child(n+4) {
    border-bottom: 0;
  }

  .opportunities__card:last-child {
    border-right: 1px solid var(--line);
  }
}

@media (max-width: 850px) {
  .opportunities__controls {
    align-items: stretch;
    flex-direction: column;
  }

  .opportunities__cards {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .opportunities__card,
  .opportunities__card:nth-child(3n),
  .opportunities__card:last-child {
    border-right: 1px solid var(--line);
    border-bottom: 1px solid var(--line);
  }

  .opportunities__card:nth-child(2n) {
    border-right: 0;
  }

  .opportunities__card:last-child {
    border-bottom: 0;
  }
}

@media (max-width: 560px) {
  .opportunities__cards {
    grid-template-columns: 1fr;
  }

  .opportunities__card,
  .opportunities__card:nth-child(2n),
  .opportunities__card:nth-child(3n),
  .opportunities__card:last-child {
    border-right: 0;
    border-bottom: 1px solid var(--line);
  }

  .opportunities__card:last-child {
    border-bottom: 0;
  }

  .opportunities__filter {
    width: 100%;
  }

  .opportunities__filter button {
    flex: 1 1 45%;
  }
}

/* The method note grew a second paragraph when reactivation stopped being
   "wagering fell" and started needing an explanation. Two spans side by side
   in the existing flex row would have squashed both. */
.opportunities__method-body {
  display: grid;
  gap: 7px;
}

.opportunities__method-body p {
  margin: 0;
}

.opportunities__method-body strong {
  color: var(--ink-soft);
  font-weight: 600;
}

/* Reactivation is gated on launch evidence, so no evidence means no targets.
   Said out loud, because an empty list otherwise reads as good news. */
.opportunities__notice {
  margin: 0 0 12px;
  padding: 10px 12px;
  border: 1px solid var(--line);
  border-left: 3px solid var(--negative);
  border-radius: 8px;
  background: var(--surface-sunk);
  color: var(--ink-soft);
  font-size: 11px;
  line-height: 1.55;
}

/* The rollout table's expanded row: who to approach about one new release,
   and the case for each. Laid out as a grid rather than a nested table so the
   rationale can run full width under the figures it explains. */
.rollout {
  padding: 4px 8px 10px 26px;
}

.rollout__list {
  display: grid;
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.rollout__list li {
  display: grid;
  grid-template-columns: minmax(0, 200px) auto minmax(0, 110px);
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  border: 1px solid var(--line);
  border-radius: 6px;
  background: var(--surface);
}

.rollout__operator {
  overflow: hidden;
  color: var(--ink);
  font-size: 11px;
  font-weight: 600;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.rollout__value {
  color: var(--ink);
  font-size: 11px;
  font-weight: 600;
  text-align: right;
}

.rollout__why {
  grid-column: 1 / -1;
  color: var(--ink-soft);
  font-size: 10px;
  line-height: 1.5;
}

.rollout__more {
  margin: 8px 0 0;
  color: var(--ink-faint);
  font-size: 10px;
}
