/* =========================================================================
   STUDENTFUNDZA — style.css
   NSFAS information site for SA students. Mobile-first, system fonts only
   (SA mobile data is expensive — no web font request on any page).
   Single stylesheet, no framework, no build step.
   ========================================================================= */

:root{
  /* Brand — NSFAS-adjacent blue, deliberately NOT NSFAS green (see CLAUDE.md) */
  --primary:#0057A8;
  --primary-dark:#003D78;
  --accent:#F5A623;

  /* Result tones */
  --success:#1A7C3E;
  --error:#C0392B;
  --warning:#E67E22;

  /* Surfaces */
  --bg:#F4F6F9;
  --surface:#FFFFFF;
  --text-main:#1A1A2E;
  --text-sec:#5A6070;
  --border:#DEE2E8;
  --ad-bg:#F0F2F5;
  --ad-border:#D0D5DD;

  --wa-green:#25D366;

  /* 8px base unit */
  --s1:8px; --s2:16px; --s3:24px; --s4:32px; --s6:48px; --s8:64px;

  --radius-card:8px;
  --radius-input:4px;
  --radius-pill:24px;
  --shadow:0 2px 8px rgba(0,0,0,.08);
  --shadow-lg:0 8px 24px rgba(0,0,0,.12);

  --maxw:1100px;
  --nav-h:60px;

  --font:system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;
}

/* ---------- Reset ---------- */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scroll-padding-top:calc(var(--nav-h) + 16px)}
body{
  font-family:var(--font);
  font-weight:400;
  line-height:1.6;
  color:var(--text-main);
  background:var(--bg);
  overflow-x:hidden;
}
img{max-width:100%;display:block;height:auto}
a{color:var(--primary);text-decoration:none}
a:hover{text-decoration:underline}
ul,ol{list-style-position:outside;padding-left:1.25em}
button{font-family:inherit;font-size:inherit;cursor:pointer;border:none;background:none;color:inherit}
:focus-visible{outline:3px solid var(--accent);outline-offset:2px}

/* ---------- Typography ---------- */
h1,h2,h3,h4{font-weight:700;line-height:1.2;letter-spacing:-.02em}
h1{font-size:clamp(1.75rem,5.5vw,2.75rem)}
h2{font-size:clamp(1.35rem,3.5vw,2rem)}
h3{font-size:clamp(1.1rem,2.5vw,1.35rem)}
p{margin-bottom:var(--s2)}
p:last-child{margin-bottom:0}
.lead{font-size:1.05rem;color:var(--text-sec)}
.small{font-size:.875rem}
.muted{color:var(--text-sec)}

