/* ═══════════════════════════════════════════════════════════════════════
   Ported verbatim from www/sites/all/themes/business/css/override.css —
   this is the live site's actual design system, not a new one. Only the
   sections actually used by the pages built so far are included; add more
   verbatim sections here as more pages get rebuilt.
   ═══════════════════════════════════════════════════════════════════════ */

:root {
  /* Theme colors (--bs-primary/-info/-success/-warning/-danger and their
     -rgb pairs), --cl-blue-soft and --cl-coral used to be redeclared here
     too — dropped since dashboard_css_urls() (includes/layout.php) always
     loads the compiled Bootstrap/Claude design-system bundle before this
     file, which already defines all of them from
     coursesite/src/assets/claude/_variables.scss and _bootswatch.scss.
     Redeclaring them here just let this file silently drift out of sync
     with that one source of truth (it loads last, so its copy would win).
     Brand colors live in _variables.scss now — see $brand-red/$brand-navy. */
  --bs-font-sans-serif: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
                        Roboto, "Helvetica Neue", Arial, sans-serif;
  --bs-body-font-family: var(--bs-font-sans-serif);

  --r-md:   12px;
  --r-lg:   14px;
  --r-xl:   20px;
  --r-2xl:  1.25rem;
  --r-pill: 999px;

  --ease-snap: ease;
  --dur-fast:  180ms;
  --dur-base:  260ms;
}

