/* ============================================================================
   AppealHound — system.css
   Reset, type roles and every component.

   🚫 This file must NEVER contain a raw hex, a vendor token (--ds-*, --do-*),
      or a hard-coded font name. It consumes the theme contract only.
      See themes/_CONTRACT.md. The moment a value is hard-coded here, themes
      stop being swappable and the whole structure is pointless.
   ========================================================================== */

*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--bg);color:var(--body);
  font:var(--w-body) var(--t-body)/1.55 var(--font-sans);
  -webkit-font-smoothing:antialiased;font-feature-settings:"kern" 1}
img{max-width:100%}

/* ---------- type roles ---------------------------------------------------- */
h1,h2,h3,.display-xl,.display-hero,.display-section{
  margin:0;color:var(--ink);font-family:var(--font-display);
  font-weight:var(--w-heading);line-height:1.14;letter-spacing:var(--track-display)}
.display-xl{font-size:var(--t-display);font-weight:var(--w-display)}
.display-hero,h1{font-size:var(--t-hero);font-weight:var(--w-display)}
.display-section,h2{font-size:var(--t-h2);line-height:1.25}
h3{font-size:var(--t-h3);line-height:1.4}

h2 + p,h1 + p,.display-section + p{margin-top:var(--s4)}
.lead{font-size:var(--t-lead);line-height:1.5;color:var(--body);max-width:var(--measure)}
.micro,.muted{font-size:var(--t-small);line-height:1.5;color:var(--muted)}
.eyebrow{display:inline-block;font:600 var(--t-micro)/1 var(--font-sans);
  letter-spacing:.09em;text-transform:uppercase;color:var(--brand);margin:0 0 var(--s4)}
.stat-num{font:var(--w-display) var(--t-hero)/1 var(--font-display);
  letter-spacing:var(--track-display);font-variant-numeric:tabular-nums;color:var(--money-text)}
.stat-num.sm{font-size:var(--t-h2)}
.num{font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}

p{margin:0 0 var(--s4);max-width:var(--measure)}
strong{color:var(--ink);font-weight:var(--w-strong)}
a{color:var(--brand);text-decoration:none}
a:hover{color:var(--brand-press);text-decoration:underline}
code{font:var(--t-small)/1.5 var(--font-mono);background:var(--bg-sunken);
  padding:2px 6px;border-radius:var(--r-control);color:var(--ink)}

/* ---------- layout -------------------------------------------------------- */
.wrap{max-width:var(--wrap);margin:0 auto;padding:0 var(--s5)}
/* .narrow sits ON .wrap, so narrowing the wrap itself would re-centre the
   section and misalign it against every other one. Instead keep the wrap at
   full width and cap the CHILDREN. Same left edge, shorter measure. */
.wrap.narrow{max-width:var(--wrap)}
.wrap.narrow > *{max-width:var(--wrap-narrow)}
section{padding:var(--s8) 0}
.sunken{background:var(--bg-sunken)}
.inv{background:var(--bg-inv);color:var(--body-inv)}
.inv h1,.inv h2,.inv h3,.inv .display-hero{color:var(--ink-inv)}
.inv strong{color:var(--ink-inv)}
.inv .lead{color:var(--body-inv)}
.inv .eyebrow,.inv a{color:var(--brand-inv)}
.inv .micro,.inv .muted,.inv .cta-note{color:var(--muted-inv)}
.inv .stat-num{color:var(--money)}

header{background:var(--bg);border-bottom:1px solid var(--line)}
.bar{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) 0}
.bar .logo{display:flex;align-items:center;gap:9px;color:var(--ink);text-decoration:none;
  font:var(--w-strong) 18px/1 var(--font-display);letter-spacing:var(--track-display)}
.bar .logo:hover{text-decoration:none}
.bar .logo svg,.bar .logo .mark{display:block;flex:none}
/* The mark carries real detail (55 paths). Below 24px it turns to mush, so the
   nav uses 30px and BRAND.md states 24px as the hard floor. */
/* The v2 mark is a 150x150 square, 2 paths. It holds down to ~20px. */
.mark{width:30px;height:30px}
.foot-brand .mark{width:34px;height:34px}
.bar .crumb{margin-left:auto;font-size:var(--t-small);color:var(--muted)}

.hero{padding:var(--s9) 0 var(--s8)}
.hero h1{max-width:17ch;margin-bottom:var(--s5)}
.hero-grid{display:grid;gap:var(--s8);align-items:center;
  grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr)}
@media (max-width:900px){.hero-grid{grid-template-columns:1fr;gap:var(--s6)}
  .hero h1{max-width:none}.paper{max-width:none}}

/* ---------- button -------------------------------------------------------- */
.btn{display:inline-flex;align-items:center;justify-content:center;height:48px;
  padding:0 var(--s6);background:var(--brand);color:var(--on-brand);border:0;
  border-radius:var(--r-pill);cursor:pointer;text-decoration:none;
  font:var(--w-strong) var(--t-body)/1 var(--font-sans);transition:opacity .12s ease}
