/* ─── tokens ─────────────────────────────────────────────────────────────
   Palette taken from the trade, not the tourist brochure: drafting ink,
   sage-gray mylar sheet, cyanotype blue for structure, mango for action. */
:root{
  --ink:      #0E1A1E;
  --ink-70:   #3A4A4E;
  --ink-45:   #6C7B7E;
  --sheet:    #D8DFDC;
  --sheet-hi: #E6EBE8;
  --sheet-lo: #C5CFCB;
  --cyan:     #2C6070;
  --mango:    #DE8B24;
  --line:     rgba(14,26,30,.22);
  --line-hi:  rgba(14,26,30,.42);

  --display: "Arial Narrow", "Helvetica Neue Condensed", "Liberation Sans Narrow", sans-serif;
  --body:    ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --mono:    ui-monospace, "SF Mono", "Menlo", "Consolas", monospace;

  --gut: clamp(18px, 4vw, 48px);
  --max: 1240px;
  --edge: clamp(10px, 2vw, 22px);   /* breathing room outside the panels */

  /* corner radii — panels, controls, pills */
  --r:    clamp(16px, 2.2vw, 28px);
  --r-sm: 12px;
  --r-xs: 8px;

  --surface: color-mix(in srgb, var(--sheet-hi) 74%, transparent);
}
/* Dark values live in one place so a page can force them with
   <html data-theme="dark"> instead of waiting on the system setting. */
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]){
    --ink:#DCE4E1; --ink-70:#A9B6B3; --ink-45:#7C8A87;
    --sheet:#0F1719; --sheet-hi:#182225; --sheet-lo:#0A1113;
    --cyan:#6FB0C4; --mango:#F0A544;
    --line:rgba(220,228,225,.20); --line-hi:rgba(220,228,225,.40);
  }
}
:root[data-theme="dark"]{
  --ink:#DCE4E1; --ink-70:#A9B6B3; --ink-45:#7C8A87;
  --sheet:#0F1719; --sheet-hi:#182225; --sheet-lo:#0A1113;
  --cyan:#6FB0C4; --mango:#F0A544;
  --line:rgba(220,228,225,.20); --line-hi:rgba(220,228,225,.40);
  color-scheme:dark;
}

*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0; background:var(--sheet); color:var(--ink);
  font-family:var(--body); font-size:16px; line-height:1.6;
  /* graph paper, faint — the surface he actually draws on */
  background-image:
    linear-gradient(var(--line) .5px, transparent .5px),
    linear-gradient(90deg, var(--line) .5px, transparent .5px);
  background-size:26px 26px;
  background-position:-.5px -.5px;
}
img{max-width:100%}
:focus-visible{outline:2px solid var(--mango); outline-offset:3px}
/* the hidden attribute must win over any display a component sets, or an
   element told to hide simply carries on showing */
[hidden]{display:none !important}

/* the plan being drawn behind everything — walls streak in, a new plan per screen */
#plan{position:fixed; inset:0; width:100%; height:100%; z-index:0; pointer-events:none}
.top, main, footer{position:relative}
/* main sits above the footer: both were z-index 1, so the footer won on DOM
   order and painted over any drop-down that hung past the end of a section */
footer{z-index:1}
main{z-index:2}

/* ─── drafting primitives ─── */
.sheet{width:min(var(--max), 100% - var(--edge)*2); margin-inline:auto; padding-inline:var(--gut)}
.rule{height:1px; background:var(--line-hi); border:0; margin:0}

.eyebrow{
  font-family:var(--mono); font-size:11px; letter-spacing:.16em;
  text-transform:uppercase; color:var(--ink-45);
  display:flex; align-items:center; gap:12px;
}
.eyebrow::after{content:""; flex:1; height:1px; background:var(--line)}

h1,h2,h3{font-family:var(--display); font-weight:700; letter-spacing:-.005em; margin:0; text-transform:uppercase}
h1{font-size:clamp(38px,7.4vw,86px); line-height:.94}
h2{font-size:clamp(26px,4.2vw,46px); line-height:1.02}
h3{font-size:clamp(17px,2vw,21px); line-height:1.2; letter-spacing:.02em}
p{margin:0 0 1em}
a{color:inherit}

.lede{font-size:clamp(16px,1.9vw,19px); color:var(--ink-70); max-width:54ch}

/* ─── opening screen ───────────────────────────────────────────────
   The door. Photo full bleed when there is one; when there isn't, the
   panel goes translucent and the floor plan drawing behind becomes the
   backdrop instead — deliberate either way. */
body.gated{overflow:hidden}
/* while the gate is up, the site itself stays out of sight — the only thing
   visible behind the translucent panel is the plan drawing itself */
.top, main, footer{transition:opacity .55s ease .1s}
body.gated .top, body.gated main, body.gated footer{opacity:0}

#gate{
  position:fixed; inset:0; z-index:60;
  display:grid; align-content:center;
  background:color-mix(in srgb, var(--sheet) 78%, transparent);
  transition:opacity .5s ease, transform .5s cubic-bezier(.4,0,.2,1);
}
#gate.shut{opacity:0; transform:translateY(-2.5%); pointer-events:none}

#gate .shot{
  position:absolute; inset:0; background-size:cover; background-position:center 26%;
  opacity:0; transition:opacity .8s ease;
}
#gate.lit{background:#0E1A1E}
#gate.lit .shot{opacity:1}
/* Over a photo the type goes light on a dark scrim. Portraits are rarely bright
   enough to carry dark text, and a scrim heavy enough to fix that would grey him
   out. Weighted to the left and bottom so his face stays clear. */
#gate.lit .shot::after{
  content:""; position:absolute; inset:0;
  background:
    linear-gradient(90deg, rgba(8,14,16,.86) 0%, rgba(8,14,16,.55) 42%, rgba(8,14,16,.12) 72%),
    linear-gradient(0deg,  rgba(8,14,16,.80) 0%, rgba(8,14,16,.10) 55%);
}
#gate.lit .gate-name{color:#F2F5F3}
#gate.lit .gate-line{color:#C9D4D1}
#gate.lit .gate-mark{color:#93A3A0}
#gate.lit .gate-mark::after{background:rgba(242,245,243,.28)}
#gate.lit .gate-role{color:#A9B6B3}
#gate.lit .btn.ghost{color:#F2F5F3; border-color:rgba(242,245,243,.55)}
#gate.lit .btn.ghost:hover{background:#F2F5F3; color:#0E1A1E}

.gate-in{
  position:relative; z-index:2;
  width:min(var(--max), 100% - var(--edge)*2); margin-inline:auto;
  padding-inline:var(--gut);
}
.gate-in > *{opacity:0; transform:translateY(14px); animation:rise .7s cubic-bezier(.2,.7,.3,1) forwards}
.gate-in > :nth-child(1){animation-delay:.10s}
.gate-in > :nth-child(2){animation-delay:.20s}
.gate-in > :nth-child(3){animation-delay:.30s}
.gate-in > :nth-child(4){animation-delay:.42s}
.gate-in > :nth-child(5){animation-delay:.54s}
.gate-in > :nth-child(6){animation-delay:.66s}
.gate-in > :nth-child(7){animation-delay:.78s}

