/* Weslo Digital — shared stylesheet for the prototype set.
   Dark-committed brand world: charcoal ground, chevron blue action, chevron green confirm. */
:root{
  color-scheme: dark;
  --ink:#2E2F31; --ink-deep:#232426; --surface:#37393C; --line:#46494D;
  --paper:#F3F5F7; --muted:#A6ACB2; --dim:#8B9299;
  --sky:#38A1DB; --sky-lo:#2A86BA; --grass:#3FAE62;
  --display:"Poppins","Century Gothic",system-ui,sans-serif;
  --body:"Barlow","Helvetica Neue",Arial,sans-serif;
  --w:1140px; --r:5px;
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
#free-audit{scroll-margin-top:90px}
body{background:var(--ink);color:var(--paper);font-family:var(--body);font-size:16px;line-height:1.6;margin:0;-webkit-font-smoothing:antialiased}
.wrap{max-width:var(--w);margin:0 auto;padding-inline:20px;position:relative;z-index:1}
h1,h2,h3{font-family:var(--display);margin:0;line-height:1.12;text-wrap:balance;letter-spacing:-0.02em;font-weight:600}
h1{font-size:clamp(2rem,4.6vw,3.1rem);font-weight:700}
h2{font-size:clamp(1.6rem,3.3vw,2.25rem)}
h3{font-size:1.14rem;letter-spacing:-0.01em}
p{margin:0}
a{color:var(--sky)}
.eyebrow{font-family:var(--display);font-size:.74rem;font-weight:600;letter-spacing:.19em;text-transform:uppercase;color:var(--sky);margin:0}
.lede{color:var(--muted);max-width:62ch}
.small{font-size:.875rem;color:var(--muted)}
section{border-top:1px solid var(--line);position:relative;overflow:hidden}
section .wrap{padding-block:clamp(42px,5.5vw,68px)}
.band{background:var(--ink-deep)}
.sechead{display:flex;flex-direction:column;gap:12px;margin-bottom:32px;max-width:66ch}
.grid{display:grid;gap:20px}
.g2{grid-template-columns:repeat(auto-fit,minmax(290px,1fr))}
.g3{grid-template-columns:repeat(auto-fit,minmax(250px,1fr))}
.g4{grid-template-columns:repeat(auto-fit,minmax(225px,1fr))}
.grid>*{min-width:0}
.prose{max-width:var(--measure,66ch);display:flex;flex-direction:column;gap:16px;color:var(--muted)}
.prose strong{color:var(--paper);font-weight:600}
.prose h3{color:var(--paper);margin-top:14px}
.prose ul{margin:0;padding-left:20px;display:flex;flex-direction:column;gap:8px}

/* ---------- chevron mark ---------- */
.logo{display:flex;align-items:center;gap:9px;text-decoration:none;color:var(--paper)}
.logo .word{font-family:var(--display);font-weight:700;font-size:1.3rem;letter-spacing:-0.025em;white-space:nowrap}

/* zoomed, low-opacity chevron behind a content block */
.chevbg{position:absolute;inset:0;overflow:hidden;pointer-events:none;z-index:0}
.chevbg svg{position:absolute;opacity:.02;color:var(--sky)}
.chevbg.right svg{right:-10%;top:50%;transform:translateY(-50%);height:190%;width:auto}
.chevbg.left svg{left:-14%;top:50%;transform:translateY(-50%);height:200%;width:auto}
.chevbg.corner svg{right:-6%;bottom:-40%;height:150%;width:auto;opacity:.015}
@media (max-width:760px){.chevbg svg{opacity:.012}}

/* chevron as a small inline list marker */
.chevlist{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:10px}
.chevlist li{display:flex;gap:11px;align-items:flex-start;color:var(--muted)}
.chevlist .m{flex:none;margin-top:6px}

/* chevron divider rule */
.chevrule{display:flex;align-items:center;gap:12px;margin:0 0 18px}
.chevrule .bar{height:1px;background:var(--line);flex:1}

/* ---------- header ---------- */
.topbar{position:sticky;top:0;z-index:40;background:rgba(35,36,38,.95);backdrop-filter:blur(8px);
  border-bottom:1px solid var(--line);transition:transform .25s ease}
/* give the bar back on a phone: it slides away as you read down and returns the
   moment you scroll up, so it is never costing height while someone is reading */
.topbar.hide{transform:translateY(-100%)}
.topbar .wrap{display:flex;align-items:center;gap:20px;min-height:68px;padding-block:10px;flex-wrap:nowrap}
.nav{display:flex;gap:18px;margin-left:auto}
.nav a{color:var(--muted);text-decoration:none;font-weight:500;font-size:.93rem;white-space:nowrap}
.nav a:hover,.nav a[aria-current]{color:var(--paper)}
.tel{font-family:var(--display);font-weight:600;font-size:1.02rem;color:var(--paper);text-decoration:none;white-space:nowrap}

/* icon buttons + mobile panel: present in the markup always, shown only under 920px */
.iconbtn{display:none;align-items:center;justify-content:center;width:42px;height:42px;flex:0 0 auto;
  border:1px solid var(--line);border-radius:var(--r);background:transparent;color:var(--paper);
  cursor:pointer;padding:0;text-decoration:none}
.iconbtn:hover{border-color:var(--sky);color:var(--sky)}
.iconbtn:focus-visible{outline:2px solid var(--sky);outline-offset:2px}
.bars,.bars::before,.bars::after{display:block;width:18px;height:2px;background:currentColor;border-radius:2px;
  transition:transform .2s ease,opacity .2s ease}
.bars::before,.bars::after{content:"";position:absolute}
.bars::before{transform:translateY(-6px)}
.bars::after{transform:translateY(6px)}
.burger{position:relative}
.burger[aria-expanded="true"] .bars{background:transparent}
.burger[aria-expanded="true"] .bars::before{transform:rotate(45deg)}
.burger[aria-expanded="true"] .bars::after{transform:rotate(-45deg)}

.mobnav{display:none;border-top:1px solid var(--line);background:var(--ink-deep);
  padding:14px 20px calc(20px + env(safe-area-inset-bottom,0px));flex-direction:column;gap:14px;
  max-height:calc(100dvh - 58px);overflow-y:auto}
.mobnav nav{display:flex;flex-direction:column}
.mobnav nav a{color:var(--paper);text-decoration:none;font-family:var(--display);font-weight:600;
  font-size:1.05rem;padding:14px 0;border-bottom:1px solid var(--line)}
.mobnav nav a[aria-current]{color:var(--sky)}
.mobtel{text-align:center;font-family:var(--display);font-weight:600;font-size:1.05rem;
  color:var(--paper);text-decoration:none}

@media (max-width:920px){
  .topbar .wrap{min-height:58px;gap:10px;padding-block:8px}
  .nav,.tel,.btn.cta-head{display:none}
  .iconbtn{display:inline-flex}
  .callbtn{margin-left:auto}
  .logo .word{font-size:1.12rem}
  .mobnav[data-open]{display:flex}
}
@media (max-width:360px){.logo .word{display:none}}

/* ---------- breadcrumbs ---------- */
.crumb{font-size:.84rem;color:var(--dim)}
.crumb ol{list-style:none;display:flex;flex-wrap:wrap;gap:6px;margin:0;padding:0}
.crumb li{display:flex;gap:6px;align-items:center}
.crumb li+li::before{content:"›";color:var(--line)}
.crumb a{color:var(--dim);text-decoration:none}
.crumb a:hover{color:var(--sky);text-decoration:underline}
.crumb [aria-current]{color:var(--muted)}

/* ---------- buttons ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;font-family:var(--display);font-weight:600;font-size:.95rem;padding:13px 24px;border-radius:var(--r);border:1px solid transparent;text-decoration:none;cursor:pointer;transition:background .15s,border-color .15s,color .15s}
.btn-primary{background:var(--sky);color:#0E2231;border-color:var(--sky)}
.btn-primary:hover{background:#4BB1E8}
.btn-ghost{background:transparent;color:var(--paper);border-color:var(--line)}
.btn-ghost:hover{border-color:var(--sky);color:var(--sky)}
.btn-go{background:var(--grass);color:#0C2614;border-color:var(--grass)}
.btn-go:hover{background:#4CC072}
.btn-block{width:100%}
.btn-lg{font-size:1.02rem;padding:15px 28px}
.btnrow{display:flex;gap:12px;flex-wrap:wrap}

/* ---------- forms ---------- */
.field{display:flex;flex-direction:column;gap:6px;margin-bottom:13px}
.field label{font-family:var(--display);font-size:.72rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}
.field input,.field select,.field textarea{font-family:var(--body);font-size:1rem;color:var(--paper);background:var(--ink-deep);border:1px solid var(--line);border-radius:var(--r);padding:12px 13px;width:100%}
.field input:focus,.field select:focus,.field textarea:focus{outline:2px solid var(--sky);outline-offset:1px;border-color:var(--sky)}
.formcard{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:24px;position:relative;overflow:hidden}
.formnote{font-size:.8rem;color:var(--muted);margin-top:11px;text-align:center}
.hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.steps{display:flex;gap:8px;align-items:center;margin-bottom:16px}
.dot{height:3px;flex:1;background:var(--line);border-radius:2px}
.dot.on{background:var(--sky)}
.stepnum{font-family:var(--display);font-size:.7rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--dim);white-space:nowrap}

/* ---------- image slots ---------- */
.figslot{position:relative;width:100%;border:1px dashed #5F646A;border-radius:var(--r);background:repeating-linear-gradient(135deg,#2A2C2E 0 10px,#2E3033 10px 20px);display:grid;place-items:center;text-align:center;padding:20px;gap:6px}
.figslot .tag{font-family:var(--display);font-size:.68rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--sky)}
.figslot .desc{color:var(--muted);font-size:.88rem;max-width:42ch}
.figslot .dims{font-family:ui-monospace,Menlo,monospace;font-size:.72rem;color:var(--dim)}
.figreal{position:relative;width:100%;overflow:hidden;border-radius:var(--r);background:var(--ink-deep)}
.figreal img{width:100%;height:100%;object-fit:cover;display:block}
.ratio-wide{aspect-ratio:16/7}
.ratio-4x3{aspect-ratio:4/3}
.ratio-3x2{aspect-ratio:3/2}
.ratio-port{aspect-ratio:4/5}
.ratio-sq{aspect-ratio:1/1}
figure{margin:0;display:flex;flex-direction:column;gap:8px}
figcaption{font-size:.82rem;color:var(--dim)}
.split{display:grid;grid-template-columns:minmax(260px,340px) 1fr;gap:34px;align-items:start}
.split.rev{grid-template-columns:1fr minmax(260px,340px)}
@media (max-width:840px){.split,.split.rev{grid-template-columns:1fr}}

