/*
 * Custom theme layer. Loaded AFTER bootstrap.min.css so these rules win.
 * Plain CSS — no preprocessing (Propshaft).
 */

/* ---------- Tokens ---------- */

:root,
[data-bs-theme="light"] {
  --brand: #4f46e5;
  --brand-hover: #4338ca;
  --brand-active: #3730a3;
  --brand-subtle: #eef0fe;
  --surface: #ffffff;
  --page-bg: #f7f5ef;
  --hairline: #e6e2d8;

  --bs-body-font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
  --bs-body-bg: var(--page-bg);
  --bs-body-color: #23262d;
  --bs-secondary-color: rgba(35, 38, 45, 0.62);
  --bs-emphasis-color: #101319;
  --bs-border-color: var(--hairline);
  --bs-link-color: var(--brand);
  --bs-link-hover-color: var(--brand-active);
  --bs-link-color-rgb: 79, 70, 229;
  --bs-primary: var(--brand);
  --bs-primary-rgb: 79, 70, 229;

  --bs-border-radius: 0.625rem;
  --bs-border-radius-sm: 0.4rem;
  --bs-border-radius-lg: 0.875rem;
  --bs-border-radius-xl: 1.25rem;

  --shadow-soft: 0 1px 2px rgba(16, 19, 25, 0.04), 0 8px 24px -12px rgba(16, 19, 25, 0.14);
  --shadow-raised: 0 1px 2px rgba(16, 19, 25, 0.05), 0 18px 40px -20px rgba(16, 19, 25, 0.28);
}

[data-bs-theme="dark"] {
  --brand: #8b83ff;
  --brand-hover: #a29bff;
  --brand-active: #b6b0ff;
  --brand-subtle: #211f38;
  --surface: #1b1e25;
  --page-bg: #14161a;
  --hairline: #2c3038;

  --bs-body-bg: var(--page-bg);
  --bs-body-color: #dfe2e8;
  --bs-secondary-color: rgba(223, 226, 232, 0.62);
  --bs-emphasis-color: #f4f6f9;
  --bs-border-color: var(--hairline);
  --bs-link-color: var(--brand);
  --bs-link-hover-color: var(--brand-hover);
  --bs-link-color-rgb: 139, 131, 255;
  --bs-primary: var(--brand);
  --bs-primary-rgb: 139, 131, 255;

  --shadow-soft: 0 1px 2px rgba(0, 0, 0, 0.4), 0 8px 24px -12px rgba(0, 0, 0, 0.6);
  --shadow-raised: 0 1px 2px rgba(0, 0, 0, 0.45), 0 18px 40px -20px rgba(0, 0, 0, 0.8);
}

body {
  background-color: var(--bs-body-bg);
  -webkit-font-smoothing: antialiased;
}

/* ---------- Typography ---------- */

h1, .h1, h2, .h2, h3, .h3, h4, .h4 {
  font-weight: 650;
  letter-spacing: -0.018em;
  text-wrap: balance;
  color: var(--bs-emphasis-color);
}

h1, .h1 { font-size: clamp(1.65rem, 1.2rem + 1.6vw, 2.35rem); }
h2, .h2 { font-size: clamp(1.25rem, 1.05rem + 0.8vw, 1.6rem); }

.text-primary { color: var(--brand) !important; }

.page-header { margin-bottom: 1.75rem; }
.page-header .lead { color: var(--bs-secondary-color); }

.data-year-badge {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  margin-bottom: 0.6rem;
  padding: 0.35em 0.8em;
  border-radius: 999px;
  background-color: var(--brand-subtle);
  color: var(--brand);
  font-size: 0.85rem;
  font-weight: 550;
  letter-spacing: -0.01em;
}

.data-year-badge i { font-size: 0.9em; }

.numeric { font-variant-numeric: tabular-nums; }

/* ---------- Navbar ---------- */

.app-navbar {
  background-color: color-mix(in srgb, var(--page-bg) 82%, transparent);
  backdrop-filter: saturate(180%) blur(12px);
  border-bottom: 1px solid var(--hairline);
  padding-block: 0.65rem;
}

.app-navbar .navbar-brand {
  font-weight: 650;
  letter-spacing: -0.02em;
  color: var(--bs-emphasis-color);
}

.app-navbar .navbar-brand i { font-size: 1.15rem; }

.app-navbar .nav-link {
  --bs-nav-link-color: var(--bs-secondary-color);
  --bs-nav-link-hover-color: var(--bs-emphasis-color);
  font-weight: 500;
  border-radius: var(--bs-border-radius-sm);
  padding-inline: 0.75rem;
}

.app-navbar .nav-link.active {
  color: var(--brand);
  background-color: var(--brand-subtle);
}

.app-navbar .navbar-toggler {
  border-color: var(--hairline);
  padding: 0.35rem 0.55rem;
}

.app-navbar .navbar-toggler:focus { box-shadow: none; }

/* ---------- Footer ---------- */

.app-footer {
  border-top: 1px solid var(--hairline);
  background-color: color-mix(in srgb, var(--page-bg) 60%, var(--surface));
}