[data-bs-theme="light"] {
  --bg-page-gradient: linear-gradient(135deg, #eaf2fb 0%, #f6f8fc 55%, #dfeaf8 100%);
  --bg-card-gradient: linear-gradient(180deg, #ffffff 0%, #eef3fa 100%);
  --shadow-card:  0 .35rem .9rem rgba(0,0,0,.06);
  --shadow-hover: 0 1rem 2rem rgba(0,0,0,.12);
  /* --tint-*-soft vars: also dropped from here for the same reason as the
     :root block above — the loaded bundle's copies (derived from $primary/
     $info/$success/$warning) already apply. */
  /* Bootstrap's own default (--bs-body-bg: #fff) leaves every element that
     paints itself with this var (.site-header, .cd-status-card, etc.) flat
     white in light mode instead of the same gradient the page body uses. */
  --bs-body-bg: var(--bg-page-gradient);
}
/* [data-bs-theme="dark"] used to redeclare its own copies of every one of
   these tokens here too — dropped for the same reason as the light block
   above: the compiled bundle's [data-bs-theme="dark"] rule (_bootswatch.scss,
   fed by claude/_variables-dark.scss) already sets all of them from the same
   $primary/$secondary source of truth, and loads before this file. The one
   real bug that duplication caused: --bs-border-color had drifted to
   rgba(255,255,255,.049) here vs the bundle's rgba(255,255,255,.08) —
   silently thinner dark-mode borders than the design system intends. */

html, body {
  font-family: var(--bs-font-sans-serif);
  -webkit-font-smoothing: antialiased;
}
html {
  /* Some pages are taller than the viewport (a scrollbar appears) and some
     aren't (no scrollbar) — without this, navigating between them shifted the
     whole page left/right by the scrollbar's width. overflow-y:scroll is the
     universal-support fallback; scrollbar-gutter reserves the same space
     without forcing the bar to always be visibly drawn on browsers that
     support it.

     overflow-x:hidden (horizontal-scroll guard) lives here too, not on body
     — html already has a non-"visible" overflow-y above, which disables the
     browser's usual body->viewport overflow propagation. With overflow-x
     set on body instead, body becomes its own scrolling/clipping container
     distinct from the real viewport, and every position:sticky element
     inside it (e.g. .cd-sidebar) stops sticking to the viewport at all. */
  overflow-y: scroll;
  overflow-x: hidden;
  scrollbar-gutter: stable;
}
body {
  background: var(--bg-page-gradient);
  min-height: 100vh;
  margin: 0;
  color: var(--bs-body-color);
  /* Explicitly undoes coursesite/src/assets/scss/theme.scss's own
     `body{overflow-x:hidden}` — that compiled bundle is shared onto every
     page here too (see dashboard_css_urls() in includes/layout.php,
     loaded in <head> before this file), and its rule would otherwise
     re-introduce exactly the sticky-breaking bug the html{} rule above
     fixed, since it targets body directly rather than html. Harmless to
     leave as-is in the Vue SPA itself (it has no html{} override, so the
     browser auto-propagates that rule to the viewport there) — this
     override only matters here, where html already has one.

     `clip`, not `visible`: course-detail.php's/home.php's scroll-triggered
     entrance animations (.course-scroll-animate + animate__fadeInLeft /
     animate__fadeInRight) translateX() elements in from off-screen. With
     `visible`, that transform's overflow bubbles past body — which isn't a
     scroll container — up to a mobile browser's pannable layout viewport
     while the animation runs, dragging position:fixed content (the
     "Start Learning" cd-fixed-cta bar) sideways with it even though html
     has overflow-x:hidden. `clip` still isn't a scroll container (so
     position:sticky descendants keep tracking the real viewport, same as
     `visible`), but it does clip that transform overflow right at body's
     edge instead of letting it bubble up and become pannable. */
  overflow-x: clip;
}
.card {
  background: var(--bg-card-gradient);
  border-color: var(--bs-border-color);
  border-radius: var(--r-2xl);
  box-shadow: var(--shadow-card);
}
main {
  /* No position/z-index here on purpose — giving main its own stacking
     context used to trap everything painted inside it (including
     position:fixed descendants like .cd-fixed-cta, whose z-index is only
     compared *within* that context) at a single z-index:1 slot when
     compared against unpositioned siblings like <footer>, so any fixed
     overlay inside main silently rendered above the footer instead of
     respecting its own much higher z-index. Letting main stay unpositioned
     lets its descendants compete on z-index directly in the root stacking
     context, same as .site-header and footer. */
  min-height: 400px;
}

/* ---------------------------------------------------------------
   SITE HEADER (logged-out variant)
--------------------------------------------------------------- */
.site-header {
  /* z-index matches Bootstrap's own .fixed-top convention (1030) so the
     header reliably wins over any in-page positioned content, including
     .cd-fixed-cta (z-index:1020, just below this) on short viewports where
     the sticky header and the fixed bottom CTA could otherwise overlap.
     Must stay below Bootstrap's own .modal-backdrop (1040) and .modal
     (1060, per the pinned 5.0.2 build) — this was previously set to 1090,
     which put the header above both, so it visually sat on top of any open
     modal and intercepted clicks wherever the two overlapped. */
  position: sticky; top: 0; z-index: 1030;
  background: var(--bs-body-bg);
  border-bottom: 1px solid var(--bs-border-color);
  box-shadow: 0 1px 0 rgba(0,0,0,.02), 0 8px 24px -16px rgba(0,0,0,.12);
  margin-bottom: 15px;
}
.flex-break{
  flex-basis: 100%;
  height: 0;
}
/* Front page's hero carousel butts straight up against the header, so the
   header's usual 15px gap (needed everywhere else to separate it from page
   content) would just show as dead space above the carousel. */
.page-home .site-header { margin-bottom: 0; }
[data-bs-theme="dark"] .site-header {
  background: rgba(20,20,20,.88);
  backdrop-filter: saturate(120%) blur(10px);
}
.site-header__inner {
  display: flex; align-items: center; gap: 16px;
  min-height: 64px; padding-block: 8px;
}
.site-header__brand {
  display: inline-flex; align-items: center; gap: 10px;
  text-decoration: none; color: inherit;
  font-weight: 800; letter-spacing: -.4px; font-size: 18px;
}
.site-header__brand img {
  height: 40px;
  width: auto;
  transition: height var(--dur-base) var(--ease-snap);
}
.brand-text {
  font-weight: 800;
  font-size: 1.25rem;
  letter-spacing: -0.03em;
  line-height: 1;
  color: var(--bs-emphasis-color) !important;
  -webkit-font-smoothing: antialiased;
  transition: font-size var(--dur-base) var(--ease-snap);
}
.site-header__sep {

  color: var(--bs-secondary-color);
    font-size: 0.5rem;
    letter-spacing: 1px;
    margin-top: 5px;
    transition: font-size var(--dur-base) var(--ease-snap);
}
/* Homepage only (body.page-home — pages/home.php): logo/wordmark/slogan are
   enlarged at the top of the page; site.js toggles .site-header--scrolled
   the moment window.scrollY leaves 0, shrinking them back to the normal
   sizes above (and back to enlarged on scrolling back to the very top).
   height, not transform:scale() on the img — this row shares space with
   .brand-text, and a transform-scaled img wouldn't push the flex row
   taller, it'd just visually overlap the wordmark next to it. */
body.page-home .site-header__brand img { height: 100px; }
body.page-home .site-header--scrolled .site-header__brand img { height: 40px; }
body.page-home .brand-text { font-size: 2.275rem; } /* 3.25rem, then -30% to feel less oversized */
body.page-home .site-header--scrolled .brand-text { font-size: 1.25rem; }
body.page-home .site-header__sep { font-size: 1rem; }
body.page-home .site-header--scrolled .site-header__sep { font-size: 0.5rem; }
/* The full enlarged state still crowds the header's CTA button on narrow
   screens — scale it down further here instead of dropping it, so mobile
   still gets a bigger-on-load moment, just a smaller one. The scrolled
   rules above still win (higher specificity) so the settled size is
   unaffected on any screen size. */
@media (max-width: 575.98px) {
  body.page-home .site-header__brand img { height: 64px; }
  body.page-home .brand-text { font-size: 1.6rem; }
}
/* Wordmark split: "Canadian" in brand navy (light mode only — dark mode
   keeps the emphasis-color default above until dark gets its own pass),
   "Drivers" in brand red in both modes. */
[data-bs-theme="light"] .brand-text {
  color: var(--bs-secondary) !important;
}
.brand-text__accent {
  color: var(--bs-primary);
}
span.slogan-line {
    background: url(/assets/img/line.png);
    width: 15px;
    display: inline-grid;
    height: 2px;
}span.slogan-line.line-after {
    transform: rotate(180deg);
    margin-top: -8px;

}
.site-header__nav-link {
  color: var(--bs-secondary-color);
  font-weight: 500;
  font-size: 14px;
  text-decoration: none;
}
.site-header__nav-link:hover,
.site-header__nav-link:focus-visible {
  color: var(--bs-primary);
}
[data-bs-theme="dark"] .site-header__nav-link:hover,
[data-bs-theme="dark"] .site-header__nav-link:focus-visible {
  color: #fff;
}
.site-header__icon-btn {
  width: 36px; height: 36px; border-radius: var(--r-pill);
  border: none; background: transparent; color: var(--bs-secondary-color);
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer; transition: background var(--dur-fast) var(--ease-snap);
}
.site-header__icon-btn:hover { background: rgba(var(--bs-emphasis-color-rgb), .06); color: var(--bs-body-color); }
/* Account/nav menu trigger reuses .site-header__icon-btn's icon-button look
   — this just drops Bootstrap's default dropdown-toggle caret so it stays a
   plain icon button, and sizes the icon glyph itself (the icon-btn rule
   above only sizes the button's hit target, not the glyph inside it). */
.site-header__menu .dropdown-toggle::after { display: none; }
.site-header__menu .site-header__icon-btn { font-size: 20px; }
/* Bootstrap's own .dropdown-menu border/shadow (--bs-box-shadow is a barely-
   there 0 1px 2px rgba(0,0,0,.05), border a light #dee2e6) reads fine on a
   busy page but nearly disappears against this site's own near-white header
   — enough to look "transparent" even though it's a solid var(--bs-body-bg)
   fill. Give it real elevation instead of relying on Bootstrap's default. */
.site-header__menu .dropdown-menu {
  font-size: 14px; min-width: 13rem;
  border: 1px solid var(--bs-border-color);
  box-shadow: var(--shadow-hover, 0 1rem 2rem rgba(0, 0, 0, .12));
  background: var(--bs-body-bg);
}
.site-header__menu .dropdown-item i { width: 1.1em; text-align: center; }
/* Bootstrap's stock dropdown-item hover (solid brand-red fill, white text)
   reads fine in light mode but felt like too much red covering the whole
   item in dark mode — swapped there for a quieter white-on-subtle-tint
   hover, matching .site-header__nav-link's dark-mode hover treatment. */
[data-bs-theme="dark"] .site-header__menu .dropdown-item:hover,
[data-bs-theme="dark"] .site-header__menu .dropdown-item:focus {
  color: #fff;
  background-color: rgba(var(--bs-emphasis-color-rgb), .1);
}
.site-header__menu-close-row { display: none; }

/* Below md: the menu becomes a full-viewport takeover instead of a small
   anchored dropdown — same idea as the Vue dashboard SPA's own account menu,
   rebuilt here with its own class name (see the "Named .site-header__menu"
   comment in nav.php) so this page's CSS/JS isn't silently borrowing a
   component it doesn't actually implement. !important overrides Popper's
   inline transform/positioning (Bootstrap only skips Popper for dropdowns
   inside .navbar-nav; this isn't one, so it still applies one here). */
@media (max-width: 767.98px) {
  .site-header__menu .dropdown-menu {
    position: fixed !important;
    inset: 0 !important;
    transform: none !important;
    width: 100vw; max-width: 100vw;
    height: 100dvh; max-height: none;
    margin: 0; border: none; border-radius: 0; box-shadow: none;
    z-index: 2000;
    display: none;
    flex-direction: column;
    padding: 0 0 env(safe-area-inset-bottom);
    overflow-y: auto;
    background-color: var(--bs-body-bg);
  }
  .site-header__menu .dropdown-menu.show { display: flex; }
  .site-header__menu .dropdown-item { padding: .85rem 1.25rem; font-size: 16px; }
  .site-header__menu .dropdown-divider { margin: .5rem 1.25rem; width: auto; }

  .site-header__menu-close-row {
    display: flex;
    justify-content: flex-end;
    padding: 14px 14px 4px;
  }
}

.site-header__menu-close {
  width: 40px; height: 40px; border-radius: var(--r-pill);
  border: none; background: rgba(var(--bs-emphasis-color-rgb), .06);
  display: inline-flex; align-items: center; justify-content: center;
  cursor: pointer; position: relative;
  transition: background var(--dur-fast) var(--ease-snap), transform var(--dur-base) var(--ease-out);
  /* Plays every time the menu opens — display:none -> flex on the parent
     .dropdown-menu (toggled above) unrenders and re-renders this button, so
     the animation genuinely restarts each time, no JS reflow trick needed
     (unlike the hero carousel's re-triggered title animation, which never
     leaves display). */
  animation: siteHeaderMenuCloseIn .32s var(--ease-out) both;
}
.site-header__menu-close:hover { background: rgba(var(--bs-emphasis-color-rgb), .12); transform: rotate(90deg); }
.site-header__menu-close-bar {
  position: absolute; width: 18px; height: 2px; border-radius: 2px;
  background: var(--bs-emphasis-color);
}
.site-header__menu-close-bar:first-child { transform: rotate(45deg); }
.site-header__menu-close-bar:last-child { transform: rotate(-45deg); }
@keyframes siteHeaderMenuCloseIn {
  from { opacity: 0; transform: scale(.6) rotate(-45deg); }
  to   { opacity: 1; transform: scale(1) rotate(0deg); }
}
@media (prefers-reduced-motion: reduce) {
  .site-header__menu-close { animation: none; }
  .site-header__menu-close:hover { transform: none; }
}

.hero-slide{
padding-top: 10px !important;
}
/* ---------------------------------------------------------------
   PRIMARY HERO — Lottie animation (home page, node--1782.tpl.php)
--------------------------------------------------------------- */
.on-board { padding: 0 60px 40px; }
@media (max-width: 991.98px) { .on-board { padding: 20px 16px 24px; } }

/* Mobile (base): header -> image -> description -> CTA, stacked.
   Desktop (>=992px, matching the old col-lg-7 split point): image on the
   left spanning all three text rows, copy stacked on the right in its
   original order. */
.hero-grid {
  display: grid;
  grid-template-columns: 1fr;
  grid-template-areas:
    "header"
    "image"
    "desc"
    "cta";
  row-gap: 24px;
  align-items: center;
}
.hero-header { grid-area: header; }
.hero-image  { grid-area: image; }
.hero-desc   { grid-area: desc; }
.hero-cta    { grid-area: cta; }

/* The Lottie/bodymovin player (#bm) has no intrinsic size of its own — it
   renders an SVG that fills whatever box this container is. Left
   unconstrained it was rendering very tall, pushing the "Courses" CTA button
   below the fold on mobile (where header -> image -> desc -> cta stack
   vertically). Capped short enough that the CTA clears the fold on a typical
   phone viewport; desktop gets more room since the animation sits beside the
   copy there, not above the CTA. */
.hero-image {
  width: 100%;
  max-height: 220px;
  display: flex;
  justify-content: center;
}
.hero-image #bm {
  width: 100%;
  max-width: 320px;
  height: 220px;
}

@media (min-width: 992px) {
  .hero-grid {
    grid-template-columns: 5fr 7fr;
    column-gap: 40px;
    row-gap: 20px;
    grid-template-areas:
      "image header"
      "image desc"
      "image cta";
  }
  .hero-image { max-height: 360px; }
  .hero-image #bm { max-width: 100%; height: 360px; }
}

.badge-soft {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  padding: .45rem .9rem;
  border-radius: var(--r-pill);
  background: var(--tint-primary-soft);
  border: 1px solid rgba(var(--bs-primary-rgb), .22);
  color: var(--bs-emphasis-color);
  font-size: 13px;
  font-weight: 500;
  line-height: 1;
}
.badge-soft .text-warning { color: var(--bs-warning) !important; font-size: 14px; }

.lottie-hero h1 {
  font-weight: 800;
  letter-spacing: -1px;
  line-height: 1.1;
  color: var(--bs-emphasis-color);
}
.lottie-hero h1 .text-primary {
  background: linear-gradient(135deg, var(--bs-primary), var(--cl-primary-soft));
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent; color: transparent !important;
}
.lottie-hero .muted { color: var(--bs-secondary-color); }
.lottie-hero .feature-checks { color: var(--bs-secondary-color); }
.lottie-hero .feature-checks > span { display: inline-flex; align-items: center; gap: 4px; }
.on-board .btn-outline-secondary {
  color: var(--bs-emphasis-color) !important;
  border-color: rgba(var(--bs-emphasis-color-rgb), .28) !important;
}
.on-board .btn-outline-secondary:hover {
  background: rgba(var(--bs-emphasis-color-rgb), .06);
}

/* ---------------------------------------------------------------
   SECONDARY INTRO
--------------------------------------------------------------- */
.secondary-intro {
  position: relative;
  padding: 64px 0 72px;
  border-top: 1px solid var(--bs-border-color);
  overflow: hidden;
}
.secondary-intro::before {
  content: ""; position: absolute; inset: -40% -10% auto auto;
  width: 600px; height: 600px;
  background: radial-gradient(circle at center, rgba(var(--bs-primary-rgb), .12) 0%, transparent 60%);
  filter: blur(20px); pointer-events: none;
}
.secondary-intro__eyebrow {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 11px; font-weight: 700; letter-spacing: .08em;
  text-transform: uppercase; color: var(--bs-info);
  padding: 5px 12px; border-radius: var(--r-pill);
  background: var(--tint-info-soft);
  margin-bottom: 16px;
}
.secondary-intro h2 {
  font-size: clamp(32px, 4.5vw, 44px);
  font-weight: 800; letter-spacing: -.8px; line-height: 1.1;
  color: var(--bs-emphasis-color); margin-bottom: 14px;
}
.secondary-intro h2 .accent {
  background: linear-gradient(135deg, var(--bs-primary), var(--cl-primary-soft));
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent; color: transparent;
}
.secondary-intro p {
  font-size: 1.05rem; line-height: 1.55; color: var(--bs-secondary-color);
  max-width: 540px; margin-bottom: 22px;
}
.secondary-intro__ctas { display: flex; gap: 12px; flex-wrap: wrap; }
.secondary-intro__ctas .btn { font-weight: 600; padding: .6rem 1.2rem; border-radius: var(--r-lg); font-size: 15px; }
.secondary-intro__art {
  position: relative;
  border-radius: var(--r-2xl);
  background: linear-gradient(135deg, rgba(236,41,30,.18) 0%, rgba(255,111,97,.08) 60%, rgba(244,189,97,.10) 100%);
  border: 1px solid var(--bs-border-color);
  padding: 20px;
  box-shadow: var(--shadow-card);
  overflow: hidden;
}
.secondary-intro__art img { width: 100%; height: auto; display: block; border-radius: var(--r-lg); }
.secondary-intro__art-floats { position: absolute; inset: 0; pointer-events: none; }
.secondary-intro__chip-float {
  position: absolute;
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px; border-radius: var(--r-pill);
  background: var(--bs-body-bg); color: var(--bs-body-color);
  border: 1px solid var(--bs-border-color);
  box-shadow: 0 10px 24px rgba(0,0,0,.18);
  font-weight: 700; font-size: 12px;
  animation: si-float 3.6s ease-in-out infinite;
}
.secondary-intro__chip-float .v { color: var(--bs-emphasis-color); }
.secondary-intro__chip-float.f1 { top: 18px; left: 10px; color: var(--bs-warning); animation-delay: .2s; }
.secondary-intro__chip-float.f2 { top: 50%; right: 12px; color: var(--bs-info); animation-delay: .8s; }
.secondary-intro__chip-float.f3 { bottom: 14px; left: 20px; color: var(--bs-success); animation-delay: 1.4s; }
@keyframes si-float {
  0%,100% { transform: translateY(0); }
  50%     { transform: translateY(-6px); }
}

/* ---------------------------------------------------------------
   VALUE PROPS — 4 benefit cards, replaces the old raw-numbers trust strip
--------------------------------------------------------------- */
.value-props { padding: 56px 0; }
.value-prop-card {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 6px;
  height: 100%;
  padding: 22px;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--r-2xl);
  background: var(--bg-card-gradient);
  box-shadow: var(--shadow-card);
  transition: transform var(--dur-base) var(--ease-snap),
              box-shadow var(--dur-base) var(--ease-snap),
              border-color var(--dur-base) var(--ease-snap);
}
.value-prop-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-hover);
  border-color: rgba(var(--bs-primary-rgb), .22);
}
.value-prop-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 2.75rem; height: 2.75rem;
  border-radius: 50%;
  font-size: 1.2rem;
  margin-bottom: 6px;
}
.value-prop-icon--primary { color: var(--bs-primary); background: var(--tint-primary-soft); }
.value-prop-icon--info    { color: var(--bs-info);    background: var(--tint-info-soft); }
.value-prop-icon--warning { color: var(--bs-warning); background: var(--tint-warning-soft); }
.value-prop-icon--success { color: var(--bs-success); background: var(--tint-success-soft); }
.value-prop-card h3 { font-size: 16px; font-weight: 700; color: var(--bs-emphasis-color); margin-bottom: 2px; }
.value-prop-card p  { font-size: 13.5px; line-height: 1.5; color: var(--bs-secondary-color); margin-bottom: 0; }