/* ---------- cards, tiers, reviews ---------- */
.card{display:flex;flex-direction:column;gap:9px;padding:20px;border:1px solid var(--line);border-radius:var(--r);text-decoration:none;color:inherit;transition:border-color .15s,background .15s}
.card:hover{border-color:var(--sky);background:#323437}
.card h3{color:var(--paper)}
.card p{color:var(--muted);font-size:.93rem}
.card .more{color:var(--sky);font-size:.88rem;font-weight:500;margin-top:auto}
.kicker{font-family:var(--display);font-size:.68rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--sky)}
.tier{display:flex;flex-direction:column;gap:10px;padding:22px;border:1px solid var(--line);border-radius:var(--r);background:var(--surface)}
.tier.pick{border-color:var(--sky);box-shadow:inset 0 2px 0 var(--sky)}
.tier .fig{font-family:var(--display);font-weight:700;font-size:2rem;line-height:1}
.tier .per{color:var(--muted);font-size:.86rem}
.tier ul{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:7px;color:var(--muted);font-size:.92rem}
.badge{display:inline-flex;align-self:flex-start;font-family:var(--display);font-size:.68rem;font-weight:600;letter-spacing:.12em;text-transform:uppercase;padding:4px 10px;border-radius:999px;color:var(--sky);border:1px solid rgba(56,161,219,.45);background:rgba(56,161,219,.1)}
.badge-go{color:var(--grass);border-color:rgba(63,174,98,.45);background:rgba(63,174,98,.1)}
.note{border-left:2px solid var(--grass);padding:12px 0 12px 16px;color:var(--muted);max-width:64ch}
.note strong{color:var(--paper)}
.ribbon{display:grid;grid-template-columns:auto 1fr 1fr;gap:28px;align-items:center}
@media (max-width:900px){.ribbon{grid-template-columns:1fr;gap:20px}}
.rating{display:flex;gap:13px;align-items:center;flex:none}
.gmark{width:46px;height:46px;border-radius:var(--r);display:grid;place-items:center;background:var(--surface);border:1px solid var(--line);flex:none}
.score{font-family:var(--display);font-weight:700;font-size:1.7rem;line-height:1;margin-right:8px}
.stars{color:var(--grass);letter-spacing:.1em;font-size:.95rem}
/* trusted-by logo strip */
.logolabel{font-family:var(--display);font-size:.72rem;font-weight:600;letter-spacing:.17em;text-transform:uppercase;color:var(--muted);margin-bottom:14px}
.logostrip{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:10px 18px;align-items:stretch}
.logoslot{
  border:1px dashed #5F646A;border-radius:var(--r);
  background:repeating-linear-gradient(135deg,#2A2C2E 0 10px,#2E3033 10px 20px);
  aspect-ratio:3/1;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:3px;padding:8px;text-align:center;min-width:0;
}
.logoslot .lname{font-family:var(--display);font-weight:600;font-size:.84rem;color:#B6BCC2;line-height:1.2}
.logoslot .ldim{font-family:ui-monospace,Menlo,monospace;font-size:.62rem;color:var(--dim)}
/* Real logos. brightness(0) invert(1) flattens any artwork — dark, light or multicolour —
   to a white silhouette while keeping its alpha, which is the only way a strip mixing navy
   wordmarks and white reversed marks reads evenly on charcoal. Hover returns the real thing. */
.logocell{min-height:84px;display:flex;align-items:center;justify-content:center;padding:6px;min-width:0}
.clientlogo{max-width:100%;max-height:72px;width:auto;height:auto;object-fit:contain;
  opacity:.8;filter:brightness(0) invert(1);transition:opacity .18s ease,filter .18s ease}
.logocell:hover .clientlogo{opacity:1;filter:none}
@media (prefers-reduced-motion:reduce){.clientlogo{transition:none}}
/* text stand-in for a client whose logo file we don't have yet — same optical weight
   as the white marks beside it, so the row still reads as one line of brands */
.logoword{font-family:var(--display);font-weight:600;font-size:.95rem;line-height:1.25;
  letter-spacing:.01em;color:var(--paper);opacity:.52;text-align:center;
  text-wrap:balance;transition:opacity .18s ease}
.logocell:hover .logoword{opacity:.8}

/* budget calculator block.
   The illustration bleeds past the block's left margin and off the bottom edge,
   desaturated and tinted toward the brand so it reads as part of the page
   rather than pasted in. Decorative only — empty alt, aria-hidden. */
.budgetband{overflow:hidden}
.budgetart{
  position:absolute;left:-70px;bottom:-90px;width:min(430px,38vw);height:auto;z-index:0;
  pointer-events:none;user-select:none;
  /* It sits BEHIND body copy, so it fades out toward the top-right before it
     reaches the text. Two masks: one kills the bottom edge, one dissolves it
     away from the bottom-left corner it is anchored to. */
  opacity:.3;
  -webkit-mask-image:linear-gradient(to top,transparent 0,#000 22%,#000 100%),
                     radial-gradient(ellipse 125% 115% at 0% 100%,#000 32%,transparent 78%);
  mask-image:linear-gradient(to top,transparent 0,#000 22%,#000 100%),
             radial-gradient(ellipse 125% 115% at 0% 100%,#000 32%,transparent 78%);
  -webkit-mask-composite:source-in; mask-composite:intersect;
}
@media (max-width:1180px){.budgetart{left:-120px;width:360px;opacity:.22}}
@media (max-width:880px){.budgetart{left:auto;right:-90px;bottom:-70px;width:300px;opacity:.12}}
@media (max-width:560px){.budgetart{display:none}}
.budgetband .budget{position:relative;z-index:1}
/* No indent: this block sits on the page gutter like every other section.
   The old clamp(0,9vw,150px) pushed it up to 150px right of everything
   above and below it. */

.budget{display:grid;grid-template-columns:1fr minmax(320px,420px);gap:38px;align-items:center}
@media (max-width:880px){.budget{grid-template-columns:1fr;gap:26px}}
.budgetcopy{display:flex;flex-direction:column;gap:14px}
.budgetname{font-family:var(--display);font-weight:700;
  font-size:clamp(1.5rem,3vw,2.1rem);line-height:1.12;letter-spacing:-0.02em;
  color:var(--sky);margin:2px 0 0;text-wrap:balance}
.budgetcalc{background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--sky);border-radius:var(--r);padding:22px;display:flex;flex-direction:column;gap:4px}
.brow{display:grid;grid-template-columns:1fr 1fr;gap:12px}
@media (max-width:460px){.brow{grid-template-columns:1fr}}
.bout{border-top:1px solid var(--line);margin:10px 0 14px;padding-top:16px}
.blabel{font-family:var(--display);font-size:.68rem;font-weight:600;letter-spacing:.16em;text-transform:uppercase;color:var(--muted)}
.bfig{font-family:var(--display);font-weight:700;font-size:2.4rem;line-height:1.1;color:var(--paper);font-variant-numeric:tabular-nums;margin-top:6px}
.brange{color:var(--muted);font-size:.88rem;margin-top:4px}

/* the allocation split: a single stacked bar plus a legend that carries the dollars.
   The bar is decoration for the numbers, so it is role=img with one label and the
   legend below is the accessible version of the same data. */
.bsplit{border-top:1px solid var(--line);padding-top:16px;margin-bottom:16px}
.sbar{display:flex;height:9px;border-radius:999px;overflow:hidden;background:var(--ink-deep);margin-top:9px}
.sbar>i{display:block;height:100%;transition:flex-basis .28s ease}
.slist{list-style:none;margin:12px 0 0;padding:0;display:flex;flex-direction:column;gap:6px}
.slist li{display:flex;align-items:baseline;gap:7px;font-size:.84rem;color:var(--muted);line-height:1.35}
.slist .dot{flex:0 0 auto;width:8px;height:8px;border-radius:2px;transform:translateY(-1px)}
.slist .sname{color:var(--paper)}
.slist .samt{margin-left:auto;font-variant-numeric:tabular-nums;white-space:nowrap}

/* industries hero */
.indhero{display:grid;grid-template-columns:1.05fr .95fr;gap:40px;align-items:center}
@media (max-width:880px){.indhero{grid-template-columns:1fr;gap:26px}}
.indstats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;background:var(--line);
  border:1px solid var(--line);border-radius:var(--r);overflow:hidden}
@media (max-width:760px){.indstats{grid-template-columns:repeat(2,minmax(0,1fr))}}
/* A page with only three stats gets three columns, not a blank fourth cell
   (branding has no fourth figure worth inventing). On narrow screens the
   three stack 2+1 with the last spanning the row. */
.indstats:has(> :nth-child(3):last-child){grid-template-columns:repeat(3,minmax(0,1fr))}
@media (max-width:760px){
  .indstats:has(> :nth-child(3):last-child){grid-template-columns:repeat(2,minmax(0,1fr))}
  .indstats:has(> :nth-child(3):last-child)>:last-child{grid-column:1/-1}
}
.indstats>div{background:var(--ink);padding:18px 20px;display:flex;flex-direction:column;gap:4px}
.indstats .sfig{font-family:var(--display);font-weight:700;font-size:1.9rem;line-height:1;color:var(--paper)}
.indstats .scap{color:var(--muted);font-size:.86rem;line-height:1.4}

/* industry trade lists: columns collapse by width, never a single tall stack */
.tradecols ul{grid-template-columns:repeat(4,minmax(0,1fr))}
@media (max-width:1020px){.tradecols ul{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:700px){.tradecols ul{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:420px){.tradecols ul{grid-template-columns:1fr}}
.card ul li a:hover span{color:var(--sky)}

/* ticked bullet lists inside cards */
.ticks{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.ticks li{display:flex;gap:10px;align-items:flex-start;color:var(--muted);font-size:.93rem;line-height:1.5}
.ticks li svg{flex:0 0 auto;margin-top:4px}

/* design map: template cards and status pills */
.tplcard{gap:14px}
.tplhead{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px}
.tplhead h3{flex:1 1 auto}
.tplref{display:inline-block;font-family:var(--display);font-size:.72rem;font-weight:700;letter-spacing:.08em;
  color:var(--sky);border:1px solid rgba(56,161,219,.45);border-radius:3px;padding:2px 7px}
.blocklist{margin:0;padding-left:22px;display:flex;flex-direction:column;gap:6px;color:var(--muted);font-size:.9rem;line-height:1.45}
.blocklist li::marker{color:var(--dim);font-family:var(--display);font-size:.82rem}
.st{display:inline-block;font-family:var(--display);font-size:.68rem;font-weight:600;letter-spacing:.09em;
  text-transform:uppercase;padding:3px 8px;border-radius:999px;border:1px solid var(--line);color:var(--dim);white-space:nowrap}
.st-done{color:var(--grass);border-color:rgba(63,174,98,.5);background:rgba(63,174,98,.1)}
.st-legacy{color:#E0A64A;border-color:rgba(224,166,74,.5);background:rgba(224,166,74,.1)}
.st-todo{color:var(--muted)}
.st-vsl{color:var(--sky);border-color:rgba(56,161,219,.45);background:rgba(56,161,219,.1)}
.dimcell{color:var(--dim)}

/* build spec: a long reference document, so density beats whitespace here */
.pgnav{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:5px 18px}
.pgnav a{display:flex;align-items:center;gap:8px;color:var(--muted);text-decoration:none;font-size:.9rem;padding:4px 0}
.pgnav a:hover{color:var(--sky)}
.tplref.sm{font-size:.62rem;padding:1px 5px;flex:0 0 auto}

.pg{border-top:1px solid var(--line);padding-top:26px;margin-top:34px;scroll-margin-top:80px}
.pg:first-child{border-top:none;margin-top:0;padding-top:0}
.pghead{display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between;align-items:flex-end;margin-bottom:16px}
.pghead h2{font-family:ui-monospace,Menlo,monospace;font-size:1.3rem;margin-top:7px;letter-spacing:-.01em}
.pgmeta{display:flex;flex-direction:column;align-items:flex-end;gap:3px;text-align:right}

.kvs{display:flex;flex-direction:column;gap:7px}
.kvs.meta{background:var(--ink-deep);border:1px solid var(--line);border-radius:var(--r);padding:14px 16px;margin-bottom:18px}
.kv{display:grid;grid-template-columns:132px 1fr;gap:12px;align-items:baseline;font-size:.9rem;line-height:1.45}
@media (max-width:620px){.kv{grid-template-columns:1fr;gap:2px}}
.kvk{font-family:var(--display);font-size:.65rem;font-weight:600;letter-spacing:.13em;text-transform:uppercase;color:var(--dim)}
.kvv{color:var(--muted);min-width:0;overflow-wrap:anywhere}
.kvv strong{color:var(--paper);font-weight:600}
.len{display:inline-block;font-family:ui-monospace,Menlo,monospace;font-size:.7rem;padding:1px 6px;border-radius:3px;margin-left:5px}
.len.ok{color:var(--grass);background:rgba(63,174,98,.13)}
.len.warn{color:#E0A64A;background:rgba(224,166,74,.13)}

.blks{display:flex;flex-direction:column;gap:10px}
.blk{border:1px solid var(--line);border-left:2px solid var(--sky);border-radius:var(--r);padding:13px 15px;display:flex;flex-direction:column;gap:9px}
.blkhead{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.bn{font-family:ui-monospace,Menlo,monospace;font-size:.72rem;color:var(--ink-deep);background:var(--sky);border-radius:3px;padding:1px 6px;font-weight:700}
.btype{font-family:var(--display);font-weight:600;font-size:.95rem;color:var(--paper)}
.bw{margin-left:auto;font-family:ui-monospace,Menlo,monospace;font-size:.7rem;color:var(--dim)}
.sub{display:flex;gap:12px;flex-wrap:wrap;align-items:baseline}
.subk{font-family:var(--display);font-size:.65rem;font-weight:600;letter-spacing:.13em;text-transform:uppercase;color:var(--dim);flex:0 0 132px}
@media (max-width:620px){.subk{flex-basis:100%}}
.chips{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:5px;flex:1 1 300px;min-width:0}
.chips li{font-size:.82rem;color:var(--muted);background:var(--ink-deep);border:1px solid var(--line);border-radius:3px;padding:2px 8px;overflow-wrap:anywhere}

/* ---------- city landing page: "the local brief" ----------
   A sticky contents rail beside one long column. The point is that a city page can
   carry 2,000 words of genuinely local writing without becoming a wall, and that
   adding a section is one more heading rather than one more band to design. */
.cityhero{border-top:none}
.cityhead{display:grid;grid-template-columns:1.25fr .75fr;gap:40px;align-items:center}
@media (max-width:900px){.cityhead{grid-template-columns:1fr;gap:26px}}
.cityhead>div:first-child{display:flex;flex-direction:column;gap:16px}
.cityhead h1{max-width:16ch}

.doc{display:grid;grid-template-columns:232px 1fr;gap:52px;align-items:start}
/* The first column is the contents rail. Pages without one were putting the
   write-up itself in that 232px column, so every results page but Arctic Air
   was reading at a fifth of its container width. */
.doc:not(:has(> .toc)){grid-template-columns:minmax(0,1fr)}
@media (max-width:940px){.doc{grid-template-columns:1fr;gap:28px}}
.toc{position:sticky;top:88px;display:flex;flex-direction:column;gap:14px}
@media (max-width:940px){.toc{position:static;top:auto;border-bottom:1px solid var(--line);padding-bottom:20px}}
.tocl{font-family:var(--display);font-size:.65rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--dim)}
.toc ol{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px;
  border-left:1px solid var(--line)}
.toc ol a{display:block;color:var(--muted);text-decoration:none;font-size:.9rem;line-height:1.35;
  padding:8px 0 8px 14px;margin-left:-1px;border-left:2px solid transparent;transition:color .15s,border-color .15s}
.toc ol a:hover{color:var(--paper)}
.toc ol a[aria-current="true"]{color:var(--sky);border-left-color:var(--sky);font-weight:500}
.tocbox{border:1px solid var(--line);border-left:2px solid var(--grass);border-radius:var(--r);
  padding:14px;display:flex;flex-direction:column;gap:8px}
.tocbl{font-family:var(--display);font-weight:600;font-size:.95rem;color:var(--paper);line-height:1.25}

/* the long column. Generous measure and rhythm — this is the page's main job. */
.docbody{max-width:70ch;min-width:0}
.docsec{border-top:none;overflow:visible;scroll-margin-top:96px;padding-bottom:40px}
.docsec+.docsec{border-top:1px solid var(--line);padding-top:38px}
.docsec h2{margin-bottom:18px;max-width:22ch}
.docsec h3{color:var(--paper);margin:26px 0 10px}
.docsec p{color:var(--muted);margin-bottom:15px;line-height:1.72}
.docsec p strong{color:var(--paper);font-weight:600}
.docsec .tablewrap{margin:22px 0}
.pull{border-left:2px solid var(--sky);padding:4px 0 4px 20px;margin:26px 0}
.pull p{font-family:var(--display);font-size:1.22rem;font-weight:500;line-height:1.4;
  color:var(--paper);margin:0;text-wrap:balance}

/* named-client proof block */
.clientproof{display:grid;grid-template-columns:200px 1fr;gap:36px;align-items:center}
@media (max-width:760px){.clientproof{grid-template-columns:1fr;gap:20px}}
.cpmark{display:flex;align-items:center;justify-content:center;min-height:96px;
  border:1px solid var(--line);border-radius:var(--r);padding:18px;background:var(--ink)}
.cpmark .clientlogo{opacity:.9;filter:brightness(0) invert(1)}

/* neighbouring-city links */
.nbstrip{display:flex;flex-wrap:wrap;gap:9px 10px}
.nbstrip a{font-family:var(--display);font-weight:500;font-size:.92rem;color:var(--paper);
  text-decoration:none;border:1px solid var(--line);border-radius:var(--r);padding:8px 15px;
  transition:border-color .15s,color .15s}
.nbstrip a:hover{border-color:var(--sky);color:var(--sky)}

/* ---------- T5: PPC landing page ("the offer page") ----------
   Photographic hero behind a scrim, copy left, form right. Stays in the dark world;
   the form panel is the one lighter surface, because a form is the one thing on the
   page people have to read and type into. */
.lpbar{position:static}
.lphero{border-top:none;position:relative;isolation:isolate;overflow:hidden}
.lpbg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;z-index:-2}
/* scrim: heavier on the left so the headline always clears, whatever photo lands here */
.lphero::before{content:"";position:absolute;inset:0;z-index:-1;
  background:linear-gradient(100deg,rgba(26,27,29,.95) 0%,rgba(26,27,29,.86) 38%,rgba(26,27,29,.42) 66%,rgba(26,27,29,.55) 100%)}
.lphero .wrap{padding-block:clamp(36px,4.6vw,64px)}
.lpgrid{display:grid;grid-template-columns:1.08fr minmax(360px,.92fr);gap:46px;align-items:center}
@media (max-width:980px){.lpgrid{grid-template-columns:1fr;gap:30px}}
.lpcopy{display:flex;flex-direction:column;gap:17px;min-width:0}
.lpcopy h1{max-width:17ch}

/* review proof, directly under the headline — not buried in a ribbon further down */
.proofrow{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.avs{display:flex}
.av{width:38px;height:38px;border-radius:50%;display:grid;place-items:center;
  font-family:var(--display);font-weight:600;font-size:.78rem;color:var(--paper);
  border:2px solid var(--ink);margin-left:-11px}
.av:first-child{margin-left:0}
.ratefig{font-family:var(--display);font-weight:700;font-size:1.05rem;color:var(--paper);margin-left:6px}
.proofrow .stars{font-size:1rem}

.lpticks{list-style:none;margin:4px 0 0;padding:0;display:grid;
  grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:9px 20px}
.lpticks li{display:flex;gap:9px;align-items:flex-start;color:var(--muted);font-size:.92rem}
.lpticks li svg{flex:0 0 auto;margin-top:3px}

/* the form panel */
.lpformwrap{min-width:0}
.lpform{background:var(--surface);border:1px solid var(--line);border-top:3px solid var(--grass);
  border-radius:var(--r);padding:26px;box-shadow:0 18px 50px rgba(0,0,0,.4)}
.lpfk{font-family:var(--display);font-size:.66rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--grass)}
.lpform h2{font-size:1.5rem;margin:8px 0 14px}
.lpfl{list-style:none;margin:0 0 18px;padding:0 0 16px;display:flex;flex-direction:column;gap:8px;
  border-bottom:1px solid var(--line)}
.lpfl li{display:flex;gap:9px;align-items:flex-start;color:var(--muted);font-size:.9rem}
.lpfl li svg{flex:0 0 auto;margin-top:3px}
.lprow{display:grid;grid-template-columns:1fr 1fr;gap:12px}
@media (max-width:440px){.lprow{grid-template-columns:1fr}}

/* numbered outcome cards */
.outcard{display:flex;flex-direction:column;gap:9px;padding-top:18px;border-top:2px solid var(--sky)}
.onum{font-family:var(--display);font-weight:700;font-size:.8rem;letter-spacing:.1em;color:var(--sky)}
.outcard h3{color:var(--paper)}
.outcard p{color:var(--muted);font-size:.95rem;line-height:1.6}

.lpclose{background:var(--ink-deep)}
.lpfoot{background:#1E1F21;border-top:1px solid var(--line)}
.lpfoot .wrap{padding-bottom:26px}
.lpfoot a{color:#9AA1A7;text-decoration:none}
.lpfoot a:hover{color:var(--sky)}

/* ---------- URL map ----------
   A tree read top to bottom rather than left to right, because depth here is only
   three levels and the interesting information is what each branch is FOR. */
.rulecard{display:flex;flex-direction:column;gap:8px;padding:20px;border:1px solid var(--line);
  border-top:2px solid var(--sky);border-radius:var(--r)}
.rulecard h3{color:var(--paper)}
.rulecard p{color:var(--muted);font-size:.93rem;line-height:1.6}
.rn{font-family:var(--display);font-weight:700;font-size:.78rem;letter-spacing:.1em;color:var(--sky)}

.tree{display:flex;flex-direction:column;gap:30px}
.lvl{display:flex;flex-direction:column;gap:12px;position:relative;padding-left:22px}
.lvl::before{content:"";position:absolute;left:0;top:7px;bottom:10px;width:2px;
  background:linear-gradient(to bottom,var(--sky),rgba(56,161,219,.12))}
.lvll{font-family:var(--display);font-size:.66rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--dim)}
.stack{display:flex;flex-direction:column;gap:9px}
.stack.tight{gap:6px}

.node{border:1px solid var(--line);border-left:2px solid var(--line);border-radius:var(--r);
  padding:12px 15px;display:flex;flex-direction:column;gap:5px;transition:border-color .15s}
.node:hover{border-left-color:var(--sky)}
.nhead{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.node .u{font-family:ui-monospace,Menlo,monospace;font-size:.93rem;color:var(--paper);
  text-decoration:none;overflow-wrap:anywhere}
a.u:hover{color:var(--sky);text-decoration:underline}
.nwhy{color:var(--muted);font-size:.89rem;line-height:1.55;margin:0}
.nwhy:empty{display:none}
.cnt{font-family:var(--display);font-size:.7rem;font-weight:600;letter-spacing:.06em;
  color:var(--dim);border:1px solid var(--line);border-radius:999px;padding:2px 8px;white-space:nowrap}
.cnt.big{align-self:flex-start;font-size:.78rem;color:var(--sky);border-color:rgba(56,161,219,.45);
  background:rgba(56,161,219,.1);margin-top:4px}
.ix{margin-left:auto;font-family:var(--display);font-size:.62rem;font-weight:600;letter-spacing:.1em;
  text-transform:uppercase;padding:2px 8px;border-radius:999px;white-space:nowrap}
.ix-y{color:var(--grass);background:rgba(63,174,98,.12);border:1px solid rgba(63,174,98,.4)}
.ix-n{color:#E0A64A;background:rgba(224,166,74,.12);border:1px solid rgba(224,166,74,.4)}

.grouped{display:grid;grid-template-columns:minmax(260px,1fr) 1.1fr;gap:26px;align-items:start}
@media (max-width:860px){.grouped{grid-template-columns:1fr;gap:16px}}
.gnote{border:1px solid var(--line);border-left:2px solid var(--grass);border-radius:var(--r);padding:18px}
.gnote h3{color:var(--paper);margin-bottom:8px}
.gnote p{color:var(--muted);font-size:.92rem;line-height:1.6}
.gnote strong{color:var(--paper)}
code{font-family:ui-monospace,Menlo,monospace;font-size:.88em;color:var(--sky);
  background:var(--ink-deep);border-radius:3px;padding:1px 5px}

/* ---------- home hero: featured-service spotlight ----------
   The hero pushes one service at a time rather than describing the agency. The video
   lives INSIDE the featured card, not across the hero: on a homepage the video is an
   offer, and putting it centre stage delays the only decision that matters. */
.homehero{border-top:none}
.hhgrid{display:grid;grid-template-columns:1.1fr minmax(340px,.9fr);gap:46px;align-items:center}
@media (max-width:960px){.hhgrid{grid-template-columns:1fr;gap:30px}}
.hhcopy{display:flex;flex-direction:column;gap:16px;min-width:0}
.hhcopy h1{max-width:16ch}

.feat{background:var(--surface);border:1px solid var(--line);border-top:3px solid var(--sky);
  border-radius:var(--r);padding:22px;display:flex;flex-direction:column;gap:14px;min-width:0;
  box-shadow:0 18px 50px rgba(0,0,0,.34)}
.featk{font-family:var(--display);font-size:.65rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--sky)}
.feath{font-size:1.32rem;line-height:1.2;color:var(--paper)}

/* click-to-play poster. Nothing autoplays and nothing loads until it is asked for. */
.featvid{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:7px;aspect-ratio:16/9;border:1px dashed #5F646A;border-radius:var(--r);text-decoration:none;
  background:repeating-linear-gradient(135deg,#2A2C2E 0 10px,#2E3033 10px 20px);
  padding:14px;text-align:center;transition:border-color .15s}
.featvid:hover{border-color:var(--sky)}
.play{width:52px;height:52px;border-radius:50%;background:var(--sky);color:#0E2231;
  display:grid;place-items:center;padding-left:4px;flex:none;transition:transform .15s}
.featvid:hover .play{transform:scale(1.07)}
.featvt{font-family:var(--display);font-weight:600;font-size:.9rem;color:var(--paper)}
.featvd{font-family:ui-monospace,Menlo,monospace;font-size:.68rem;color:var(--dim)}

.featl{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}
.featl li{display:flex;gap:9px;align-items:flex-start;color:var(--muted);font-size:.92rem;line-height:1.5}
.featl li svg{flex:0 0 auto;margin-top:3px}
.featfoot{display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  border-top:1px solid var(--line);padding-top:14px;margin-top:2px}
.featp{font-family:var(--display);font-weight:700;font-size:1.05rem;color:var(--paper)}
.featfoot .btn{margin-left:auto;font-size:.88rem;padding:9px 16px}

/* ---------- T4: seasonal demand chart ----------
   Bars carry the shape, the list beneath carries the meaning and the accessible text.
   The chart is role=img with one label; nobody has to read a bar to get the content. */
.seasonwrap{display:grid;grid-template-columns:1fr 1fr;gap:38px;align-items:center}
@media (max-width:880px){.seasonwrap{grid-template-columns:1fr;gap:26px}}
.seasonchart{display:grid;grid-template-columns:repeat(5,1fr);gap:12px;align-items:end;
  height:210px;padding:14px 0;border-bottom:1px solid var(--line)}
.scol{display:flex;flex-direction:column;align-items:center;gap:9px;height:100%;justify-content:flex-end}
.sbarwrap{width:100%;height:100%;display:flex;align-items:flex-end}
.sbarfill{width:100%;border-radius:3px 3px 0 0;
  background:linear-gradient(to top,var(--sky-lo),var(--sky));min-height:6px}
.sm{font-family:var(--display);font-size:.74rem;font-weight:600;letter-spacing:.04em;color:var(--muted)}
.seasonnotes{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:11px}
.seasonnotes li{color:var(--muted);font-size:.92rem;line-height:1.55;padding-left:14px;
  border-left:2px solid var(--line)}
.seasonnotes strong{color:var(--paper);font-family:var(--display);font-weight:600}

/* ---------- T6-A: answer page ----------
   Almost no sales furniture. The answer box is the whole point: a self-contained
   block a snippet can lift and an LLM can quote without the surrounding page. */
.anshero{border-top:none}
.ansmeta{color:var(--dim);font-size:.86rem}
.answerbox{border:1px solid rgba(63,174,98,.45);border-left:3px solid var(--grass);
  background:rgba(63,174,98,.07);border-radius:var(--r);padding:20px 22px;margin-bottom:34px}
.abk{font-family:var(--display);font-size:.65rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--grass)}
.answerbox p{color:var(--paper);font-size:1.08rem;line-height:1.62;margin-top:9px;max-width:66ch}

.numlist{margin:0;padding-left:22px;display:flex;flex-direction:column;gap:11px;
  color:var(--muted);line-height:1.65}
.numlist li::marker{color:var(--sky);font-family:var(--display);font-weight:600}
.numlist strong{color:var(--paper)}

.rell{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}
.rell a{color:var(--muted);text-decoration:none;font-size:.88rem;line-height:1.4}
.rell a:hover{color:var(--sky)}

/* one inline CTA at the halfway mark, and only one */
.inlinecta{display:flex;align-items:center;gap:20px;flex-wrap:wrap;
  border:1px solid var(--line);border-left:2px solid var(--sky);border-radius:var(--r);
  padding:18px 20px;margin:34px 0}
.inlinecta h3{color:var(--paper)}
.inlinecta .btn{margin-left:auto}
@media (max-width:560px){.inlinecta .btn{margin-left:0;width:100%}}

.authorbox{display:grid;grid-template-columns:120px 1fr;gap:20px;align-items:center;
  border-top:1px solid var(--line);padding-top:26px;margin-top:38px}
@media (max-width:560px){.authorbox{grid-template-columns:1fr}}
.abyk{font-family:var(--display);font-size:.65rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--dim)}
.authorbox h3{color:var(--paper);margin:3px 0 7px}

/* the three steps beside the calculator. Their job is partly editorial and partly
   structural: without them the copy column was 272px against a 662px card. */
.bsteps{list-style:none;margin:4px 0 0;padding:0;display:flex;flex-direction:column;gap:14px}
.bsteps li{display:flex;gap:13px;align-items:flex-start}
/* The step marker is the brand chevron rather than a numbered circle. The
   step's own chevron is lit and the other two sit back, so the sequence is
   still readable as first / second / third. */
.bsn{flex:0 0 auto;display:grid;place-items:center;width:26px;height:26px;margin-top:2px}
.bsn svg{display:block;width:22px;height:12px}
.bsteps strong{display:block;font-family:var(--display);font-weight:600;font-size:.97rem;color:var(--paper)}
.bsteps span:not(.bsn){color:var(--muted);font-size:.9rem;line-height:1.55}

/* credential row — closes the height gap in an image + prose split */
.prose .credrow,.credrow{list-style:none;margin:6px 0 0;padding:14px 0 0;border-top:1px solid var(--line);
  display:grid;grid-template-columns:repeat(3,minmax(0,auto));gap:10px 34px;justify-content:start}
@media (max-width:440px){.prose .credrow,.credrow{grid-template-columns:1fr 1fr}}
.credrow li{display:flex;flex-direction:column;gap:2px;align-items:flex-start}
.cf{font-family:var(--display);font-weight:700;font-size:1.5rem;line-height:1;color:var(--paper)}
.cc{color:var(--muted);font-size:.82rem;line-height:1.35;max-width:16ch}

.arealist{margin-top:26px;padding-top:20px;border-top:1px solid var(--line);
  display:flex;flex-direction:column;gap:12px}
.arealabel{font-family:var(--display);font-size:.66rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--dim)}

/* ---------- Pulse client sign-in ---------- */
.signin{display:inline-flex;align-items:center;gap:7px;font-family:var(--display);font-weight:600;
  font-size:.86rem;color:var(--muted);text-decoration:none;white-space:nowrap;
  border:1px solid var(--line);border-radius:var(--r);padding:9px 14px;transition:border-color .15s,color .15s}
.signin:hover{border-color:var(--sky);color:var(--sky)}
.signin:focus-visible{outline:2px solid var(--sky);outline-offset:2px}
.fsignin{margin-top:16px;align-self:flex-start}
@media (max-width:1180px){.topbar .signin{display:none}}

/* ---------- footer socials ---------- */
.socials{display:flex;gap:9px;margin-top:16px}
.socials a{width:36px;height:36px;border:1px solid var(--line);border-radius:var(--r);
  display:grid;place-items:center;color:#9AA1A7;transition:border-color .15s,color .15s}
.socials a:hover{border-color:var(--sky);color:var(--sky)}
.socials a:focus-visible{outline:2px solid var(--sky);outline-offset:2px}

/* ---------- scrolling logo marquee ----------
   Two identical runs translated by -50% give a seamless loop. Edges are masked so
   logos fade in and out rather than being guillotined by the viewport. */
.marqband{overflow:hidden;padding-bottom:34px}
/* The caption that used to sit under the marquee carried the band's bottom
   padding in its wrapper. With the caption gone the logos sat on the border,
   so the band owns its own spacing now. */
.marquee{position:relative;overflow:hidden;
  -webkit-mask-image:linear-gradient(to right,transparent,#000 9%,#000 91%,transparent);
  mask-image:linear-gradient(to right,transparent,#000 9%,#000 91%,transparent)}
.mtrack{display:flex;width:max-content;animation:marq 46s linear infinite}
.marquee:hover .mtrack,.marquee:focus-within .mtrack{animation-play-state:paused}
.mrun{display:flex;align-items:center;flex:0 0 auto}
.mcell{flex:0 0 auto;width:188px;height:88px;display:flex;align-items:center;justify-content:center;padding:8px}
.mcell .clientlogo{max-height:58px;opacity:.72}
.marquee .mcell:hover .clientlogo{opacity:1;filter:none}
@keyframes marq{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@media (prefers-reduced-motion:reduce){
  .mtrack{animation:none;flex-wrap:wrap;width:100%;justify-content:center}
  .mrun[aria-hidden="true"]{display:none}
  .marquee{-webkit-mask-image:none;mask-image:none}
}

/* ---------- alternative section textures ----------
   Three treatments so no two adjacent blocks carry the same decoration. The chevron
   watermark is the loudest, so it is rationed — never twice in a row. */
.texbg{position:absolute;inset:0;pointer-events:none;z-index:0}
.gridbg{background-image:radial-gradient(circle at 1px 1px,rgba(255,255,255,.055) 1px,transparent 0);
  background-size:26px 26px;
  -webkit-mask-image:radial-gradient(ellipse 80% 70% at 50% 40%,#000,transparent);
  mask-image:radial-gradient(ellipse 80% 70% at 50% 40%,#000,transparent)}
/* Angled matte plate. Gradient base paints instantly; the WebP layers over it. */
.platebg{background-color:var(--ink);
  background-image:linear-gradient(118deg,#333436 0%,#2E2F31 46%,#292A2C 100%);
  background-repeat:no-repeat;background-size:cover;background-position:center}
.platebg::after{content:"";position:absolute;inset:0;
  background-repeat:no-repeat;background-size:cover;background-position:center;opacity:.9}
.platebg.p-a::after{background-image:url(/assets/bg/plate-a.webp)}
.platebg.p-b::after{background-image:url(/assets/bg/plate-b.webp)}
.platebg.p-c::after{background-image:url(/assets/bg/plate-c.webp)}
.platebg.p-d::after{background-image:url(/assets/bg/plate-d.webp)}
.platebg.left::after{transform:scaleX(-1)}
/* Narrow viewports: the plate's diagonal edge would cut straight through the body
   copy, so zoom past it and show only the panel interior. */
@media (max-width:760px){.platebg::after{background-size:260% auto;background-position:28% 32%}}

.washbg.right{background:radial-gradient(ellipse 58% 120% at 92% 50%,rgba(56,161,219,.10),transparent 70%)}
.washbg.left{background:radial-gradient(ellipse 58% 120% at 8% 50%,rgba(63,174,98,.085),transparent 70%)}

/* Google review bar */
.revband{background:var(--ink-deep);padding-bottom:clamp(42px,5.5vw,68px)}
.revband .wrap{padding-bottom:0}
.rvhead{display:flex;align-items:center;justify-content:space-between;gap:24px;
  flex-wrap:wrap;padding-bottom:20px;margin-bottom:22px;border-bottom:1px solid var(--line)}
.rvh2{display:flex;align-items:baseline;gap:16px;flex-wrap:wrap}
.rvh2 h2{margin:0;font-size:clamp(1.3rem,2.4vw,1.75rem)}
.rvall{color:var(--sky);font-size:.9rem;text-decoration:none;border-bottom:1px solid transparent}
.rvall:hover{border-bottom-color:var(--sky)}
.rvall.pending{color:var(--dim);cursor:default}
/* Rolling review marquee. Slower than the logo strip (90s) because these are
   read, not recognised, and paused on hover or keyboard focus so a visitor can
   actually finish one. Fades at both edges so cards enter and leave cleanly. */
.revmarq{position:relative;overflow:hidden;padding-block:4px;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 5%,#000 95%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 5%,#000 95%,transparent)}
.rvtrack{display:flex;width:max-content;animation:rvmarq 90s linear infinite}
.revmarq:hover .rvtrack,.revmarq:focus-within .rvtrack{animation-play-state:paused}
.rvrun{display:flex;align-items:stretch;flex:0 0 auto}
.rcard{flex:0 0 auto;width:360px;margin:0 8px;display:flex;flex-direction:column;gap:10px;
  padding:20px;border:1px solid var(--line);border-radius:var(--r);background:var(--surface)}
.rcard .stars{color:#E8B33A;font-size:.95rem;letter-spacing:.08em}
.rcard p{color:var(--paper);font-size:.93rem;line-height:1.55;margin:0;flex:1;
  display:-webkit-box;-webkit-line-clamp:7;-webkit-box-orient:vertical;overflow:hidden}
.rcard footer{display:flex;flex-direction:column;gap:2px;padding-top:10px;
  border-top:1px solid var(--line)}
.rcard cite{font-style:normal;font-family:var(--display);font-weight:600;
  color:var(--paper);font-size:.92rem}
.rrole{color:var(--dim);font-size:.82rem}
@keyframes rvmarq{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@media (prefers-reduced-motion:reduce){
  .rvtrack{animation:none;flex-wrap:wrap;width:100%}
  .rvrun[aria-hidden="true"]{display:none}
  .rvrun{flex-wrap:wrap;justify-content:center}
  .revmarq{-webkit-mask-image:none;mask-image:none}
  .rcard p{-webkit-line-clamp:none;overflow:visible}
}
@media (max-width:620px){.rcard{width:290px}}

/* Pricing — grouped by service, with a jump nav */
.pnavwrap{border-top:none;position:sticky;top:0;z-index:30;background:var(--ink-deep);
  border-bottom:1px solid var(--line)}
.pnavwrap .wrap{display:flex;align-items:center;gap:14px;padding-block:12px;flex-wrap:wrap}
.pnav{display:flex;flex-wrap:wrap;gap:7px}
.pchip{font-size:.86rem;color:var(--muted);background:var(--ink);border:1px solid var(--line);
  border-radius:999px;padding:6px 14px;text-decoration:none;white-space:nowrap;
  transition:color .15s,border-color .15s}
.pchip:hover{color:var(--paper);border-color:var(--sky-lo)}
.priceblock{scroll-margin-top:72px}
.phead{display:flex;align-items:flex-end;justify-content:space-between;gap:18px;
  flex-wrap:wrap;margin-bottom:22px;padding-bottom:14px;border-bottom:1px solid var(--line)}
.phead h2{margin:0}
.pfrom{font-family:var(--display);font-size:.9rem;color:var(--grass);font-weight:600}
.pmore{font-size:.86rem;padding:8px 16px;white-space:nowrap}
.grid.g1{grid-template-columns:minmax(0,420px)}
@media (max-width:620px){.pnavwrap{position:static}}

/* Results grid — filterable client cards */
.rfilters{display:flex;flex-direction:column;gap:12px;padding-bottom:22px;margin-bottom:26px;
  border-bottom:1px solid var(--line)}
.frow{display:flex;gap:14px;align-items:baseline;flex-wrap:wrap}
.flabel{font-family:var(--display);font-size:.7rem;font-weight:600;letter-spacing:.15em;
  text-transform:uppercase;color:var(--dim);min-width:72px}
.fchips{display:flex;flex-wrap:wrap;gap:7px}
.fchip{font-family:var(--body);font-size:.86rem;color:var(--muted);background:var(--ink-deep);
  border:1px solid var(--line);border-radius:999px;padding:6px 14px;cursor:pointer;
  transition:border-color .15s,color .15s,background .15s}
.fchip:hover{color:var(--paper);border-color:var(--dim)}
.fchip.on{background:var(--sky);border-color:var(--sky);color:#0C1114;font-weight:600}
.fmeta{justify-content:space-between;align-items:center;margin-top:2px}
.rcount{font-family:var(--display);font-size:.9rem;color:var(--paper);font-weight:600}
.fclear{background:none;border:none;color:var(--dim);font-size:.86rem;cursor:pointer;
  text-decoration:underline;text-underline-offset:3px;padding:4px}
.fclear:hover{color:var(--paper)}

.rgrid{display:flex;flex-direction:column;gap:10px}
.rcard{border:1px solid var(--line);border-radius:var(--r);background:var(--ink-deep);overflow:hidden}
.rcard:has(.rhead[aria-expanded="true"]){border-color:var(--sky-lo)}
.rhead{display:grid;grid-template-columns:150px 1fr auto 22px;gap:20px;align-items:center;
  width:100%;text-align:left;background:none;border:none;cursor:pointer;padding:16px 18px;
  font-family:inherit;transition:background .15s}
.rhead:hover{background:var(--surface)}
.rmark{display:flex;align-items:center;justify-content:flex-start;min-height:40px}
.rmark .clientlogo{max-height:38px;filter:brightness(0) invert(1);opacity:.9}
.rmeta{display:flex;flex-direction:column;gap:2px;min-width:0}
.rname{font-family:var(--display);font-weight:600;color:var(--paper);font-size:1rem}
.rsec{font-size:.84rem;color:var(--dim)}
.rfig{display:flex;flex-direction:column;align-items:flex-end;text-align:right;max-width:30ch}
.rnum{font-family:var(--display);font-weight:700;font-size:1.5rem;color:var(--grass);line-height:1.1}
.rfig.pending .rnum{color:var(--line)}
.rwhat{font-size:.78rem;color:var(--dim);line-height:1.3}
.rchev{color:var(--dim);display:flex;transition:transform .18s ease}
.rhead[aria-expanded="true"] .rchev{transform:rotate(180deg);color:var(--sky)}
.rbody{padding:4px 18px 20px;border-top:1px solid var(--line);
  display:flex;flex-direction:column;gap:14px}
.rsvcs{display:flex;flex-wrap:wrap;gap:6px;padding-top:14px}
.svc{font-size:.76rem;color:var(--sky);border:1px solid var(--sky-lo);border-radius:999px;padding:3px 11px}
.rwork{margin:0}
.rnote{color:var(--muted);font-size:.92rem;margin:0;font-style:italic}
.rbtn{align-self:flex-start;font-size:.86rem;padding:8px 16px}
.rempty{color:var(--dim);text-align:center;padding:36px 0}
/* [hidden] is display:none at UA specificity (0,0,1) — a class rule setting
   display:flex beats it, so these have to say it explicitly. */
.rbody[hidden],.rcard[hidden],.rempty[hidden]{display:none}
@media (max-width:860px){
  .rhead{grid-template-columns:1fr 22px;grid-template-areas:"mark chev" "meta chev" "fig chev";gap:10px}
  .rmark{grid-area:mark}.rmeta{grid-area:meta}
  .rfig{grid-area:fig;align-items:flex-start;text-align:left;max-width:none}
  .rchev{grid-area:chev;align-self:start;margin-top:6px}
}
@media (prefers-reduced-motion:reduce){.rchev{transition:none}}

/* Service areas index */
.aregions{display:flex;flex-direction:column;gap:26px}
.aregion{display:grid;grid-template-columns:260px 1fr;gap:22px;align-items:start;
  padding-top:20px;border-top:1px solid var(--line)}
.aregion:first-child{border-top:none;padding-top:0}
.arhead h3{margin:0 0 5px}
.acities{display:flex;flex-wrap:wrap;gap:8px}
.acity{display:inline-flex;flex-direction:column;gap:1px;padding:8px 13px;border-radius:var(--r);
  border:1px solid var(--line);background:var(--ink-deep);color:var(--muted);
  font-size:.92rem;line-height:1.25;text-decoration:none}
a.acity.live{border-color:var(--sky-lo);color:var(--paper)}
a.acity.live:hover{background:var(--surface);border-color:var(--sky)}
.acs{font-size:.68rem;letter-spacing:.06em;text-transform:uppercase;color:var(--dim)}
a.acity.live .acs{color:var(--sky)}
@media (max-width:760px){.aregion{grid-template-columns:1fr;gap:12px}}

.protonote{margin-top:30px;padding:10px 14px;border:1px dashed #4E5257;border-radius:var(--r);
  color:var(--dim);font-size:.8rem}
.protonote a{color:var(--dim)}
.protonote a:hover{color:var(--sky)}

/* ---------- T6-B: case study ("the receipt") ----------
   Result first. Somebody scanning has one question — did it work and by how much —
   so the number sits above the fold and the story explains it underneath. */
.unverified{border-top:none;background:rgba(224,166,74,.08)}
.unvbox{border-left:3px solid #E0A64A;padding-left:16px}
.unvk{font-family:var(--display);font-size:.68rem;font-weight:700;letter-spacing:.14em;
  text-transform:uppercase;color:#E0A64A}
.unvbox p{margin-top:6px;max-width:74ch}
.unvbox .ticks li{font-size:.88rem}

.cshero{border-top:none}
.csgrid{display:grid;grid-template-columns:1.15fr minmax(280px,.85fr);gap:44px;align-items:center}
@media (max-width:900px){.csgrid{grid-template-columns:1fr;gap:28px}}
.cscopy{display:flex;flex-direction:column;gap:15px;min-width:0}
.cscopy h1{max-width:14ch}
.csmark{display:flex;align-items:center;height:62px}
.csmark .clientlogo{max-height:52px;opacity:.95;filter:brightness(0) invert(1)}
.csmeta{display:flex;gap:34px;flex-wrap:wrap;border-top:1px solid var(--line);padding-top:16px;margin-top:4px}
.csmk{display:block;font-family:var(--display);font-size:.64rem;font-weight:600;letter-spacing:.15em;
  text-transform:uppercase;color:var(--dim);margin-bottom:6px}
.csmv{color:var(--muted);font-size:.92rem}
.cssvc{display:flex;gap:7px;flex-wrap:wrap}
.cssvc a{font-size:.85rem;color:var(--sky);text-decoration:none;border:1px solid rgba(56,161,219,.4);
  border-radius:999px;padding:3px 11px}
.cssvc a:hover{background:rgba(56,161,219,.12)}

/* the headline number */
.csbig{background:var(--surface);border:1px solid var(--line);border-top:3px solid var(--grass);
  border-radius:var(--r);padding:26px;display:flex;flex-direction:column;gap:6px;
  box-shadow:0 18px 50px rgba(0,0,0,.34)}
.csbk{font-family:var(--display);font-size:.65rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--grass)}
.csbfig{font-family:var(--display);font-weight:700;font-size:clamp(2.6rem,6vw,3.8rem);line-height:1;
  color:var(--paper);letter-spacing:-.03em;margin:4px 0}
.csbwhat{color:var(--muted);font-size:.98rem;line-height:1.45}
.csbsrc{font-family:ui-monospace,Menlo,monospace;font-size:.7rem;color:var(--dim);margin-top:8px;
  padding-top:10px;border-top:1px solid var(--line)}

/* supporting metrics — each one carries its own source line */
.mxgrid{display:flex;flex-wrap:wrap;gap:1px;
  background:var(--line);border:1px solid var(--line);border-radius:var(--r);overflow:hidden}
.mx{background:var(--ink-deep);padding:20px;display:flex;flex-direction:column;gap:5px;flex:1 1 215px;min-width:0}
.mxfig{font-family:var(--display);font-weight:700;font-size:1.85rem;line-height:1;color:var(--paper)}
.mxwhat{color:var(--muted);font-size:.89rem;line-height:1.45}
.mxsrc{font-family:ui-monospace,Menlo,monospace;font-size:.67rem;color:var(--dim);margin-top:5px}

.csquote{margin:36px 0 0;padding:24px 26px;background:var(--ink-deep);border:1px solid var(--line);
  border-left:3px solid var(--sky);border-radius:var(--r)}
.csquote p{font-family:var(--display);font-size:1.22rem;font-weight:500;line-height:1.5;
  color:var(--paper);text-wrap:balance;margin:0}
.csquote footer{display:flex;flex-direction:column;gap:3px;margin-top:16px;padding-top:14px;
  border-top:1px solid var(--line)}
.csquote cite{font-style:normal;font-family:var(--display);font-weight:600;color:var(--paper);font-size:.95rem}
.csqr{color:var(--muted);font-size:.86rem}
.csqs{font-family:ui-monospace,Menlo,monospace;font-size:.67rem;color:var(--dim);margin-top:5px}

.pills{display:flex;flex-wrap:wrap;gap:8px 10px}
.pills a{color:#9AA1A7;text-decoration:none;font-size:.88rem;border:1px solid var(--line);border-radius:999px;padding:6px 13px}
.pills a:hover{color:var(--sky);border-color:var(--sky)}

/* ---------- tables, faq ---------- */
.tablewrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r)}
table{width:100%;border-collapse:collapse;font-size:.94rem}
th,td{text-align:left;padding:12px 15px;border-bottom:1px solid var(--line)}
th{font-family:var(--display);font-size:.72rem;font-weight:600;letter-spacing:.11em;text-transform:uppercase;color:var(--muted);background:var(--ink-deep)}
td{color:var(--muted)}
td:first-child{color:var(--paper)}
tr:last-child td{border-bottom:none}
.num{font-variant-numeric:tabular-nums;white-space:nowrap}
details{border-bottom:1px solid var(--line)}
details summary{cursor:pointer;list-style:none;padding:16px 0;display:flex;justify-content:space-between;gap:16px;align-items:center;font-family:var(--display);font-size:1.07rem;font-weight:600}
details summary::-webkit-details-marker{display:none}
details summary::after{content:"+";color:var(--sky);font-size:1.5rem;line-height:1;flex:none}
details[open] summary::after{content:"–"}
details .ans{padding:0 0 18px;color:var(--muted);max-width:68ch}

/* ---------- footer ---------- */
/* scoped to the page footer: a bare `footer` selector also hits the <footer>
   inside each review blockquote and paints a band behind the attribution */
body > footer{border-top:1px solid var(--line);background:#1E1F21;position:relative;overflow:hidden}
body > footer .wrap{padding-block:46px 26px}
.fgrid{display:grid;grid-template-columns:1.4fr repeat(3,1fr);gap:32px}
@media (max-width:820px){.fgrid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}}
.fcol h4{font-family:var(--display);font-size:.74rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;color:var(--muted);margin:0 0 12px}
.fcol ul{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:7px}
.fcol a{color:#9AA1A7;text-decoration:none;font-size:.9rem}
.fcol a:hover{color:var(--sky)}
.fbot{display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-top:32px;padding-top:18px;border-top:1px solid var(--line);color:var(--dim);font-size:.84rem}

/* ---------- sticky cta ---------- */
.stickybar{position:fixed;left:0;right:0;bottom:0;z-index:30;display:flex;gap:12px;align-items:center;justify-content:center;background:rgba(31,32,34,.97);border-top:1px solid var(--line);padding:11px 20px calc(11px + env(safe-area-inset-bottom,0px));transform:translateY(110%);transition:transform .22s ease}
.stickybar.show{transform:translateY(0)}
.stickybar .msg{color:var(--muted);font-size:.9rem}
.stickybar .btn{padding:11px 20px;font-size:.92rem}
@media (max-width:760px){.stickybar .msg{display:none}.stickybar .btn{flex:1;padding:12px 14px;font-size:.9rem}}
body > footer .wrap{padding-bottom:92px}

@media (prefers-reduced-motion:reduce){*{transition:none!important;scroll-behavior:auto!important}}

/* ---------- T6: results index — filterable client grid ----------
   NB: the old .rcard rules on this page collided with the review-marquee
   .rcard (width:360px), which crushed the layout. These are cl* prefixed so
   nothing on this page can ever inherit from the marquee again. */
.clfilters{display:flex;flex-direction:column;gap:14px;padding-bottom:22px;
  margin-bottom:28px;border-bottom:1px solid var(--line)}
.clrow{display:flex;gap:14px;align-items:baseline;flex-wrap:wrap}
.cllabel{font-family:var(--display);font-size:.66rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--dim);flex:0 0 76px;padding-top:6px}
.clchips{display:flex;flex-wrap:wrap;gap:7px;flex:1;min-width:0}
.clchip{font-family:var(--body);font-size:.88rem;color:var(--muted);background:transparent;
  border:1px solid var(--line);border-radius:999px;padding:5px 14px;cursor:pointer;
  transition:border-color .15s,color .15s,background .15s}
.clchip:hover{border-color:var(--sky);color:var(--paper)}
.clchip[aria-pressed="true"]{border-color:var(--sky);background:rgba(56,161,219,.14);color:var(--paper)}
.clchip:focus-visible{outline:2px solid var(--sky);outline-offset:2px}
.clmeta{justify-content:space-between;align-items:center}
.clcount{font-family:var(--display);font-weight:600;color:var(--paper);font-size:.92rem}
.clclear{background:none;border:0;color:var(--sky);font-size:.88rem;cursor:pointer;
  padding:0;text-decoration:underline;text-underline-offset:3px}

.clgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:18px}
.clcard{display:flex;flex-direction:column;gap:0;border:1px solid var(--line);
  border-radius:var(--r);background:var(--ink-deep);text-decoration:none;color:inherit;
  overflow:hidden;transition:border-color .15s,transform .15s,background .15s}
.clcard:hover{border-color:var(--sky);background:var(--surface);transform:translateY(-2px)}
.clcard:focus-visible{outline:2px solid var(--sky);outline-offset:2px}
.clmark{display:flex;align-items:center;justify-content:center;height:96px;padding:18px;
  background:var(--ink);border-bottom:1px solid var(--line)}
/* Reversed to white, the same treatment the logo strip and the client-proof
   blocks already use. These are supplied dark-on-transparent, so without it
   they sit almost invisible on the charcoal card. */
.clmark img{max-height:46px;max-width:78%;width:auto;object-fit:contain;
  opacity:.85;filter:brightness(0) invert(1);transition:opacity .18s ease}
.clcard:hover .clmark img{opacity:1}
.clbody{display:flex;flex-direction:column;gap:9px;padding:18px 18px 16px;flex:1}
.clname{font-family:var(--display);font-weight:600;font-size:1.06rem;color:var(--paper);
  line-height:1.25;margin:0}
.clsector{font-size:.82rem;color:var(--dim);margin:0}
.clsum{font-size:.9rem;color:var(--muted);line-height:1.5;margin:0}
.clsvcs{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px}
.clsvc{font-size:.73rem;color:var(--muted);background:var(--ink);border:1px solid var(--line);
  border-radius:3px;padding:2px 8px;white-space:nowrap}
.clmore{font-family:var(--display);font-weight:600;font-size:.86rem;color:var(--sky);
  margin-top:auto;padding-top:12px}
.clempty{padding:38px 0;color:var(--muted);text-align:center}
.clempty[hidden],.clcard[hidden]{display:none}

/* ---------- individual client result page ---------- */
.clhero{border-top:none}
.clhead{display:grid;grid-template-columns:168px 1fr;gap:34px;align-items:center}
@media (max-width:720px){.clhead{grid-template-columns:1fr;gap:20px}}
.clhead .clmark{height:120px;border:1px solid var(--line);border-radius:var(--r)}
.clhq{display:flex;flex-direction:column;gap:12px;min-width:0}
.clhq h1{max-width:20ch}
.clnums{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:1px;
  background:var(--line);border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  margin-top:8px}
.clnums>div{background:var(--ink);padding:18px 20px;display:flex;flex-direction:column;gap:4px}
.clnums .nfig{font-family:var(--display);font-weight:700;font-size:1.8rem;line-height:1;color:var(--paper)}
.clnums .ncap{color:var(--muted);font-size:.85rem;line-height:1.4}
.clnums .nfig.await{color:var(--line);font-size:1.5rem}


/* ---------- blog index ----------
   A featured lead post, then a capped grid. The page opened as a wall of 31
   cards; now it shows a page at a time and the rest stay in the DOM so the
   filters and crawlers still see everything. */
.bloglead{margin-bottom:30px}
.blogcard p{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.blogcard[hidden]{display:none}
.blogfeat{display:grid;gap:10px;padding:26px 28px;border-color:var(--sky-lo);
  background:linear-gradient(120deg,var(--ink-deep) 0%,var(--surface) 100%)}
.blogfeat h3{font-size:clamp(1.35rem,2.6vw,1.9rem);line-height:1.18;max-width:24ch}
.blogfeat p{-webkit-line-clamp:4;font-size:.98rem;max-width:68ch}
.blogmonths{margin-top:4px}
.blogmonths summary{font-family:var(--display);font-size:.84rem;font-weight:600;
  color:var(--sky);cursor:pointer;list-style:none;padding:4px 0;width:fit-content}
.blogmonths summary::-webkit-details-marker{display:none}
.blogmonths summary::before{content:"\203A ";display:inline-block;transition:transform .15s ease}
.blogmonths[open] summary::before{transform:rotate(90deg)}
.blogmore{display:flex;justify-content:center;margin-top:32px}
.blogmore button[hidden]{display:none}

/* ---------- blog post body images ----------
   Post images are 1400px wide; the prose column is ~68ch. Without this they
   render at natural width and bleed straight out of the column. */
.prose figure{margin:26px 0;gap:10px;max-width:100%}
.prose figure img,.prose img{display:block;width:100%;height:auto;max-width:100%;
  border:1px solid var(--line);border-radius:var(--r);background:var(--ink-deep)}
.prose figcaption{font-size:.84rem;color:var(--dim);line-height:1.5;max-width:68ch}
.prose table{max-width:100%}

/* lead image, between the hero and the first paragraph */
.postlead{margin:0 0 6px}
.postlead img{display:block;width:100%;height:auto;border:1px solid var(--line);
  border-radius:var(--r);background:var(--ink-deep)}

/* ---------- blog card thumbnails ----------
   These are text-heavy graphics: the headline is baked into the image, so
   cropping them destroys the thing a reader is scanning for. The library is
   mixed (43 at 3:2, 21 at 16:9), so the box is 3:2 and the image is
   contained rather than cropped. The light backing matches the graphics'
   own white field so the letterboxing on 16:9 reads as a margin. */
.blogcard{padding:0;overflow:hidden}
.blogthumb{display:block;width:100%;aspect-ratio:3/2;object-fit:contain;
  background:var(--paper);border-bottom:1px solid var(--line)}
.blogcard .blogbody{display:flex;flex-direction:column;gap:9px;padding:20px 22px 22px;flex:1}
.blogcard h3{font-size:1.08rem;line-height:1.3}
.blogcard p{font-size:.93rem;-webkit-line-clamp:3}

/* Wider cards so the thumbnail is actually legible: two per row on desktop,
   three only on very wide screens. */
.bloggrid{display:grid;gap:22px;grid-template-columns:repeat(auto-fill,minmax(420px,1fr))}
@media (min-width:1500px){.bloggrid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:900px){.bloggrid{grid-template-columns:1fr;gap:18px}}

/* featured lead card: image beside the copy, not above it */
.blogfeat{padding:0;display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);
  align-items:stretch;gap:0}
.blogfeat .blogthumb{aspect-ratio:3/2;height:100%;border-bottom:0;border-right:1px solid var(--line)}
.blogfeat .blogbody{padding:30px 34px;gap:12px;justify-content:center}
.blogfeat h3{font-size:clamp(1.3rem,2.3vw,1.75rem);line-height:1.2}
.blogfeat p{font-size:1rem;-webkit-line-clamp:4}
@media (max-width:900px){
  .blogfeat{grid-template-columns:1fr}
  .blogfeat .blogthumb{border-right:0;border-bottom:1px solid var(--line)}
  .blogfeat .blogbody{padding:22px 24px}
}

/* ---------- "the written version" block on service pages ----------
   The divider rule and heading spanned the full 1140px container while the
   body copy was capped at ~66ch, leaving a dead zone down the right-hand
   side. Constraining the whole block to one measure makes it read as a
   deliberate column instead of text floating in a wide container.
   An .writtenart two-column variant is available where a genuine
   service-specific photo exists. */
/* Wherever a section holds body copy, the divider rule and heading take the
   same measure as the copy. Previously the rule spanned the full 1140px
   container while the text stopped at ~66ch, so the block read as broken on
   a wide screen.

   The measure is capped, never centred: capping .wrap would re-centre the
   block and shift its left edge inward, breaking alignment with every other
   section on the page. */
.wrap:has(> .prose) > .chevrule,
.wrap:has(> .prose) > .sechead{max-width:var(--measure,66ch)}
.written{--measure:860px}

/* :has() is unsupported on a few older browsers; there the rule simply spans
   the container as it did before, which is a cosmetic fallback, not a break. */

/* two-column variant: copy left, sticky image right */
.writtengrid{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:48px;align-items:start}
@media (max-width:900px){.writtengrid{grid-template-columns:1fr;gap:26px}}
.writtenaside{position:sticky;top:96px;display:flex;flex-direction:column;gap:10px}
.writtenaside img{width:100%;height:auto;display:block;border:1px solid var(--line);
  border-radius:var(--r)}
.writtenaside figcaption{font-size:.82rem;color:var(--dim);line-height:1.45}

/* ---------- lists that carry their own chevron marker ----------
   These items start with an inline chevron SVG, so the list's own bullet is
   a second marker sitting beside the first. Drop the bullet, keep the
   chevron, and hang the text off it so wrapped lines align under the words
   rather than under the arrow. */
.prose ul:has(> li > svg:first-child),
ul:has(> li > svg:first-child){list-style:none;padding-left:0}
/* Hanging chevron: the marker is taken out of flow so the text keeps running
   as one paragraph. Flexing the <li> made <strong> a sibling column and broke
   every item into a ragged two-column block. */
.prose ul:has(> li > svg:first-child) > li,
ul:has(> li > svg:first-child) > li:not([style*="flex"]){display:block;position:relative;
  padding-left:26px;line-height:1.6}
.prose ul:has(> li > svg:first-child) > li > svg:first-child,
ul:has(> li > svg:first-child) > li:not([style*="flex"]) > svg:first-child{position:absolute;left:0;top:6px}
.prose ul:has(> li > svg:first-child) > li > strong{color:var(--paper)}

/* Google attribution on a client review: the mark and the rating sit above
   the quote so it reads as a verified Google review, not a pull quote we
   wrote ourselves. */
.csqhead{display:flex;align-items:center;gap:9px;margin-bottom:14px}
.csqhead .gicon{flex:0 0 auto;display:block}
.csqhead .stars{color:#E8B33A;font-size:1rem;letter-spacing:.08em;line-height:1}
.csqg{font-family:var(--display);font-size:.78rem;font-weight:600;letter-spacing:.09em;
  text-transform:uppercase;color:var(--dim)}

/* ---------- industries hub ----------
   The whole category card lifts on hover, not just the link inside it, so the
   card reads as one object. */
.card:has(.tradelink){transition:border-color .15s,background .15s,transform .15s}
.card:has(.tradelink):hover{border-color:var(--sky);background:#323437;transform:translateY(-2px)}
.tradelink{color:var(--muted);text-decoration:none;display:flex;gap:8px;align-items:center;
  line-height:1.3;transition:color .15s}
.tradelink:hover{color:var(--paper)}
.tradelink svg{flex:0 0 auto}
/* a trade whose page exists reads as live; the rest are plain text until built */
.tradelink.live{color:var(--paper);font-weight:500}
.tradelink.live:hover{color:var(--sky)}
.tradelink:not(.live){cursor:default;pointer-events:none}

/* ---------- T4: industry page ----------
   Each block takes a shape that suits its content. The first version ran
   everything through one 66ch column inside an 1140px container, which left
   half the page empty and made the page feel unfinished. */
.indhero .wrap{padding-block:clamp(38px,5vw,66px)}
.indhead{display:flex;flex-direction:column;gap:16px;max-width:60ch}
.indhead h1{max-width:18ch}
h1 em{font-style:normal;color:var(--sky)}
.indlede{color:var(--muted);font-size:1.12rem;line-height:1.6;max-width:56ch}

/* the season: four cards, so the year reads at a glance */
.seasongrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(248px,1fr));gap:18px}
.seasoncard{display:flex;flex-direction:column;gap:9px;padding:22px;border:1px solid var(--line);
  border-top:2px solid var(--sky);border-radius:var(--r);background:var(--ink-deep)}
.seasoncard .when{font-family:var(--display);font-size:.7rem;font-weight:700;letter-spacing:.15em;
  text-transform:uppercase;color:var(--sky)}
.seasoncard h3{color:var(--paper);font-size:1.04rem;line-height:1.3}
.seasoncard p{color:var(--muted);font-size:.92rem;line-height:1.6;margin:0}

/* two-business split */
.splitpair{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px}
.splitcard{display:flex;flex-direction:column;gap:11px;padding:26px;border:1px solid var(--line);
  border-radius:var(--r);background:var(--ink-deep)}
.splitcard.a{border-left:2px solid var(--grass)}
.splitcard.b{border-left:2px solid var(--sky)}
.splitcard h3{color:var(--paper);font-size:1.12rem}
.splitcard p{color:var(--muted);font-size:.94rem;line-height:1.65;margin:0}
.splitcard dl{margin:6px 0 0;display:grid;grid-template-columns:auto 1fr;gap:7px 14px;font-size:.89rem}
.splitcard dt{color:var(--dim)}
.splitcard dd{margin:0;color:var(--paper)}

/* search intent: three columns of real terms */
.termgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:20px}
.termcard{display:flex;flex-direction:column;gap:10px;padding:22px;border:1px solid var(--line);
  border-radius:var(--r)}
.termcard h3{color:var(--paper);font-size:1rem}
.termcard .intent{font-family:var(--display);font-size:.68rem;font-weight:700;letter-spacing:.14em;
  text-transform:uppercase}
.termcard.buy .intent{color:var(--grass)}
.termcard.research .intent{color:var(--sky)}
.termcard.emergency .intent{color:#E0A64A}
.termlist{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}
.termlist li{color:var(--muted);font-size:.9rem;font-family:var(--body)}
.termcard .note{color:var(--dim);font-size:.85rem;line-height:1.55;margin:4px 0 0;
  padding-top:11px;border-top:1px solid var(--line)}

/* the objection block: copy left, the counter-argument pulled out right */
.objgrid{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);gap:44px;align-items:start}
@media (max-width:900px){.objgrid{grid-template-columns:1fr;gap:24px}}
.objaside{border:1px solid var(--line);border-left:2px solid var(--sky);border-radius:var(--r);
  padding:22px;display:flex;flex-direction:column;gap:12px;background:var(--ink-deep)}
.objaside h3{color:var(--paper);font-size:1rem}
.objaside p{color:var(--muted);font-size:.92rem;line-height:1.65;margin:0}
/* a section's lede now sits in .sechead rather than as the first line of a
   .prose column, so it needs the body treatment the prose used to give it */
.sechead>p{color:var(--muted);font-size:1.02rem;line-height:1.65;margin:0}


/* ---------- Enterprise tier ----------
   Same card as every other tier, set apart by color rather than size: green
   where the others are blue, so it reads as a different kind of engagement
   without taking a different shape. */
.tier.ent{border-color:rgba(63,174,98,.5);box-shadow:inset 0 2px 0 var(--grass)}
.tier.ent .fig{color:var(--paper)}
.tier.ent .fig small{font-size:1.05rem;font-weight:600;color:var(--grass);margin-left:2px}
.tier.ent .per{color:var(--grass)}

/* ---------- service areas ----------
   The map is a Leaflet slippy map on CARTO's dark basemap. Panel chrome is
   restyled so it reads as part of the site rather than a bolted-on widget. */
.mapfig{margin:0 0 30px;border:1px solid var(--line);border-radius:var(--r);
  background:var(--ink-deep);overflow:hidden}
.areamap{display:block;width:100%;height:clamp(380px,46vw,540px);background:var(--ink-deep)}
.areamap .leaflet-container{background:var(--ink-deep);font-family:var(--body)}
/* OSM ships a light map; invert and re-rotate the hue so it reads dark and
   keeps roads and water the right way round. Applied to the tiles only, so
   pins, labels and controls above them keep their real colours. */
.areamap .leaflet-tile-pane{filter:invert(1) hue-rotate(180deg) brightness(.82)
  contrast(.92) saturate(.72)}
.areamap .leaflet-control-zoom a{background:var(--surface);color:var(--paper);
  border-color:var(--line)}
.areamap .leaflet-control-zoom a:hover{background:#323437}
.areamap .leaflet-control-attribution{background:rgba(26,28,30,.82);color:var(--dim);
  font-size:.72rem}
.areamap .leaflet-control-attribution a{color:var(--muted)}
.areamap .pinlabel{background:transparent;border:none;box-shadow:none;
  color:var(--dim);font-family:var(--body);font-size:.84rem;font-weight:400;
  padding:0;white-space:nowrap}
.areamap .pinlabel::before{display:none}
.areamap .pinlabel.live{color:var(--paper);font-size:.94rem;font-weight:600;
  text-shadow:0 1px 3px rgba(0,0,0,.9)}
.areamap .pinlabel.office{color:var(--grass);font-family:var(--display);
  font-weight:700;font-size:.86rem;text-shadow:0 1px 3px rgba(0,0,0,.9)}
.areamap .leaflet-popup-content-wrapper,.areamap .leaflet-popup-tip{
  background:var(--surface);color:var(--paper);border:1px solid var(--line)}
.areamap .leaflet-popup-content a{color:var(--sky)}
.areamap .pin-live{transition:opacity .15s}
.areamap .pin-live:hover{opacity:.75}
.maplegend{display:flex;flex-wrap:wrap;gap:10px 26px;padding:14px 20px;
  border-top:1px solid var(--line);background:var(--surface)}
.mlk{display:flex;align-items:center;gap:8px;color:var(--muted);font-size:.86rem}
.mlk::before{content:"";width:10px;height:10px;border-radius:50%;flex:none}
.mlk.office::before{background:var(--grass)}
.mlk.live::before{background:var(--sky)}
.mlk.plain::before{background:none;border:2px solid var(--dim);width:8px;height:8px}
.aregions{display:flex;flex-direction:column;gap:26px}
.aregion{display:grid;grid-template-columns:260px 1fr;gap:22px;align-items:start;
  padding-top:20px;border-top:1px solid var(--line)}
.aregion:first-child{border-top:none;padding-top:0}
.arhead h3{margin:0 0 5px}
.acities{display:flex;flex-wrap:wrap;gap:8px}
.acity{display:inline-flex;flex-direction:column;gap:1px;padding:8px 13px;border-radius:var(--r);
  border:1px solid var(--line);background:var(--ink-deep);color:var(--muted);
  font-size:.92rem;line-height:1.25;text-decoration:none}
a.acity.live{border-color:var(--sky-lo);color:var(--paper)}
a.acity.live:hover{background:var(--surface);border-color:var(--sky)}
.acs{font-size:.68rem;letter-spacing:.06em;text-transform:uppercase;color:var(--dim)}
a.acity.live .acs{color:var(--sky)}
@media (max-width:760px){.aregion{grid-template-columns:1fr;gap:12px}}

.protonote{margin-top:30px;padding:10px 14px;border:1px dashed #4E5257;border-radius:var(--r);
  color:var(--dim);font-size:.8rem}
.protonote a{color:var(--dim)}
.protonote a:hover{color:var(--sky)}

/* ---------- T6-B: case study ("the receipt") ----------
   Result first. Somebody scanning has one question — did it work and by how much —
   so the number sits above the fold and the story explains it underneath. */
.unverified{border-top:none;background:rgba(224,166,74,.08)}
.unvbox{border-left:3px solid #E0A64A;padding-left:16px}
.unvk{font-family:var(--display);font-size:.68rem;font-weight:700;letter-spacing:.14em;
  text-transform:uppercase;color:#E0A64A}
.unvbox p{margin-top:6px;max-width:74ch}
.unvbox .ticks li{font-size:.88rem}

.cshero{border-top:none}
.csgrid{display:grid;grid-template-columns:1.15fr minmax(280px,.85fr);gap:44px;align-items:center}
@media (max-width:900px){.csgrid{grid-template-columns:1fr;gap:28px}}
.cscopy{display:flex;flex-direction:column;gap:15px;min-width:0}
.cscopy h1{max-width:14ch}
.csmark{display:flex;align-items:center;height:62px}
.csmark .clientlogo{max-height:52px;opacity:.95;filter:brightness(0) invert(1)}
.csmeta{display:flex;gap:34px;flex-wrap:wrap;border-top:1px solid var(--line);padding-top:16px;margin-top:4px}
.csmk{display:block;font-family:var(--display);font-size:.64rem;font-weight:600;letter-spacing:.15em;
  text-transform:uppercase;color:var(--dim);margin-bottom:6px}
.csmv{color:var(--muted);font-size:.92rem}
.cssvc{display:flex;gap:7px;flex-wrap:wrap}
.cssvc a{font-size:.85rem;color:var(--sky);text-decoration:none;border:1px solid rgba(56,161,219,.4);
  border-radius:999px;padding:3px 11px}
.cssvc a:hover{background:rgba(56,161,219,.12)}

/* the headline number */
.csbig{background:var(--surface);border:1px solid var(--line);border-top:3px solid var(--grass);
  border-radius:var(--r);padding:26px;display:flex;flex-direction:column;gap:6px;
  box-shadow:0 18px 50px rgba(0,0,0,.34)}
.csbk{font-family:var(--display);font-size:.65rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--grass)}
.csbfig{font-family:var(--display);font-weight:700;font-size:clamp(2.6rem,6vw,3.8rem);line-height:1;
  color:var(--paper);letter-spacing:-.03em;margin:4px 0}
.csbwhat{color:var(--muted);font-size:.98rem;line-height:1.45}
.csbsrc{font-family:ui-monospace,Menlo,monospace;font-size:.7rem;color:var(--dim);margin-top:8px;
  padding-top:10px;border-top:1px solid var(--line)}

/* supporting metrics — each one carries its own source line */
.mxgrid{display:flex;flex-wrap:wrap;gap:1px;
  background:var(--line);border:1px solid var(--line);border-radius:var(--r);overflow:hidden}
.mx{background:var(--ink-deep);padding:20px;display:flex;flex-direction:column;gap:5px;flex:1 1 215px;min-width:0}
.mxfig{font-family:var(--display);font-weight:700;font-size:1.85rem;line-height:1;color:var(--paper)}
.mxwhat{color:var(--muted);font-size:.89rem;line-height:1.45}
.mxsrc{font-family:ui-monospace,Menlo,monospace;font-size:.67rem;color:var(--dim);margin-top:5px}

.csquote{margin:36px 0 0;padding:24px 26px;background:var(--ink-deep);border:1px solid var(--line);
  border-left:3px solid var(--sky);border-radius:var(--r)}
.csquote p{font-family:var(--display);font-size:1.22rem;font-weight:500;line-height:1.5;
  color:var(--paper);text-wrap:balance;margin:0}
.csquote footer{display:flex;flex-direction:column;gap:3px;margin-top:16px;padding-top:14px;
  border-top:1px solid var(--line)}
.csquote cite{font-style:normal;font-family:var(--display);font-weight:600;color:var(--paper);font-size:.95rem}
.csqr{color:var(--muted);font-size:.86rem}
.csqs{font-family:ui-monospace,Menlo,monospace;font-size:.67rem;color:var(--dim);margin-top:5px}

.pills{display:flex;flex-wrap:wrap;gap:8px 10px}
.pills a{color:#9AA1A7;text-decoration:none;font-size:.88rem;border:1px solid var(--line);border-radius:999px;padding:6px 13px}
.pills a:hover{color:var(--sky);border-color:var(--sky)}

/* ---------- tables, faq ---------- */
.tablewrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r)}
table{width:100%;border-collapse:collapse;font-size:.94rem}
th,td{text-align:left;padding:12px 15px;border-bottom:1px solid var(--line)}
th{font-family:var(--display);font-size:.72rem;font-weight:600;letter-spacing:.11em;text-transform:uppercase;color:var(--muted);background:var(--ink-deep)}
td{color:var(--muted)}
td:first-child{color:var(--paper)}
tr:last-child td{border-bottom:none}
.num{font-variant-numeric:tabular-nums;white-space:nowrap}
details{border-bottom:1px solid var(--line)}
details summary{cursor:pointer;list-style:none;padding:16px 0;display:flex;justify-content:space-between;gap:16px;align-items:center;font-family:var(--display);font-size:1.07rem;font-weight:600}
details summary::-webkit-details-marker{display:none}
details summary::after{content:"+";color:var(--sky);font-size:1.5rem;line-height:1;flex:none}
details[open] summary::after{content:"–"}
details .ans{padding:0 0 18px;color:var(--muted);max-width:68ch}

/* ---------- footer ---------- */
/* scoped to the page footer: a bare `footer` selector also hits the <footer>
   inside each review blockquote and paints a band behind the attribution */
body > footer{border-top:1px solid var(--line);background:#1E1F21;position:relative;overflow:hidden}
body > footer .wrap{padding-block:46px 26px}
.fgrid{display:grid;grid-template-columns:1.4fr repeat(3,1fr);gap:32px}
@media (max-width:820px){.fgrid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}}
.fcol h4{font-family:var(--display);font-size:.74rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;color:var(--muted);margin:0 0 12px}
.fcol ul{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:7px}
.fcol a{color:#9AA1A7;text-decoration:none;font-size:.9rem}
.fcol a:hover{color:var(--sky)}
.fbot{display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;margin-top:32px;padding-top:18px;border-top:1px solid var(--line);color:var(--dim);font-size:.84rem}

/* ---------- sticky cta ---------- */
.stickybar{position:fixed;left:0;right:0;bottom:0;z-index:30;display:flex;gap:12px;align-items:center;justify-content:center;background:rgba(31,32,34,.97);border-top:1px solid var(--line);padding:11px 20px calc(11px + env(safe-area-inset-bottom,0px));transform:translateY(110%);transition:transform .22s ease}
.stickybar.show{transform:translateY(0)}
.stickybar .msg{color:var(--muted);font-size:.9rem}
.stickybar .btn{padding:11px 20px;font-size:.92rem}
@media (max-width:760px){.stickybar .msg{display:none}.stickybar .btn{flex:1;padding:12px 14px;font-size:.9rem}}
body > footer .wrap{padding-bottom:92px}

@media (prefers-reduced-motion:reduce){*{transition:none!important;scroll-behavior:auto!important}}

/* ---------- T6: results index — filterable client grid ----------
   NB: the old .rcard rules on this page collided with the review-marquee
   .rcard (width:360px), which crushed the layout. These are cl* prefixed so
   nothing on this page can ever inherit from the marquee again. */
.clfilters{display:flex;flex-direction:column;gap:14px;padding-bottom:22px;
  margin-bottom:28px;border-bottom:1px solid var(--line)}
.clrow{display:flex;gap:14px;align-items:baseline;flex-wrap:wrap}
.cllabel{font-family:var(--display);font-size:.66rem;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;color:var(--dim);flex:0 0 76px;padding-top:6px}
.clchips{display:flex;flex-wrap:wrap;gap:7px;flex:1;min-width:0}
.clchip{font-family:var(--body);font-size:.88rem;color:var(--muted);background:transparent;
  border:1px solid var(--line);border-radius:999px;padding:5px 14px;cursor:pointer;
  transition:border-color .15s,color .15s,background .15s}
.clchip:hover{border-color:var(--sky);color:var(--paper)}
.clchip[aria-pressed="true"]{border-color:var(--sky);background:rgba(56,161,219,.14);color:var(--paper)}
.clchip:focus-visible{outline:2px solid var(--sky);outline-offset:2px}
.clmeta{justify-content:space-between;align-items:center}
.clcount{font-family:var(--display);font-weight:600;color:var(--paper);font-size:.92rem}
.clclear{background:none;border:0;color:var(--sky);font-size:.88rem;cursor:pointer;
  padding:0;text-decoration:underline;text-underline-offset:3px}

.clgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:18px}
.clcard{display:flex;flex-direction:column;gap:0;border:1px solid var(--line);
  border-radius:var(--r);background:var(--ink-deep);text-decoration:none;color:inherit;
  overflow:hidden;transition:border-color .15s,transform .15s,background .15s}
.clcard:hover{border-color:var(--sky);background:var(--surface);transform:translateY(-2px)}
.clcard:focus-visible{outline:2px solid var(--sky);outline-offset:2px}
.clmark{display:flex;align-items:center;justify-content:center;height:96px;padding:18px;
  background:var(--ink);border-bottom:1px solid var(--line)}
/* Reversed to white, the same treatment the logo strip and the client-proof
   blocks already use. These are supplied dark-on-transparent, so without it
   they sit almost invisible on the charcoal card. */
.clmark img{max-height:46px;max-width:78%;width:auto;object-fit:contain;
  opacity:.85;filter:brightness(0) invert(1);transition:opacity .18s ease}
.clcard:hover .clmark img{opacity:1}
.clbody{display:flex;flex-direction:column;gap:9px;padding:18px 18px 16px;flex:1}
.clname{font-family:var(--display);font-weight:600;font-size:1.06rem;color:var(--paper);
  line-height:1.25;margin:0}
.clsector{font-size:.82rem;color:var(--dim);margin:0}
.clsum{font-size:.9rem;color:var(--muted);line-height:1.5;margin:0}
.clsvcs{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px}
.clsvc{font-size:.73rem;color:var(--muted);background:var(--ink);border:1px solid var(--line);
  border-radius:3px;padding:2px 8px;white-space:nowrap}
.clmore{font-family:var(--display);font-weight:600;font-size:.86rem;color:var(--sky);
  margin-top:auto;padding-top:12px}
.clempty{padding:38px 0;color:var(--muted);text-align:center}
.clempty[hidden],.clcard[hidden]{display:none}

/* ---------- individual client result page ---------- */
.clhero{border-top:none}
.clhead{display:grid;grid-template-columns:168px 1fr;gap:34px;align-items:center}
@media (max-width:720px){.clhead{grid-template-columns:1fr;gap:20px}}
.clhead .clmark{height:120px;border:1px solid var(--line);border-radius:var(--r)}
.clhq{display:flex;flex-direction:column;gap:12px;min-width:0}
.clhq h1{max-width:20ch}
.clnums{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:1px;
  background:var(--line);border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  margin-top:8px}
.clnums>div{background:var(--ink);padding:18px 20px;display:flex;flex-direction:column;gap:4px}
.clnums .nfig{font-family:var(--display);font-weight:700;font-size:1.8rem;line-height:1;color:var(--paper)}
.clnums .ncap{color:var(--muted);font-size:.85rem;line-height:1.4}
.clnums .nfig.await{color:var(--line);font-size:1.5rem}


/* ---------- blog index ----------
   A featured lead post, then a capped grid. The page opened as a wall of 31
   cards; now it shows a page at a time and the rest stay in the DOM so the
   filters and crawlers still see everything. */
.bloglead{margin-bottom:30px}
.blogcard p{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.blogcard[hidden]{display:none}
.blogfeat{display:grid;gap:10px;padding:26px 28px;border-color:var(--sky-lo);
  background:linear-gradient(120deg,var(--ink-deep) 0%,var(--surface) 100%)}
.blogfeat h3{font-size:clamp(1.35rem,2.6vw,1.9rem);line-height:1.18;max-width:24ch}
.blogfeat p{-webkit-line-clamp:4;font-size:.98rem;max-width:68ch}
.blogmonths{margin-top:4px}
.blogmonths summary{font-family:var(--display);font-size:.84rem;font-weight:600;
  color:var(--sky);cursor:pointer;list-style:none;padding:4px 0;width:fit-content}
.blogmonths summary::-webkit-details-marker{display:none}
.blogmonths summary::before{content:"\203A ";display:inline-block;transition:transform .15s ease}
.blogmonths[open] summary::before{transform:rotate(90deg)}
.blogmore{display:flex;justify-content:center;margin-top:32px}
.blogmore button[hidden]{display:none}

/* ---------- blog post body images ----------
   Post images are 1400px wide; the prose column is ~68ch. Without this they
   render at natural width and bleed straight out of the column. */
.prose figure{margin:26px 0;gap:10px;max-width:100%}
.prose figure img,.prose img{display:block;width:100%;height:auto;max-width:100%;
  border:1px solid var(--line);border-radius:var(--r);background:var(--ink-deep)}
.prose figcaption{font-size:.84rem;color:var(--dim);line-height:1.5;max-width:68ch}
.prose table{max-width:100%}

/* lead image, between the hero and the first paragraph */
.postlead{margin:0 0 6px}
.postlead img{display:block;width:100%;height:auto;border:1px solid var(--line);
  border-radius:var(--r);background:var(--ink-deep)}

/* ---------- blog card thumbnails ----------
   These are text-heavy graphics: the headline is baked into the image, so
   cropping them destroys the thing a reader is scanning for. The library is
   mixed (43 at 3:2, 21 at 16:9), so the box is 3:2 and the image is
   contained rather than cropped. The light backing matches the graphics'
   own white field so the letterboxing on 16:9 reads as a margin. */
.blogcard{padding:0;overflow:hidden}
.blogthumb{display:block;width:100%;aspect-ratio:3/2;object-fit:contain;
  background:var(--paper);border-bottom:1px solid var(--line)}
.blogcard .blogbody{display:flex;flex-direction:column;gap:9px;padding:20px 22px 22px;flex:1}
.blogcard h3{font-size:1.08rem;line-height:1.3}
.blogcard p{font-size:.93rem;-webkit-line-clamp:3}

/* Wider cards so the thumbnail is actually legible: two per row on desktop,
   three only on very wide screens. */
.bloggrid{display:grid;gap:22px;grid-template-columns:repeat(auto-fill,minmax(420px,1fr))}
@media (min-width:1500px){.bloggrid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:900px){.bloggrid{grid-template-columns:1fr;gap:18px}}

/* featured lead card: image beside the copy, not above it */
.blogfeat{padding:0;display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);
  align-items:stretch;gap:0}
.blogfeat .blogthumb{aspect-ratio:3/2;height:100%;border-bottom:0;border-right:1px solid var(--line)}
.blogfeat .blogbody{padding:30px 34px;gap:12px;justify-content:center}
.blogfeat h3{font-size:clamp(1.3rem,2.3vw,1.75rem);line-height:1.2}
.blogfeat p{font-size:1rem;-webkit-line-clamp:4}
@media (max-width:900px){
  .blogfeat{grid-template-columns:1fr}
  .blogfeat .blogthumb{border-right:0;border-bottom:1px solid var(--line)}
  .blogfeat .blogbody{padding:22px 24px}
}

/* ---------- "the written version" block on service pages ----------
   The divider rule and heading spanned the full 1140px container while the
   body copy was capped at ~66ch, leaving a dead zone down the right-hand
   side. Constraining the whole block to one measure makes it read as a
   deliberate column instead of text floating in a wide container.
   An .writtenart two-column variant is available where a genuine
   service-specific photo exists. */
/* Wherever a section holds body copy, the divider rule and heading take the
   same measure as the copy. Previously the rule spanned the full 1140px
   container while the text stopped at ~66ch, so the block read as broken on
   a wide screen.

   The measure is capped, never centred: capping .wrap would re-centre the
   block and shift its left edge inward, breaking alignment with every other
   section on the page. */
.wrap:has(> .prose) > .chevrule,
.wrap:has(> .prose) > .sechead{max-width:var(--measure,66ch)}
.written{--measure:860px}

/* :has() is unsupported on a few older browsers; there the rule simply spans
   the container as it did before, which is a cosmetic fallback, not a break. */

/* two-column variant: copy left, sticky image right */
.writtengrid{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:48px;align-items:start}
@media (max-width:900px){.writtengrid{grid-template-columns:1fr;gap:26px}}
.writtenaside{position:sticky;top:96px;display:flex;flex-direction:column;gap:10px}
.writtenaside img{width:100%;height:auto;display:block;border:1px solid var(--line);
  border-radius:var(--r)}
.writtenaside figcaption{font-size:.82rem;color:var(--dim);line-height:1.45}

/* ---------- lists that carry their own chevron marker ----------
   These items start with an inline chevron SVG, so the list's own bullet is
   a second marker sitting beside the first. Drop the bullet, keep the
   chevron, and hang the text off it so wrapped lines align under the words
   rather than under the arrow. */
.prose ul:has(> li > svg:first-child),
ul:has(> li > svg:first-child){list-style:none;padding-left:0}
/* Hanging chevron: the marker is taken out of flow so the text keeps running
   as one paragraph. Flexing the <li> made <strong> a sibling column and broke
   every item into a ragged two-column block. */
.prose ul:has(> li > svg:first-child) > li,
ul:has(> li > svg:first-child) > li:not([style*="flex"]){display:block;position:relative;
  padding-left:26px;line-height:1.6}
.prose ul:has(> li > svg:first-child) > li > svg:first-child,
ul:has(> li > svg:first-child) > li:not([style*="flex"]) > svg:first-child{position:absolute;left:0;top:6px}
.prose ul:has(> li > svg:first-child) > li > strong{color:var(--paper)}

/* Google attribution on a client review: the mark and the rating sit above
   the quote so it reads as a verified Google review, not a pull quote we
   wrote ourselves. */
.csqhead{display:flex;align-items:center;gap:9px;margin-bottom:14px}
.csqhead .gicon{flex:0 0 auto;display:block}
.csqhead .stars{color:#E8B33A;font-size:1rem;letter-spacing:.08em;line-height:1}
.csqg{font-family:var(--display);font-size:.78rem;font-weight:600;letter-spacing:.09em;
  text-transform:uppercase;color:var(--dim)}

/* ---------- industries hub ----------
   The whole category card lifts on hover, not just the link inside it, so the
   card reads as one object. */
.card:has(.tradelink){transition:border-color .15s,background .15s,transform .15s}
.card:has(.tradelink):hover{border-color:var(--sky);background:#323437;transform:translateY(-2px)}
.tradelink{color:var(--muted);text-decoration:none;display:flex;gap:8px;align-items:center;
  line-height:1.3;transition:color .15s}
.tradelink:hover{color:var(--paper)}
.tradelink svg{flex:0 0 auto}
/* a trade whose page exists reads as live; the rest are plain text until built */
.tradelink.live{color:var(--paper);font-weight:500}
.tradelink.live:hover{color:var(--sky)}
.tradelink:not(.live){cursor:default;pointer-events:none}

/* ---------- T4: industry page ----------
   Each block takes a shape that suits its content. The first version ran
   everything through one 66ch column inside an 1140px container, which left
   half the page empty and made the page feel unfinished. */
.indhero .wrap{padding-block:clamp(38px,5vw,66px)}
.indhead{display:flex;flex-direction:column;gap:16px;max-width:60ch}
.indhead h1{max-width:18ch}
.indlede{color:var(--muted);font-size:1.12rem;line-height:1.6;max-width:56ch}

/* the season: four cards, so the year reads at a glance */
.seasongrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(248px,1fr));gap:18px}
.seasoncard{display:flex;flex-direction:column;gap:9px;padding:22px;border:1px solid var(--line);
  border-top:2px solid var(--sky);border-radius:var(--r);background:var(--ink-deep)}
.seasoncard .when{font-family:var(--display);font-size:.7rem;font-weight:700;letter-spacing:.15em;
  text-transform:uppercase;color:var(--sky)}
.seasoncard h3{color:var(--paper);font-size:1.04rem;line-height:1.3}
.seasoncard p{color:var(--muted);font-size:.92rem;line-height:1.6;margin:0}

/* two-business split */
.splitpair{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px}
.splitcard{display:flex;flex-direction:column;gap:11px;padding:26px;border:1px solid var(--line);
  border-radius:var(--r);background:var(--ink-deep)}
.splitcard.a{border-left:2px solid var(--grass)}
.splitcard.b{border-left:2px solid var(--sky)}
.splitcard h3{color:var(--paper);font-size:1.12rem}
.splitcard p{color:var(--muted);font-size:.94rem;line-height:1.65;margin:0}
.splitcard dl{margin:6px 0 0;display:grid;grid-template-columns:auto 1fr;gap:7px 14px;font-size:.89rem}
.splitcard dt{color:var(--dim)}
.splitcard dd{margin:0;color:var(--paper)}

/* search intent: three columns of real terms */
.termgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:20px}
.termcard{display:flex;flex-direction:column;gap:10px;padding:22px;border:1px solid var(--line);
  border-radius:var(--r)}
.termcard h3{color:var(--paper);font-size:1rem}
.termcard .intent{font-family:var(--display);font-size:.68rem;font-weight:700;letter-spacing:.14em;
  text-transform:uppercase}
.termcard.buy .intent{color:var(--grass)}
.termcard.research .intent{color:var(--sky)}
.termcard.emergency .intent{color:#E0A64A}
.termlist{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}
.termlist li{color:var(--muted);font-size:.9rem;font-family:var(--body)}
.termcard .note{color:var(--dim);font-size:.85rem;line-height:1.55;margin:4px 0 0;
  padding-top:11px;border-top:1px solid var(--line)}

/* the objection block: copy left, the counter-argument pulled out right */
.objgrid{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);gap:44px;align-items:start}
@media (max-width:900px){.objgrid{grid-template-columns:1fr;gap:24px}}
.objaside{border:1px solid var(--line);border-left:2px solid var(--sky);border-radius:var(--r);
  padding:22px;display:flex;flex-direction:column;gap:12px;background:var(--ink-deep)}
.objaside h3{color:var(--paper);font-size:1rem}
.objaside p{color:var(--muted);font-size:.92rem;line-height:1.65;margin:0}
/* a section's lede now sits in .sechead rather than as the first line of a
   .prose column, so it needs the body treatment the prose used to give it */
.sechead>p{color:var(--muted);font-size:1.02rem;line-height:1.65;margin:0}


/* ---------- Enterprise tier ----------
   Same card as every other tier, set apart by color rather than size: green
   where the others are blue, so it reads as a different kind of engagement
   without taking a different shape. */
.tier.ent{border-color:rgba(63,174,98,.5);box-shadow:inset 0 2px 0 var(--grass)}
.tier.ent .fig{color:var(--paper)}
.tier.ent .fig small{font-size:1.05rem;font-weight:600;color:var(--grass);margin-left:2px}
.tier.ent .per{color:var(--grass)}

.aregions{display:grid;gap:0}
.aregion{display:grid;grid-template-columns:minmax(0,230px) minmax(0,1fr);gap:30px;
  padding:20px 0;border-top:1px solid var(--line);align-items:start}
.aregion:first-child{border-top:none;padding-top:0}
@media (max-width:760px){.aregion{grid-template-columns:1fr;gap:12px}}
.arhead h3{color:var(--paper);font-size:1.02rem;margin-bottom:5px}
.arhead .small{color:var(--dim);line-height:1.5}
.acities{display:flex;flex-wrap:wrap;gap:8px}
.acity{display:inline-flex;flex-direction:column;gap:1px;padding:7px 13px;
  border:1px solid var(--line);border-radius:var(--r);color:var(--dim);
  font-size:.92rem;line-height:1.25;text-decoration:none}
.acity .acs{font-family:var(--display);font-size:.6rem;font-weight:600;
  letter-spacing:.12em;text-transform:uppercase;color:var(--dim)}
a.acity.live{color:var(--paper);border-color:rgba(56,161,219,.42);background:rgba(56,161,219,.07)}
a.acity.live .acs{color:var(--sky)}
a.acity.live:hover{border-color:var(--sky);background:rgba(56,161,219,.14)}

/* ---------- Proof band ----------
   The flat green wash read as a grey box with a green corner. This is the
   brand chevron instead, oversized and bled off the right edge, masked so it
   fades out rather than stopping at a hard line. Each chevron keeps its own
   colour, so the mark is recognisable at low opacity. */
.proofbg{position:absolute;inset:0;overflow:hidden;pointer-events:none;z-index:0}
.proofbg svg{position:absolute;right:-4%;top:50%;transform:translateY(-50%);
  height:240%;width:auto;opacity:.06;filter:blur(1.5px);
  -webkit-mask-image:radial-gradient(ellipse 85% 70% at 78% 50%,#000 10%,transparent 78%);
  mask-image:radial-gradient(ellipse 85% 70% at 78% 50%,#000 10%,transparent 78%)}
@media (max-width:860px){.proofbg svg{height:170%;right:-26%;opacity:.05}}
.proofbg::after{content:"";position:absolute;inset:0;
  background:radial-gradient(ellipse 75% 125% at 90% 50%,rgba(56,161,219,.045),transparent 75%)}
.proofshot{display:block;width:100%;height:auto;border-radius:var(--r);
  border:1px solid var(--line);background:var(--ink-deep)}
.proofcap{color:var(--dim);font-size:.85rem;line-height:1.55;margin-top:11px}
/* The dashboard is a wide screenshot; in the standard .split it lands in the
   260-340px column and becomes an unreadable smudge. Give it the larger share. */
.proofsplit{display:grid;grid-template-columns:minmax(0,1.42fr) minmax(0,1fr);
  gap:40px;align-items:center}
@media (max-width:900px){.proofsplit{grid-template-columns:1fr;gap:26px}}

/* Marketing budget calculator ------------------------------------------------
   Readout on top, controls beneath, like the face of an instrument. The display
   is always present -- dimmed until there is something to show -- so the card
   never reads as an empty form. */
.budget{align-items:start}
@media (min-width:881px){.budget{grid-template-columns:1fr minmax(400px,470px)}}
.budgetcalc{padding:0;gap:0;overflow:hidden}

.bcdisplay{background:var(--ink-deep);padding:22px 22px 20px;border-bottom:1px solid var(--line)}
.bcreadrow{display:flex;align-items:flex-end;justify-content:space-between;gap:16px}
.bcfig{font-family:var(--display);font-weight:700;font-size:clamp(2.3rem,5.4vw,3.1rem);
  line-height:1;letter-spacing:-.02em;color:var(--dim);font-variant-numeric:tabular-nums;
  margin-top:7px;transition:color .18s ease}
.is-live .bcfig{color:var(--paper)}
.bcannlab{margin-top:10px}
.bcfig-ann{font-size:clamp(1.5rem,3.4vw,1.95rem)}
.bcpct{text-align:right;line-height:1.2;flex:none}
.bcpct strong{display:block;font-family:var(--display);font-weight:600;font-size:1.3rem;
  color:var(--sky);font-variant-numeric:tabular-nums}
.bcpct span{font-size:.76rem;color:var(--dim)}
.bcsub{color:var(--dim);font-size:.85rem;margin:10px 0 0;min-height:1.2em}
.bcdisplay .sbar{margin-top:14px;opacity:.3;transition:opacity .18s ease}
.is-live .bcdisplay .sbar{opacity:1}
.bcdisplay .slist{margin-top:11px}

.bccontrols{padding:20px 22px 22px;display:flex;flex-direction:column}
.budgetcalc [hidden]{display:none !important}   /* author display rules beat the attribute */
.bccontrols .field{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.bcrow2{gap:12px}
.bcmoney{position:relative;display:flex;align-items:center}
.bcmoney>span{position:absolute;left:13px;color:var(--dim);font-size:1rem;pointer-events:none}
.bcmoney input{padding-left:26px;font-variant-numeric:tabular-nums}

.seg{display:flex;gap:4px;background:var(--ink-deep);border:1px solid var(--line);
  border-radius:var(--r);padding:4px}
.seg button{flex:1;min-width:0;font-family:var(--body);font-size:.88rem;font-weight:500;
  color:var(--muted);background:none;border:0;border-radius:3px;padding:9px 4px;cursor:pointer;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:background .14s ease,color .14s ease}
.seg button:hover{color:var(--paper)}
.seg button[aria-checked="true"]{background:var(--sky);color:#08212F;font-weight:600}
.seg button:focus-visible{outline:2px solid var(--sky);outline-offset:1px}

.bcerr{color:#E8927C;font-size:.82rem;margin:2px 0 0}
.bcback{background:none;border:0;padding:0;cursor:pointer;font-family:var(--body);
  font-size:.82rem;color:var(--muted);text-align:left}
.bcback:hover{color:var(--sky)}
.bcback:focus-visible{outline:2px solid var(--sky);outline-offset:2px;border-radius:3px}
.bcrecap{font-family:var(--display);font-size:.95rem;color:var(--paper);
  border-bottom:1px solid var(--line);padding:12px 0 14px;margin:12px 0 14px}
.bcrecap strong{color:var(--sky)}
.budgetcalc form[data-cstep="3"]{padding:20px 22px 22px}
.budgetcalc form[data-cstep="3"] .field{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
@media (prefers-reduced-motion:reduce){
  .bcfig,.bcdisplay .sbar,.seg button{transition:none}
}
@media (max-width:420px){
  .bcrow2{grid-template-columns:1fr}
  .seg button{font-size:.8rem;padding:9px 2px}
}

/* Calculator promo banner — copy left, rotating example card right. The card is
   a static readout: it shows the payoff but cannot be used here, so the only way
   to get your own figure is the calculator page, which is where the video is. */
.bcpromo-in{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,330px);
  gap:clamp(22px,4vw,48px);align-items:center;position:relative;z-index:1}
.bcpromo-copy{display:flex;flex-direction:column;align-items:flex-start;gap:12px;min-width:0}
.bcpromo-copy strong{font-family:var(--display);font-weight:600;
  font-size:clamp(1.35rem,2.6vw,1.8rem);line-height:1.25;color:var(--paper);text-wrap:balance}
.bcpromo-sub{color:var(--muted);font-size:.95rem;line-height:1.6;max-width:54ch}
/* "Free tool" reads as a plain blue eyebrow here; the button is the only pill-shaped
   thing in the block, so the eye lands on the CTA (the budget question is the #1 ask). */
.bcpromo-copy .badge{padding:0;border:0;background:none;letter-spacing:.14em}
.bcpromo-go{display:inline-flex;align-items:center;justify-content:center;gap:10px;
  font-family:var(--display);font-weight:600;font-size:1.02rem;line-height:1;
  padding:15px 28px;margin-top:6px;border-radius:var(--r);
  background:var(--sky);color:#0E2231;border:1px solid var(--sky);text-decoration:none;
  box-shadow:0 8px 24px rgba(56,161,219,.28);
  transition:background .15s,box-shadow .15s,transform .15s}
.bcpromo-go::after{content:"";width:8px;height:8px;border-right:2px solid currentColor;
  border-bottom:2px solid currentColor;transform:rotate(-45deg);transition:transform .18s ease}
.bcpromo-go:hover{background:#4BB1E8;box-shadow:0 10px 28px rgba(56,161,219,.4);transform:translateY(-1px)}
.bcpromo-go:hover::after{transform:rotate(-45deg) translate(3px,3px)}
.bcpromo-go:focus-visible{outline:2px solid var(--paper);outline-offset:3px}
@media (max-width:560px){.bcpromo-go{width:100%}}

.bcpromo-card{display:grid;background:var(--ink-deep);border:1px solid var(--line);
  border-left:3px solid var(--sky);border-radius:var(--r);padding:20px 22px 18px;
  text-decoration:none;color:inherit;transition:border-color .18s ease}
.bcpromo-card:hover{border-color:var(--sky)}
.bcpromo-card:focus-visible{outline:2px solid var(--sky);outline-offset:4px}
.bcpromo-card{overflow:hidden}
.bcpromo-card>[data-i]{grid-area:1/1;opacity:0;visibility:hidden;transform:translateX(26px);
  transition:opacity .32s ease,transform .38s cubic-bezier(.2,.7,.2,1),visibility .32s}
.bcpromo-card>[data-i].is-on{opacity:1;visibility:visible;transform:none}
.bcpromo-card>[data-i].is-out{opacity:0;visibility:hidden;transform:translateX(-22px)}
.bcslide-who{display:block;font-size:.8rem;color:var(--sky);margin-bottom:12px;
  min-height:2.4em;line-height:1.3}
.bcpromo-lab{display:block;font-family:var(--display);font-size:.64rem;font-weight:600;
  letter-spacing:.16em;text-transform:uppercase;color:var(--muted)}
.bcpromo-fig-ann{font-size:1.6rem}
.bcpromo-lab+.bcpromo-fig+.bcpromo-lab{margin-top:8px}
.bcpromo-fig{display:block;font-family:var(--display);font-weight:700;font-size:2.4rem;
  line-height:1.05;letter-spacing:-.02em;color:var(--paper);
  font-variant-numeric:tabular-nums;margin-top:5px}
.bcpromo-bar{display:flex;height:9px;border-radius:999px;overflow:hidden;
  background:var(--ink);margin-top:14px}
.bcpromo-bar>i{display:block;height:100%}
.bcpromo-leg{display:block;font-size:.72rem;color:var(--dim);margin-top:9px;line-height:1.4}
/* industry strip: one chip per example, active chip fills over the rotation interval */
.bcslide-tabs{grid-area:2/1;display:flex;flex-wrap:wrap;gap:6px;margin-top:16px;padding-top:14px;border-top:1px solid var(--line)}
.bcslide-tabs button{position:relative;overflow:hidden;font-family:var(--display);font-weight:600;font-size:.62rem;
  letter-spacing:.08em;text-transform:uppercase;color:var(--muted);background:var(--ink);border:1px solid var(--line);
  border-radius:999px;padding:5px 9px;cursor:pointer;transition:color .2s ease,border-color .2s ease}
.bcslide-tabs button::before{content:"";position:absolute;inset:0;width:0;background:rgba(56,161,219,.28);transition:none}
.bcslide-tabs button span{position:relative}
.bcslide-tabs button[aria-selected="true"]{color:var(--paper);border-color:var(--sky)}
.bcslide-tabs button[aria-selected="true"]::before{animation:bcfill var(--bc-step,1.8s) linear forwards}
.bcpromo-card.is-held .bcslide-tabs button[aria-selected="true"]::before{animation-play-state:paused}
.bcslide-tabs button:hover{color:var(--paper);border-color:var(--sky)}
.bcslide-tabs button:focus-visible{outline:2px solid var(--sky);outline-offset:3px}
@keyframes bcfill{from{width:0}to{width:100%}}

@media (max-width:760px){
  .bcpromo-in{grid-template-columns:1fr;gap:24px}
  .bcpromo-fig{font-size:2.1rem}
}
@media (prefers-reduced-motion:reduce){
  .bcpromo-card>[data-i]{transition:none;transform:none}
  .bcslide-tabs button[aria-selected="true"]::before{animation:none;width:100%}
  .bcpromo-go::after{transition:none}
}

/* ─────────────────────────────────────────────────────────────
   Results pages: proof layout.
   One dominant figure, a real before/after comparison, and a
   services rail. Replaces the stacked box-grids, which gave
   every number on the page the same visual weight.
   ───────────────────────────────────────────────────────────── */

/* Hero: one number carries the page, two support it. */
.rpproof{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);
  gap:clamp(28px,5vw,64px);align-items:end;margin-top:34px}
.rphead{display:flex;flex-direction:column;gap:10px;min-width:0}
.rpfig{font-family:var(--display);font-weight:700;letter-spacing:-.04em;line-height:.86;
  font-size:clamp(4.2rem,13vw,8.5rem);color:var(--paper);
  font-variant-numeric:tabular-nums}
.rpwhat{font-family:var(--display);font-weight:600;font-size:clamp(1rem,2vw,1.22rem);
  color:var(--paper);line-height:1.3;max-width:19ch}
.rpwhen{color:var(--dim);font-size:.82rem;line-height:1.5;max-width:40ch}

/* Supporting metrics: hairline rows, deliberately quieter. */
.rpalso{display:flex;flex-direction:column;gap:0;min-width:0}
.rpalso div{display:flex;align-items:baseline;gap:14px;
  padding:13px 0;border-top:1px solid var(--line)}
.rpalso div:last-child{border-bottom:1px solid var(--line)}
.rpalso b{font-family:var(--display);font-weight:700;font-size:1.5rem;line-height:1;
  color:var(--sky);flex:none;min-width:4.4ch;font-variant-numeric:tabular-nums}
.rpalso span{color:var(--muted);font-size:.87rem;line-height:1.4}

/* The one chart on the page: last year against this year. */
.rpba{margin-top:30px;border-top:1px solid var(--line);padding-top:22px}
.rpba h3{font-family:var(--display);font-size:.95rem;font-weight:600;color:var(--paper);
  margin:0 0 16px}
.rpbar{display:grid;grid-template-columns:7.5ch minmax(0,1fr) 8ch;gap:14px;
  align-items:center;margin-bottom:9px}
.rpbar i{font-style:normal;color:var(--dim);font-size:.8rem;
  font-variant-numeric:tabular-nums}
.rpbar u{text-decoration:none;display:block;height:14px;border-radius:2px;
  background:var(--line)}
.rpbar.on u{background:linear-gradient(90deg,var(--sky-lo),var(--grass))}
.rpbar b{font-family:var(--display);font-weight:700;font-size:.95rem;color:var(--paper);
  text-align:right;font-variant-numeric:tabular-nums}
.rpba p{color:var(--dim);font-size:.78rem;margin:12px 0 0}

/* Services as a rail, not a bulleted list. */
.rprail{display:flex;flex-wrap:wrap;align-items:baseline;gap:0 26px;
  border-top:1px solid var(--line);border-bottom:1px solid var(--line);padding:18px 0}
.rprail span{font-family:var(--display);font-weight:600;font-size:1rem;color:var(--paper);
  padding:5px 0}
.rprail span.lead{color:var(--grass)}
.rpsite{color:var(--muted);font-size:.86rem;margin-top:13px}

/* Before / after, side by side, because the story is a change. */
.rpsplit{display:grid;grid-template-columns:repeat(auto-fit,minmax(248px,1fr));
  gap:clamp(20px,4vw,44px);margin-bottom:26px}
.rpcol{display:flex;flex-direction:column;gap:9px}
.rpcol em{font-style:normal;font-family:var(--display);font-weight:700;font-size:.78rem;
  letter-spacing:.1em;color:var(--dim)}
.rpcol strong{font-family:var(--display);font-weight:700;font-size:1.65rem;line-height:1.1;
  color:var(--paper)}
.rpcol p{color:var(--muted);font-size:.92rem;line-height:1.65;margin:0}
.rpcol.now strong{color:var(--grass)}

@media(max-width:760px){
  .rpproof{grid-template-columns:minmax(0,1fr);gap:26px;align-items:start}
  .rpbar{grid-template-columns:6.5ch minmax(0,1fr) 7ch;gap:10px}
  .rprail{gap:0 18px}
}
@media(prefers-reduced-motion:no-preference){
  .rpbar u{transition:width .6s cubic-bezier(.22,.8,.3,1)}
}

/* Results pages run the full container width; prose sets in two
   columns so lines stay readable without a dead right-hand margin. */
.rppage .doc{grid-template-columns:minmax(0,1fr)}
.rppage .docbody{max-width:none}
.rppage .docsec h2{max-width:none}
.rpprose{display:grid;grid-template-columns:repeat(auto-fit,minmax(330px,1fr));
  gap:clamp(20px,3.5vw,46px);align-items:start}
.rpprose p{margin-bottom:14px}

/* What the lead figure is actually made of. */
.rpmake{margin-top:30px;border-top:1px solid var(--line);padding-top:22px}
.rpmake h3{font-family:var(--display);font-size:.95rem;font-weight:600;color:var(--paper);
  margin:0 0 15px}
.rpstack{display:flex;height:34px;border-radius:3px;overflow:hidden;background:var(--ink)}
.rpstack span{display:block;height:100%}
.rpstack .a{background:var(--grass)}
.rpstack .b{background:var(--sky)}
.rpstack .c{background:repeating-linear-gradient(135deg,var(--line) 0 6px,transparent 6px 12px);
  border:1px dashed var(--line);box-sizing:border-box}
.rpkey{display:flex;flex-wrap:wrap;gap:8px 28px;margin-top:15px}
.rpkey div{display:flex;align-items:baseline;gap:9px;font-size:.84rem;color:var(--muted)}
.rpkey i{width:10px;height:10px;border-radius:2px;flex:none;align-self:center}
.rpkey i.a{background:var(--grass)} .rpkey i.b{background:var(--sky)}
.rpkey i.c{border:1px dashed var(--dim)}
.rpkey b{font-family:var(--display);color:var(--paper);font-weight:700;
  font-variant-numeric:tabular-nums}
.rpmake p{color:var(--dim);font-size:.78rem;margin:14px 0 0;max-width:62ch}

/* Services, shown as what is running rather than as a list. */
.rpsvc{display:flex;flex-wrap:wrap;gap:7px;margin-top:20px}
.rpsvc span{font-family:var(--display);font-weight:600;font-size:.82rem;color:var(--paper);
  background:var(--ink);border:1px solid var(--line);border-left:2px solid var(--grass);
  border-radius:3px;padding:7px 12px;white-space:nowrap}
.rpsvc span.site{border-left-color:var(--sky);font-weight:500;color:var(--muted)}
.rpsvc span.site a{color:var(--sky)}

/* Narrative column plus a facts card, instead of two loose text columns. */
.rpstory{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,330px);
  gap:clamp(22px,4vw,52px);align-items:start}
.rpstory > div{min-width:0}
.rpstory .rpnarr p{max-width:none}
.rpnarr p{max-width:none}
.rpcard{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  padding:24px;display:flex;flex-direction:column;gap:0}
.rpcard h4{font-family:var(--display);font-size:.7rem;font-weight:700;letter-spacing:.12em;
  color:var(--dim);margin:0 0 16px}
.rpcard .row{display:flex;flex-direction:column;gap:4px;padding:14px 0;
  border-top:1px solid var(--line)}
.rpcard .row:first-of-type{border-top:none;padding-top:0}
.rpcard .row em{font-style:normal;font-size:.76rem;color:var(--dim)}
.rpcard .row strong{font-family:var(--display);font-weight:700;font-size:1.15rem;line-height:1.25;
  color:var(--paper)}
.rpcard .row.now strong{color:var(--grass);font-size:1.5rem}
.rpcard .row p{color:var(--muted);font-size:.85rem;line-height:1.55;margin:2px 0 0}

/* Results disclosure. */
.rpnote{border-top:1px solid var(--line);margin-top:10px;padding-top:20px}
.rpnote p{color:var(--dim);font-size:.78rem;line-height:1.6;max-width:84ch;margin:0}

@media(max-width:860px){
  .rpstory{grid-template-columns:minmax(0,1fr)}
}

/* founder pull quote */
.fquote{margin:6px 0 0;padding:14px 18px;border-left:3px solid var(--sky);background:var(--ink-deep);border-radius:0 var(--r) var(--r) 0}
.fquote p{margin:0;color:var(--paper);font-family:var(--display);font-weight:500;font-size:1.02rem;line-height:1.5}
.fquote footer{margin-top:6px;color:var(--muted);font-size:.85rem}

/* vertical video embed (YouTube Shorts) */
.vid916{aspect-ratio:9/16}
.vid916 iframe{position:absolute;inset:0;width:100%;height:100%;border:0;display:block}

/* proof — five-client results strip on the city pages */
.proof{display:grid;grid-template-columns:1.25fr 1fr 1fr;grid-template-rows:auto auto;gap:14px}
.pc{position:relative;display:flex;flex-direction:column;gap:8px;padding:22px;border:1px solid var(--line);border-radius:var(--r);background:var(--ink);min-width:0;
  transition:border-color .18s,background .18s,transform .18s}
.pc:hover{border-color:var(--sky);background:#323437;transform:translateY(-3px)}
.pc.lead{grid-row:1/3;border-left:2px solid var(--grass);padding:26px}
.pc img:not(.shot){height:34px;width:auto;max-width:150px;object-fit:contain;object-position:left;filter:brightness(0) invert(1);opacity:.85}
.pc .trade{font-size:.78rem;letter-spacing:.12em;text-transform:uppercase;color:var(--dim);font-family:var(--display);font-weight:600}
.fig{font-family:var(--display);font-weight:700;font-size:2.1rem;line-height:1;color:var(--paper);margin-top:6px;font-variant-numeric:tabular-nums}
.lead .fig{font-size:3.3rem}
.what{color:var(--paper);font-size:.95rem;line-height:1.45}
.src{color:var(--dim);font-size:.78rem;line-height:1.4;margin-top:auto;padding-top:10px;border-top:1px solid var(--line);display:flex;gap:7px;align-items:flex-start}
.src svg{flex:0 0 auto;margin-top:2px}
.lead .shot{margin:10px 0 4px;width:100%;max-width:100%;height:auto;border:1px solid var(--line);border-radius:4px;display:block}
.lead .pill{position:absolute;top:18px;right:18px;font-size:.68rem;letter-spacing:.14em;text-transform:uppercase;font-family:var(--display);font-weight:600;color:var(--grass);border:1px solid rgba(63,174,98,.4);border-radius:999px;padding:3px 9px}
.pc a.more{margin-top:auto;padding-top:8px;color:var(--sky);font-size:.85rem;font-weight:500;text-decoration:none}.pc a.more:hover{text-decoration:underline}
.foot{margin-top:18px;color:var(--dim);font-size:.85rem;display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap}
.foot a{color:var(--sky)}
@media (max-width:900px){.proof{grid-template-columns:1fr 1fr}.pc.lead{grid-column:1/-1;grid-row:auto}}
@media (max-width:560px){.proof{grid-template-columns:1fr}.lead .fig{font-size:2.6rem}}
@media (prefers-reduced-motion:reduce){.pc{transition:none}.pc:hover{transform:none}}

/* ---------- click-to-play VSL poster ---------- */
.vsl{aspect-ratio:16/9}
.vsl .vslbtn{position:absolute;inset:0;width:100%;height:100%;padding:0;border:0;background:none;cursor:pointer;display:block}
.vsl .vslbtn img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .35s ease,filter .35s ease}
.vsl .vslbtn:hover img{transform:scale(1.015);filter:brightness(1.06)}
.vsl .vslplay{position:absolute;left:50%;top:50%;width:clamp(64px,9vw,92px);transform:translate(-50%,-50%);filter:drop-shadow(0 6px 18px rgba(0,0,0,.55));transition:transform .2s ease}
.vsl .vslplay svg{width:100%;height:auto;display:block}
.vsl .vslbtn:hover .vslplay{transform:translate(-50%,-50%) scale(1.08)}
.vsl .vslbtn:focus-visible{outline:3px solid var(--sky);outline-offset:3px;border-radius:var(--r)}
.vsl .vsldur{position:absolute;right:12px;bottom:12px;font-family:var(--display);font-weight:600;font-size:.8rem;letter-spacing:.04em;color:#fff;background:rgba(0,0,0,.75);padding:3px 7px;border-radius:4px}
.vsl.playing iframe{position:absolute;inset:0;width:100%;height:100%;border:0;display:block}

/* Pulse dashboard callout */
.pulseband{overflow:hidden}
.pulsegrid{display:grid;grid-template-columns:minmax(300px,420px) 1fr;gap:48px;align-items:center}
.pulsecopy .sechead{margin-bottom:0}
.pulsecopy h2{margin:0 0 14px}
.pulsecopy .lede{margin:0 0 22px;max-width:48ch}
.pulselist{list-style:none;margin:0 0 26px;padding:0;display:grid;gap:12px}
.pulselist li{position:relative;padding-left:26px;color:var(--muted);line-height:1.55}
.pulselist li strong{color:var(--paper);font-weight:600}
.pulselist li::before{content:"";position:absolute;left:2px;top:.52em;width:9px;height:9px;border-radius:50%;background:var(--grass);box-shadow:0 0 0 4px rgba(63,174,98,.18)}
.pulsefig{margin:0;min-width:0}
.pulsefig img{display:block;width:100%;height:auto;filter:drop-shadow(0 24px 40px rgba(0,0,0,.45))}
.pulsefig figcaption{margin-top:14px;color:var(--dim);font-size:.86rem;text-align:center}
@media (max-width:900px){.pulsegrid{grid-template-columns:1fr;gap:30px}.pulsecopy .lede{max-width:none}}

/* ---------- founder photo deck (written-version block) ----------
   A stack of real photos in the figure slot: top card full colour, the rest
   fanned behind it, dimmed so they sit inside the dark theme. Click the top
   card to advance; the thumb strip jumps. No JS: the first card shows alone
   and the strip is plain. Kept to five cards so it stays a proof, not a
   gallery. */
.deck{display:flex;flex-direction:column;gap:12px}
.deckstack{position:relative;aspect-ratio:4/5;width:100%}
.deckcard{position:absolute;inset:0;margin:0;padding:0;border:0;background:var(--ink-deep);
  border-radius:var(--r);overflow:hidden;cursor:pointer;transform-origin:50% 100%;
  box-shadow:0 22px 54px rgba(0,0,0,.5),0 0 0 1px rgba(255,255,255,.06);
  transition:transform .45s cubic-bezier(.2,.8,.2,1),opacity .45s,filter .45s}
.deckcard img{width:100%;height:100%;object-fit:cover;display:block}
.deckcard[data-d="0"]{transform:none;z-index:5;opacity:1;filter:none}
.deckcard[data-d="1"]{transform:translate(6px,-8px) rotate(-4deg) scale(.965);z-index:4;opacity:.78;filter:saturate(.6) brightness(.8)}
.deckcard[data-d="2"]{transform:translate(16px,-16px) rotate(3.5deg) scale(.93);z-index:3;opacity:.56;filter:saturate(.6) brightness(.8)}
.deckcard[data-d="3"]{transform:translate(26px,-24px) rotate(-2.5deg) scale(.895);z-index:2;opacity:.45;filter:saturate(.6) brightness(.8)}
.deckcard[data-d="4"]{transform:translate(36px,-32px) rotate(2deg) scale(.86);z-index:1;opacity:.45;filter:saturate(.6) brightness(.8)}
.deckcard:focus-visible{outline:2px solid var(--sky);outline-offset:3px}
.deckmeta{display:flex;justify-content:space-between;align-items:baseline;gap:12px;font-size:.88rem;line-height:1.4}
.deckmeta b{color:var(--paper);font-weight:600;display:block}
.deckmeta span{color:var(--dim)}
.deckmeta em{font-style:normal;color:var(--sky);font-weight:600;white-space:nowrap;font-size:.82rem}
.deckthumbs{display:flex;gap:8px}
.deckthumbs button{flex:1 1 0;height:50px;margin:0;padding:0;border:0;background:none;cursor:pointer;
  border-radius:4px;opacity:.5;outline:2px solid transparent;outline-offset:2px;transition:opacity .2s,outline-color .2s}
.deckthumbs button img{width:100%;height:100%;object-fit:cover;display:block;border-radius:4px}
.deckthumbs button[aria-current="true"]{opacity:1;outline-color:var(--sky)}
.deckthumbs button:focus-visible{outline-color:var(--paper)}
.deck figcaption{font-size:.82rem;color:var(--dim);line-height:1.45}
.deck .bio{font-size:.9rem;line-height:1.6;color:var(--muted);margin:4px 0 0;padding-top:12px;border-top:1px solid var(--line)}
.deck .bio strong{color:var(--paper);font-weight:600}
.no-js .deckcard:not([data-d="0"]){display:none}

/* ---------- "how it works" band: three steps across the container ----------
   Sits between the logo marquee and Pricing on service pages so the reader
   sees the process before the price. Each step: hand-drawn SVG in brand
   colours, a chevron-shaped number, title, two lines, a timing label. A
   gradient line runs behind the numbers (grass → sky → sky-lo, the logo's
   three colours) so the row reads as one path; it is hidden when the steps
   stack on narrow screens. */
.howsteps{position:relative;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:32px;margin-top:8px}
.howsteps::before{content:"";position:absolute;left:60px;right:60px;top:186px;height:2px;
  background:linear-gradient(90deg,var(--grass),var(--sky) 50%,var(--sky-lo));opacity:.55;pointer-events:none}
.howstep{display:flex;flex-direction:column;gap:16px;min-width:0}
.howart{height:150px;display:flex;align-items:flex-end}
.howart svg{width:230px;max-width:100%;height:auto;transition:transform .35s cubic-bezier(.2,.8,.2,1)}
.howstep:hover .howart svg{transform:translateY(-4px)}
.howhead{display:flex;align-items:center;gap:14px}
.hownum{position:relative;flex:0 0 auto;width:56px;height:44px}
.hownum svg{position:absolute;inset:0;width:56px;height:44px}
.hownum span{display:none;
  font-family:var(--display);font-weight:700;font-size:1.35rem;color:#0E2231}
.hownum.c3 span{color:var(--paper)}
.howhead h3{margin:0;font-size:1.3rem;color:var(--paper);position:relative;background:var(--ink-deep);padding-right:12px}
.hownum{background:var(--ink-deep)}
.howstep p{margin:0;color:var(--muted);line-height:1.6}
.howwhen{font-family:var(--display);font-weight:600;font-size:.74rem;letter-spacing:.14em;text-transform:uppercase;color:var(--sky)}
.howwhen.g{color:var(--grass)}
.howcta{margin-top:44px;display:flex;flex-wrap:wrap;align-items:center;gap:14px 22px}
.howcta .small{margin:0}
@media (max-width:840px){
  .howsteps{grid-template-columns:1fr;gap:40px}
  .howsteps::before{display:none}
  .howart{height:auto}
}

/* thank-you success mark: brand green tile with white check and sky halo */
.okmark{width:64px;height:64px;border-radius:var(--r);display:grid;place-items:center;flex:none;background:linear-gradient(135deg,var(--grass),var(--sky-lo));box-shadow:0 0 0 6px rgba(56,161,219,.16)}

/* Closing audit CTA: copy + form side by side, stacked on phones so the form card never overflows */
.ctagrid{display:grid;grid-template-columns:1fr minmax(300px,410px);gap:38px;align-items:center}
@media (max-width:760px){.ctagrid{grid-template-columns:1fr;gap:26px}.ctagrid .formcard{width:100%;max-width:none}}

/* Contact page: big phone/email read as plain text but are real tap targets */
.bigtel{color:inherit;text-decoration:none;display:inline-block;padding-block:4px;-webkit-tap-highlight-color:rgba(56,161,219,.25)}
.bigtel:hover{color:var(--sky)}
.bigtel:focus-visible{outline:2px solid var(--sky);outline-offset:3px}

/* Footer on phones: brand column spans the full width (so the Client login button can't spill
   into the Services column), link columns sit in two even columns with room to breathe,
   and the bottom row stacks and clears the sticky call/audit bar. */
@media (max-width:820px){
  .fgrid{grid-template-columns:repeat(2,minmax(0,1fr));column-gap:28px;row-gap:34px}
  .fgrid > .fcol:first-child{grid-column:1 / -1}
  .fgrid > .fcol:first-child .small{max-width:none}
  .fsignin{max-width:100%;white-space:nowrap}
  .fcol ul{gap:0}
  .fcol li a{display:block;padding-block:8px;line-height:1.35}
  .fcol h4{margin-bottom:8px}
  .fbot{flex-direction:column;align-items:flex-start;gap:8px}
  .fbot a.tel{display:inline-block;padding-block:6px}
  body > footer .wrap{padding-bottom:calc(120px + env(safe-area-inset-bottom,0px))}
}

/* Inline phone numbers in body copy: look like the surrounding text, but are real tap targets */
.tel-inline{color:inherit;text-decoration:underline;text-decoration-color:rgba(56,161,219,.55);text-underline-offset:3px;white-space:nowrap}
.tel-inline:hover{color:var(--sky)}
