/* ============================================================================
   RIVERTOWN — THE COMPOSITION
   Every value here resolves to a token in tokens.css. Nothing is eyeballed.
   ========================================================================= */

*,*::before,*::after{box-sizing:border-box}
*{margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
/* No global smooth-scroll: it fights the user's own scrolling and it hides
   anchor jumps. In-page links land instantly, which is what a person looking
   for a phone number actually wants. */

body{
  background:var(--ground);
  color:var(--ink);
  font-family:var(--text);
  font-size:var(--ms-0);
  line-height:1.6;
  font-synthesis-weight:none;
  overflow-wrap:break-word;
  -webkit-font-smoothing:antialiased;
}

/* The living surface: never flat. A deep field with the bloom of a lit sign
   falling off fast, plus a fine grain so nothing reads as a printed gradient. */
body::before{
  content:'';position:fixed;inset:0;z-index:-2;pointer-events:none;
  background:
    radial-gradient(120% 62% at 50% -8%, color-mix(in srgb,var(--navy-600) 62%, transparent) 0%, transparent 62%),
    radial-gradient(52% 26% at 50% 0%, color-mix(in srgb,var(--accent) 13%, transparent) 0%, transparent 72%),
    var(--ground);
}
body::after{
  content:'';position:fixed;inset:0;z-index:-1;pointer-events:none;opacity:.30;
  mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='3'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='.5'/%3E%3C/svg%3E");
}

/* ── Shell + grid ─────────────────────────────────────────────── */
.shell{width:var(--shell);margin-inline:auto;padding-inline:var(--edge)}
.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--gutter)}
.measure{max-width:var(--measure)}

/* ── THE AXIS. Mobile centers. Desktop obeys meaning. ─────────────
   data-axis="action" -> left on desktop (signposts, data, forms)
   data-axis="voice"  -> centred on desktop (promise, philosophy)
   Running body text opts out of centring on mobile via .runs.        */
[data-axis]{text-align:center;align-items:center}
[data-axis] .runs{text-align:left;margin-inline:auto}
@media (min-width:64rem){
  [data-axis="action"]{text-align:left;align-items:start}
  [data-axis="action"] .measure{margin-inline:0}
  [data-axis="voice"]{text-align:center;align-items:center}
  [data-axis="voice"] .measure{margin-inline:auto}
  [data-axis="voice"] .runs{text-align:center}
}
/* .measure centres by default (the phone axis). Only the desktop rule below
   pins it left, and nothing after this may re-centre it -- an earlier pair of
   unscoped rules here did exactly that and pushed every lead paragraph off the
   axis its own heading sat on. */

/* ── Type roles: one treatment each, identical everywhere ─────── */
.t-display{
  font-family:var(--display);font-weight:700;
  font-size:clamp(2.6rem, 1.4rem + 5.4vw, var(--ms-7));
  line-height:1.02;letter-spacing:-.03em;text-wrap:balance;
}
h1,.t-h1{font-family:var(--display);font-weight:700;font-size:clamp(2rem,1.2rem + 3.4vw,var(--ms-5));line-height:1.05;letter-spacing:-.025em;text-wrap:balance}
h2,.t-h2{font-family:var(--display);font-weight:600;font-size:clamp(1.6rem,1.1rem + 2.2vw,var(--ms-4));line-height:1.1;letter-spacing:-.02em;text-wrap:balance}
h3,.t-h3{font-family:var(--display);font-weight:600;font-size:var(--ms-2);line-height:1.15;letter-spacing:-.01em}
.t-lead{font-size:var(--ms-1);line-height:1.5;color:var(--ink-soft);text-wrap:pretty}
p{line-height:1.65;text-wrap:pretty;color:var(--ink-soft)}
.t-label{
  font-family:var(--mono);font-size:var(--ms-dn1);font-weight:500;
  letter-spacing:.10em;text-transform:uppercase;line-height:1.2;color:var(--ink-muted);
}
.t-data{font-family:var(--mono);font-variant-numeric:tabular-nums lining-nums;letter-spacing:-.01em}
.lit{color:var(--accent)}
strong,b{color:var(--ink);font-weight:600}

/* ── Section rhythm: one --section-y everywhere ───────────────── */
.band{padding-block:var(--section-y);position:relative}
/* Anything a link can land on clears the sticky header. */
:target,h2[id],h3[id],section[id]{scroll-margin-top:calc(64px + var(--space-6))}
.band + .band{border-top:1px solid var(--line)}
.band__head{display:flex;flex-direction:column;gap:var(--space-4);margin-bottom:var(--space-8)}