/* ---------- Buttons ---------- */

.btn { font-weight: 500; }

.btn-primary {
  --bs-btn-bg: var(--brand);
  --bs-btn-border-color: var(--brand);
  --bs-btn-hover-bg: var(--brand-hover);
  --bs-btn-hover-border-color: var(--brand-hover);
  --bs-btn-active-bg: var(--brand-active);
  --bs-btn-active-border-color: var(--brand-active);
  --bs-btn-disabled-bg: var(--brand);
  --bs-btn-disabled-border-color: var(--brand);
  --bs-btn-color: #fff;
  --bs-btn-hover-color: #fff;
  --bs-btn-active-color: #fff;
  --bs-btn-disabled-color: #fff;
}

[data-bs-theme="dark"] .btn-primary {
  --bs-btn-color: #16182b;
  --bs-btn-hover-color: #16182b;
  --bs-btn-active-color: #16182b;
  --bs-btn-disabled-color: #16182b;
}

.btn-outline-primary {
  --bs-btn-color: var(--brand);
  --bs-btn-border-color: var(--brand);
  --bs-btn-hover-bg: var(--brand);
  --bs-btn-hover-border-color: var(--brand);
  --bs-btn-active-bg: var(--brand-active);
  --bs-btn-active-border-color: var(--brand-active);
}

.btn-outline-secondary {
  --bs-btn-color: var(--bs-body-color);
  --bs-btn-border-color: var(--hairline);
  --bs-btn-hover-bg: var(--brand-subtle);
  --bs-btn-hover-border-color: var(--brand-subtle);
  --bs-btn-hover-color: var(--brand);
  --bs-btn-active-bg: var(--brand-subtle);
  --bs-btn-active-border-color: var(--brand-subtle);
  --bs-btn-active-color: var(--brand);
}

.btn:focus-visible {
  box-shadow: 0 0 0 0.22rem color-mix(in srgb, var(--brand) 30%, transparent);
}

/* ---------- Forms ---------- */

.form-control,
.form-select {
  border-color: var(--hairline);
  background-color: var(--surface);
}

.form-control:focus,
.form-select:focus {
  border-color: var(--brand);
  box-shadow: 0 0 0 0.22rem color-mix(in srgb, var(--brand) 22%, transparent);
}

.form-check-input:checked {
  background-color: var(--brand);
  border-color: var(--brand);
}

.form-check-input:focus {
  border-color: var(--brand);
  box-shadow: 0 0 0 0.22rem color-mix(in srgb, var(--brand) 22%, transparent);
}

.form-label {
  font-weight: 500;
  font-size: 0.9rem;
  color: var(--bs-secondary-color);
}

/* ---------- Cards ---------- */

.card {
  --bs-card-bg: var(--surface);
  --bs-card-border-color: var(--hairline);
  --bs-card-inner-border-radius: calc(var(--bs-border-radius-lg) - 1px);
  border-radius: var(--bs-border-radius-lg);
  box-shadow: var(--shadow-soft);
}

.search-panel {
  border-radius: var(--bs-border-radius-xl);
  box-shadow: var(--shadow-raised);
}

.search-panel .input-group-text {
  background-color: var(--surface);
  border-color: var(--hairline);
  border-right: 0;
  color: var(--bs-secondary-color);
}

.search-panel .input-group .form-control { border-left: 0; }
.search-panel .input-group .form-control:focus { border-left: 0; box-shadow: none; }
.search-panel .input-group:focus-within {
  border-radius: var(--bs-border-radius);
  box-shadow: 0 0 0 0.22rem color-mix(in srgb, var(--brand) 22%, transparent);
}
.search-panel .input-group:focus-within .input-group-text,
.search-panel .input-group:focus-within .form-control { border-color: var(--brand); }

/* ---------- Tables ---------- */

.results-card,
.table-card { overflow: hidden; }

.results-table,
.data-table {
  --bs-table-bg: var(--surface);
  --bs-table-color: var(--bs-body-color);
  --bs-table-border-color: var(--hairline);
  --bs-table-hover-bg: var(--brand-subtle);
  --bs-table-hover-color: var(--bs-body-color);
  margin-bottom: 0;
}

.results-table thead th,
.data-table thead th {
  background-color: color-mix(in srgb, var(--surface) 88%, var(--hairline));
  border-bottom: 1px solid var(--hairline);
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--bs-secondary-color);
  white-space: nowrap;
}

.data-table tbody th,
.data-table tbody td { border-color: var(--hairline); }
.data-table tbody td { font-variant-numeric: tabular-nums; }
.data-table thead th { white-space: normal; }

/* Series names as column headers: sentence case, wrapped, capped width. */
.data-table--labels thead th {
  text-transform: none;
  letter-spacing: normal;
  font-size: 0.85rem;
  min-width: 8rem;
  max-width: 14rem;
}

.results-table thead th a {
  color: inherit;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
}

.results-table thead th a:hover { color: var(--brand); }
.results-table thead th .sort-icon { opacity: 0.35; font-size: 0.7rem; }
.results-table thead th .sort-icon.is-active { opacity: 1; color: var(--brand); }