/* ---------------------------------------------------------------
   SECTION HEADINGS
--------------------------------------------------------------- */
.section { padding: 80px 0; }
.section-head { margin-bottom: 36px; }
.section-eyebrow {
  font-size: 11px; font-weight: 700; color: var(--bs-info);
  letter-spacing: .12em; text-transform: uppercase; margin-bottom: 10px;
}
.section-head h2 {
  font-size: 36px; font-weight: 800; letter-spacing: -.6px; line-height: 1.15;
  color: var(--bs-emphasis-color);
}
.section-head p {
  color: var(--bs-secondary-color); margin-top: 8px; font-size: 16px; line-height: 1.55;
  max-width: 600px;
}

/* ---------------------------------------------------------------
   HOW IT WORKS — 3 onboarding cards
--------------------------------------------------------------- */
.howcard {
  display: block; text-decoration: none; color: inherit;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--r-2xl);
  padding: 28px;
  background: var(--bg-card-gradient);
  box-shadow: var(--shadow-card);
  height: 100%;
  position: relative; overflow: hidden;
  transition: transform var(--dur-base) var(--ease-snap),
              box-shadow var(--dur-base) var(--ease-snap),
              border-color var(--dur-base) var(--ease-snap);
}
.howcard:hover {
  transform: translateY(-6px) scale(1.015);
  box-shadow: var(--shadow-hover);
  border-color: rgba(var(--bs-primary-rgb), .22);
}
.howcard__num {
  position: absolute; top: 18px; right: 22px;
  font-size: 60px; font-weight: 800; line-height: 1;
  color: rgba(var(--bs-emphasis-color-rgb), .04);
}
.howcard__icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 56px; height: 56px; border-radius: 16px;
  font-size: 22px; line-height: 1; margin-bottom: 16px;
}
.howcard--learn     .howcard__icon { background: var(--tint-info-soft);    color: var(--bs-info); }
.howcard--quiz      .howcard__icon { background: rgba(var(--bs-primary-rgb), .14); color: var(--bs-primary); }
[data-bs-theme="dark"] .howcard--quiz .howcard__icon { color: var(--cl-blue-soft); }
.howcard--pass       .howcard__icon { background: var(--tint-warning-soft); color: var(--bs-warning); }
.howcard h3 {
  font-size: 22px; font-weight: 800; letter-spacing: -.2px; color: var(--bs-emphasis-color);
  margin-bottom: 10px;
}
.howcard p { color: var(--bs-secondary-color); font-size: 15px; line-height: 1.55; margin-bottom: 0; }
.howcard__metas {
  display: flex; flex-wrap: wrap; gap: 6px; margin-top: 16px;
  padding-top: 16px; border-top: 1px dashed var(--bs-border-color);
}
.howcard__metas .pill {
  font-size: 11px; font-weight: 600; padding: 4px 10px; border-radius: var(--r-pill);
  background: rgba(var(--bs-emphasis-color-rgb), .04); color: var(--bs-secondary-color);
}