/* ── Links + focus (never a browser blue, never outline:none) ─── */
a{color:inherit;text-decoration-color:color-mix(in srgb,currentColor 40%,transparent);text-underline-offset:.22em}
a:hover{text-decoration-color:currentColor}
:focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:var(--r-xs)}

/* ── Buttons ──────────────────────────────────────────────────── */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);
  min-height:48px;padding:var(--space-3) var(--space-5);
  font-family:var(--text);font-size:var(--ms-0);font-weight:600;line-height:1;
  border:1px solid transparent;border-radius:var(--r-sm);cursor:pointer;
  text-decoration:none;position:relative;overflow:hidden;
  transition:transform var(--dur-element) var(--ease-standard),
             background-color var(--dur-element) var(--ease-standard),
             border-color var(--dur-element) var(--ease-standard),
             box-shadow var(--dur-element) var(--ease-standard);
}
.btn--lit{background:var(--accent);color:var(--accent-ink);box-shadow:var(--glow-sm)}
.btn--lit:hover{transform:translateY(-2px);box-shadow:var(--glow-md)}
.btn--quiet{background:transparent;color:var(--ink);border-color:var(--line-strong)}
.btn--quiet:hover{transform:translateY(-2px);border-color:var(--ink-soft);background:color-mix(in srgb,var(--navy-200) 8%,transparent)}
.btn--call{background:var(--navy-500);color:#fff}
.btn--call:hover{transform:translateY(-2px);background:var(--navy-400)}
/* sheen -- the one thing you want pressed (THE GRAMMAR: action) */
[data-g28~="sheen"]::after{
  content:'';position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(105deg,transparent 38%,color-mix(in srgb,#fff 40%,transparent) 50%,transparent 62%);
  transform:translateX(-120%);
}
[data-g28~="sheen"]:hover::after{transform:translateX(120%);transition:transform 620ms var(--ease-expressive)}
.btn-row{display:flex;flex-wrap:wrap;gap:var(--space-3);justify-content:center}
@media (min-width:64rem){[data-axis="action"] .btn-row{justify-content:flex-start}}

/* ── Nav ──────────────────────────────────────────────────────── */
.nav{
  position:sticky;top:0;z-index:60;
  background:color-mix(in srgb,var(--ground) 86%,transparent);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  border-bottom:1px solid var(--line);
}
.nav__in{display:flex;align-items:center;gap:var(--space-5);min-height:64px;padding-block:var(--space-2)}
.nav__brand{display:flex;align-items:center;gap:var(--space-3);flex:none;text-decoration:none}
.nav__brand img{height:34px;width:auto;display:block}
.nav__links{display:none;gap:var(--space-5);margin-left:auto;align-items:center}
.nav__links a{font-size:var(--ms-dn1);font-weight:500;text-decoration:none;color:var(--ink-soft);padding-block:var(--space-2);position:relative}
.nav__links a:hover,.nav__links a[aria-current="page"]{color:var(--ink)}
.nav__links a[aria-current="page"]::after{content:'';position:absolute;left:0;right:0;bottom:0;height:2px;background:var(--accent)}
.nav__cta{margin-left:auto;display:flex;gap:var(--space-2);align-items:center}
@media (min-width:64rem){
  .nav__links{display:flex}
  .nav__cta{margin-left:0}
}
.nav__toggle{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;background:none;border:1px solid var(--line-strong);border-radius:var(--r-sm);color:var(--ink)}
@media (min-width:64rem){.nav__toggle{display:none}}
.nav__drawer{display:none;flex-direction:column;gap:var(--space-1);padding-bottom:var(--space-5)}
.nav__drawer.is-open{display:flex}
.nav__drawer a{padding:var(--space-3);text-decoration:none;border-bottom:1px solid var(--line);font-size:var(--ms-1);text-align:center}
@media (min-width:64rem){.nav__drawer{display:none !important}}

/* ══ THE SIGN ══════════════════════════════════════════════════ */
.sign{min-height:100svh;display:flex;flex-direction:column;justify-content:center;padding-block:var(--space-9) var(--space-7);position:relative}
.sign__state{display:flex;align-items:center;gap:var(--space-3);justify-content:center;margin-bottom:var(--space-4)}
@media (min-width:64rem){.sign__state{justify-content:flex-start}}
.lamp{
  width:14px;height:14px;border-radius:var(--r-full);flex:none;
  background:var(--accent);box-shadow:var(--glow-sm);
  animation:breathe 2.8s var(--ease-standard) infinite;
}
.lamp[data-out]{background:var(--navy-400);box-shadow:none;animation:none;opacity:.6}
@keyframes breathe{0%,100%{opacity:1}50%{opacity:.45}}
@media (prefers-reduced-motion: reduce){.lamp{animation:none}}

.sign__headline{
  font-family:var(--display);font-weight:700;text-transform:uppercase;
  font-size:clamp(2.7rem, 1.1rem + 8.2vw, 6.6rem);
  line-height:.94;letter-spacing:-.035em;color:#fff;text-wrap:balance;
  text-shadow:0 0 52px color-mix(in srgb,var(--accent) 34%, transparent);
}
.sign__headline[data-closed]{color:var(--ink);text-shadow:none;font-weight:500}
.sign__count{
  font-family:var(--mono);font-variant-numeric:tabular-nums lining-nums;
  font-weight:500;font-size:clamp(1rem,.72rem + 1.5vw,var(--ms-2));
  color:var(--accent);margin-top:var(--space-5);letter-spacing:-.02em;
}
.sign__count[data-closed]{color:var(--ink-muted)}
.sign__where{margin-top:var(--space-4);color:var(--ink-muted);font-size:var(--ms-dn1);line-height:1.9}
.sign__where b{color:var(--ink);font-weight:500}
.sign__acts{margin-top:var(--space-7)}
.sign__scroll{margin-top:auto;padding-top:var(--space-7);color:var(--ink-muted);font-family:var(--mono);font-size:var(--ms-dn2);letter-spacing:.10em;text-transform:uppercase}

/* ══ THE BOARD — a ledger. Earned: real rows of real data. ═════ */
.board{border-top:1px solid var(--line-strong)}
.door{
  display:grid;grid-template-columns:minmax(0,1fr);gap:var(--space-1);
  padding-block:var(--space-4);border-bottom:1px solid var(--line);
  text-decoration:none;position:relative;text-align:left;
  transition:background-color var(--dur-element) var(--ease-standard);
}
.door:hover{background:color-mix(in srgb,var(--navy-200) 6%,transparent)}
.door__name{font-family:var(--display);font-weight:600;font-size:var(--ms-1);color:var(--ink);display:flex;align-items:center;gap:var(--space-3)}
.door__dot{width:9px;height:9px;border-radius:var(--r-full);background:var(--navy-400);flex:none}
.door[data-open] .door__dot{background:var(--accent);box-shadow:var(--glow-sm)}
.door[data-open] .door__name{color:#fff}
.door__meta{font-family:var(--mono);font-size:var(--ms-dn2);color:var(--ink-muted);letter-spacing:.04em}
.door[data-open] .door__meta{color:var(--accent-quiet)}
.door__addr{font-size:var(--ms-dn1);color:var(--ink-muted)}
@media (min-width:48rem){
  /* One grid for the whole board; each row inherits its tracks via subgrid, so
     the three columns line up down the page instead of per row. */
  .board{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) max-content}
  .door{grid-column:1/-1;display:grid;grid-template-columns:subgrid;
        gap:var(--space-5);align-items:center;padding-block:var(--space-5)}
  .door__meta{text-align:right}
}

/* ── The sequence: EARNED. The order is what actually happens. ── */
.steps{counter-reset:step;display:grid;gap:var(--space-6);text-align:left}
.step{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--space-4);align-items:start}
.step::before{
  counter-increment:step;content:counter(step);
  font-family:var(--mono);font-size:var(--ms-dn1);font-weight:600;color:var(--accent);
  width:34px;height:34px;display:grid;place-items:center;flex:none;
  border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);border-radius:var(--r-full);
}
.step h3{margin-bottom:var(--space-2)}

/* ── The split: 7+5 with a counterweight ──────────────────────── */
.split{display:grid;gap:var(--space-7)}
@media (min-width:64rem){
  .split{grid-template-columns:7fr 5fr;gap:var(--gutter);align-items:start}
  .split--flip{grid-template-columns:5fr 7fr}
}

/* ── The running list: services as editorial rows, not cards ──── */
.rows{border-top:1px solid var(--line)}
.row-item{
  display:grid;gap:var(--space-2);padding-block:var(--space-6);
  border-bottom:1px solid var(--line);text-align:left;
}
@media (min-width:64rem){
  .row-item{grid-template-columns:minmax(0,4fr) minmax(0,7fr);gap:var(--gutter);align-items:baseline}
}
.row-item h3{color:#fff}
.row-item p{max-width:var(--measure)}

/* ── The lane: carriers, awards -- a marquee that is a real list ─ */
.lane{display:flex;gap:var(--space-3);flex-wrap:wrap;justify-content:center}
@media (min-width:64rem){[data-axis="action"] .lane{justify-content:flex-start}}
.chip{
  font-family:var(--mono);font-size:var(--ms-dn1);letter-spacing:.04em;
  padding:var(--space-2) var(--space-4);border:1px solid var(--line-strong);
  border-radius:var(--r-pill);color:var(--ink-soft);white-space:nowrap;
}

/* ── The artifact panel: proof shown, not asserted ─────────────── */
.artifact{
  border:1px solid var(--line-strong);border-radius:var(--r-md);
  padding:var(--space-6);background:color-mix(in srgb,var(--surface) 70%,transparent);
  text-align:left;
}
.artifact__seal{font-family:var(--mono);font-size:var(--ms-dn2);letter-spacing:.14em;text-transform:uppercase;color:var(--accent);margin-bottom:var(--space-4)}

/* ── Pull quote: the voice, centred, big ──────────────────────── */
.quote{
  font-family:var(--display);font-weight:500;
  font-size:clamp(1.35rem,.95rem + 1.9vw,var(--ms-3));
  line-height:1.28;letter-spacing:-.02em;color:#fff;text-wrap:balance;
}
.quote__by{margin-top:var(--space-5);color:var(--ink-muted);font-size:var(--ms-dn1)}

/* ── The index: people, as a directory ────────────────────────── */
.index{display:grid;gap:0;border-top:1px solid var(--line);text-align:left}
.index__row{
  display:grid;gap:var(--space-1);padding-block:var(--space-4);border-bottom:1px solid var(--line);
}
@media (min-width:48rem){
  .index__row{grid-template-columns:minmax(0,1fr) auto;gap:var(--space-5);align-items:baseline}
}
.index__name{font-weight:600;color:var(--ink)}
.index__cred{font-family:var(--mono);font-size:var(--ms-dn2);color:var(--accent-quiet);letter-spacing:.06em}
.index__role{font-size:var(--ms-dn1);color:var(--ink-muted)}

/* ── Forms: this is where care is proved or lost ───────────────── */
.form{display:grid;gap:var(--space-5);text-align:left;max-width:38rem;margin-inline:auto}
@media (min-width:64rem){[data-axis="action"] .form{margin-inline:0}}
.field{display:grid;gap:var(--space-2)}
.field > label{font-family:var(--mono);font-size:var(--ms-dn1);font-weight:500;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-soft)}
.field input,.field select,.field textarea{
  width:100%;min-height:48px;padding:var(--space-3) var(--space-4);
  background:var(--surface);color:var(--ink);
  border:1px solid var(--line-strong);border-radius:var(--r-xs);
  font-family:var(--text);font-size:var(--ms-0);line-height:1.4;
  transition:border-color var(--dur-element) var(--ease-standard);
}
.field textarea{min-height:110px;resize:vertical}
.field input::placeholder,.field textarea::placeholder{color:var(--ink-muted);opacity:.75}
.field input:focus,.field select:focus,.field textarea:focus{border-color:var(--accent);outline:none;box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 22%,transparent)}
.field__hint{font-size:var(--ms-dn1);color:var(--ink-muted);line-height:1.5}
.check{display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--space-3);align-items:start}
.check input{width:22px;height:22px;min-height:0;margin-top:2px;accent-color:var(--accent)}
.check label{font-size:var(--ms-dn1);color:var(--ink-soft);line-height:1.5}
.form__note{font-size:var(--ms-dn1);color:var(--ink-muted);border-left:2px solid var(--accent);padding-left:var(--space-4);line-height:1.6}
.form__out{display:none;padding:var(--space-5);border-radius:var(--r-sm);border:1px solid var(--line-strong);background:var(--surface)}
.form__out.is-shown{display:block}
.form__out[data-tone="ok"]{border-color:color-mix(in srgb,var(--accent) 55%,transparent)}
.form__out[data-tone="bad"]{border-color:color-mix(in srgb,var(--danger) 55%,transparent)}