/* Rows are click-to-select, so suppress the text selection / tap flash that
   tapping one otherwise produces. */
.results-table tbody tr {
  cursor: pointer;
  user-select: none;
  -webkit-user-select: none;
  -webkit-tap-highlight-color: transparent;
}

.results-table tbody tr.is-selected {
  --bs-table-bg: var(--brand-subtle);
  --bs-table-accent-bg: var(--brand-subtle);
}

.results-table tbody tr.is-selected > td { background-color: var(--brand-subtle); }

.results-table .school-name {
  font-weight: 550;
  color: var(--bs-emphasis-color);
  text-decoration: none;
}

.results-table .school-name:hover { color: var(--brand); text-decoration: underline; }
.results-table .school-city { font-size: 0.83rem; color: var(--bs-secondary-color); }
.results-table .university-link { color: var(--bs-secondary-color); text-decoration: none; }
.results-table .university-link:hover { color: var(--brand); text-decoration: underline; }

.results-table .score {
  font-variant-numeric: tabular-nums;
  font-weight: 600;
  font-size: 1.02rem;
  color: var(--bs-emphasis-color);
  white-space: nowrap;
}

.results-table .col-select { width: 2.75rem; }

/* Card mode: below md the same rows render as stacked cards. */
@media (max-width: 767.98px) {
  .results-card {
    background: transparent;
    border: 0;
    box-shadow: none;
  }

  .results-table,
  .results-table tbody,
  .results-table tr,
  .results-table td {
    display: block;
    width: auto;
  }

  .results-table thead { display: none; }

  .results-table tbody tr {
    position: relative;
    background-color: var(--surface);
    border: 1px solid var(--hairline);
    border-radius: var(--bs-border-radius-lg);
    box-shadow: var(--shadow-soft);
    padding: 0.9rem 1rem 0.9rem 2.9rem;
    margin-bottom: 0.75rem;
  }

  .results-table tbody tr.is-selected {
    background-color: var(--brand-subtle);
    border-color: var(--brand);
    box-shadow: 0 0 0 1px var(--brand), var(--shadow-soft);
  }

  .results-table tbody td {
    border: 0;
    padding: 0;
  }

  /* The card is the tr, so cells must never paint their own fill — otherwise
     hover/selected tints stop at the text instead of filling the card. Kept
     off the `border` shorthand so it can't clobber the col-score divider. */
  .results-table tbody tr > td,
  .results-table tbody tr.is-selected > td {
    background-color: transparent;
    box-shadow: none;
  }

  .results-table tbody td.col-select {
    position: absolute;
    left: 1rem;
    top: 1rem;
    width: auto;
  }

  .results-table tbody td.col-score {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 0.5rem;
    margin-top: 0.5rem;
    padding-top: 0.5rem;
    border-top: 1px dashed var(--hairline);
  }

  /* --hairline is a warm neutral and vanishes on the selected indigo fill. */
  .results-table tbody tr.is-selected td.col-score {
    border-top-color: color-mix(in srgb, var(--brand) 35%, transparent);
  }

  .results-table tbody td.col-score::before {
    content: attr(data-label);
    font-size: 0.78rem;
    font-weight: 600;
    letter-spacing: 0.03em;
    text-transform: uppercase;
    color: var(--bs-secondary-color);
  }

  .results-table tbody td.col-university { margin-top: 0.15rem; }
}

/* ---------- Charts ---------- */

.chart-wrap {
  position: relative;
  width: 100%;
}

/* HTML legend (see chart_theme.js): wraps where a canvas legend would clip. */
.chart-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem 1rem;
  margin-top: 1rem;
}

.chart-legend__item {
  display: flex;
  align-items: baseline;
  gap: 0.5rem;
  max-width: 100%;
  padding: 0.25rem 0;
  border: 0;
  background: none;
  text-align: left;
  font-size: 0.8125rem;
  line-height: 1.35;
  color: var(--bs-body-color);
}

.chart-legend__item.is-hidden {
  color: var(--bs-secondary-color);
  text-decoration: line-through;
}

.chart-legend__item.is-hidden .chart-legend__key {
  opacity: 0.35;
}

.chart-legend__key {
  flex: 0 0 auto;
  width: 14px;
  height: 3px;
  border-radius: 2px;
  transform: translateY(-0.3em);
}

@media (max-width: 767.98px) {
  .chart-legend {
    gap: 0.15rem 1rem;
  }

  .chart-legend__item {
    flex: 0 0 100%;
  }
}

/* ---------- Misc ---------- */

.empty-state {
  text-align: center;
  padding: 3.5rem 1.25rem;
  color: var(--bs-secondary-color);
}

.empty-state i {
  font-size: 2.5rem;
  color: var(--bs-secondary-color);
  opacity: 0.55;
}

.badge-category {
  background-color: var(--brand-subtle);
  color: var(--brand);
  font-weight: 550;
  border-radius: 999px;
  padding: 0.35em 0.75em;
}

.result-count { color: var(--bs-secondary-color); font-size: 0.92rem; }

.prose p { line-height: 1.75; }
.prose p + p { margin-top: 0.9rem; }