/* ---------------------------------------------------------------
   COURSE CARD (node--course--teaser.tpl.php) — the actual template used
   by the "list_all_courses" View (row_plugin=node, view_mode=teaser).
   NOTE: override.css also has a separate, differently-named
   ".view-list-all-courses" block that turned out to be dead/unused CSS —
   the real per-card output goes through this node teaser template
   instead, confirmed via the Views config in the quizbuilder DB.
--------------------------------------------------------------- */
.course-card {
  transition: transform .22s ease, box-shadow .22s ease;
  background: var(--bg-card-gradient);
  box-shadow: var(--shadow-card);
  border-radius: var(--r-2xl) !important;
}
.course-card:hover {
  transform: translateY(-5px);
  box-shadow: var(--shadow-hover);
}
.course-card__hero {
  height: 188px;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  flex-shrink: 0;
}
.course-card__hero-overlay {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(0,0,0,.14) 0%, rgba(0,0,0,.54) 100%);
  border-radius: 0;
  transition: opacity .2s ease;
}
.course-card:hover .course-card__hero-overlay { opacity: .75; }
.course-card__hero-badges {
  position: absolute;
  top: .7rem; left: .75rem; right: .75rem;
  display: flex;
  align-items: flex-start;
  gap: .45rem;
}
.course-card__title {
  font-size: .9rem;
  font-weight: 700;
  line-height: 1.35;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  color: var(--bs-body-color);
}
.course-card__title a { color: inherit; }
.course-card__title a:hover { color: var(--bs-primary); }
.course-card__teaser {
  font-size: .8rem;
  line-height: 1.5;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.cstat-pill {
  display: inline-flex;
  align-items: center;
  gap: .25rem;
  font-size: .72rem;
  font-weight: 500;
  padding: .22rem .5rem;
  border-radius: var(--r-pill);
  background: var(--bs-tertiary-bg, rgba(0,0,0,.04));
  border: 1px solid var(--bs-border-color);
  white-space: nowrap;
  color: var(--bs-body-color);
}
.cstat-pill i { font-size: .66rem; }
[data-bs-theme="dark"] .cstat-pill {
  background: rgba(255,255,255,.06);
  border-color: rgba(255,255,255,.1);
}
.course-topic-pill { font-size: .67rem !important; }
.course-topic-overflow {
  font-size: .67rem !important;
  background: var(--bs-tertiary-bg, rgba(0,0,0,.04)) !important;
  border: 1px solid var(--bs-border-color);
  color: var(--bs-secondary-color) !important;
}
[data-bs-theme="dark"] .course-topic-overflow {
  background: rgba(255,255,255,.06) !important;
  border-color: rgba(255,255,255,.1);
}
.course-card__meta { font-size: .77rem; }
.course-card__cta { position: relative; z-index: 2; }

/* ---------------------------------------------------------------
   REVIEWS
--------------------------------------------------------------- */
.review-card {
  height: 100%;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--r-2xl);
  padding: 26px;
  background: var(--bg-card-gradient);
  box-shadow: var(--shadow-card);
  transition: transform var(--dur-base) var(--ease-snap),
              box-shadow var(--dur-base) var(--ease-snap),
              border-color var(--dur-base) var(--ease-snap);
}
.review-card:hover {
  transform: translateY(-6px) scale(1.015);
  box-shadow: var(--shadow-hover);
  border-color: rgba(var(--bs-primary-rgb), .22);
}
.review-card__stars { color: var(--bs-warning); font-size: 14px; margin-bottom: 14px; }
.review-card__quote {
  color: var(--bs-secondary-color); font-size: 15px; line-height: 1.6;
  margin-bottom: 20px;
}
.review-card__author { display: flex; align-items: center; gap: 12px; }
.review-card__avatar {
  display: inline-flex; align-items: center; justify-content: center;
  width: 42px; height: 42px; border-radius: 50%;
  font-size: 14px; font-weight: 800; flex-shrink: 0;
}
.review-card__name { font-weight: 700; color: var(--bs-emphasis-color); font-size: 14px; }
.review-card__meta { color: var(--bs-secondary-color); font-size: 12.5px; }

.reviews-carousel { position: relative; padding: 4px 56px 8px; }
.reviews-carousel .carousel-control-prev,
.reviews-carousel .carousel-control-next {
  position: absolute; top: 50%; bottom: auto; transform: translateY(-50%);
  width: 40px; height: 40px; border-radius: 50%;
  background: var(--bs-primary); opacity: 1;
  box-shadow: var(--shadow-card);
}
.reviews-carousel .carousel-control-prev { left: 0; }
.reviews-carousel .carousel-control-next { right: 0; }
.reviews-carousel .carousel-control-prev-icon,
.reviews-carousel .carousel-control-next-icon { width: 14px; height: 14px; }
.reviews-carousel .carousel-indicators { position: static; margin-top: 32px; }
.reviews-carousel .carousel-indicators [data-bs-target] {
  width: 8px; height: 8px; border-radius: 50%;
  background-color: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), .25);
  opacity: 1; border: 0; margin: 0 4px;
}
.reviews-carousel .carousel-indicators .active { background-color: var(--bs-primary); }
@media (max-width: 575.98px) {
  .reviews-carousel { padding-left: 44px; padding-right: 44px; }
  .reviews-carousel .carousel-control-prev,
  .reviews-carousel .carousel-control-next { width: 32px; height: 32px; }
}

/* ---------------------------------------------------------------
   FINAL CTA
--------------------------------------------------------------- */
.final-cta {
  border-radius: var(--r-2xl); padding: 56px 40px;
  background: linear-gradient(135deg,
              rgba(var(--bs-primary-rgb), .18) 0%,
              rgba(var(--bs-secondary-rgb), .1) 50%,
              rgba(var(--bs-warning-rgb), .14) 100%);
  border: 1px solid var(--bs-border-color);
  position: relative; overflow: hidden;
  text-align: center;
}
.final-cta h2 {
  font-size: clamp(28px, 4vw, 44px); font-weight: 800; letter-spacing: -.6px;
  color: var(--bs-emphasis-color); margin-bottom: 12px;
}
.final-cta p { color: var(--bs-secondary-color); font-size: 17px; max-width: 540px; margin: 0 auto 24px; }

/* ---------------------------------------------------------------
   SCROLL ANIMATIONS (mirrors coursesite's scrollAnimations.js)
--------------------------------------------------------------- */
.tile-animate-ease { transition-timing-function: cubic-bezier(.22, .68, 0, 1.2); }
.course-scroll-animate:not(.is-visible) { opacity: 0; }
.course-scroll-animate.is-visible { opacity: 1; }


/* ═══════════════════════════════════════════════════════════════════════
   Below: course-detail-page hero (.cd-hero, .cbadge) ported verbatim from
   the same stylesheet, for the course detail/preview pages built earlier.
   Not yet reconciled with the .view-list-all-courses card styles above —
   course listing/detail pages are next in line for a real-markup pass.
   ═══════════════════════════════════════════════════════════════════════ */