.btn:hover{background:var(--brand-press);color:var(--on-brand);text-decoration:none}
/* On an inverted band the brand colour sits too close to the ground, so the
   button loses contrast. Invert it: the surface becomes the button. */
.inv .btn{background:var(--ink-inv);color:var(--bg-inv)}
.inv .btn:hover{background:var(--brand-wash);color:var(--bg-inv)}
.btn.subtle{background:var(--bg-sunken);color:var(--ink)}
.cta{display:flex;align-items:center;gap:var(--s4);flex-wrap:wrap;margin:var(--s6) 0 0}
.cta-note{font-size:var(--t-small);color:var(--muted)}

/* ---------- card ---------------------------------------------------------- */
.card{background:var(--bg-card);border-radius:var(--r-card);box-shadow:var(--e-card);
  padding:var(--s5) var(--s6);margin:0 0 var(--s4)}
.card-title{font:var(--w-strong) var(--t-h3)/1.4 var(--font-sans);color:var(--ink);margin:0 0 var(--s1)}
.card-desc{font-size:var(--t-small);color:var(--muted);margin:0 0 var(--s4)}
.cards{display:grid;gap:var(--s4);grid-template-columns:repeat(auto-fit,minmax(240px,1fr));margin:0 0 var(--s4)}
.cards > .card{margin:0}

/* ---------- numbered steps ------------------------------------------------ */
ol.steps{list-style:none;margin:0;padding:0;counter-reset:s;display:grid;gap:var(--s3)}
ol.steps li{counter-increment:s;position:relative;padding:var(--s5) var(--s6) var(--s5) 62px;
  background:var(--bg-card);border-radius:var(--r-card);box-shadow:var(--e-card)}
ol.steps li::before{content:counter(s);position:absolute;left:var(--s5);top:var(--s5);
  width:26px;height:26px;border-radius:var(--r-pill);background:var(--brand-wash);
  color:var(--brand);font:600 var(--t-small)/26px var(--font-sans);text-align:center}
ol.steps p{margin:var(--s1) 0 0;font-size:var(--t-small);color:var(--muted)}

/* ---------- spec tiles ---------------------------------------------------- */
.spec{display:grid;gap:var(--s3);grid-template-columns:repeat(auto-fit,minmax(160px,1fr));margin:0 0 var(--s4)}
.spec > div{background:var(--bg-sunken);border-radius:var(--r-base);padding:var(--s4) var(--s5)}
.spec .k{font:600 var(--t-micro)/1 var(--font-sans);letter-spacing:.09em;
  text-transform:uppercase;color:var(--muted);margin:0 0 var(--s2)}
.spec .v{font-size:var(--t-body);font-weight:var(--w-strong);color:var(--ink);margin:0}

/* ---------- lozenge ------------------------------------------------------- */
.chip{display:inline-block;font:600 var(--t-micro)/1 var(--font-sans);letter-spacing:.04em;
  text-transform:uppercase;padding:5px 9px;border-radius:var(--r-control);
  background:var(--bg-sunken);color:var(--ink)}
.chip.ok{background:var(--ok-wash);color:var(--ok-text)}
.chip.info{background:var(--brand-wash);color:var(--brand)}
.chip.warn{background:var(--warn-wash);color:var(--warn)}
.chip.bad{background:var(--bad-wash);color:var(--bad)}
.chip-row{display:flex;flex-wrap:wrap;gap:var(--s2)}

/* ---------- section message ----------------------------------------------- */
.note{border-radius:var(--r-base);background:var(--bg-sunken);
  padding:var(--s4) var(--s5);margin:0 0 var(--s4);font-size:var(--t-small)}
.note.info{background:var(--brand-wash)}
.note.warn{background:var(--warn-wash);color:var(--warn)}
.note.bad{background:var(--bad-wash);color:var(--bad)}
.note > :last-child{margin-bottom:0}

/* ---------- table --------------------------------------------------------- */
table{border-collapse:collapse;width:100%;font-size:var(--t-small)}
thead th{text-align:left;padding:0 var(--s3) var(--s2) 0;
  font:600 var(--t-micro)/1 var(--font-sans);letter-spacing:.08em;text-transform:uppercase;
  color:var(--muted);border-bottom:2px solid var(--line)}
th.n,td.n{text-align:right}
td{padding:var(--s3) var(--s3) var(--s3) 0;vertical-align:top;border-bottom:1px solid var(--line)}
td.n{white-space:nowrap;font-variant-numeric:tabular-nums;font-weight:var(--w-strong);color:var(--ink)}
tr:last-child td{border-bottom:0}

/* ---------- form ---------------------------------------------------------- */
label{display:block;font:var(--w-strong) var(--t-small)/1.4 var(--font-sans);color:var(--ink);margin:0 0 var(--s1)}
.field{margin:0 0 var(--s4)}
.row{display:flex;gap:var(--s4)}.row > .field{flex:1}
input[type=text],textarea,select,input[type=file]{width:100%;padding:9px var(--s3);
  font:var(--w-body) var(--t-small)/1.5 var(--font-sans);color:var(--ink);
  background:var(--bg-sunken);border:2px solid transparent;border-radius:var(--r-control)}