/* the mark opens the sequence — it arrives before the name */
.gate-logo{
  display:block; width:clamp(46px,6.5vw,66px); height:auto;
  color:var(--cyan); overflow:visible; margin-bottom:26px;
}
#gate.lit .gate-logo{color:#7FBFD3}
@keyframes rise{to{opacity:1; transform:none}}

.gate-mark{
  font-family:var(--mono); font-size:11px; letter-spacing:.18em; text-transform:uppercase;
  color:var(--ink-45); display:flex; align-items:center; gap:12px; margin-bottom:22px;
}
.gate-mark::after{content:""; flex:1; height:1px; background:var(--line-hi); max-width:190px}
/* On a narrow screen the flex row breaks the name across two ragged lines.
   Drop to normal text flow and lose the rule — it has no room to sit anyway. */
@media (max-width:560px){
  .gate-mark{display:block; font-size:10px; letter-spacing:.1em}
  .gate-mark::after{display:none}
}
/* Deliberately not an h1 — the hero headline behind it is the page's h1, and
   two of them muddies both the outline and the search snippet. */
.gate-name{
  font-family:var(--display); font-weight:700; text-transform:uppercase;
  letter-spacing:-.005em; color:var(--ink);
  font-size:clamp(42px,9vw,104px); line-height:.92; margin:0 0 6px;
}
/* the slogan sits directly under the name, before the trade description —
   it is the promise, the line below is the job */
.gate-slogan{
  font-family:var(--display); text-transform:uppercase; font-weight:700;
  font-size:clamp(17px,2.4vw,27px); line-height:1.05; letter-spacing:.01em;
  color:var(--cyan); margin:0 0 12px; max-width:20ch;
}
#gate.lit .gate-slogan{color:#7FBFD3}

.gate-role{
  font-family:var(--mono); font-size:clamp(11px,1.5vw,13px); letter-spacing:.2em;
  text-transform:uppercase; color:var(--ink-45); margin-bottom:24px;
}
.gate-line{font-size:clamp(16px,2vw,20px); color:var(--ink-70); max-width:38ch; margin-bottom:36px}

.gate-btns{display:flex; gap:12px; flex-wrap:wrap; align-items:center}
.gate-btns .btn{padding:16px 26px; font-size:13px}

/* ── appointment drop-down ──
   The two ways in live inside this instead of sitting loose on the page. */
.drop{position:relative}
#apptBtn{cursor:pointer; font:inherit; font-family:var(--mono); font-size:13px;
  letter-spacing:.09em; text-transform:uppercase; padding:16px 26px}
#apptBtn .caret{transition:transform .2s ease}
.drop.open #apptBtn .caret{transform:rotate(180deg)}

.drop-menu{
  position:absolute; left:0; top:calc(100% + 10px); min-width:100%;
  background:var(--sheet-hi); border:1px solid var(--line-hi);
  border-radius:var(--r-sm); padding:6px; display:grid; gap:2px; z-index:5;
  opacity:0; visibility:hidden; transform:translateY(-6px);
  transition:opacity .18s ease, transform .18s ease, visibility .18s;
  box-shadow:0 14px 34px rgba(8,14,16,.18);
}
/* bridges the 10px gap so the pointer can travel button → menu without it closing */
.drop-menu::before{content:""; position:absolute; left:0; right:0; top:-12px; height:12px}
.drop.open .drop-menu{opacity:1; visibility:visible; transform:none}
.drop-menu a, .drop-menu button{
  display:block; width:100%; text-align:left; cursor:pointer;
  padding:12px 18px; text-decoration:none; white-space:nowrap;
  border:0; background:none;
  border-radius:calc(var(--r-sm) - 5px); color:var(--ink);
  font-family:var(--mono); font-size:12px; letter-spacing:.06em; text-transform:uppercase;
  transition:background .15s ease, color .15s ease, padding-left .18s cubic-bezier(.2,.7,.3,1);
}
.drop-menu a::after, .drop-menu button::after{
  content:"→"; margin-left:10px; opacity:.45; display:inline-block;
  transition:transform .18s cubic-bezier(.2,.7,.3,1);
}
.drop-menu a:hover, .drop-menu a:focus-visible,
.drop-menu button:hover, .drop-menu button:focus-visible{
  background:var(--cyan); color:var(--sheet-hi); padding-left:22px;
}
.drop-menu a:hover::after, .drop-menu button:hover::after{transform:translateX(4px)}
.drop-menu a:active, .drop-menu button:active{transform:scale(.98)}

/* a chosen district keeps a mark against it when you come back to the step */
.drop-menu button[aria-checked="true"]{color:var(--mango)}
.drop-menu button[aria-checked="true"]::before{content:"✓ "; opacity:.9}

/* ─── where: region menu, then district menu ─── */
.q-where{display:grid; grid-template-columns:1fr 1fr; gap:10px; max-width:620px}
@media (max-width:640px){ .q-where{grid-template-columns:1fr} }

.q-pick{position:relative}
.pick-cap{
  display:block; font-family:var(--mono); font-size:9.5px; letter-spacing:.16em;
  text-transform:uppercase; color:var(--ink-45); margin-bottom:6px;
}
.pick-btn{
  width:100%; justify-content:space-between; padding:13px 17px; font-size:12px;
  background:var(--sheet-hi); color:var(--ink); border-color:var(--line-hi);
}
.pick-btn:hover{background:var(--sheet-hi); border-color:var(--cyan)}
.pick-btn .lbl{text-align:left; white-space:nowrap; overflow:hidden; text-overflow:ellipsis}
.pick-btn .caret{transition:transform .2s ease; flex:none}
.q-pick.open .pick-btn .caret{transform:rotate(180deg)}

/* the district menu is inert until a region is chosen — say so, don't just fail */
.pick-btn:disabled{opacity:.45; cursor:not-allowed; transform:none; box-shadow:none}
.pick-btn:disabled:hover{border-color:var(--line-hi)}
#districtPick.ready .pick-btn{border-color:var(--mango)}

/* menu items carry a big heading and a quiet line under it */
/* Six districts is taller than the panel, so the menu used to spill across the
   footer. Cap it and let it scroll instead. */
.drop-menu.wide{
  min-width:max(100%, 260px); white-space:normal;
  max-height:min(300px, 46vh); overflow-y:auto; overscroll-behavior:contain;
}
/* items here are <a> in some menus and <button> in others — style both, or the
   heading and its note collapse onto one line */