.cd-hero {
  min-height: 420px;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  display: flex;
  align-items: flex-end;
  position: relative;
  margin-top:-20px;
}
@media (max-width: 767px) {
  .cd-hero { min-height: 300px; }
}
.cd-hero__overlay {
  position: absolute; inset: 0;
  background: linear-gradient(
    160deg,
    rgba(0,0,0,.30) 0%,
    rgba(0,0,0,.72) 60%,
    rgba(0,0,0,.88) 100%
  );
}
.cd-hero__content {
  padding-top: 3rem;
  padding-bottom: 2.5rem;
  width: 100%;
  z-index:1;
}
.cd-breadcrumb { --bs-breadcrumb-divider-color: rgba(255,255,255,.4); font-size: .8rem; }
.cd-hero__title {
  font-size: clamp(1.6rem, 4vw, 2.6rem);
  font-weight: 800;
  color: #fff;
  line-height: 1.2;
  text-shadow: 0 2px 12px rgba(0,0,0,.4);
  margin-bottom: .75rem;
}
.cd-hero__teaser {
  color: rgba(255,255,255,.82);
  font-size: 1.05rem;
  max-width: 640px;
  margin-bottom: 1rem;
}
.cd-hero__tag {
  border: 1px solid rgba(255,255,255,.3);
  background: rgba(255,255,255,.12) !important;
  font-size: .72rem;
  font-weight: 500;
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
}
.cd-stats-strip { margin-top: 1.25rem; flex-wrap: wrap; }
.cd-stat {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    color: rgba(255, 255, 255, .88);
    font-size: .85rem;
    margin-right: 5px;
    font-weight: 500;
    background: var(--bs-body-bg);
    color: var(--bs-body-color);
    padding: 5px 12px;
    border-radius: 12px;
    margin-bottom: 5px;
}
.cd-stat i { font-size: .78rem; opacity: .8; }
.cd-stat--rating { gap: .2rem; }
.cd-stat--rating .fa-star { font-size: .7rem; }
.cd-stat__muted { opacity: .65; }
.cbadge {
  display: inline-flex; align-items: center; gap: .3rem;
  font-size: .68rem; font-weight: 700; line-height: 1;
  padding: .28rem .55rem; border-radius: var(--r-pill);
  letter-spacing: .01em;
  backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
  text-transform: uppercase;
}
.cbadge--free     { background: rgba(47, 179, 128, .88); color: #fff; }
.cbadge--standard { background: rgba(40, 123, 181, .88); color: #fff; }
.cbadge--premium  {
  background: linear-gradient(135deg, rgba(196,130,10,.92), rgba(224,165,25,.92));
  color: #fff;
}
.cbadge--cat {
  background: rgba(236, 41, 30, .84);
  color: #fff;
  margin-left: auto;
  text-transform: none;
  font-weight: 600;
}

/* ── Placeholder utility classes used by course-detail.php / course-preview.php
   / courses.php as originally built — kept for now, to be replaced when those
   pages get their real-markup pass. ── */
.card .card-img-top,
.card .img-bg {
  border-top-left-radius: 20px;
  border-top-right-radius: 20px;
}
.card .title-trimmed {
  display: inline-block;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  width: 100%;
}
.card .card-details {
  max-height: 120px;
  min-height: 120px;
  overflow: hidden;
  margin-bottom: 20px;
  font-size: 12px;
}
.box-shadow-light {
  box-shadow: 0 6px 6px 0 rgba(0, 0, 0, 0.03);
}

/* ═══════════════════════════════════════════════════════════════════════
   LOGIN PAGE — ported verbatim from
   www/sites/all/themes/business/css/onboarding.css (.lp-* rules) and the
   field customizations from userdashboard_form_alter() (icon-input-wrapper).
   .page-login on <body> replaces Drupal's automatic body.page-user-login
   class, since www2 doesn't have Drupal's page-class system.
   ═══════════════════════════════════════════════════════════════════════ */
body.page-login {
  background: radial-gradient(ellipse 60% 50% at 25% 15%, rgba(var(--bs-primary-rgb), 0.09) 0%, transparent 100%), radial-gradient(ellipse 55% 45% at 80% 85%, rgba(var(--bs-primary-rgb), 0.06) 0%, transparent 100%), var(--bg-page-gradient);
      margin: -25px 0;
}
body.page-login .site-header {
  display: none !important;
}
body.page-login main {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 2.5rem 1rem 4rem;
  min-height: calc(100dvh - 66px);
}

#block-system-main .lp-header,
#block-system-main .lp-form-card,
#block-system-main .lp-oauth,
body.page-login .lp-header,
body.page-login .lp-form-card,
body.page-login .lp-oauth {
  width: 100%;
  max-width: 460px;
  box-sizing: border-box;
}

.lp-header {
  text-align: center;
  margin-bottom: 1.75rem;
}
.lp-back {
  display: inline-flex;
  align-items: center;
  gap: 0.35rem;
  font-size: 0.8rem;
  font-weight: 500;
  color: var(--bs-secondary-color, rgba(0, 0, 0, 0.48));
  text-decoration: none;
  padding: 0.28rem 0.55rem;
  border-radius: 0.5rem;
  transition: color 0.18s ease, background 0.18s ease;
  margin-bottom: 0.9rem;
}
.lp-back i { font-size: 0.75rem; }
.lp-back:hover {
  color: var(--bs-emphasis-color, #111);
  background: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);
}
[data-bs-theme=dark] .lp-back { color: rgba(255, 255, 255, 0.45); }
[data-bs-theme=dark] .lp-back:hover {
  color: rgba(255, 255, 255, 0.85);
  background: rgba(255, 255, 255, 0.06);
}

.lp-header__logo {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 54px;
  height: 54px;
  border-radius: 16px;
  background: linear-gradient(135deg, var(--bs-primary, #ec291e) 0%, var(--cl-primary-soft, #ff6f61) 100%);
  box-shadow: 0 6px 22px rgba(var(--bs-primary-rgb, 236, 41, 30), 0.4);
  font-size: 1.45rem;
  color: #fff;
  margin-bottom: 0.9rem;
}
.lp-header__title {
  font-size: 1.75rem;
  font-weight: 800;
  letter-spacing: -0.5px;
  color: var(--bs-emphasis-color, #111);
  margin: 0 0 0.35rem;
  line-height: 1.15;
}
.lp-header__sub {
  font-size: 0.9rem;
  color: var(--bs-secondary-color, rgba(0, 0, 0, 0.55));
  margin: 0;
  line-height: 1.5;
}

.lp-form-card {
  background: var(--bg-card-gradient, #fff);
  border: 1px solid var(--bs-border-color, rgba(0, 0, 0, 0.12));
  border-radius: 1.4rem 1.4rem 0 0;
  box-shadow: 0 16px 48px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.05);
  padding: 1.75rem 2rem 2rem;
  border-bottom: none;
  padding-bottom: 1.6rem;
}
/* Forgot/reset-password use the same card with no .lp-oauth half below it
   (see pages/forgot-password.php, pages/reset-password.php) — needs its own
   bottom border and full corner radius instead of the flush top-half look. */
.lp-form-card--standalone {
  border-radius: 1.4rem;
  border-bottom: 1px solid var(--bs-border-color, rgba(0, 0, 0, 0.12));
  padding-bottom: 2rem;
}
.lp-form-card .icon-input-wrapper { position: relative; margin-bottom: 1.1rem; }
.lp-form-card .icon-input-wrapper .form-control { padding-left: 2.75rem; }
.lp-form-card .icon-input-wrapper .icon-label {
  position: absolute;
  left: 0.88rem;
  bottom: 1rem;
  font-size: 0.82rem;
  color: var(--bs-secondary-color, rgba(0, 0, 0, 0.38));
  pointer-events: none;
  line-height: 1;
  transition: color 0.18s ease, transform 0.18s ease;
}
.lp-form-card .icon-input-wrapper .form-control:focus ~ .icon-container .icon-label,
.lp-form-card .icon-input-wrapper .form-control:focus ~ .icon-label {
  color: var(--bs-primary, #ec291e);
  transform: scale(1.1);
}
.lp-form-card .icon-input-wrapper .form-control:not(:placeholder-shown) ~ .icon-container .icon-label,
.lp-form-card .icon-input-wrapper .form-control:not(:placeholder-shown) ~ .icon-label {
  color: var(--bs-primary, #ec291e);
}
.lp-form-card .control-label {
  display: block;
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--bs-secondary-color, rgba(0, 0, 0, 0.5));
  margin-bottom: 0.42rem;
}
.lp-form-card .form-control {
  display: block;
  width: 100%;
  padding: 0.78rem 1rem;
  border: 1.5px solid var(--bs-border-color, rgba(0, 0, 0, 0.14));
  border-radius: 0.75rem;
  background: var(--bs-body-bg, #fff);
  color: var(--bs-body-color, #111);
  font-size: 0.95rem;
  line-height: 1.5;
  appearance: none;
  -webkit-appearance: none;
  transition: border-color 0.18s ease, box-shadow 0.18s ease;
  outline: none;
  box-shadow: none;
}
.lp-form-card .form-control::placeholder {
  color: var(--bs-tertiary-color, rgba(0, 0, 0, 0.28));
  font-weight: 400;
}
.lp-form-card .form-control:focus {
  border-color: var(--bs-primary, #ec291e);
  box-shadow: 0 0 0 3.5px rgba(var(--bs-primary-rgb, 236, 41, 30), 0.14);
}
.lp-form-card .form-control:not(:placeholder-shown):not(:focus) {
  border-color: rgba(var(--bs-success-rgb, 47, 179, 128), 0.45);
}
.lp-form-card .lp-remember {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin-bottom: 1.1rem;
  padding-left: 0;
}
.lp-form-card .lp-remember .form-check-input {
  margin: 0;
}
.lp-form-card .lp-remember .form-check-label {
  font-size: 0.85rem;
  color: var(--bs-secondary-color, rgba(0, 0, 0, 0.6));
}
.lp-form-card .form-actions {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 0.85rem;
  margin-top: 1.5rem;
  border: none;
  padding: 0;
  background: transparent;
}
.lp-form-card .form-actions .btn-primary,
.lp-form-card .form-actions .form-submit {
  width: 100%;
  padding: 0.82rem 1rem;
  border: none;
  border-radius: 0.75rem;
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: 0.01em;
  background: var(--bs-primary, #ec291e);
  color: #fff;
  cursor: pointer;
  font-family: inherit;
  box-shadow: 0 6px 22px rgba(var(--bs-primary-rgb, 236, 41, 30), 0.38);
  transition: transform 0.18s ease, box-shadow 0.18s ease, background 0.18s ease;
}
.lp-form-card .form-actions .btn-primary:hover,
.lp-form-card .form-actions .form-submit:hover {
  background: #c11f16;
  transform: translateY(-2px);
  box-shadow: 0 10px 32px rgba(var(--bs-primary-rgb, 236, 41, 30), 0.48);
}
.lp-form-card .form-actions .btn-primary:active,
.lp-form-card .form-actions .form-submit:active {
  transform: translateY(0);
  box-shadow: 0 4px 12px rgba(var(--bs-primary-rgb, 236, 41, 30), 0.28);
}
.lp-form-card .form-actions a {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.4rem;
  font-size: 0.83rem;
  font-weight: 500;
  color: var(--bs-secondary-color, rgba(0, 0, 0, 0.52));
  text-decoration: none;
  padding: 0.35rem;
  border-radius: 0.5rem;
  transition: color 0.18s ease, background 0.18s ease;
}
/* A form-actions link styled as the primary button (forgot/reset-password's
   "Back to sign in" / "Sign in" / "Request a new link") — an <a>, so it
   needs its own display:block for the shared .form-submit width:100% to
   apply, and its own colors since it's not the muted secondary-link style
   the bare `a` rule above targets. */
.lp-form-card .form-actions a.form-submit {
  display: block;
  color: #fff;
}
.lp-form-card .form-actions a.form-submit:hover {
  color: #fff;
}
.lp-form-card .form-actions a i {
  color: var(--bs-primary, #ec291e);
  font-size: 0.78rem;
}
.lp-form-card .form-actions a:hover {
  color: var(--bs-primary, #ec291e);
  background: rgba(var(--bs-primary-rgb, 236, 41, 30), 0.06);
}

.lp-trust {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.45rem;
  margin-top: 1.1rem;
  padding-top: 1.1rem;
  border-top: 1px solid var(--bs-border-color, rgba(0, 0, 0, 0.08));
  font-size: 0.72rem;
  letter-spacing: 0.01em;
  color: var(--bs-secondary-color, rgba(0, 0, 0, 0.48));
  line-height: 1.45;
}
.lp-trust i {
  color: var(--bs-success, #2fb380);
  font-size: 0.8rem;
  margin-top: 0.12rem;
  flex-shrink: 0;
}

.lp-oauth {
  background: var(--bg-card-gradient, #fff);
  border: 1px solid var(--bs-border-color, rgba(0, 0, 0, 0.12));
  border-radius: 0 0 1.4rem 1.4rem;
  padding: 1.25rem 2rem 1.75rem;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.05);
}
.lp-divider {
  display: flex;
  align-items: center;
  gap: 0.85rem;
  margin-bottom: 1.1rem;
}
.lp-divider::before, .lp-divider::after {
  content: "";
  flex: 1;
  height: 1px;
  background: var(--bs-border-color, rgba(0, 0, 0, 0.12));
}
.lp-divider span {
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--bs-secondary-color, rgba(0, 0, 0, 0.45));
  white-space: nowrap;
}
.lp-oauth__buttons {
  display: flex;
  flex-direction: column;
  gap: 0.65rem;
}
.lp-oauth__btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.65rem;
  width: 100%;
  padding: 0.72rem 1rem;
  border-radius: 0.75rem;
  border: 1.5px solid var(--bs-border-color, rgba(0, 0, 0, 0.14));
  background: transparent;
  color: var(--bs-body-color, #111);
  font-size: 0.9rem;
  font-weight: 600;
  font-family: inherit;
  cursor: not-allowed;
  opacity: 0.62;
  transition: opacity 0.18s ease;
}
.lp-oauth__btn:hover { opacity: 0.78; }
.lp-oauth__icon { width: 18px; height: 18px; flex-shrink: 0; display: block; }
.lp-oauth__fb-icon { font-size: 1.15rem; color: #1877f2; flex-shrink: 0; }
.lp-oauth__soon {
  margin-left: auto;
  font-size: 0.65rem;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  padding: 0.18rem 0.45rem;
  border-radius: 999px;
  background: rgba(var(--bs-primary-rgb, 236, 41, 30), 0.12);
  color: var(--bs-primary, #ec291e);
}

[data-bs-theme=dark] .lp-form-card,
[data-bs-theme=dark] .lp-oauth {
  background: rgba(255, 255, 255, 0.04);
  border-color: rgba(255, 255, 255, 0.09);
}
[data-bs-theme=dark] .lp-oauth {
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.24);
}
[data-bs-theme=dark] .lp-form-card .form-control::placeholder { color: rgba(255, 255, 255, 0.22); }
[data-bs-theme=dark] .lp-form-card .form-control:focus { box-shadow: 0 0 0 3.5px rgba(var(--bs-primary-rgb, 236, 41, 30), 0.2); }
[data-bs-theme=dark] .lp-form-card .form-control:not(:placeholder-shown):not(:focus) {
  border-color: rgba(var(--bs-success-rgb, 47, 179, 128), 0.35);
}
[data-bs-theme=dark] .lp-oauth__btn { color: #e0e0e0; border-color: rgba(255, 255, 255, 0.1); }

@media (max-width: 575.98px) {
  /* Vertically centering content taller than the viewport (the default
     above) renders roughly half the overflow ABOVE the visible top of the
     page — the sign-in form only appears after scrolling even before
     accounting for its own height. Top-aligning instead, plus the tighter
     spacing below, keeps the form + submit button on-screen without
     scrolling on a typical phone viewport. */
  body.page-login main {
    justify-content: flex-start;
    padding: 1rem 1rem 1.25rem;
    min-height: auto;
  }
  .lp-back { margin-bottom: 0.5rem; }
  .lp-header { margin-bottom: 1rem; }
  .lp-header__logo {
    width: 42px;
    height: 42px;
    border-radius: 13px;
    font-size: 1.15rem;
    margin-bottom: 0.55rem;
  }
  .lp-header__title { font-size: 1.3rem; margin-bottom: 0.25rem; }
  .lp-header__sub { font-size: 0.82rem; }
  .lp-form-card { padding: 1.25rem 1.25rem 1.1rem; }
  .lp-form-card--standalone { padding-bottom: 1.4rem; }
  .lp-form-card .icon-input-wrapper { margin-bottom: 0.85rem; }
  .lp-form-card .lp-remember { margin-bottom: 0.85rem; }
  .lp-form-card .form-actions { margin-top: 1rem; gap: 0.65rem; }
  .lp-trust { margin-top: 0.85rem; padding-top: 0.85rem; }
  .lp-oauth { padding: 1.1rem 1.25rem 1.5rem; }
}

/* ═══════════════════════════════════════════════════════════════════════
   COURSE DETAIL PAGE (node--course.tpl.php / www2/pages/course-detail.php)
   Ported from www/sites/all/themes/business/css/override.css. The old
   file also carried a .cd-hero / .cd-stats-strip block (banner-style hero
   with an overlay + stat pills) — the actual node--course.tpl.php markup
   never used it (course-detail-page has no hero wrapper, just a plain
   breadcrumb nav), so it's dead CSS and is not ported here.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── Scroll animations (mirrors www2/assets/js/site.js's IntersectionObserver) ── */
.tile-animate-ease {
  transition-timing-function: cubic-bezier(.22, .68, 0, 1.2);
}
.course-scroll-animate:not(.is-visible) {
  opacity: 0;
}
.course-scroll-animate.is-visible {
  opacity: 1;
}

/* ── Breadcrumbs ──────────────────────────────────────────── */
.bread-crumbs {
  padding: .85rem 0;
}
.bread-crumbs .breadcrumb {
  margin-bottom: 0;
  margin-left: 0;
  padding: 0;
  flex-wrap: wrap;
  align-items: center;
  font-size: .85rem;
}
.bread-crumbs .breadcrumb-item + .breadcrumb-item {
  padding-left: .5rem;
}
.bread-crumbs .breadcrumb-item + .breadcrumb-item::before {
  padding-right: .5rem;
  content: "\f105";
  font-family: "Font Awesome 7 Free"; /* matches the FA 7.0.1 CDN pinned in www2/includes/layout.php — a stale "6" here silently dropped this glyph */
  font-weight: 900;
  font-size: .65rem;
  color: var(--bs-secondary-color, #adb5bd);
  vertical-align: middle;
}
.bread-crumbs .breadcrumb-item a {
  color: var(--bs-secondary-color, #6c757d);
  text-decoration: none;
  font-weight: 500;
  transition: color .15s ease;
}
.bread-crumbs .breadcrumb-item a:hover,
.bread-crumbs .breadcrumb-item a:focus-visible {
  color: var(--bs-primary);
  text-decoration: underline;
}
.bread-crumbs .breadcrumb-item.active {
  color: var(--bs-body-color);
  font-weight: 600;
  max-width: 28ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
@media (max-width: 767.98px) {
  .bread-crumbs .breadcrumb-item.active { max-width: 18ch; }
}
@media (max-width: 380px) {
  .bread-crumbs .breadcrumb-item.active { max-width: 13ch; }
}

/* ── Page layout ─────────────────────────────────────────── */
.cd-divider {
  border-color: var(--bs-border-color);
  margin: 2.5rem 0;
  opacity: .6;
}

/* ── Sections ────────────────────────────────────────────── */
.cd-section { margin-bottom: .5rem; }

.cd-section-header {
  display: flex;
  align-items: center;
  gap: .65rem;
  margin-bottom: 1.25rem;
}
.cd-section-header > i { font-size: 1.1rem; flex-shrink: 0; }
.cd-section-title {
  font-size: 1.15rem;
  font-weight: 700;
  margin: 0;
  color: var(--bs-body-color);
}

.cd-prose {
  font-size: .975rem;
  line-height: 1.75;
  color: var(--bs-body-color);
}
.cd-prose p { margin-bottom: 1rem; }
.cd-prose h2, .cd-prose h3, .cd-prose h4 { margin-top: 1.5rem; font-weight: 700; }

.cd-prose--collapsed {
  position: relative;
  max-height: 12rem;
  overflow: hidden;
}
.cd-prose--collapsed::after {
  content: '';
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 3.5rem;
  background: linear-gradient(to bottom, transparent, var(--bs-body-bg));
  pointer-events: none;
}
.cd-prose-toggle {
  display: inline-flex;
  align-items: center;
  gap: .35rem;
  margin-top: .75rem;
  padding: 0;
  border: none;
  background: none;
  color: var(--bs-primary);
  font-size: .9rem;
  font-weight: 600;
  cursor: pointer;
}
.cd-prose-toggle:hover { text-decoration: underline; }

/* Anchor targets for the .cd-toc nav — offsets the jump so a section's
   heading doesn't land underneath the sticky .site-header (~80px tall).
   Scoped to the main content column so it also covers custom ids inside
   admin-authored above/below-description content, not just built-in
   .cd-section wrappers. */
.col-lg-8 [id], #cd-top {
  scroll-margin-top: 96px;
}

/* ── Above/below-description content blocks (raw_data.page_layout) ── */
.cd-content-block { margin-bottom: .5rem; }

/* ── In-page navigation pills (sidebar "On This Page" card) ────────── */
.cd-toc {
  display: flex;
  flex-direction: column;
  gap: .35rem;
}
.cd-toc__pill {
  display: flex;
  align-items: center;
  gap: .5rem;
  padding: .4rem .7rem;
  border-radius: .5rem;
  color: var(--bs-body-color);
  font-size: .875rem;
  font-weight: 500;
  text-decoration: none;
  transition: background-color .15s ease, color .15s ease;
}
.cd-toc__pill:hover {
  background: var(--bs-tertiary-bg);
  color: var(--bs-primary);
}
.cd-toc__pill i { width: 1rem; text-align: center; flex-shrink: 0; color: var(--bs-primary); }

/* Inline variant — the same nav, rendered as a wrapping row of pills in the
   main content column (right above About) instead of a column in the
   sidebar card. Needs its own card-like background since it isn't nested
   inside .cd-sidebar-card here. */
.cd-toc--inline {
  flex-direction: row;
  flex-wrap: wrap;
  padding: 0rem 0.5rem 0.5rem 0;
  background: var(--bs-tertiary-bg);
  border-radius: .75rem;
}
.cd-toc--inline .cd-toc__pill {
  background: var(--bs-body-bg);
  border: 1px solid var(--bs-border-color);
}
.cd-toc--inline .cd-toc__pill:hover {
  border-color: var(--bs-primary);
}

/* ── "Back to top" link after each section, jumps to #cd-top (the hero) ── */
.cd-back-to-top {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: .35rem;
  margin-top: .75rem;
  font-size: .8rem;
  font-weight: 600;
  color: var(--bs-secondary-color);
  text-decoration: none;
}
.cd-back-to-top:hover { color: var(--bs-primary); text-decoration: underline; }
.cd-back-to-top i { font-size: .7rem; }

/* ── Topic cards grid ────────────────────────────────────── */
.cd-topics-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: .75rem;
}
.cd-topics-grid--lessons {
  grid-template-columns: repeat(2, 1fr);
}
@media (max-width: 640px) {
  .cd-topics-grid--lessons { grid-template-columns: 1fr; }
}
.cd-topic-card {
  display: flex;
  align-items: center;
  gap: .6rem;
  background: var(--bg-card-gradient);
  border: 1px solid var(--bs-border-color);
  border-radius: var(--r-lg);
  padding: .75rem 1rem;
  position: relative;
  overflow: hidden;
  transition: transform .18s ease, box-shadow .18s ease;
}
.cd-topic-card:hover {
  transform: translateY(-2px);
  box-shadow: var(--shadow-hover);
}
.cd-topic-card__accent {
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 3px;
  background: var(--bs-primary);
  border-radius: var(--r-lg) 0 0 var(--r-lg);
}
.cd-topic-card__body {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex: 1;
  min-width: 0;
}
.cd-topic-card__name {
  font-size: .85rem;
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  color: var(--bs-body-color);
}
.cd-topic-card__meta { flex-shrink: 0; margin-left: .5rem; }
.cd-topic-card__check { font-size: .8rem; flex-shrink: 0; }
.cd-topic-card__type-icon {
  font-size: .72rem;
  margin-right: .4rem;
  color: var(--bs-secondary-color);
}

/* ── Reference cards ─────────────────────────────────────── */
.cd-ref-card {
  display: flex;
  align-items: flex-start;
  gap: .75rem;
  background: var(--bg-card-gradient);
  border: 1px solid var(--bs-border-color);
  border-radius: var(--r-lg);
  padding: .85rem 1rem;
  height: 100%;
  transition: transform .18s ease, box-shadow .18s ease;
}
.cd-ref-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-hover); }
.cd-ref-card__icon {
  width: 2.2rem; height: 2.2rem;
  display: flex; align-items: center; justify-content: center;
  background: var(--tint-info-soft);
  border-radius: var(--r-md);
  flex-shrink: 0;
}
.cd-ref-card__body { flex: 1; min-width: 0; }
.cd-ref-card__title {
  font-size: .875rem;
  font-weight: 600;
  color: var(--bs-body-color);
  text-decoration: none;
  display: block;
  word-break: break-word;
}
a.cd-ref-card__title:hover { color: var(--bs-primary); text-decoration: underline; }

/* ── Learn Path: locked / free topic-card variants ───────── */
.cd-topic-card--locked { opacity: .82; }
.cd-topic-card--locked .cd-topic-card__accent { background: var(--bs-secondary-color); }
/* Free items stay full-opacity (not dimmed like locked ones) and get a
   green accent to match their green unlock icon — the whole point is a
   visibly distinct "free path" through the card grid, not just a different
   corner icon. */
.cd-topic-card--free .cd-topic-card__accent { background: var(--bs-success); }
.cd-lesson-quiz-heading {
  font-size: .78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--bs-secondary-color);
  margin: 1rem 0 .6rem;
}

/* ── Sidebar ─────────────────────────────────────────────── */
.cd-sidebar {
  position: sticky;
  top: 1.5rem;
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}
@media (max-width: 991px) {
  .cd-sidebar { position: static; }
}
.cd-sidebar-card {
  background: var(--bg-card-gradient);
  border: 1px solid var(--bs-border-color);
  border-radius: var(--r-2xl);
  box-shadow: var(--shadow-card);
  overflow: hidden;
}
.cd-sidebar-card__header {
  display: flex;
  align-items: center;
  gap: .5rem;
  padding: .9rem 1.1rem;
  border-bottom: 1px solid var(--bs-border-color);
  background: var(--bs-tertiary-bg, rgba(0,0,0,.03));
  font-size: .875rem;
}
.cd-sidebar-card__body { padding: 1.1rem; }

.cd-stats-list .list-group-item {
  background: transparent;
  border-color: var(--bs-border-color);
  padding: .65rem 1.1rem;
  font-size: .85rem;
}
.cd-enrol-social { font-size: .84rem; }

/* ── Mobile CTA (sidebar card sits below all body content once it stacks) ── */
.cd-mobile-cta {
  background: var(--bg-card-gradient);
  border: 1px solid var(--bs-border-color);
  border-radius: var(--r-2xl);
  box-shadow: var(--shadow-card);
  padding: 1rem;
}

/* ── Social share buttons ────────────────────────────────── */
.cd-share-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.4rem; height: 2.4rem;
  border-radius: 50%;
  font-size: 1rem;
  color: #fff;
  text-decoration: none;
  transition: transform .16s ease, filter .16s ease;
  flex-shrink: 0;
}
.cd-share-btn:hover { transform: scale(1.12); filter: brightness(1.15); color: #fff; }
.share-facebook  { background: #1877f2; }
.share-twitter   { background: #000; }
.share-linkedin  { background: #0a66c2; }
.share-whatsapp  { background: #25d366; }

.cd-copy-link .form-control {
  font-size: .75rem;
  color: var(--bs-secondary-color);
}

/* ── Dark theme overrides for detail page ────────────────── */
[data-bs-theme="dark"] .cd-topic-card,
[data-bs-theme="dark"] .cd-ref-card,
[data-bs-theme="dark"] .cd-sidebar-card,
[data-bs-theme="dark"] .cd-mobile-cta {
  background: rgba(255,255,255,.04);
  border-color: rgba(255,255,255,.09);
}
[data-bs-theme="dark"] .cd-sidebar-card__header {
  background: rgba(255,255,255,.04);
}
[data-bs-theme="dark"] .cd-stats-list .list-group-item {
  border-color: rgba(255,255,255,.08);
}

/* ── Money-back guarantee banner (above the Pricing section) ──────
   Soft tinted treatment — same "tint background + colored icon chip" idea
   as .value-prop-icon--* elsewhere in this file, not a full-bleed saturated
   gradient — that read as too loud against the rest of the page's muted
   card aesthetic, in both themes. */
.cd-guarantee-banner {
  display: flex;
  align-items: center;
  gap: 1.25rem;
  background: linear-gradient(135deg, rgba(var(--bs-primary-rgb), .09) 0%, rgba(var(--bs-primary-rgb), .03) 100%);
  border: 1px solid rgba(var(--bs-primary-rgb), .2);
  border-radius: var(--r-2xl);
  padding: 1.5rem 1.75rem;
  box-shadow: var(--shadow-card);
}
.cd-guarantee-banner__icon {
  flex-shrink: 0;
  width: 3.25rem;
  height: 3.25rem;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.4rem;
  color: var(--bs-primary);
  background: rgba(var(--bs-primary-rgb), .14);
  border-radius: 50%;
}
.cd-guarantee-banner__title {
  font-size: 1.1rem;
  font-weight: 800;
  margin: 0 0 .25rem;
  color: var(--bs-body-color);
}
.cd-guarantee-banner__text {
  font-size: .875rem;
  margin: 0;
  color: var(--bs-secondary-color);
}
@media (max-width: 576px) {
  .cd-guarantee-banner { flex-direction: column; text-align: center; padding: 1.5rem 1.25rem; }
}
[data-bs-theme="dark"] .cd-guarantee-banner {
  background: linear-gradient(135deg, rgba(var(--bs-primary-rgb), .16) 0%, rgba(var(--bs-primary-rgb), .05) 100%);
  border-color: rgba(var(--bs-primary-rgb), .32);
}
[data-bs-theme="dark"] .cd-guarantee-banner__icon {
  background: rgba(var(--bs-primary-rgb), .24);
}

/* ── Pricing cards ────────────────────────────────────────────── */
.cd-pricing-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 1rem;
  align-items: stretch;
}
.cd-pricing-card {
  display: flex;
  flex-direction: column;
  background: var(--bg-card-gradient);
  border: 1px solid var(--bs-border-color);
  border-radius: var(--r-2xl);
  padding: 1.5rem 1.25rem;
  box-shadow: var(--shadow-card);
  transition: transform .18s ease, box-shadow .18s ease;
}
.cd-pricing-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-hover); }
.cd-pricing-card--featured { border-color: rgba(var(--bs-primary-rgb), .3); }
.cd-pricing-card__emoji { font-size: 1.75rem; margin-bottom: .35rem; }
.cd-pricing-card__name { font-size: 1.05rem; font-weight: 700; color: var(--bs-body-color); margin-bottom: .5rem; }
.cd-pricing-card__price-row {
  display: flex;
  align-items: baseline;
  gap: .4rem;
  flex-wrap: wrap;
}
.cd-pricing-card__price-original {
  font-size: .9rem;
  color: var(--bs-secondary-color);
  text-decoration: line-through;
}
.cd-pricing-card__price {
  font-size: 1.6rem;
  font-weight: 800;
  color: var(--bs-body-color);
}
.cd-pricing-card__price-currency {
  font-size: .72rem;
  font-weight: 600;
  color: var(--bs-secondary-color);
  text-transform: uppercase;
}
.cd-pricing-card__savings {
  display: inline-block;
  align-self: flex-start;
  font-size: .68rem;
  font-weight: 700;
  text-transform: uppercase;
  color: var(--bs-success);
  background: var(--tint-success-soft);
  border-radius: var(--r-pill);
  padding: .15rem .55rem;
  margin: .35rem 0 0;
}
.cd-pricing-card__desc {
  font-size: .82rem;
  color: var(--bs-secondary-color);
  margin: .75rem 0 0;
}
.cd-pricing-card__note {
  font-size: .8rem;
  color: var(--bs-secondary-color);
  margin: .4rem 0 0;
  font-style: italic;
}
.cd-pricing-card__features {
  list-style: none;
  padding: 0;
  margin: 1rem 0;
  display: flex;
  flex-direction: column;
  gap: .4rem;
  flex: 1;
}
.cd-pricing-card__features li {
  font-size: .8rem;
  color: var(--bs-secondary-color);
}
[data-bs-theme="dark"] .cd-pricing-card {
  background: rgba(255,255,255,.04);
  border-color: rgba(255,255,255,.09);
}

/* ── Fixed bottom "Start Learning" / dashboard CTA ─────────
   Always on screen (not just mobile) so guests have a persistent, hard-to-
   miss path back into the preview/registration flow. body.has-fixed-cta
   (set by course-detail.php) gets bottom padding so the bar never covers
   the footer once the page is scrolled all the way down — replaces the old
   Drupal body.node-type-course convention. ── */
body.has-fixed-cta {
  padding-bottom: 92px;
}
@media (max-width: 575px) {
  body.has-fixed-cta { padding-bottom: 80px; }
}

.cd-fixed-cta {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 1020; /* just below .site-header's 1030 */
  /* Navy-led with a muted red undertone, not a full red→navy sweep — a
     solid red edge read as too aggressive for a bar that's on-screen on
     every course page. */
  background: linear-gradient(90deg,
    rgba(var(--bs-primary-rgb, 236, 41, 30), .55) 0%,
    var(--bs-secondary, #002b58) 65%);
  background-color: var(--bs-secondary, #002b58);
  box-shadow: 0 -6px 24px rgba(0, 0, 0, .18);
  padding: .85rem 0;
}
.cd-fixed-cta__inner {
  display: flex;
  align-items: center;
  gap: 1rem;
}
.cd-fixed-cta__icon {
  width: 3rem;
  height: 3rem;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(255, 255, 255, .18);
  border-radius: 50%;
  font-size: 1.25rem;
  color: #fff;
  text-decoration: none;
  animation: cdFixedCtaPulse 1.7s ease-in-out infinite;
}
@keyframes cdFixedCtaPulse {
  0%, 100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(255, 255, 255, .4); }
  50%      { transform: scale(1.15); box-shadow: 0 0 0 9px rgba(255, 255, 255, 0); }
}
.cd-fixed-cta__text {
  flex: 1;
  min-width: 0;
  color: #fff;
  line-height: 1.25;
  text-decoration: none;
}
.cd-fixed-cta__text:hover strong { text-decoration: underline; }

/* Bottom fixed CTA enroll link — same dark-theme link-color bug as the
   sidebar Enroll Now button below: the explicit `color: #fff` above loses
   to [data-bs-theme=dark] a's higher-specificity gold. White at rest, gold
   highlight on hover/focus. */
[data-bs-theme="dark"] .cd-fixed-cta__icon,
[data-bs-theme="dark"] .cd-fixed-cta__text {
  color: #fff;
}
[data-bs-theme="dark"] .cd-fixed-cta__text:hover,
[data-bs-theme="dark"] .cd-fixed-cta__text:focus-visible {
  color: var(--bs-warning);
}

/* Sidebar "Enroll Now" — opts out of the app-wide dark-theme link color
   (coursesite's compiled Bootstrap bundle sets a direct, non-variable
   `[data-bs-theme=dark] a { color: #f4c20d }` — since this is an <a> styled
   as a button, that beats .btn's `color: var(--bs-btn-color)` on
   specificity, so overriding the --bs-btn-color custom property alone,
   as tried first, had no effect) just for this one button: plain white
   text at rest, gold highlight only on hover/focus. */
[data-bs-theme="dark"] .cd-sidebar-card__body a.btn-primary {
  color: #fff;
}
[data-bs-theme="dark"] .cd-sidebar-card__body a.btn-primary:hover,
[data-bs-theme="dark"] .cd-sidebar-card__body a.btn-primary:focus-visible {
  color: var(--bs-warning);
}
.cd-fixed-cta__text strong {
  display: block;
  font-size: 1.02rem;
  font-weight: 700;
}
.cd-fixed-cta__text span {
  display: block;
  font-size: .78rem;
  opacity: .85;
}
.cd-fixed-cta__btn {
  flex-shrink: 0;
  font-weight: 700;
  white-space: nowrap;
}
@media (max-width: 575px) {
  .cd-fixed-cta__text span { display: none; }
  .cd-fixed-cta__text strong { font-size: .92rem; }
  .cd-fixed-cta__icon { width: 2.5rem; height: 2.5rem; font-size: 1.05rem; }
}

/* Logged-in variant — static, no animation, no urgency framing needed */
.cd-fixed-cta--dashboard {
  background: var(--bs-body-bg);
  border-top: 1px solid var(--bs-border-color);
  box-shadow: 0 -4px 16px rgba(0, 0, 0, .08);
}
.cd-fixed-cta--dashboard .cd-fixed-cta__inner { justify-content: center; }
.cd-fixed-cta--dashboard .cd-fixed-cta__btn { width: 100%; max-width: 420px; }

@media (prefers-reduced-motion: reduce) {
  .cd-fixed-cta__icon { animation: none; }
}

[data-bs-theme="dark"] .cd-fixed-cta--dashboard {
  background: var(--bs-tertiary-bg, #1a1d24);
  border-color: rgba(255, 255, 255, .09);
}

/* ── "Start Learning" confirmation modal (course-detail.php) ───────────────
   Self-contained — no Bootstrap .modal/.modal-backdrop classes and no
   dependency on Bootstrap's Modal JS component (see the HTML comment above
   this modal's markup for why: a JS/CSS Bootstrap version mismatch on this
   page). Own namespaced classes, own explicit z-index, shown/hidden by
   assets/js/site.js toggling .is-open — nothing here can be affected by
   how any other component on the page happens to use Bootstrap. */
.slm {
  display: none;
  position: fixed;
  inset: 0;
  z-index: 1100; /* comfortably above everything else on this page (.site-header:1030, .cd-fixed-cta:1020) — its own dedicated top-of-stack slot */
  align-items: center;
  justify-content: center;
  padding: 1rem;
}
.slm.is-open {
  display: flex;
}
.slm__backdrop {
  position: fixed;
  inset: 0;
  z-index: 0;
  background: rgba(0, 0, 0, .9);
}
.slm__dialog {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: 460px;
  max-height: calc(100vh - 2rem);
  overflow-y: auto;
  background: var(--bs-body-bg);
  color: var(--bs-body-color);
  border-radius: 1rem;
  box-shadow: 0 20px 48px rgba(0, 0, 0, .28);
}
.slm__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .75rem;
  padding: 1.1rem 1.25rem;
  border-bottom: 1px solid var(--bs-border-color);
}
.slm__title {
  margin: 0;
  font-size: 1.1rem;
}
.slm__body {
  padding: 1.25rem;
}
.slm__footer {
  display: flex;
  justify-content: flex-end;
  flex-wrap: wrap;
  gap: .5rem;
  padding: 1rem 1.25rem 1.25rem;
}
@media (max-width: 420px) {
  .slm__footer {
    flex-direction: column-reverse;
  }
  .slm__footer .btn {
    width: 100%;
  }
}
html.slm-open {
  overflow: hidden;
}

/* ── Average rating block ────────────────────────────────── */
.cd-avg-rating {
  display: inline-flex;
  align-items: center;
  gap: 1.25rem;
  background: var(--bg-card-gradient);
  border: 1px solid var(--bs-border-color);
  border-radius: var(--r-xl);
  padding: 1rem 1.5rem;
}
.cd-avg-rating__score {
  font-size: 3rem;
  font-weight: 800;
  line-height: 1;
  color: var(--bs-body-color);
}

/* ── Star row ────────────────────────────────────────────── */
.cd-stars-display { display: inline-flex; gap: .2rem; }
.cd-stars-display .fa-star { font-size: .95rem; }
.cd-stars-display--sm .fa-star { font-size: .72rem; }

/* ── Reviews list ────────────────────────────────────────── */
.cd-reviews-list {
  display: flex;
  flex-direction: column;
  gap: .1rem;
}
.cd-review-item {
  background: var(--bg-card-gradient);
  border: 1px solid var(--bs-border-color);
  border-radius: var(--r-lg);
  padding: .9rem 1rem;
  transition: box-shadow .16s ease;
}
.cd-review-item:hover { box-shadow: var(--shadow-card); }

.cd-review-avatar {
  width: 2rem; height: 2rem;
  border-radius: 50%;
  background: linear-gradient(135deg, var(--bs-primary), var(--cl-primary-soft, #ff6f61));
  color: #fff;
  font-size: .75rem;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}

[data-bs-theme="dark"] .cd-avg-rating,
[data-bs-theme="dark"] .cd-review-item {
  background: rgba(255,255,255,.04);
  border-color: rgba(255,255,255,.09);
}