/* ── Footer ───────────────────────────────────────────────────── */
.foot{border-top:1px solid var(--line-strong);padding-block:var(--space-8) var(--space-7);text-align:center}
.foot__grid{display:grid;gap:var(--space-7);text-align:left}
@media (min-width:48rem){.foot__grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (min-width:64rem){.foot__grid{grid-template-columns:repeat(4,minmax(0,1fr))}}
.foot h4{font-family:var(--mono);font-size:var(--ms-dn2);letter-spacing:.14em;text-transform:uppercase;color:var(--ink-muted);margin-bottom:var(--space-4);font-weight:500}
.foot ul{list-style:none;display:grid;gap:var(--space-2)}
.foot a{font-size:var(--ms-dn1);color:var(--ink-soft);text-decoration:none}
.foot a:hover{color:var(--ink)}
.foot__base{margin-top:var(--space-8);padding-top:var(--space-6);border-top:1px solid var(--line);display:grid;gap:var(--space-2);font-size:var(--ms-dn1);color:var(--ink-muted)}
.icon-link{display:inline-grid;place-items:center;width:44px;height:44px;border:1px solid var(--line-strong);border-radius:var(--r-full);color:var(--ink-soft)}
.icon-link:hover{color:var(--ink);border-color:var(--ink-soft)}

/* ── The crisis bar: always reachable, never in the way ────────── */
.crisis{
  background:color-mix(in srgb,var(--navy-700) 70%,transparent);
  border-block:1px solid var(--line);
  padding-block:var(--space-3);font-size:var(--ms-dn1);text-align:center;color:var(--ink-soft);
}
.crisis a{color:#fff;font-weight:600}

/* ── The thumb bar: the primary action, in reach, on a phone ───── */
.thumb{
  position:fixed;left:0;right:0;bottom:0;z-index:70;
  display:grid;grid-template-columns:1fr 1fr;gap:1px;
  background:var(--line-strong);
  padding-bottom:env(safe-area-inset-bottom);
  border-top:1px solid var(--line-strong);
}
.thumb a{
  display:flex;align-items:center;justify-content:center;gap:var(--space-2);
  min-height:56px;background:var(--surface);color:var(--ink);
  text-decoration:none;font-weight:600;font-size:var(--ms-dn1);
}
.thumb a.is-lit{background:var(--accent);color:var(--accent-ink)}
@media (min-width:64rem){.thumb{display:none}}
body{padding-bottom:calc(56px + env(safe-area-inset-bottom))}
@media (min-width:64rem){body{padding-bottom:0}}

/* ── THE GRAMMAR: the hand for this build ──────────────────────
   arrival reveal+weight · action sheen · chapter count+scrub
   media glare+grain · field velocity · nav elastic+ripple
   collection orbit · PROOF LEFT PLAIN · close lane
   Proof is plain on purpose: a real number about a real practice
   holds still. Numbers that dance are numbers nobody believes. */
/* CONTENT IS VISIBLE BY DEFAULT. The reveal only ever hides something once JS
   has proven it can un-hide it (html.js-reveal is set synchronously by
   sign.js). If the script fails, the observer never fires, or the browser has
   no IntersectionObserver, every word is simply on the page. A site that hides
   its own content behind an animation is not a site that reads care. */
.js-reveal [data-g28~="reveal"]:not([data-g28-seen]){opacity:0;transform:translateY(22px)}
[data-g28~="reveal"][data-g28-seen]{opacity:1;transform:none;
  transition:opacity var(--dur-cinematic) var(--ease-expressive),
             transform var(--dur-cinematic) var(--ease-expressive);
  transition-delay:calc(var(--g28-i,0) * var(--stagger))}
@media (prefers-reduced-motion: reduce){.js-reveal [data-g28~="reveal"]{opacity:1;transform:none}}
[data-g28~="glare"]{position:relative;overflow:hidden}
[data-g28~="glare"]::after{
  content:'';position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(circle 220px at calc(var(--g28-ex,.5)*100%) calc(var(--g28-ey,.5)*100%),
    color-mix(in srgb,var(--accent) 60%,transparent),transparent 70%);
  opacity:calc(var(--g28-in,0) * .18);transition:opacity var(--dur-section) var(--ease-standard);
}

.hide{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
.skip{position:absolute;left:var(--space-4);top:-100px;z-index:100;background:var(--accent);color:var(--accent-ink);padding:var(--space-3) var(--space-4);border-radius:var(--r-sm);font-weight:600;text-decoration:none}
.skip:focus{top:var(--space-4)}

/* A carrier people expect to be refused, marked as accepted. This is the
   accent doing its one job: it marks what is TRUE and load-bearing. */
.chip.is-lit{
  border-color:color-mix(in srgb,var(--accent) 55%,transparent);
  color:var(--accent);
}

/* ── Corrections from the first look, 2026-07-24 ──────────────────
   Read against the render at 375 and 1440, not guessed. */

/* 1. The header carried a full-width call button on a phone, wrapping to two
      lines and crowding the mark -- while the thumb bar already carries the
      same action within reach. One action, one place. */
.nav__call{display:none}
@media (min-width:64rem){.nav__call{display:inline-flex}}
.nav__brand img{height:38px;width:auto}
@media (min-width:64rem){.nav__brand img{height:44px}}

/* 2. The lamp read as dull maroon rather than lit. A sign that is on should
      look on: it breathes between full and three-quarters, never down to half. */
.lamp{width:13px;height:13px;box-shadow:0 0 14px var(--accent),0 0 34px color-mix(in srgb,var(--accent) 45%,transparent)}
@keyframes breathe{0%,100%{opacity:1}50%{opacity:.72}}

/* 3. The hero seated dead centre and left ~280px of dead air under the
      buttons. A single hero seats at 46% from the top (the eye reads a seated
      block as centred; a mathematically centred one reads as low). */
.sign{justify-content:flex-start;padding-block:clamp(var(--space-8),14svh,var(--space-11)) var(--space-7)}
.sign__scroll{padding-top:var(--space-8)}
@media (min-width:64rem){
  .sign{padding-block:clamp(var(--space-9),16svh,var(--space-11)) var(--space-8)}
}

/* 4. The crisis line is load-bearing but it is not the headline. Tighten it so
      it reads as a standing offer, not an alarm competing with the sign. */
.crisis{font-size:var(--ms-dn1);line-height:1.5;padding-inline:var(--edge)}

/* 5. Measured, not guessed: at 1440x900 the hero reserved a full viewport and
      filled the top half, leaving ~300px of dead navy before the board. A hero
      should end by pulling the eye to the next thing, not by trailing off.
      Mobile is content-driven (no reserved emptiness at all); desktop keeps a
      commanding block but lets the first door peek above the fold. */
.sign{min-height:auto}
@media (min-width:64rem){
  .sign{min-height:min(90svh,860px)}
}
.sign__scroll{opacity:.7}

/* A phone number must never break across lines. Half a number is worse than
   no number to someone reading it while upset. */
.nowrap{white-space:nowrap}

/* ── The printed week, one block per office ───────────────────── */
.week{display:grid;gap:var(--space-6);padding-block:var(--space-8);border-bottom:1px solid var(--line);text-align:left}
.week:first-child{border-top:1px solid var(--line-strong)}
@media (min-width:64rem){.week{grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:var(--gutter);align-items:start}}
.week__head h3{color:#fff;margin-bottom:var(--space-2)}
.week__kind{font-family:var(--mono);font-size:var(--ms-dn2);letter-spacing:.08em;text-transform:uppercase;color:var(--accent);margin-bottom:var(--space-4)}
.week__addr{font-size:var(--ms-dn1);line-height:1.7}
.week__phone{font-size:var(--ms-dn1);margin-top:var(--space-2)}
.week__zone{font-family:var(--mono);font-size:var(--ms-dn2);color:var(--accent-quiet);margin-top:var(--space-3);letter-spacing:.04em}
.week__table{width:100%;border-collapse:collapse;font-family:var(--mono);font-size:var(--ms-dn1);font-variant-numeric:tabular-nums lining-nums}
.week__table th,.week__table td{padding:var(--space-3) 0;border-bottom:1px solid var(--line);text-align:left;font-weight:400;color:var(--ink-soft);vertical-align:baseline}
.week__table th{color:var(--ink-muted);width:9.5em}
.week__walk{color:var(--accent-quiet);font-size:var(--ms-dn2);text-align:right}
.week__table tr.is-today th,.week__table tr.is-today td{color:#fff}
.week__table tr.is-today th::after{content:' — today';color:var(--accent);font-size:var(--ms-dn2)}