/* ---------- Layout ---------- */
.container{width:100%;max-width:var(--maxw);margin:0 auto;padding:0 var(--s2)}
.section{padding:var(--s6) 0}
.section--tight{padding:var(--s4) 0}
.surface{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-card);box-shadow:var(--shadow);padding:var(--s3)}
.skip-link{position:absolute;left:-9999px;top:0;background:var(--primary);color:#fff;padding:var(--s1) var(--s2);z-index:200}
.skip-link:focus{left:0}

/* ---------- Buttons ---------- */
.btn-primary,.btn-secondary,.btn-whatsapp{
  display:inline-flex;align-items:center;justify-content:center;gap:var(--s1);
  font-weight:700;font-size:1rem;line-height:1;
  padding:14px var(--s3);border-radius:var(--radius-pill);
  text-align:center;text-decoration:none;
  transition:background .18s ease,transform .18s ease,box-shadow .18s ease;
}
.btn-primary:hover,.btn-secondary:hover,.btn-whatsapp:hover{text-decoration:none;transform:translateY(-2px)}
.btn-primary{background:var(--primary);color:#fff;box-shadow:0 4px 12px rgba(0,87,168,.28)}
.btn-primary:hover{background:var(--primary-dark)}
.btn-secondary{background:var(--surface);color:var(--primary);border:2px solid var(--primary)}
.btn-secondary:hover{background:var(--primary);color:#fff}
.btn-whatsapp{background:var(--wa-green);color:#fff;box-shadow:0 4px 12px rgba(37,211,102,.3)}
.btn-whatsapp:hover{background:#1da851}
.btn-whatsapp svg{width:1.2em;height:1.2em;fill:currentColor;flex:none}
.btn-block{width:100%}

/* ---------- Header / Nav ---------- */
.header{
  position:sticky;top:0;z-index:100;
  background:rgba(255,255,255,.97);
  backdrop-filter:blur(8px);
  border-bottom:1px solid var(--border);
}
.nav{display:flex;align-items:center;justify-content:space-between;height:var(--nav-h)}
.brand{font-weight:700;font-size:1.15rem;letter-spacing:-.03em;color:var(--text-main);display:flex;align-items:center;gap:6px}
.brand:hover{text-decoration:none}
.brand svg{width:24px;height:24px;flex:none}
.brand b{color:var(--primary)}
.nav-links{display:flex;align-items:center;gap:4px;list-style:none;padding:0;margin:0}
.nav-links a{
  display:block;font-weight:600;font-size:.95rem;color:var(--text-main);
  padding:var(--s1) 12px;border-radius:var(--radius-input);
  transition:color .15s,background .15s;
}
.nav-links a:hover{color:var(--primary);background:var(--bg);text-decoration:none}
.nav-links a.active{color:var(--primary)}
.nav-links a.active::after{content:"";display:block;height:3px;width:20px;background:var(--primary);border-radius:3px;margin:2px auto 0}
.nav-toggle{display:none;flex-direction:column;gap:5px;padding:var(--s1);margin-right:-8px}
.nav-toggle span{display:block;width:24px;height:3px;background:var(--text-main);border-radius:3px;transition:transform .25s,opacity .25s}
.nav-toggle.open span:nth-child(1){transform:translateY(8px) rotate(45deg)}
.nav-toggle.open span:nth-child(2){opacity:0}
.nav-toggle.open span:nth-child(3){transform:translateY(-8px) rotate(-45deg)}

@media (max-width:767px){
  .nav-toggle{display:flex}
  .nav-links{
    position:absolute;top:var(--nav-h);left:0;right:0;
    flex-direction:column;align-items:stretch;gap:0;
    background:var(--surface);border-bottom:1px solid var(--border);
    box-shadow:var(--shadow);
    display:none;
  }
  .nav-links.open{display:flex}
  .nav-links a{padding:14px var(--s2);border-radius:0;border-bottom:1px solid var(--border)}
  .nav-links li:last-child a{border-bottom:none}
  .nav-links a.active::after{margin:2px 0 0}
}

/* ---------- Ad Slots ─────────────────────────────────────────────────────
   Reserved at build time so the layout does NOT shift when AdSense loads.

   Two deliberate departures from the original spec snippet:
   1. min-height, not height. The spec's own performance rules ask for
      min-height ("so they don't collapse on small viewports"); a fixed height
      would also clip a taller responsive AdSense unit.
   2. The "Advertisement" label hangs off .ad-slot--placeholder, not .ad-slot.
      On the base class it would keep painting on top of a live ad. (:empty is
      not a safe alternative — any whitespace inside the div defeats it.)
      Removing that one class is part of the documented AdSense swap-in.
   ------------------------------------------------------------------------ */
.ad-slot{
  display:flex;align-items:center;justify-content:center;
  margin:var(--s3) auto;
  overflow:hidden;position:relative;
}
.ad-slot--placeholder{
  background:var(--ad-bg);
  border:1px dashed var(--ad-border);
  border-radius:var(--radius-input);
}
.ad-slot--placeholder::before{
  content:'Advertisement';
  font-size:10px;color:var(--text-sec);
  letter-spacing:.05em;text-transform:uppercase;
  position:absolute;top:4px;left:50%;transform:translateX(-50%);
  white-space:nowrap;
}
/* Leaderboard: 728x90 desktop, shorter on mobile */
.ad-leaderboard{width:100%;max-width:728px;min-height:90px}
/* Rectangle: 300x250 (MPU) */
.ad-rectangle{width:300px;min-height:250px;flex-shrink:0}
/* In-article banner: 468x60 */
.ad-banner{width:100%;max-width:468px;min-height:60px}

@media (max-width:767px){
  .ad-leaderboard{min-height:60px}
  .ad-rectangle{width:100%;max-width:336px}
}

/* Result ad — stays hidden until the quiz actually produces a result, so no
   ad ever appears mid-quiz (see calculator.js showResult). */
.result-ad{display:none}
.result-ad.visible{display:flex}

/* ---------- Hero ---------- */
.hero{
  background:linear-gradient(160deg,var(--primary) 0%,var(--primary-dark) 100%);
  color:#fff;padding:var(--s6) 0;text-align:center;
}
.hero h1{margin-bottom:var(--s2)}
.hero p{max-width:620px;margin:0 auto var(--s3);color:rgba(255,255,255,.9);font-size:1.05rem}
.trust-badges{
  display:flex;flex-wrap:wrap;justify-content:center;gap:var(--s1);
  margin-bottom:var(--s3);
}
.trust-badges span{
  background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.25);
  border-radius:var(--radius-pill);padding:6px 14px;
  font-size:.8rem;font-weight:600;white-space:nowrap;
}
.hero .btn-primary{background:var(--accent);color:var(--text-main);box-shadow:0 4px 14px rgba(0,0,0,.2)}
.hero .btn-primary:hover{background:#e0951a}

/* ---------- Page header (pages other than the calculator) ---------- */
.page-header{background:var(--primary);color:#fff;padding:var(--s4) 0}
.page-header h1{margin-bottom:var(--s1)}
.page-header p{color:rgba(255,255,255,.9);margin:0;max-width:640px}

/* ---------- Calculator ---------- */
.calc-card{
  background:var(--surface);border:1px solid var(--border);
  border-radius:var(--radius-card);box-shadow:var(--shadow);
  padding:var(--s3);max-width:640px;margin:0 auto;
}
.progress{margin-bottom:var(--s3)}
.progress-label{display:flex;justify-content:space-between;font-size:.8rem;font-weight:600;color:var(--text-sec);margin-bottom:6px}
.progress-track{height:6px;background:var(--bg);border-radius:3px;overflow:hidden}
.progress-fill{height:100%;width:20%;background:var(--primary);border-radius:3px;transition:width .3s ease}

.step{display:none}
.step.active{display:block}
/* The slide-in is for moving BETWEEN questions. calculator.js adds .stepped on
   the first answer, so question 1 paints instantly instead of fading in. */
.stepped .step.active{animation:step-in .28s ease}
@keyframes step-in{from{opacity:0;transform:translateX(12px)}to{opacity:1;transform:none}}
.step h2{font-size:1.25rem;margin-bottom:var(--s1)}
.step .step-sub{font-size:.9rem;color:var(--text-sec);margin-bottom:var(--s2)}

.options{display:flex;flex-direction:column;gap:var(--s1);margin-bottom:var(--s2)}
.option{
  display:block;width:100%;text-align:left;
  background:var(--surface);border:2px solid var(--border);
  border-radius:var(--radius-input);padding:14px var(--s2);
  font-size:.95rem;font-weight:500;line-height:1.4;
  transition:border-color .15s,background .15s,transform .1s;
}
.option:hover{border-color:var(--primary);background:#F7FAFD}
.option:active{transform:scale(.99)}
.option.selected{border-color:var(--primary);background:#EAF2FA;font-weight:600}

.step-back{
  font-size:.875rem;font-weight:600;color:var(--text-sec);
  padding:var(--s1) 0;text-decoration:underline;
}
.step-back:hover{color:var(--primary)}
.step-back[hidden]{display:none}

/* ---------- Result card ---------- */
.result{display:none;max-width:640px;margin:var(--s3) auto 0}
.result.visible{display:block;animation:step-in .3s ease}
/* calculator.js focuses this region so screen readers announce the result.
   It is never tabbed to, so the focus ring would just read as a stray border. */
.result:focus{outline:none}
.result-card{
  background:var(--surface);border:1px solid var(--border);border-left:6px solid var(--text-sec);
  border-radius:var(--radius-card);box-shadow:var(--shadow);padding:var(--s3);
}
.result-card.tone-green{border-left-color:var(--success)}
.result-card.tone-red{border-left-color:var(--error)}
.result-card.tone-amber{border-left-color:var(--warning)}
.result-heading{display:flex;align-items:flex-start;gap:var(--s1);font-size:1.3rem;margin-bottom:var(--s2)}
.tone-green .result-heading{color:var(--success)}
.tone-red .result-heading{color:var(--error)}
.tone-amber .result-heading{color:#B35F0F}
.result-reason{
  background:var(--bg);border-radius:var(--radius-input);
  padding:12px var(--s2);margin-bottom:var(--s2);font-size:.95rem;
}
/* Only the leading "Reason:" label is a block — inline <strong> inside the
   body copy must stay inline or it breaks the sentence onto its own line. */
.result-reason > strong:first-child{display:block;margin-bottom:2px}
.result-actions{display:flex;flex-direction:column;gap:var(--s1);margin-top:var(--s3)}
.result-restart{display:block;margin:var(--s2) auto 0;font-size:.875rem;font-weight:600;color:var(--text-sec);text-decoration:underline}

/* ---------- Affiliate link (revenue CTA, not decoration) ---------- */
.affiliate-link{
  display:flex;align-items:center;justify-content:center;gap:var(--s1);
  background:#FFF8EC;border:2px solid var(--accent);border-radius:var(--radius-pill);
  padding:14px var(--s3);font-weight:700;color:var(--text-main);text-align:center;
  transition:background .18s,transform .18s;
}
.affiliate-link:hover{background:#FDEFD6;transform:translateY(-2px);text-decoration:none}

/* ---------- Disclaimer ---------- */
.disclaimer{
  background:#FFF8EC;border:1px solid var(--accent);border-radius:var(--radius-card);
  padding:var(--s2);font-size:.875rem;color:var(--text-main);
}
/* Heading only. A blanket `.disclaimer strong` would also block-ify the bold
   run inside the paragraph and split the sentence across lines. */
.disclaimer > strong:first-child{display:block;margin-bottom:4px}
.result .disclaimer{margin-top:var(--s2)}

/* ---------- Content pages (guide + articles) ---------- */
.layout{display:block}
.content h2{margin:var(--s4) 0 var(--s2)}
.content h3{margin:var(--s3) 0 var(--s1)}
.content > *:first-child{margin-top:0}
.content ul,.content ol{margin-bottom:var(--s2);color:var(--text-main)}
.content li{margin-bottom:6px}

.table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;margin-bottom:var(--s2);border:1px solid var(--border);border-radius:var(--radius-card);background:var(--surface)}
table{width:100%;border-collapse:collapse;font-size:.9rem;min-width:480px}
caption{text-align:left;font-size:.85rem;color:var(--text-sec);padding:var(--s1) var(--s2)}
th,td{padding:12px var(--s2);text-align:left;border-bottom:1px solid var(--border);vertical-align:top}
th{background:var(--bg);font-weight:700;font-size:.8rem;text-transform:uppercase;letter-spacing:.04em;color:var(--text-sec)}
tbody tr:last-child td{border-bottom:none}

.status-pill{display:inline-block;font-size:.75rem;font-weight:700;padding:3px 10px;border-radius:var(--radius-pill);white-space:nowrap}
.status-pill.good{background:#E6F4EC;color:var(--success)}
.status-pill.bad{background:#FBEAE8;color:var(--error)}
.status-pill.wait{background:#FDF0E3;color:#B35F0F}

/* Desktop sidebar: main column + sticky ad rail at >=1024px, stacked below it. */
@media (min-width:1024px){
  .layout{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:var(--s4);align-items:start}
  .ad-sidebar{position:sticky;top:calc(var(--nav-h) + 16px)}
  .ad-sidebar .ad-slot{margin-top:0}
}

/* ---------- Article ---------- */
.article-header{margin-bottom:var(--s3)}
.article-meta{display:flex;flex-wrap:wrap;gap:var(--s1) var(--s2);font-size:.85rem;color:var(--text-sec);margin-top:var(--s1)}
.article-content{font-size:1.02rem}
.article-content p{margin-bottom:var(--s2)}
.article-content .ad-slot{margin:var(--s3) auto}
/* Stub copy in the scaffolded articles. Visually distinct so an unfinished
   section is obvious at a glance rather than reading as finished prose. */
.article-placeholder{color:var(--text-sec);font-style:italic;border-left:3px solid var(--border);padding-left:var(--s2)}

/* ---------- Card grids (blog listing + related) ---------- */
.card-grid{display:grid;grid-template-columns:1fr;gap:var(--s2);list-style:none;padding:0;margin:0}
@media (min-width:768px){.card-grid{grid-template-columns:repeat(2,1fr)}}
@media (min-width:1024px){.card-grid--3{grid-template-columns:repeat(3,1fr)}}
.card{
  background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-card);
  box-shadow:var(--shadow);padding:var(--s3);display:flex;flex-direction:column;
  transition:transform .18s ease,box-shadow .18s ease;
}
.card:hover{transform:translateY(-3px);box-shadow:var(--shadow-lg)}
.card h3{margin-bottom:var(--s1)}
.card h3 a{color:var(--text-main)}
.card h3 a:hover{color:var(--primary)}
.card p{font-size:.92rem;color:var(--text-sec);flex:1}
.card .read-more{font-weight:700;font-size:.9rem;margin-top:var(--s2)}

/* ---------- Footer ---------- */
.footer{background:var(--text-main);color:rgba(255,255,255,.75);padding:var(--s4) 0 var(--s3);margin-top:var(--s6)}
.footer a{color:#fff}
.footer-grid{display:grid;grid-template-columns:1fr;gap:var(--s3);margin-bottom:var(--s3)}
@media (min-width:768px){.footer-grid{grid-template-columns:2fr 1fr 1fr}}
.footer h4{color:#fff;font-size:.9rem;text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--s1)}
.footer ul{list-style:none;padding:0}
.footer li{margin-bottom:6px;font-size:.9rem}
.footer-disclaimer{
  border-top:1px solid rgba(255,255,255,.15);padding-top:var(--s2);
  font-size:.8rem;line-height:1.5;
}
.footer-disclaimer p{margin-bottom:var(--s1)}

/* ---------- Motion ---------- */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important}
  .btn-primary:hover,.btn-secondary:hover,.btn-whatsapp:hover,.card:hover,.affiliate-link:hover{transform:none}
}