input:focus-visible,textarea:focus-visible,select:focus-visible{
  outline:none;background:var(--bg);border-color:var(--brand)}
textarea{min-height:190px;font-family:var(--font-mono);line-height:1.55}

/* ---------- footer -------------------------------------------------------
   The <footer> element carries the background and spans full width. The .wrap
   INSIDE it centres the content. Putting .wrap on <footer> itself constrains
   the background to the centred box, which is the bug this replaced. */
footer{background:var(--bg-sunken);color:var(--muted);
  padding:var(--s8) 0 var(--s7);border-top:1px solid var(--line);font-size:var(--t-small)}
.foot-grid{display:grid;gap:var(--s6);align-items:start;
  grid-template-columns:minmax(240px,1.4fr) repeat(auto-fit,minmax(150px,1fr))}
.foot-brand .logo{margin-bottom:var(--s3)}
.foot-brand p{margin:0 0 var(--s2);max-width:34ch}
.foot-col h4{margin:0 0 var(--s3);font:600 var(--t-micro)/1 var(--font-sans);
  letter-spacing:.09em;text-transform:uppercase;color:var(--muted)}
.foot-col ul{list-style:none;margin:0;padding:0}
.foot-col li{margin:0 0 var(--s2)}
.foot-col a{color:var(--ink);text-decoration:none}
.foot-col a:hover{color:var(--brand);text-decoration:underline}
.foot-legal{margin-top:var(--s7);padding-top:var(--s5);border-top:1px solid var(--line);
  display:flex;gap:var(--s5);flex-wrap:wrap;justify-content:space-between;
  color:var(--muted)}
.foot-legal p{margin:0;max-width:none}
footer strong{color:var(--ink)}

/* ---------- nav ----------------------------------------------------------- */
.nav{margin-left:auto;display:flex;align-items:center;gap:var(--s5)}
/* :not(.btn) matters. `.nav a` is specificity (0,1,1) and `.btn` is (0,1,0),
   so without it the nav rule wins and the CTA renders dark text on a blue pill. */
.nav a:not(.btn){color:var(--body);font-size:var(--t-small);font-weight:500;text-decoration:none}
.nav a:not(.btn):hover{color:var(--ink);text-decoration:none}
.nav .btn{height:38px;padding:0 var(--s5);font-size:var(--t-small);line-height:38px;
  white-space:nowrap;flex:none}

/* 3. Below 720px the nav links do not fit beside the CTA. Drop the links and
      keep the one action. A three-item nav that wraps is worse than no nav. */
@media (max-width:720px){
  .nav a:not(.btn){display:none}
  .nav{gap:var(--s3)}
  .bar{padding:var(--s2) 0}
  .foot-grid{grid-template-columns:1fr;gap:var(--s5)}
}

/* ---------- sample report, shown inline on the landing page --------------- */
.paper{background:var(--bg);border-radius:var(--r-card);box-shadow:var(--e-card);
  padding:var(--s5) var(--s6);max-width:520px}
.paper .ph{display:flex;align-items:baseline;justify-content:space-between;
  gap:var(--s4);padding-bottom:var(--s3);border-bottom:1px solid var(--line);
  margin-bottom:var(--s4)}
.paper .ph b{font:600 var(--t-body)/1.3 var(--font-sans);color:var(--ink)}
.paper .row-i{display:flex;justify-content:space-between;gap:var(--s4);
  padding:var(--s2) 0;font-size:var(--t-small);border-bottom:1px solid var(--line)}
.paper .row-i:last-of-type{border-bottom:0}
.paper .row-i span:last-child{font-variant-numeric:tabular-nums;font-weight:600;color:var(--ink)}

@media print{
  /* The ONE place raw values are allowed: paper is white and ink is black
     whatever the theme is. A dark theme must not print as a black rectangle. */
  .inv,footer{background:#fff!important;color:#333!important}
  .inv h1,.inv h2,.inv h3{color:#000!important}
  .card,ol.steps li{box-shadow:none;border:1px solid var(--line)}
  .btn,.cta{display:none!important}
}
@media (max-width:640px){
  .row{flex-direction:column;gap:0}.btn{width:100%}
  section{padding:var(--s7) 0}.hero{padding:var(--s7) 0 var(--s6)}
}


/* ---------- mascots ------------------------------------------------------
   Line art from hounds/. Decorative only: always alt="", never load-bearing.
   The stroke is fine, so do not render below ~90px. */
.mascot{display:block;height:auto;opacity:.9}
.why{display:grid;gap:var(--s7);align-items:center;
  grid-template-columns:minmax(0,1fr) auto}
.why .spec{grid-template-columns:repeat(3,1fr)}
@media (max-width:700px){.why .spec{grid-template-columns:1fr 1fr}}
@media (max-width:820px){
  .why{grid-template-columns:1fr;gap:var(--s5)}
  .why .mascot{width:140px;justify-self:start}
}