.drop-menu.wide a, .drop-menu.wide button{white-space:normal; line-height:1.3; padding:13px 18px}
.drop-menu.wide a b, .drop-menu.wide button b{
  display:block; font-family:var(--display); font-size:17px; letter-spacing:.02em;
  text-transform:uppercase; margin-bottom:3px;
}
.drop-menu.wide a span, .drop-menu.wide button span{
  display:block; font-family:var(--mono); font-size:10.5px; letter-spacing:.04em;
  color:var(--ink-45); text-transform:none;
}
.drop-menu.wide a:hover span, .drop-menu.wide a:focus-visible span,
.drop-menu.wide button:hover span, .drop-menu.wide button:focus-visible span{color:inherit; opacity:.75}
.drop-menu.wide a::after, .drop-menu.wide button::after{display:none}
.drop-menu.wide button[aria-checked="true"] b::before{content:"✓ "}

/* the About tab reads as a tab, not a third button */
#gateAbout{
  font-family:var(--mono); font-size:12px; letter-spacing:.12em; text-transform:uppercase;
  color:var(--ink-70); text-decoration:none; padding:16px 6px;
  border-bottom:1px solid transparent; margin-left:6px;
}
#gateAbout:hover{color:var(--ink); border-bottom-color:var(--mango)}
#gate.lit #gateAbout{color:#C9D4D1}
#gate.lit #gateAbout:hover{color:#F2F5F3}
#gate.lit .drop-menu{background:#16232733; backdrop-filter:blur(14px); border-color:rgba(242,245,243,.3)}
#gate.lit .drop-menu a{color:#F2F5F3}

