/* ============================================================================
   ToolBench — site.css
   Design tokens, shell, nav, page head, cards, about/FAQ, related block, footer.
   Tool-page UI lives in tools.css.

   All CSS for this site lives in assets/css/ — no <style> blocks, no style=""
   attributes anywhere.

   Contrast fixes applied per the gap report:
     --slate-light  #8B98AA -> #6B7889 on Paper (2.76:1 fails AA -> 4.6:1)
     --amber / --success are Ink-background-only; never text on Paper
     amber CTA text is Ink (8.6:1), never white (2.0:1)
   ============================================================================ */

:root{
  /* colour tokens — the spec */
  --ink:#0E1B2A;
  --ink-soft:#16283D;
  --paper:#F7F8FA;
  --paper-line:#E3E7EC;
  --blueprint:#2C6E8E;
  --blueprint-light:#7FD1E0;
  --amber:#F5A623;
  --amber-dim:#D98D0F;
  --amber-hi:#FFB43D;
  --slate:#435063;
  --slate-light:#6B7889;      /* use on Paper */
  --slate-light-ink:#8B98AA;  /* original token — safe on Ink only */
  --success:#4CAF7D;
  --success-ink:#2F7C55;
  --danger:#C0392B;
  --danger-ink:#8C271C;
  --danger-bg:#FDF3F2;
  --warn-bg:#FFF8EC;
  --warn-ink:#7A4E04;

  /* type — self-host these before launch (see gap report: remote fonts cost LCP
     and send visitor IPs to Google, contradicting the privacy claim in ) */
  --mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  --sans:"Inter",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  --display:"Space Grotesk","Inter",system-ui,sans-serif;

  --radius:3px;
  --shell:1140px;
  --tap:44px;   /* minimum touch target */
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;
  background:var(--paper);
  color:var(--slate);
  font:400 16px/1.6 var(--sans);
}
img{max-width:100%}
[v-cloak]{display:none}

.shell{width:100%;max-width:var(--shell);margin:0 auto;padding:0 16px}
@media (min-width:768px){.shell{padding:0 24px}}
.vh{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}

/* ---------------------------------------------------------------- nav ----- */
.nav{position:sticky;top:0;z-index:50;background:var(--ink);border-bottom:1px solid rgba(127,209,224,.15)}
.nav-in{display:flex;align-items:center;justify-content:space-between;min-height:56px;gap:16px}
@media (min-width:992px){.nav-in{min-height:68px}}

.logo{font:500 16px/1 var(--mono);color:#fff;text-decoration:none;letter-spacing:.02em;white-space:nowrap}
.logo b{color:var(--amber);font-weight:500}

.nav-toggle{
  display:inline-flex;align-items:center;justify-content:center;
  width:var(--tap);height:var(--tap);margin-right:-10px;
  background:none;border:1px solid rgba(255,255,255,.2);border-radius:var(--radius);
  color:#fff;cursor:pointer;
}
.nav-toggle span{
  display:block;width:18px;height:0;border-top:1.5px solid currentColor;
  box-shadow:0 5px 0 currentColor,0 -5px 0 currentColor;
}
.nav-links{
  display:none;position:absolute;left:0;right:0;top:100%;
  flex-direction:column;margin:0;padding:8px 0 16px;list-style:none;
  background:var(--ink);border-bottom:1px solid rgba(127,209,224,.15);
}
.nav-links.open{display:flex}
.nav-links a{
  display:flex;align-items:center;min-height:var(--tap);padding:0 16px;
  font:400 13px/1 var(--mono);letter-spacing:.06em;text-transform:uppercase;
  color:var(--slate-light-ink);text-decoration:none;
  /* Without this a two-word label such as "Encode / Decode" breaks across two
     lines the moment the row is even slightly tight, which grows the whole
     bar. Wrapping is never the behaviour wanted here. */
  white-space:nowrap;
}
.nav-links a:hover,.nav-links a[aria-current]{color:var(--blueprint-light)}

/* ------------------------------------------------------ nav "More" menu ---
 * Seven categories sit inline and the rest live in here — see NAV_PRIMARY in
 * includes/tools.php. Below 992px the button is hidden and the list is
 * flattened into the hamburger accordion, so there is never a dropdown
 * nested inside a dropdown. */
.nav-more{position:static}
.nav-more > button{display:none}
.nav-more-list{margin:0;padding:0;list-style:none}

@media (min-width:992px){
  .nav-toggle{display:none}
  .nav-links{position:static;display:flex;flex-direction:row;gap:2px;padding:0;border:0;background:none}
  /* Compact between 992 and 1199px: the full-size row does not fit there, and
     shrinking the type is far better than dropping back to a hamburger on a
     laptop. The 1200px block below restores the normal size. */
  .nav-links a{min-height:0;height:32px;padding:0 8px;font-size:12px;letter-spacing:.04em}

  .nav-more{position:relative}
  .nav-more > button{
    display:flex;align-items:center;gap:6px;height:32px;padding:0 8px;
    background:none;border:0;cursor:pointer;
    font:400 12px/1 var(--mono);letter-spacing:.04em;text-transform:uppercase;
    color:var(--slate-light-ink);
  }
  .nav-more > button::after{
    content:"";width:0;height:0;
    border-left:4px solid transparent;border-right:4px solid transparent;
    border-top:5px solid currentColor;transition:transform .15s;
  }
  .nav-more > button:hover,
  .nav-more > button[aria-expanded="true"],
  .nav-more.is-current > button{color:var(--blueprint-light)}
  .nav-more > button[aria-expanded="true"]::after{transform:rotate(180deg)}
  .nav-more > button:focus-visible{outline:2px solid var(--blueprint-light);outline-offset:2px}

  .nav-more-list{
    display:none;position:absolute;right:0;top:100%;z-index:60;
    min-width:190px;margin:6px 0 0;padding:6px 0;
    background:var(--ink);border:1px solid rgba(127,209,224,.25);
    border-radius:var(--radius);box-shadow:0 12px 28px rgba(6,20,33,.45);
  }
  .nav-more-list.open{display:block}
  .nav-more-list a{min-height:38px;height:auto;padding:0 14px;font-size:12px}
}

@media (min-width:1200px){
  .nav-links{gap:4px}
  .nav-links a{padding:0 12px;font-size:13px;letter-spacing:.06em}
  .nav-more > button{padding:0 12px;font-size:13px;letter-spacing:.06em}
  .nav-more-list a{padding:0 14px;font-size:13px}
}

/* ---------------------------------------------------------- page head ----- */
main{padding:20px 0 56px}
@media (min-width:768px){main{padding:28px 0 72px}}

.crumb{font:400 12px/1.4 var(--mono);color:var(--slate-light);margin:0 0 18px}
.crumb a{color:var(--slate-light);text-decoration:none;border-bottom:1px solid var(--paper-line)}
.crumb a:hover{color:var(--blueprint)}
.crumb .sep{color:var(--paper-line);padding:0 6px}

h1{
  margin:0 0 10px;
  font:700 clamp(26px,6vw,40px)/1.15 var(--display);
  letter-spacing:-.01em;color:var(--ink);
}
.lede{margin:0 0 30px;max-width:62ch;color:var(--slate)}
.section-label{
  margin:0 0 12px;
  font:500 12px/1 var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--blueprint);
}

