:root{
  --navy:#0f2338; --ink:#12202f; --brass:#b98a3e; --cream:#f6f1e7;
  --line:#e4dccd; --ok:#2f7d4f; --warn:#b5872b; --err:#b23b3b; --muted:#6b7685;
}
*{box-sizing:border-box}
body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  color:var(--ink);background:#f3efe6;-webkit-text-size-adjust:100%}
.topbar{position:sticky;top:0;z-index:5;display:flex;align-items:center;justify-content:space-between;
  padding:14px 18px;background:var(--navy);color:#fff;box-shadow:0 2px 10px rgba(0,0,0,.15)}
.brand{font-weight:700;letter-spacing:.3px;display:flex;align-items:center;gap:10px}
.mark{display:inline-grid;place-items:center;width:30px;height:30px;border-radius:8px;
  background:var(--brass);color:var(--navy);font-weight:800;font-size:.8rem}
.who{font-size:.8rem;opacity:.8}
.wrap{max-width:720px;margin:0 auto;padding:18px 14px 60px}
.card{background:#fff;border:1px solid var(--line);border-radius:16px;padding:20px;margin-bottom:16px;
  box-shadow:0 1px 3px rgba(20,32,47,.05)}
.gate{max-width:420px;margin:40px auto}
h1{font-size:1.3rem;margin:0 0 6px}
.muted{color:var(--muted);font-size:.9rem;margin:.2rem 0 1rem}
.err{color:var(--err);font-size:.88rem}
input,select{width:100%;padding:12px 14px;border:1px solid var(--line);border-radius:12px;font-size:1rem;
  background:#fbf9f4;margin-bottom:12px}
.btn{border:0;border-radius:12px;padding:12px 16px;font-size:1rem;font-weight:600;cursor:pointer}
.btn.primary{background:var(--navy);color:#fff;width:100%}
.btn.ghost{background:transparent;border:1px solid var(--line);color:var(--navy)}
.btn.ok{background:var(--ok);color:#fff}
.btn.small{padding:8px 12px;font-size:.85rem}
.qhead{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.qcard{background:#fff;border:1px solid var(--line);border-radius:16px;overflow:hidden;margin-bottom:16px;
  box-shadow:0 1px 3px rgba(20,32,47,.05)}
.qtop{display:flex;gap:12px;padding:14px;align-items:flex-start;border-bottom:1px solid var(--line)}
.thumbs{display:flex;gap:8px;flex-wrap:wrap;margin:0 14px 12px}
.thumbs img{width:84px;height:84px;object-fit:cover;border-radius:10px;border:1px solid var(--line)}
.badge{display:inline-block;padding:3px 9px;border-radius:999px;font-size:.72rem;font-weight:700;letter-spacing:.02em}
.badge.queued{background:#eef1f5;color:#48566a}
.badge.ai_analyzed{background:#e7f2ea;color:var(--ok)}
.badge.manual_required{background:#fbf1dd;color:var(--warn)}
.badge.approved{background:#0f2338;color:#fff}
.cust{font-weight:700}
.sub{color:var(--muted);font-size:.85rem}
.prov{font-size:.8rem;color:var(--muted);margin:0 14px 6px}
.counts{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;padding:0 14px 6px}
.counts label{font-size:.72rem;color:var(--muted);display:block;margin-bottom:4px;font-weight:600;text-transform:uppercase;letter-spacing:.04em}
.counts input{margin-bottom:0;text-align:center;font-weight:700;font-size:1.1rem}
.est{padding:10px 14px;font-size:1.05rem}
.est b{font-size:1.3rem;color:var(--navy)}
.actions{display:flex;gap:10px;padding:12px 14px 16px}
.actions .btn{flex:1}
.notes{font-size:.82rem;color:var(--muted);padding:0 14px 12px}
.toast{position:fixed;left:50%;bottom:20px;transform:translateX(-50%);background:var(--navy);color:#fff;
  padding:12px 18px;border-radius:12px;font-size:.9rem;box-shadow:0 6px 24px rgba(0,0,0,.25)}

.cols2{grid-template-columns:1fr 1fr !important}
.fld{display:block;font-size:.72rem;color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:.04em;margin-bottom:10px}
.fld input{margin-top:6px;text-transform:none}

/* ---------------- accessibility floor (WCAG 2.2 AA) ----------------
   Shared by /quote.html, /rate.html and /review.html, which all load this sheet.

   What this block fixes, all of it real defect rather than polish:
     - a skip link existed on the generated marketing pages and on none of these;
     - `.fld` was written for a label WRAPPING its input. The inputs are now siblings addressed by
       `for=`, because a wrapping label with placeholder-only fields is what left four boxes on the
       quote form unlabelled — so the spacing that used to come from `.fld input` is restored here;
     - `.counts input{text-align:center}` was written for window COUNTS and was centring people's
       names on the quote form. Scoped off the two-column contact rows;
     - focus was invisible against the cream background on every control;
     - the star buttons and the file input were under the 44px target minimum (2.5.8);
     - nothing here relies on colour alone: `.err` keeps its own marker. */
.skip{position:absolute;left:-9999px;min-height:44px;display:flex;align-items:center}
.skip:focus{left:12px;top:12px;z-index:99;background:var(--navy);color:#fff;padding:10px 16px;border-radius:8px}
:focus-visible{outline:3px solid var(--brass);outline-offset:2px}

label{display:block}
.fld+input,.fld+select,.fld+textarea{margin-top:6px;text-transform:none}
.counts label{margin-bottom:4px}
.cols2 input{text-align:left;font-weight:400;font-size:1rem}
input,select,textarea{min-height:48px}
input[type=file]{min-height:48px;padding:12px 14px;background:#fbf9f4}
.btn{min-height:48px}
.err[hidden]{display:none}
.err::before{content:"! ";font-weight:800}
.card[tabindex]:focus-visible{outline:3px solid var(--brass);outline-offset:3px}

/* Star rating: real radio semantics on the buttons (see rate.html/rate.js), sized as targets. */
.stars .star{min-width:44px;min-height:44px}

@media(prefers-reduced-motion:reduce){
  *{animation-duration:.001ms !important;animation-iteration-count:1 !important;transition-duration:.001ms !important;scroll-behavior:auto !important}
}