/* ── swipe up to enter ── slow float, bottom centre ── */
#gateSwipe{
  position:absolute; left:50%; bottom:clamp(18px,3.5vh,40px); translate:-50% 0;
  display:flex; flex-direction:column-reverse; align-items:center; gap:6px;
  background:none; border:0; padding:12px 18px; cursor:pointer; color:var(--ink-45);
  font-family:var(--mono); font-size:10px; letter-spacing:.18em; text-transform:uppercase;
  opacity:0; animation:rise .8s 1s cubic-bezier(.2,.7,.3,1) forwards;
}
#gateSwipe{transition:color .16s ease, transform .14s cubic-bezier(.2,.7,.3,1)}
#gateSwipe:hover{color:var(--ink)}
#gateSwipe:active{transform:translate(-50%,0) scale(.9); transition-duration:.06s}
#gateSwipe svg{width:24px; height:24px; animation:bob 2.8s ease-in-out infinite}
@keyframes bob{
  0%,100%{transform:translateY(5px); opacity:.5}
  50%    {transform:translateY(-5px); opacity:1}
}
#gate.lit #gateSwipe{color:#A9B6B3}
#gate.lit #gateSwipe:hover{color:#F2F5F3}
@media (max-height:620px){ #gateSwipe{display:none} }

/* ─── header ─── */
.top{position:sticky; top:0; z-index:20; padding-block:10px 4px}
.top-in{
  width:min(var(--max), 100% - var(--edge)*2); margin-inline:auto;
  padding:9px 9px 9px clamp(16px,2.4vw,24px);
  display:flex; align-items:center; gap:18px;
  background:var(--sheet-hi);
  background:color-mix(in srgb, var(--sheet-hi) 84%, transparent);
  backdrop-filter:blur(10px);
  border:1px solid var(--line-hi);
  border-radius:999px;
}
.mark{display:flex; align-items:center; gap:10px; text-decoration:none; margin-right:auto}
/* longer business names must stay on one line — a wrapped name makes the pill
   grow a second row and throws the whole header out */
.mark b{
  font-family:var(--display); font-size:clamp(14px,3.4vw,19px);
  letter-spacing:.03em; text-transform:uppercase; white-space:nowrap;
}
.north{width:23px; height:23px; flex:none; color:var(--cyan); overflow:visible}
.top nav{display:flex; gap:22px; font-family:var(--mono); font-size:11.5px; letter-spacing:.1em; text-transform:uppercase}
/* the underline grows out from the left rather than blinking on */
.top nav a{
  position:relative; text-decoration:none; color:var(--ink-70); padding:4px 0;
  transition:color .16s ease;
}
.top nav a::after{
  content:""; position:absolute; left:0; right:0; bottom:0; height:1px;
  background:var(--mango); transform:scaleX(0); transform-origin:left;
  transition:transform .22s cubic-bezier(.2,.7,.3,1);
}
.top nav a:hover{color:var(--ink)}
.top nav a:hover::after{transform:scaleX(1)}
.top nav a:active{color:var(--mango)}

/* the dimension line stretches out a touch when you reach for home */
.mark .north path:nth-of-type(1){transition:transform .28s cubic-bezier(.2,.7,.3,1); transform-origin:16px 16px}
.mark .north path:nth-of-type(2){transition:transform .28s cubic-bezier(.2,.7,.3,1); transform-origin:16px 28px}
.mark:hover .north path:nth-of-type(1){transform:translateY(-1px)}
.mark:hover .north path:nth-of-type(2){transform:scaleX(1.12)}
.mark .north{transition:transform .25s cubic-bezier(.2,.7,.3,1)}
.mark:active .north{transform:scale(.94)}
/* Below 820px the nav used to be hidden. That was fine when it pointed at
   anchors on one page; with three pages it strands phone visitors on whatever
   page they landed on. It drops to a second row inside the bar instead. */
@media (max-width:820px){
  .top-in{flex-wrap:wrap; row-gap:8px; border-radius:var(--r); padding:10px 12px 10px 16px}
  .mark{margin-right:auto}
  .top nav{
    order:3; width:100%; justify-content:space-between; gap:10px;
    font-size:11px; border-top:1px solid var(--line); padding-top:8px;
  }
  .top nav a{padding:2px 0}
}

/* ─── buttons ───────────────────────────────────────────────────────────
   Every pressable thing shares one motion curve: lift on hover, sink on
   press. The press state matters most — on a phone there is no hover, so
   without it a tap gives no feedback at all. */
.btn{
  display:inline-flex; align-items:center; gap:9px;
  font-family:var(--mono); font-size:12.5px; letter-spacing:.09em; text-transform:uppercase;
  padding:13px 22px; text-decoration:none; border:1px solid var(--ink);
  background:var(--ink); color:var(--sheet); border-radius:999px;
  cursor:pointer; -webkit-tap-highlight-color:transparent;
  transition:transform .16s cubic-bezier(.2,.7,.3,1), box-shadow .16s ease,
             background .16s ease, color .16s ease, border-color .16s ease;
}
.btn:hover{transform:translateY(-2px); box-shadow:0 8px 20px rgba(8,14,16,.20)}
.btn:active{transform:translateY(0) scale(.97); box-shadow:0 2px 6px rgba(8,14,16,.18); transition-duration:.06s}
.btn.ghost{background:transparent; color:var(--ink)}
.btn.ghost:hover{background:var(--ink); color:var(--sheet)}
.btn.go{background:var(--mango); border-color:var(--mango); color:#14100A}
.btn.go:hover{box-shadow:0 8px 22px color-mix(in srgb, var(--mango) 42%, transparent)}

/* arrow buttons nudge forward, so the direction of travel is felt */
.btn .arw{transition:transform .18s cubic-bezier(.2,.7,.3,1)}
.btn:hover .arw{transform:translateX(4px)}
.btn:active .arw{transform:translateX(1px)}

/* ─── section frame: each sheet in the set is its own rounded panel,
       translucent so the plan being drawn behind still reads through ─── */
main{padding-top:10px}
.sec{
  position:relative;
  padding-block:clamp(48px,6.4vw,88px);
  background:var(--sheet-hi);
  background:var(--surface);
  border:1px solid var(--line);
  border-radius:var(--r);
  margin-bottom:clamp(12px,1.6vw,20px);
}
.sec-head{display:flex; align-items:baseline; gap:16px; margin-bottom:34px; flex-wrap:wrap}
.sec-no{
  font-family:var(--mono); font-size:11px; letter-spacing:.14em;
  color:var(--cyan); border:1px solid var(--cyan); padding:3px 11px;
  border-radius:999px; flex:none;
}

/* ─── rhythm inside a sheet ────────────────────────────────────────────
   Every rule below replaces an inline style that was guessing at 14, 18, 20,
   30, 34 or 38px in a different file. Set once, so the sheets line up. */
.sec-head + .lede{margin-bottom:34px}
.sec > .eyebrow:first-child{margin-bottom:18px}
.sec .disc{max-width:70ch}
.lanes + .disc{margin-top:30px}
.sec .disc + p{margin-top:30px}
.about .eyebrow{margin-bottom:14px}
.chips + .disc{margin-top:18px}
footer .eyebrow{margin-bottom:18px}
footer h2{max-width:16ch}

/* ─── hero ─── */
.hero{padding-block:clamp(46px,7vw,80px) clamp(34px,5vw,58px)}
.hero-grid{display:grid; grid-template-columns:1.35fr .65fr; gap:clamp(24px,4vw,56px); align-items:end}
@media (max-width:900px){ .hero-grid{grid-template-columns:1fr} }
h1 .cy{color:var(--cyan)}
.hero .lede{margin-top:22px}
.hero-cta{display:flex; gap:12px; flex-wrap:wrap; margin-top:30px}

/* dimension line under the headline — draws itself on load */
.dim{display:block; width:100%; height:20px; margin-top:20px; color:var(--cyan); overflow:visible}
.dim line, .dim path{stroke:currentColor; stroke-width:1; fill:none}
.dim .span{stroke-dasharray:1400; stroke-dashoffset:1400; animation:draw 1.1s .15s cubic-bezier(.22,.7,.3,1) forwards}
.dim text{font-family:var(--mono); font-size:9.5px; fill:currentColor; letter-spacing:.1em;
  opacity:0; animation:fade .5s .95s forwards}
@keyframes draw{to{stroke-dashoffset:0}}
@keyframes fade{to{opacity:1}}

/* ─── title block — the signature element, straight off a real plan sheet ─── */
.tblock{
  border:1.5px solid var(--line-hi); background:var(--sheet-hi);
  border-radius:var(--r-sm); overflow:hidden;
  font-family:var(--mono); font-size:11px;
}
.tblock .row{display:grid; grid-template-columns:1fr 1fr; border-bottom:1px solid var(--line)}
.tblock .row:last-child{border-bottom:0}
.tblock .cell{padding:9px 11px; border-right:1px solid var(--line)}
.tblock .cell:last-child{border-right:0}
.tblock .k{font-size:9px; letter-spacing:.14em; color:var(--ink-45); text-transform:uppercase; display:block; margin-bottom:3px}
.tblock .v{color:var(--ink); font-size:12px}
.tblock .wide{grid-column:1/-1}
.tblock .big{font-family:var(--display); font-size:22px; text-transform:uppercase; letter-spacing:.02em}

/* ─── estimator ─── */
.est{display:grid; grid-template-columns:1fr 1fr; gap:clamp(20px,3vw,44px); align-items:start}
@media (max-width:920px){ .est{grid-template-columns:1fr} }
.field{margin-bottom:22px}
.field > label{display:block; font-family:var(--mono); font-size:10.5px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--ink-45); margin-bottom:9px}
select, input[type=number]{
  width:100%; font-family:var(--mono); font-size:14px; color:var(--ink);
  background:var(--sheet-hi); border:1px solid var(--line-hi);
  border-radius:var(--r-sm); padding:12px 14px;
}
select:focus, input:focus{outline:2px solid var(--mango); outline-offset:1px}
.opts{display:flex; gap:0; border:1px solid var(--line-hi); border-radius:var(--r-sm); overflow:hidden}
.opts label{flex:1; position:relative}
.opts input{position:absolute; opacity:0; width:100%; height:100%; margin:0; cursor:pointer}
.opts span{
  display:block; padding:11px 8px; text-align:center; cursor:pointer;
  font-family:var(--mono); font-size:11px; letter-spacing:.08em; text-transform:uppercase;
  border-right:1px solid var(--line-hi); color:var(--ink-70);
}
.opts label:last-child span{border-right:0}
.opts input:checked + span{background:var(--cyan); color:var(--sheet-hi)}
.opts input:focus-visible + span{outline:2px solid var(--mango); outline-offset:-2px}
.finish-note{font-size:13px; color:var(--ink-45); margin-top:9px; min-height:1.4em}

/* the readout is styled as a bill of quantities, because that is what he sells */
.boq{border:1.5px solid var(--line-hi); background:var(--sheet-hi); border-radius:var(--r-sm); overflow:hidden}
.boq-top{padding:13px 16px; border-bottom:1px solid var(--line-hi); display:flex; justify-content:space-between; align-items:center}
.boq-top span{font-family:var(--mono); font-size:10px; letter-spacing:.14em; text-transform:uppercase; color:var(--ink-45)}
.boq-body{padding:20px 16px}
.amt{font-family:var(--display); font-size:clamp(30px,5.2vw,52px); line-height:1; letter-spacing:-.01em}
.amt .cur{font-family:var(--mono); font-size:14px; color:var(--ink-45); letter-spacing:.1em; margin-right:8px; vertical-align:.55em}
.amt-sub{font-family:var(--mono); font-size:13px; color:var(--ink-70); margin-top:9px}
.boq-lines{margin-top:20px; border-top:1px solid var(--line)}
.boq-lines div{display:flex; justify-content:space-between; gap:14px; padding:8px 0;
  border-bottom:1px solid var(--line); font-family:var(--mono); font-size:12px; color:var(--ink-70)}
.boq-lines div b{color:var(--ink); font-weight:400}
.disc{font-size:12.5px; color:var(--ink-45); margin-top:16px; line-height:1.5}

/* ═══ ESTIMATE QUESTIONNAIRE ═══════════════════════════════════════════
   One question on screen at a time. Answering advances it, so the whole
   thing is four taps rather than a form to fill in. */
/* The questionnaire runs tighter than the reading sections — it is a control
   panel, not prose, and every empty band is one more scroll before the answer. */
#estimate{padding-block:clamp(30px,3.4vw,46px)}
#estimate .sec-head{margin-bottom:22px}

.quiz{max-width:none}
.quiz-top{display:flex; align-items:center; gap:16px; margin-bottom:20px}
.quiz-bar{flex:1; height:3px; background:var(--line); border-radius:2px; overflow:hidden}
.quiz-fill{
  display:block; height:100%; width:0%; background:var(--mango);
  border-radius:2px; transition:width .5s cubic-bezier(.4,0,.2,1);
}
.quiz-count{
  font-family:var(--mono); font-size:11px; letter-spacing:.16em; color:var(--ink-45);
  margin:0; flex:none;
}

/* the stage holds one step; height animates so nothing jumps */
.quiz-stage{position:relative; transition:height .38s cubic-bezier(.4,0,.2,1)}
.q-step{
  position:absolute; inset:0 0 auto 0; width:100%;
  opacity:0; transform:translateX(34px); pointer-events:none;
  transition:opacity .34s ease, transform .38s cubic-bezier(.2,.7,.3,1);
}
.q-step.on{opacity:1; transform:none; pointer-events:auto; position:relative}
.q-step.out-left{opacity:0; transform:translateX(-34px)}

.q-ask{
  font-family:var(--display); text-transform:uppercase; font-weight:700;
  font-size:clamp(20px,2.6vw,29px); line-height:1.04; margin:0 0 5px;
}
.q-note{font-size:13px; color:var(--ink-45); margin:0 0 16px}

/* One row, always — the choices are meant to be compared at a glance, and
   auto-fit was dropping a four-option question onto two lines. */
.q-opts{display:grid; grid-auto-flow:column; grid-auto-columns:1fr; gap:9px}
@media (max-width:800px){
  .q-opts{grid-auto-flow:row; grid-auto-columns:auto; grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}
}
.q-opt{
  text-align:left; cursor:pointer; font:inherit; color:var(--ink);
  background:var(--sheet-hi); border:1px solid var(--line-hi);
  border-radius:var(--r-sm); padding:13px 14px 12px;
  transition:transform .15s ease, border-color .15s ease, background .15s ease;
}
.q-opt:hover{transform:translateY(-3px); border-color:var(--cyan); box-shadow:0 10px 24px rgba(0,0,0,.28)}
.q-opt:active{transform:translateY(-1px) scale(.98); transition-duration:.06s}
/* the chosen answer flashes once before the step slides away — it confirms
   the tap registered, which matters when the screen is about to change */
.q-opt.picked{border-color:var(--mango); background:color-mix(in srgb, var(--mango) 14%, var(--sheet-hi)); animation:pick .34s ease}
@keyframes pick{
  0%{transform:scale(1)} 40%{transform:scale(1.035)} 100%{transform:scale(1)}
}
.q-opt b{display:block; font-family:var(--display); font-size:15.5px; text-transform:uppercase; letter-spacing:.02em; margin-bottom:3px; line-height:1.1}
.q-opt span{display:block; font-family:var(--mono); font-size:10.5px; color:var(--ink-45); letter-spacing:.03em; line-height:1.35}

/* size step */
.q-size{display:flex; align-items:baseline; gap:10px; margin-bottom:4px}
.q-size input{
  width:158px; font-family:var(--display); font-size:34px; text-align:center;
  padding:7px 8px; letter-spacing:.01em;
}
.q-size em{font-family:var(--mono); font-size:11px; color:var(--ink-45); font-style:normal; letter-spacing:.14em}
.q-chips{display:flex; flex-wrap:wrap; gap:6px; margin:12px 0 2px}
.q-chip{
  cursor:pointer; font-family:var(--mono); font-size:11px; letter-spacing:.08em;
  padding:7px 14px; border-radius:999px; color:var(--ink-70);
  border:1px solid var(--line-hi); background:transparent;
  transition:background .15s ease, color .15s ease;
}
.q-chip{transition:background .15s ease, color .15s ease, border-color .15s ease, transform .14s cubic-bezier(.2,.7,.3,1)}
.q-chip:hover{background:var(--cyan); color:var(--sheet-hi); border-color:var(--cyan); transform:translateY(-2px)}
.q-chip:active{transform:scale(.94); transition-duration:.06s}

.quiz-nav{display:flex; gap:12px; align-items:center; margin-top:14px; min-height:30px}
.quiz-ghost{
  cursor:pointer; font-family:var(--mono); font-size:11.5px; letter-spacing:.12em;
  text-transform:uppercase; color:var(--ink-45); background:none;
  border:0; padding:10px 2px; border-bottom:1px solid transparent;
}
.quiz-ghost{transition:color .16s ease, border-color .16s ease, transform .12s ease}
.quiz-ghost:hover{color:var(--ink); border-bottom-color:var(--mango)}
.quiz-ghost:active{transform:scale(.95); transition-duration:.06s}
.quiz-ghost[hidden]{display:none}

/* the appointment trigger presses like everything else */
#apptBtn:active{transform:translateY(0) scale(.97); transition-duration:.06s}

/* ─── the answer ─── */
.result{margin-top:6px}
.result[hidden]{display:none}
.res-in > .eyebrow{margin-bottom:14px}
.book .disc{margin-top:20px}
.book-actions .quiz-ghost{margin-left:6px}
.res-in > *{opacity:0; transform:translateY(16px); animation:rise .6s cubic-bezier(.2,.7,.3,1) forwards}
.res-in > :nth-child(1){animation-delay:.05s}
.res-in > :nth-child(2){animation-delay:.16s}
.res-in > :nth-child(3){animation-delay:.28s}
.res-in > :nth-child(4){animation-delay:.40s}
.res-in > :nth-child(5){animation-delay:.54s}

.res-fig{
  font-family:var(--display); font-size:clamp(38px,7vw,74px); line-height:.95;
  letter-spacing:-.015em; margin:0;
}
.res-fig .cur{font-family:var(--mono); font-size:14px; letter-spacing:.14em; color:var(--ink-45); vertical-align:.7em; margin-right:9px}
.res-sub{font-family:var(--mono); font-size:12.5px; color:var(--ink-70); margin:9px 0 0}

/* the summary lines sit beside the figure rather than under it, so the
   answer and its workings fit on one screen */
.res-grid{display:grid; grid-template-columns:1fr 1fr; gap:clamp(18px,3vw,40px); align-items:start}
@media (max-width:760px){ .res-grid{grid-template-columns:1fr; gap:16px} }
.res-grid .boq-lines{margin-top:0}

/* booking arrives only once the number is on screen */
.book{
  margin-top:22px; padding:20px 20px 18px; border-radius:var(--r-sm);
  border:1px solid var(--line-hi); background:var(--sheet-hi);
}
/* ─── the three ways to get in touch ─── */
.book-actions{display:flex; gap:10px; flex-wrap:wrap; align-items:center}
.book-drop .btn{padding:13px 18px}
.book-drop .caret{transition:transform .2s ease; flex:none}
.book-drop.open .caret{transform:rotate(180deg)}
/* near the bottom of the panel, so these hang over the disclaimer — lift them
   above it rather than letting the text show through */
.book-drop .drop-menu{z-index:12}

/* the appointment a link opens with — mango edge so it reads as "this is the
   thing you came here for", not another section of the page */
.appt{border-color:var(--mango); background:color-mix(in srgb, var(--mango) 7%, var(--sheet-hi))}
.appt[hidden]{display:none}
.appt .sec-no{color:var(--mango); border-color:var(--mango)}
.appt .boq-lines{max-width:560px; margin-top:0}
.appt .foot-cta{margin:22px 0 0}

/* ─── reviews on the front page ─── */
#reviewSec[hidden]{display:none}
.reviews{display:grid; grid-template-columns:repeat(auto-fit,minmax(250px,1fr)); gap:clamp(12px,1.6vw,18px)}
.review{
  margin:0; padding:22px 22px 20px; border-radius:var(--r-sm);
  border:1px solid var(--line-hi); background:var(--sheet-hi);
}
.review-stars{color:var(--mango); font-size:15px; letter-spacing:.14em; margin:0 0 12px}
.review blockquote{margin:0 0 14px; font-size:15px; line-height:1.55; color:var(--ink)}
.review blockquote::before{content:"“"} .review blockquote::after{content:"”"}
.review figcaption{
  font-family:var(--mono); font-size:11px; letter-spacing:.1em; text-transform:uppercase;
  color:var(--ink-45);
}

/* ─── the survey a client sees when their set lands ─── */
.survey{
  margin-top:26px; padding:22px; border-radius:var(--r-sm);
  border:1px solid var(--cyan); background:color-mix(in srgb, var(--cyan) 8%, transparent);
}
.survey[hidden]{display:none}
.survey h3{margin-bottom:6px}
.survey > p{font-size:13.5px; color:var(--ink-70); margin:0 0 16px; max-width:56ch}
.stars{border:0; margin:0 0 16px; padding:0; display:flex; gap:6px; flex-wrap:wrap}
.stars legend{position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0)}
.stars label{position:relative}
.stars input{position:absolute; opacity:0; inset:0; width:100%; cursor:pointer}
.stars span{
  display:block; padding:8px 12px; border-radius:999px; cursor:pointer;
  border:1px solid var(--line-hi); color:var(--ink-45); font-size:14px; letter-spacing:.08em;
  transition:background .15s ease, color .15s ease, border-color .15s ease;
}
.stars input:checked + span{background:var(--mango); border-color:var(--mango); color:#14100A}
.stars input:focus-visible + span{outline:2px solid var(--mango); outline-offset:2px}
.survey textarea{
  width:100%; font-family:var(--body); font-size:14px; color:var(--ink);
  background:var(--sheet-hi); border:1px solid var(--line-hi);
  border-radius:var(--r-sm); padding:11px 13px; resize:vertical;
}

/* ─── admin: the curtain ─── */
.lock{border-color:var(--mango)}
.lock-row{display:flex; gap:10px; flex-wrap:wrap; max-width:420px}
.lock-row input{
  flex:1; min-width:180px; font-family:var(--mono); font-size:15px; letter-spacing:.14em;
  color:var(--ink); background:var(--sheet-hi); border:1px solid var(--line-hi);
  border-radius:var(--r-sm); padding:12px 14px;
}

/* ─── admin: reviews held before publishing ─── */
.rev-list{margin-top:20px; display:grid; gap:1px; background:var(--line-hi);
  border:1px solid var(--line-hi); border-radius:var(--r-sm); overflow:hidden}
.rev-list:empty{display:none}
.rev-row{
  background:var(--sheet-hi); padding:14px 16px;
  display:flex; align-items:flex-start; justify-content:space-between; gap:16px;
}
.rev-row b{display:block; font-family:var(--mono); font-size:12px; letter-spacing:.06em}
.rev-row span{display:block; font-family:var(--mono); font-size:10.5px; color:var(--mango); margin:2px 0 6px}
.rev-row p{margin:0; font-size:13.5px; color:var(--ink-70)}
.admin-textarea, #revText{
  width:100%; font-family:var(--body); font-size:14px; color:var(--ink);
  background:var(--sheet-hi); border:1px solid var(--line-hi);
  border-radius:var(--r-sm); padding:11px 13px; resize:vertical;
}

