/**
 * Stackforge Academy — Course catalog.
 *
 * Extends the existing .course-card component rather than redefining
 * it; only the catalog-specific chrome (filter bar, results grid,
 * loading state) lives here.
 *
 * Filters are a stacked, full-width column on mobile and a sticky
 * sidebar from 1024px — the same markup either way.
 */

.catalog {
  padding-block: var(--sf-space-10) var(--sf-space-16);
}

.catalog__header {
  margin-bottom: var(--sf-space-8);
}

.catalog__layout {
  display: grid;
  gap: var(--sf-space-8);
  grid-template-columns: 1fr;
  align-items: start;
}

@media (min-width: 1024px) {
  .catalog__layout {
    grid-template-columns: 260px minmax(0, 1fr);
    gap: var(--sf-space-10);
  }
}

/* ---------- Filters ---------- */

.catalog-filters {
  background: var(--sf-surface);
  border: 1px solid var(--sf-border);
  border-radius: var(--sf-radius-lg);
  padding: var(--sf-space-5);
}

@media (min-width: 1024px) {
  .catalog-filters {
    position: sticky;
    top: calc(var(--sf-header-height) + var(--sf-space-6));
  }
}

.catalog-filters__group + .catalog-filters__group {
  margin-top: var(--sf-space-6);
  padding-top: var(--sf-space-6);
  border-top: 1px solid var(--sf-border);
}

.catalog-filters__legend {
  font-family: var(--sf-font-mono);
  font-size: var(--sf-text-xs);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--sf-slate-400);
  margin-bottom: var(--sf-space-3);
  padding: 0;
}

.catalog-filters__options {
  display: flex;
  flex-direction: column;
  gap: var(--sf-space-1);
}

.catalog-filter {
  display: flex;
  align-items: center;
  gap: var(--sf-space-2);
  /* 44px target — these are tapped, not just clicked. */
  min-height: 44px;
  padding: var(--sf-space-2);
  border-radius: var(--sf-radius-sm);
  font-size: var(--sf-text-sm);
  color: var(--sf-slate-600);
  cursor: pointer;
  transition: background var(--sf-duration-fast) var(--sf-ease),
              color var(--sf-duration-fast) var(--sf-ease);
}

.catalog-filter:hover { background: var(--sf-indigo-50); color: var(--sf-indigo); }

.catalog-filter input { accent-color: var(--sf-indigo); }

.catalog-filter__count {
  margin-left: auto;
  font-family: var(--sf-font-mono);
  font-size: var(--sf-text-xs);
  color: var(--sf-slate-400);
}

/* Mobile: a disclosure so filters don't push results off-screen. */
.catalog-filters__toggle {
  display: flex;
  width: 100%;
  align-items: center;
  justify-content: space-between;
  min-height: 44px;
  margin-bottom: var(--sf-space-4);
}

@media (min-width: 1024px) {
  .catalog-filters__toggle { display: none; }
  .catalog-filters__body { display: block !important; }
}

/* ---------- Toolbar ---------- */

.catalog-toolbar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--sf-space-3);
  margin-bottom: var(--sf-space-6);
}

.catalog-toolbar__count {
  font-family: var(--sf-font-mono);
  font-size: var(--sf-text-sm);
  color: var(--sf-slate-600);
}

.catalog-toolbar__sort {
  display: flex;
  align-items: center;
  gap: var(--sf-space-2);
}

.catalog-toolbar__sort select { min-height: 44px; }

/* ---------- Active filter chips ---------- */

.catalog-active {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sf-space-2);
  margin-bottom: var(--sf-space-5);
}

.catalog-chip {
  display: inline-flex;
  align-items: center;
  gap: var(--sf-space-2);
  padding: var(--sf-space-2) var(--sf-space-3);
  border-radius: var(--sf-radius-full);
  background: var(--sf-indigo-50);
  color: var(--sf-indigo-600);
  font-size: var(--sf-text-xs);
  text-decoration: none;
  min-height: 32px;
}

.catalog-chip:hover { background: var(--sf-indigo-100); color: var(--sf-indigo-600); }
.catalog-chip__remove { font-weight: var(--sf-weight-bold); opacity: 0.6; }
.catalog-chip:hover .catalog-chip__remove { opacity: 1; }

/* ---------- Results grid ---------- */

.catalog-results {
  display: grid;
  gap: var(--sf-space-6);
  grid-template-columns: 1fr;
  transition: opacity var(--sf-duration-base) var(--sf-ease);
}

@media (min-width: 560px) {
  .catalog-results { grid-template-columns: repeat(2, 1fr); }
}

@media (min-width: 1024px) {
  .catalog-results { grid-template-columns: repeat(3, 1fr); }
}

/* While an AJAX refresh is in flight, dim rather than blank the grid —
   replacing results with a spinner makes the page jump and loses the
   reader's place. */
.catalog-results.is-loading {
  opacity: 0.45;
  pointer-events: none;
}

/* ---------- Card additions ---------- */

.course-card__enrolled {
  position: absolute;
  top: var(--sf-space-3);
  right: var(--sf-space-3);
}

.course-card__price--sale {
  color: var(--sf-slate-400);
  text-decoration: line-through;
  font-weight: var(--sf-weight-regular);
  margin-right: var(--sf-space-2);
}

.course-card__progress { margin-top: var(--sf-space-3); }

.course-card__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sf-space-3);
  font-family: var(--sf-font-mono);
  font-size: var(--sf-text-xs);
  color: var(--sf-slate-400);
  margin-top: var(--sf-space-3);
}


/* ---------- Touch sizing ---------- */

@media (pointer: coarse) {
  .catalog-chip {
    min-height: 44px;
    padding-inline: var(--sf-space-4);
  }

  /* The remove affordance is its own target inside the chip, so it
     needs its own room rather than inheriting the chip's. */
  .catalog-chip__remove {
    min-width: 32px;
    min-height: 32px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    opacity: 1;
  }
}