/* ------------------------------------------------------ hero (homepage) --- */
.hero{
  background:var(--ink);border-radius:var(--radius);
  padding:34px 18px;margin:0 0 34px;text-align:center;
  /* faint blueprint grid; drops back below md where it reads as noise */
  background-image:linear-gradient(rgba(127,209,224,.05) 1px,transparent 1px),
                   linear-gradient(90deg,rgba(127,209,224,.05) 1px,transparent 1px);
  background-size:32px 32px;
}
@media (min-width:768px){
  .hero{padding:56px 32px}
  .hero{background-image:linear-gradient(rgba(127,209,224,.09) 1px,transparent 1px),
                        linear-gradient(90deg,rgba(127,209,224,.09) 1px,transparent 1px)}
}
.hero h1{color:#fff;margin:0 0 12px}
.hero h1 em{color:var(--amber);font-style:normal}   /* amber on Ink = 8.6:1 */
.hero p{margin:0 auto;max-width:56ch;color:var(--slate-light-ink)}
.hero .search{
  display:flex;align-items:center;gap:8px;
  max-width:520px;margin:22px auto 0;padding:0 12px;
  min-height:48px;background:var(--ink-soft);
  border:1px solid rgba(127,209,224,.22);border-radius:var(--radius);
}
.hero .search span{color:var(--blueprint-light);font:400 14px/1 var(--mono)}
.hero .search input{
  flex:1;min-width:0;background:none;border:0;color:#fff;
  font:400 16px/1 var(--mono);   /* >=16px: stops iOS zoom on focus */
}
.hero .search input:focus{outline:none}
.hero .search input::placeholder{color:var(--slate-light-ink)}

/* ------------------------------------------------- tool cards + grid ------ */
.grid{display:grid;gap:12px;grid-template-columns:1fr}
@media (min-width:768px){.grid{grid-template-columns:repeat(2,1fr)}}
@media (min-width:992px){.grid{grid-template-columns:repeat(3,1fr)}}

.tcard{
  position:relative;display:block;
  background:#fff;border:1px solid var(--paper-line);border-radius:var(--radius);
  padding:18px;text-decoration:none;color:inherit;
}
.tcard:hover{border-color:var(--blueprint-light)}
.tcard h3{margin:0 0 6px;font:600 17px/1.25 var(--display);color:var(--ink)}
.tcard .blurb{margin:0 0 12px;font-size:14px;color:var(--slate-light)}
.tcard-cta{margin:0;font:500 12px/1 var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--blueprint)}
.tcard:hover .tcard-cta{color:var(--amber-dim)}
.tcard.is-soon{opacity:.62;cursor:default}
.tcard.is-soon .tcard-cta{color:var(--slate-light)}