/* ─── admin: build-cost rates ─── */
.rate-group{margin-bottom:22px}
.rate-region{
  font-family:var(--mono); font-size:11px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--cyan); margin:0 0 8px; padding-bottom:6px; border-bottom:1px solid var(--line-hi);
}
.rate-region span{color:var(--ink-45); letter-spacing:.06em; text-transform:none; margin-left:10px}
.rate-row{
  display:flex; align-items:center; justify-content:space-between; gap:16px;
  flex-wrap:wrap; padding:7px 0; border-bottom:1px solid var(--line);
}
.rate-row label{font-size:14px; color:var(--ink)}
.rate-in{
  display:flex; align-items:center; gap:7px;
  font-family:var(--mono); font-size:11px; color:var(--ink-45);
}
.rate-in input{
  width:74px; padding:7px 9px; text-align:center;
  font-family:var(--mono); font-size:13px; color:var(--ink);
  background:var(--sheet-hi); border:1px solid var(--line-hi); border-radius:var(--r-xs);
}
.rate-in em{font-style:normal}
#rateOut{font-size:11px; line-height:1.55; max-height:340px; overflow:auto}

/* ─── admin: what still needs filling in ─── */
.check-score{
  font-family:var(--mono); font-size:12px; letter-spacing:.08em; text-transform:uppercase;
  color:var(--mango); margin:0 0 16px;
}
.check{list-style:none; margin:0; padding:0; display:grid; gap:1px; background:var(--line-hi);
  border:1px solid var(--line-hi); border-radius:var(--r-sm); overflow:hidden}
.check li{background:var(--sheet-hi); padding:13px 16px 12px; display:grid; gap:2px}
.check li b{font-family:var(--mono); font-size:12px; letter-spacing:.06em}
.check li span{font-size:12.5px; color:var(--ink-45); line-height:1.45}
.check li.ok b::before   {content:"✓ "; color:var(--cyan)}
.check li.todo b::before {content:"● "; color:var(--mango)}
.check li.todo b{color:var(--mango)}
#setOut{white-space:pre-wrap; line-height:1.7}
code{font-family:var(--mono); font-size:.92em; color:var(--ink)}

/* ─── where the job is up to ─── */
.track{
  list-style:none; margin:26px 0 0; padding:0;
  display:grid; grid-template-columns:repeat(auto-fit,minmax(120px,1fr)); gap:2px;
}
.track li{
  padding:14px 12px 12px; border-top:2px solid var(--line);
  color:var(--ink-45); transition:color .2s ease, border-color .2s ease;
}
.track li b{
  display:block; font-family:var(--mono); font-size:10.5px; letter-spacing:.1em;
  text-transform:uppercase; margin-bottom:4px;
}
.track li span{display:block; font-size:11.5px; line-height:1.4}
.track li.done{border-top-color:var(--cyan); color:var(--ink-70)}
.track li.done b::before{content:"✓ "}
.track li.now{
  border-top-color:var(--mango); color:var(--ink);
  background:color-mix(in srgb, var(--mango) 8%, transparent);
}
.track li.now b{color:var(--mango)}