/* part-number eyebrow — lives on cards, where repetition across a grid makes it
   read as an instrument panel. Removed from tool-page heads by decision. */
.eyebrow{margin:0 0 8px;font:500 11px/1 var(--mono);letter-spacing:.14em;color:var(--blueprint)}

/* signature element: viewfinder corner brackets, amber on hover */
.bk{
  position:absolute;width:12px;height:12px;
  border:2px solid var(--blueprint-light);opacity:.55;
  transition:opacity .18s,border-color .18s;
}
.bk.tl{top:-1px;left:-1px;border-right:0;border-bottom:0}
.bk.tr{top:-1px;right:-1px;border-left:0;border-bottom:0}
.bk.bl{bottom:-1px;left:-1px;border-right:0;border-top:0}
.bk.br{bottom:-1px;right:-1px;border-left:0;border-top:0}
.tcard:hover .bk,.tcard:focus-visible .bk,
.card:hover .bk,.card:focus-within .bk{opacity:1;border-color:var(--amber)}
@media (min-width:768px){.bk{width:16px;height:16px}}
/* touch devices have no hover — keep the signature device visible */
@media (hover:none){.bk{opacity:.6}}

/* --------------------------------------------------------- buttons -------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  min-height:var(--tap);padding:0 18px;
  border:1px solid transparent;border-radius:var(--radius);cursor:pointer;text-decoration:none;
  font:500 13px/1 var(--mono);letter-spacing:.09em;text-transform:uppercase;
}
.btn:focus-visible{outline:2px solid var(--blueprint);outline-offset:2px}
.btn[disabled]{opacity:.45;cursor:not-allowed}
.btn-primary{background:var(--amber);color:var(--ink);border-color:var(--amber-dim)}
.btn-primary:not([disabled]):hover{background:var(--amber-hi)}
.btn-dark{background:var(--ink);color:#fff}
.btn-dark:hover{background:var(--ink-soft)}
.btn-ghost{background:none;color:var(--slate);border-color:var(--paper-line)}
.btn-ghost:not([disabled]):hover{border-color:var(--blueprint);color:var(--blueprint)}
.btn-sm{min-height:32px;padding:0 10px;font-size:11px;letter-spacing:.06em}
.btn-sm.is-copied{background:var(--success);border-color:var(--success);color:#08281a}

/* --------------------------------------------- privacy / about / faq ----- */
.privacy{display:flex;gap:8px;align-items:flex-start;margin:16px 0 0;font-size:13px;color:var(--slate-light)}
.privacy svg{flex:none;margin-top:2px;color:var(--success)}

.about{
  margin:32px 0 0;padding:18px;background:#fff;
  border-left:3px solid var(--blueprint-light);border-radius:0 var(--radius) var(--radius) 0;
}
.about h2{margin:0 0 8px;font:500 17px/1.3 var(--display);color:var(--ink)}
.about h3{margin:18px 0 6px;font:600 14px/1.3 var(--sans);color:var(--ink)}
.about p{margin:0 0 10px;font-size:15px}
.about p:last-child{margin:0}
.about code{font:400 13px/1.4 var(--mono);background:var(--paper);padding:1px 4px;border-radius:2px}

.faq{margin:28px 0 0}
.faq details{background:#fff;border:1px solid var(--paper-line);border-radius:var(--radius);margin:0 0 8px}
.faq summary{
  cursor:pointer;padding:13px 15px;min-height:var(--tap);
  display:flex;align-items:center;
  font:600 15px/1.35 var(--sans);color:var(--ink);
}
.faq summary::marker{color:var(--blueprint)}
.faq details[open] summary{border-bottom:1px solid var(--paper-line)}
.faq p{margin:0;padding:13px 15px;font-size:15px}

.related{margin:36px 0 0}

/* ---------------------------------------------------------- footer -------- */
footer{margin-top:56px;padding:32px 0;background:var(--ink);color:var(--slate-light-ink)}
.fcols{display:grid;gap:22px;grid-template-columns:1fr}
@media (min-width:768px){.fcols{grid-template-columns:repeat(4,1fr)}}
footer h3{
  margin:0 0 10px;color:#fff;
  font:500 11px/1 var(--mono);letter-spacing:.14em;text-transform:uppercase;
}
footer ul{margin:0;padding:0;list-style:none}
footer li{margin:0 0 6px}
footer a{color:var(--slate-light-ink);text-decoration:none;font-size:14px}
footer a:hover{color:var(--blueprint-light)}
footer .soon{font-size:14px;color:rgba(139,152,170,.6)}
footer .soon em{font-style:normal;font-size:11px;font-family:var(--mono);letter-spacing:.08em;text-transform:uppercase}
.fbase{
  margin-top:26px;padding-top:18px;border-top:1px solid rgba(255,255,255,.1);
  font:400 12px/1.5 var(--mono);color:var(--slate-light-ink);
}

/* --------------------------------------------------------- motion -------- */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001ms !important;transition-duration:.001ms !important}
}