/* ─── the finished set ─── */
.drawing{
  display:flex; align-items:center; justify-content:space-between; gap:20px; flex-wrap:wrap;
  margin-top:24px; padding:20px 22px; border-radius:var(--r-sm);
  border:1px solid var(--mango); background:color-mix(in srgb, var(--mango) 10%, transparent);
}
.drawing[hidden]{display:none}
.drawing h3{margin-bottom:4px}
.drawing p{margin:0; font-size:13.5px; color:var(--ink-70)}
.fld-wide{grid-column:1/-1}

/* ─── payment ─── */
.pay-methods{display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:10px; margin:26px 0 4px}
.pay-way{
  display:block; text-decoration:none; color:var(--ink);
  padding:16px 18px; border:1px solid var(--line-hi); border-radius:var(--r-sm);
  background:var(--sheet-hi);
  transition:transform .15s ease, border-color .15s ease;
}
a.pay-way:hover{transform:translateY(-3px); border-color:var(--cyan)}
a.pay-way:active{transform:translateY(-1px) scale(.99); transition-duration:.06s}
.pay-way b{display:block; font-family:var(--display); font-size:16px; text-transform:uppercase; letter-spacing:.02em; margin-bottom:3px}
.pay-way span{display:block; font-family:var(--mono); font-size:10.5px; color:var(--ink-45); line-height:1.4}
.pay-way.is-static{cursor:default}
.pay-way pre{
  margin:10px 0 0; font-family:var(--mono); font-size:11.5px; line-height:1.6;
  color:var(--ink-70); white-space:pre-wrap;
}
.pay-told{grid-column:1/-1; justify-content:center; margin-top:4px}
.mk-out{
  font-family:var(--mono); font-size:12px; color:var(--ink-70); word-break:break-all;
  margin-top:14px; padding:12px 14px; border:1px dashed var(--line-hi); border-radius:var(--r-sm);
}
.mk-out[hidden]{display:none}

/* ─── book a call ─── */
#schedBtn .caret{transition:transform .22s ease; flex:none}
#schedBtn.open .caret{transform:rotate(180deg)}
#schedBtn.open{border-color:var(--mango); color:var(--mango)}

.sched{
  margin-top:16px; padding:18px 18px 16px;
  border:1px solid var(--line-hi); border-radius:var(--r-sm);
  background:color-mix(in srgb, var(--sheet) 60%, transparent);
  animation:rise .4s cubic-bezier(.2,.7,.3,1) both;
}
.sched[hidden]{display:none}
.sched-top{display:flex; align-items:center; gap:14px; margin-bottom:16px}
.sched-top .quiz-bar{flex:1}
.sched-top .quiz-ghost{flex:none; padding:4px 2px}
.sched-stage{position:relative; transition:height .34s cubic-bezier(.4,0,.2,1)}

/* the day chips run tighter than the main quiz — six of them, not four */
.sched-days{grid-auto-columns:minmax(0,1fr)}
.sched-days .q-opt{padding:11px 10px; text-align:center}
.sched-days .q-opt b{font-size:14px; margin-bottom:2px}
.sched-days .q-opt span{font-size:10px}

/* five fixed slots, so they sit as one row of equal buttons */
.sched-slots{grid-auto-columns:minmax(0,1fr)}
.sched-slots .q-opt{padding:14px 10px; text-align:center}
.sched-slots .q-opt b{font-size:16px; margin-bottom:0}
/* Days and times are short chips — the 160px minimum the other questions use
   is far too wide for them, and pushed five time slots onto three rows. */
@media (max-width:800px){
  .sched-days, .sched-slots{grid-auto-flow:row; grid-template-columns:repeat(auto-fit,minmax(88px,1fr))}
}

.sched-fields{display:grid; grid-template-columns:1fr 1fr; gap:12px; max-width:520px}
@media (max-width:560px){ .sched-fields{grid-template-columns:1fr} }
.fld{display:block}
.fld > span{
  display:block; font-family:var(--mono); font-size:10px; letter-spacing:.14em;
  text-transform:uppercase; color:var(--ink-45); margin-bottom:6px;
}
.fld input{
  width:100%; font-family:var(--body); font-size:15px; color:var(--ink);
  background:var(--sheet-hi); border:1px solid var(--line-hi);
  border-radius:var(--r-sm); padding:11px 13px;
}
.sched-err{
  font-family:var(--mono); font-size:11px; letter-spacing:.06em;
  color:var(--mango); margin:10px 0 0;
}
.sched-err[hidden]{display:none}
.sched-send{display:flex; gap:10px; flex-wrap:wrap; margin-top:16px}

/* a plain fact in a menu, not something you can press */
.menu-note{
  display:block; padding:10px 18px 8px; margin-top:2px;
  border-top:1px solid var(--line);
  font-family:var(--mono); font-size:10px; letter-spacing:.1em;
  text-transform:uppercase; color:var(--ink-45);
}

.book h3{margin-bottom:6px}
.book p{font-size:13.5px; color:var(--ink-70); margin:0 0 16px; max-width:56ch}
.book .foot-cta{margin:0}
.book .btn{position:relative; overflow:hidden}
/* one slow sweep across the primary button — enough to draw the eye, not a disco */
.book .btn.go::before{
  content:""; position:absolute; inset:0;
  background:linear-gradient(105deg, transparent 35%, rgba(255,255,255,.42) 50%, transparent 65%);
  transform:translateX(-120%); animation:sweep 2.6s ease-in-out 1.1s 2;
}
@keyframes sweep{to{transform:translateX(120%)}}

@media (prefers-reduced-motion: reduce){
  .q-step{transition:none}
  .book .btn.go::before{animation:none; display:none}
}

/* ─── price cards ─── */
.cards{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(258px,1fr)); gap:1px;
  background:var(--line-hi); border:1px solid var(--line-hi);
  border-radius:var(--r-sm); overflow:hidden;
}
.card{background:var(--sheet); padding:24px 22px 26px; display:flex; flex-direction:column; position:relative}
.card.feat{background:var(--sheet-hi)}
.card-code{font-family:var(--mono); font-size:10px; letter-spacing:.16em; color:var(--cyan); margin-bottom:12px}
.card.feat .card-code{color:var(--mango)}
.card h3{margin-bottom:12px}
.card p{font-size:14px; color:var(--ink-70); margin-bottom:18px}
.price{font-family:var(--display); font-size:38px; line-height:1; margin-bottom:3px}
.price small{font-family:var(--mono); font-size:12px; letter-spacing:.1em; color:var(--ink-45); margin-right:7px; vertical-align:.5em}
.price-alt{font-family:var(--mono); font-size:12px; color:var(--ink-45); margin-bottom:18px}
.card ul{list-style:none; margin:0 0 22px; padding:0; font-size:13.5px; color:var(--ink-70)}
.card li{padding:7px 0 7px 20px; position:relative; border-top:1px solid var(--line)}
.card li::before{content:""; position:absolute; left:2px; top:14px; width:8px; height:1px; background:var(--cyan)}
.card .btn{margin-top:auto; justify-content:center}

/* The reference sheet gets the same panel as every other sheet — it used to be
   transparent with a dashed edge, which made it read as a stray note rather
   than part of the set. Its "Reference" badge carries the hierarchy instead. */
.sec.ref .sec-no{color:var(--ink-45); border-color:var(--line-hi)}

/* the current page is stated, not just implied by what you clicked last */
.top nav a[aria-current="page"]{color:var(--ink)}
.top nav a[aria-current="page"]::after{background:var(--cyan); transform:scaleX(1)}

/* ─── the two ways on from the home page ─── */
.paths{display:grid; grid-template-columns:1fr 1fr; gap:clamp(12px,1.6vw,18px)}
@media (max-width:760px){ .paths{grid-template-columns:1fr} }
.path{
  display:block; text-decoration:none; padding:26px 24px 24px;
  border:1px solid var(--line-hi); border-radius:var(--r-sm);
  background:var(--sheet-hi); transition:transform .16s ease, border-color .16s ease;
}
.path:hover{transform:translateY(-3px); border-color:var(--cyan); box-shadow:0 12px 28px rgba(8,14,16,.18)}
.path:active{transform:translateY(-1px) scale(.99); transition-duration:.06s}
.path .go-lbl span{display:inline-block; transition:transform .18s cubic-bezier(.2,.7,.3,1)}
.path:hover .go-lbl span{transform:translateX(5px)}
.path .k{
  font-family:var(--mono); font-size:10px; letter-spacing:.16em; text-transform:uppercase;
  color:var(--cyan); display:block; margin-bottom:12px;
}
.path h3{margin-bottom:10px}
.path p{font-size:14px; color:var(--ink-70); margin:0 0 16px}
.path .go-lbl{
  font-family:var(--mono); font-size:12px; letter-spacing:.08em; text-transform:uppercase;
  color:var(--ink); display:inline-flex; gap:9px; align-items:center;
}
.path:hover .go-lbl{color:var(--cyan)}

/* ─── plain-language explainer on the home page ─── */
.explain{display:grid; grid-template-columns:repeat(auto-fit,minmax(250px,1fr)); gap:clamp(20px,3vw,38px)}
.explain h3{margin-bottom:10px}
.explain p{font-size:15px; color:var(--ink-70); margin:0}
.explain .n{
  font-family:var(--mono); font-size:11px; letter-spacing:.14em; color:var(--mango);
  display:block; margin-bottom:14px;
}

/* ─── rules / legal lane ─── */
.lanes{display:grid; grid-template-columns:repeat(auto-fit,minmax(260px,1fr)); gap:clamp(16px,2.4vw,28px)}
.lane{border-top:2px solid var(--cyan); padding-top:16px}
.lane.warn{border-top-color:var(--mango)}
.lane-size{font-family:var(--mono); font-size:12px; letter-spacing:.1em; color:var(--ink-45); margin-bottom:7px}
.lane h3{margin-bottom:9px}
.lane p{font-size:14px; color:var(--ink-70); margin:0}

/* ─── steps ─── */
.steps{display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:clamp(18px,2.6vw,32px); counter-reset:s}
.step{position:relative; padding-top:38px; border-top:1px solid var(--line-hi)}
.step::before{
  counter-increment:s; content:counter(s,decimal-leading-zero);
  position:absolute; top:12px; left:0; font-family:var(--mono); font-size:11px;
  letter-spacing:.14em; color:var(--mango);
}
.step h3{margin-bottom:8px}
.step p{font-size:14px; color:var(--ink-70); margin:0}

/* ─── about ─── */
.about{display:grid; grid-template-columns:1fr .8fr; gap:clamp(24px,4vw,54px); align-items:start}
@media (max-width:900px){ .about{grid-template-columns:1fr} }
.stats{display:flex; gap:34px; flex-wrap:wrap; margin:26px 0 0}
.stat b{display:block; font-family:var(--display); font-size:40px; line-height:1}
.stat span{font-family:var(--mono); font-size:10.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--ink-45)}
.chips{display:flex; flex-wrap:wrap; gap:7px; margin-top:14px}
.chip{font-family:var(--mono); font-size:11px; letter-spacing:.08em; text-transform:uppercase;
  border:1px solid var(--line-hi); padding:5px 13px; border-radius:999px; color:var(--ink-70)}

/* ─── footer ─── */
footer{
  padding-block:clamp(40px,6vw,68px) 30px;
  background:var(--sheet-hi);
  background:var(--surface);
  border:1px solid var(--line);
  border-radius:var(--r);
  margin-bottom:var(--edge);
}
.foot-cta{display:flex; gap:12px; flex-wrap:wrap; margin:24px 0 40px}
.colophon{font-family:var(--mono); font-size:11px; color:var(--ink-45); display:flex;
  justify-content:space-between; gap:16px; flex-wrap:wrap; border-top:1px solid var(--line); padding-top:16px}

@media (prefers-reduced-motion: reduce){
  *{animation-duration:.001ms !important; transition-duration:.001ms !important}
  .dim .span{stroke-dashoffset:0}
  .dim text{opacity:1}
}

/* ─── the client portal ─── */
.job-card{
  padding:24px 22px 22px; margin-bottom:14px;
  border:1px solid var(--line-hi); border-radius:var(--r-sm); background:var(--sheet-hi);
}
.job-card:last-child{margin-bottom:0}
.job-card .sec-head{margin-bottom:20px}
.job-card .track{margin:22px 0 0}
.files-head{
  font-family:var(--mono); font-size:11px; letter-spacing:.14em; text-transform:uppercase;
  color:var(--ink-45); margin:24px 0 0;
}
.job-card .pay-methods{margin-top:10px}
.job-card .survey{margin-top:24px}

/* ─── admin: checkboxes and file rows ─── */
.check-fld{display:flex; align-items:center; gap:10px; align-self:end; padding-bottom:11px}
.check-fld input{width:18px; height:18px; accent-color:var(--mango); flex:none}
.check-fld > span{margin:0; font-family:var(--body); font-size:14px;
  letter-spacing:0; text-transform:none; color:var(--ink)}
.file-rows{margin-top:10px; display:grid; gap:6px}
.file-row{display:flex; align-items:center; gap:10px; font-size:13px; cursor:pointer}
.file-row input{width:16px; height:16px; accent-color:var(--mango); flex:none}
.file-row span{color:var(--ink)}
.file-row em{font-family:var(--mono); font-size:10px; letter-spacing:.08em;
  text-transform:uppercase; color:var(--ink-45); font-style:normal; margin-left:auto}
.rev-acts{display:flex; gap:10px; flex:none}
