/* ===========================================================================
   Agnes Cleaning Services

   Written as one system, not patched. If you need a value, take it from the
   tokens below. If the token you want does not exist, think again before
   adding one: the previous stylesheet reached 34 spacing values, 34 font
   sizes, 6 shadows and 7 radii, and that is what made the site look thrown
   together.

   Palette: Slate & Terracotta. One dark slate, one warm accent, warm neutrals.
   The accent is for small marks only and must stay under about 5% of the
   painted area. If you can see two terracotta areas bigger than a stamp on
   one screen, something is wrong.

   Type: EB Garamond sets the body as well as the headings, which is what
   premium service sites do. Inter is for uppercase labels and buttons only.
   =========================================================================== */

@font-face{font-family:'EB Garamond';font-style:normal;font-weight:400 700;font-display:swap;
  src:url('/assets/fonts/EBGaramond-var.woff2') format('woff2')}
@font-face{font-family:'EB Garamond';font-style:italic;font-weight:400 600;font-display:swap;
  src:url('/assets/fonts/EBGaramond-italic.woff2') format('woff2')}
@font-face{font-family:'Inter';font-style:normal;font-weight:400 700;font-display:swap;
  src:url('/assets/fonts/Inter-var.woff2') format('woff2')}

:root{
  /* ---- palette -------------------------------------------------------
     Two separate faults were fixed here, because they are different things:

     EARTHY was hue. The neutrals carried a yellow cast (paper was H50,
     hairlines H44), which reads as beige however light you make it. They
     are now all in the same cool family as the brand, H195-199.

     DULL was saturation, not lightness. The footer at S20% was a grey
     that happened to lean blue. It is now S46%, so it reads as a colour.
     It is also lighter again, L26 -> L31.

     Steps: L100 > 96 > 88 > 77 > 37 > 31 > 12. Every pairing was computed
     before it was written; the lowest text ratio on the site is 4.79. */
  --paper:#F2F5F6;        /* page background, everywhere */
  --surface:#FFFFFF;      /* cards and inputs */
  --tint:#D9E4E9;         /* one quiet full-width band per page, never a card */
  --brand:#2B5F75;        /* footer, CTA band, filled buttons, focus rings */
  --brand-hover:#1E4858;
  --text:#132129;
  --muted:#4F646E;        /* the lightest text allowed on light surfaces */
  --line:#B9C8CE;         /* every hairline */
  --accent:#A34226;       /* small marks only: rules, ticks, numerals, underlines */
  --accent-on-dark:#F8CCBD;
  --on-dark:#D2E0E6;      /* the darkest text allowed on the slate */

  /* ---- type ------------------------------------------------------------ */
  --serif:'EB Garamond',Georgia,'Times New Roman',serif;
  --sans:'Inter',-apple-system,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;

  /* EB Garamond has a small x-height: 41 against Inter's 55 at the same px.
     The scale is set ~30% larger than a sans scale so it reads the same size.
     Spaces around + and - inside clamp() are required, or the whole
     declaration is dropped and the element silently inherits. */
  --t-xs:.75rem;          /* 12px  Inter, uppercase labels, the only label size */
  --t-sm:.9375rem;        /* 15px  Inter, captions and meta */
  --t-base:1.3125rem;     /* 21px  body */
  --t-md:1.625rem;        /* 26px  card titles, sub-heads */
  --t-lg:2.125rem;        /* 34px  section heads */
  --t-xl:3rem;            /* 48px  page h1 */
  --t-display:clamp(2.75rem, 2rem + 3.4vw, 4.5rem);  /* home h1 only */

  /* ---- space (8px scale) ----------------------------------------------- */
  --s1:.25rem; --s2:.5rem; --s3:.75rem; --s4:1rem;  --s5:1.5rem;
  --s6:2rem;   --s7:3rem;  --s8:4rem;   --s9:6rem;  --s10:8rem;

  --measure:34em;         /* reading width */
  --radius:2px;           /* buttons and inputs only; panels are square */
  --wrap:1120px;
}

*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth;scroll-padding-top:88px;-webkit-text-size-adjust:100%}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}
  *,*::before,*::after{animation:none!important;transition:none!important}}

body{
  font-family:var(--serif);
  font-size:var(--t-base);
  line-height:1.65;
  color:var(--text);
  background:var(--paper);
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
img{max-width:100%;display:block;height:auto}

h1,h2,h3,h4{font-family:var(--serif);font-weight:600;line-height:1.15;letter-spacing:-.011em;
  color:var(--text);text-wrap:balance}
h1{font-size:var(--t-xl)}
h2{font-size:var(--t-lg)}
h3{font-size:var(--t-md)}

p,li{text-wrap:pretty}
p+p{margin-top:var(--s4)}

/* links: ink with an accent underline, not a coloured word */
a{color:inherit;text-decoration:underline;text-decoration-thickness:1px;
  text-decoration-color:var(--accent);text-underline-offset:.18em}
a:hover{text-decoration-thickness:2px}
:focus-visible{outline:2px solid var(--brand);outline-offset:3px;border-radius:1px}

.wrap{max-width:var(--wrap);margin:0 auto;padding:0 var(--s5)}
/* hello@agnescleaningservices.co.uk is 33 unbreakable characters and the
   only thing on the site long enough to push a 320px screen sideways */
a[href^="mailto:"],a[href^="tel:"]{overflow-wrap:anywhere}
@media (min-width:900px){.wrap{padding:0 var(--s7)}}

/* ---- the one label treatment ------------------------------------------ */
.h-small,.chip,.tag,.band-tag,.inc-head,.tc-view,.county-link,.mini,.opt,
.field label,.tick-label,.form-title,.pc-chip,.nav-toggle,footer h2{
  font-family:var(--sans);
  font-size:var(--t-xs);
  font-weight:650;
  line-height:1.2;
  letter-spacing:.09em;
  text-transform:uppercase;
  font-feature-settings:'liga' 0;
}
.chip{display:inline-block;color:var(--accent);margin-bottom:var(--s4)}
.chip--red,.band-tag{color:var(--accent)}
.h-small{color:var(--muted);margin-bottom:var(--s3)}
.opt{text-transform:none;letter-spacing:0;font-weight:400;color:var(--muted)}

/* ---- buttons ----------------------------------------------------------- */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:.4em;
  font-family:var(--sans);font-size:var(--t-sm);font-weight:600;letter-spacing:.01em;
  line-height:1;text-decoration:none;text-align:center;
  padding:1rem 1.75rem;min-height:52px;
  border:1px solid transparent;border-radius:var(--radius);
  background:none;cursor:pointer;transition:background-color .15s ease,color .15s ease;
}
.btn--red,.btn--blue{background:var(--brand);color:var(--paper);border-color:var(--brand)}
.btn--red:hover,.btn--blue:hover{background:var(--brand-hover);border-color:var(--brand-hover)}
.btn--yellow,.btn-outline-blue{background:transparent;color:var(--text);border-color:var(--line)}
.btn--yellow:hover,.btn-outline-blue:hover{border-color:var(--text)}
.btn:disabled{opacity:.45;cursor:not-allowed}
.cta-row{display:flex;gap:var(--s3);flex-wrap:wrap;margin-top:var(--s6)}
.cta-center{text-align:center;margin-top:var(--s7)}

.skip-link{position:absolute;left:-9999px;top:0;z-index:99;background:var(--brand);
  color:var(--paper);padding:var(--s3) var(--s4);text-decoration:none}
.skip-link:focus{left:var(--s2);top:var(--s2)}

/* ---- header ------------------------------------------------------------ */
/* Slate, because the header is sticky and the page has three surfaces it
   can pass over: paper, white cards and one tinted band. Paper and tint
   both collided with it. Slate collides with none of them, and it bookends
   the page with the CTA band and the footer. Everything that sits on the
   header therefore has to be the reversed version of itself. */
header{background:var(--brand);position:sticky;top:0;z-index:50}
header .wm-name{color:var(--paper)}
header .wm-sub{color:var(--on-dark);opacity:.85}
header :focus-visible{outline-color:var(--paper)}
.nav{display:flex;align-items:center;justify-content:space-between;gap:var(--s4);
  min-height:80px;position:relative}
.brand{text-decoration:none;display:inline-flex;align-items:center;gap:var(--s3);min-height:52px}
.brand-mark{display:block;flex:none;width:56px;height:56px}
.brand-mark--foot{width:68px;height:68px}
.foot-lockup{display:flex;flex-direction:column;align-items:flex-start;gap:var(--s3)}
.wordmark{display:flex;flex-direction:column;line-height:1}
.wm-name{font-family:var(--serif);font-weight:600;font-size:var(--t-md);letter-spacing:-.015em;color:var(--text)}
.wm-sub{font-family:var(--sans);font-weight:600;font-size:var(--t-xs);letter-spacing:.16em;
  text-transform:uppercase;color:var(--muted);margin-top:5px;white-space:nowrap}
.nav nav{display:flex;align-items:center;gap:var(--s1)}
.nav nav a{white-space:nowrap;font-family:var(--sans);font-size:var(--t-xs);text-transform:uppercase;letter-spacing:.08em;font-weight:550;letter-spacing:.02em;
  text-transform:none;text-decoration:none;padding:.6rem .7rem;
  border-radius:var(--radius);min-height:40px;display:inline-flex;align-items:center;color:var(--paper)}
.nav nav a:hover{color:var(--accent-on-dark)}
.nav nav a.active{box-shadow:inset 0 -2px 0 var(--accent-on-dark)}
.nav nav a.nav-cta{background:var(--paper);color:var(--brand);padding:.7rem 1.1rem;margin-left:var(--s3)}
.nav nav a.nav-cta:hover{background:#fff;color:var(--brand-hover)}
.nav-toggle{display:none;background:none;border:1px solid var(--on-dark);border-radius:var(--radius);
  padding:0 var(--s4);min-height:44px;min-width:56px;cursor:pointer;color:var(--paper)}
@media (max-width:1060px){
  .nav-toggle{display:inline-flex;align-items:center;justify-content:center}
  .nav nav{display:none;position:absolute;top:80px;left:0;right:0;background:var(--brand);
    flex-direction:column;align-items:stretch;gap:0;padding:var(--s2) 0 var(--s4);
    padding-inline:inherit;
    border-bottom:1px solid var(--brand-hover)}
  .nav nav.open{display:flex}
  .nav nav a{padding:var(--s3) 0;min-height:48px;border-bottom:1px solid var(--brand-hover)}
  .nav nav a.nav-cta{margin:var(--s3) 0 0;justify-content:center}
}

/* Small phones. At 320 the brand and the Menu button together needed 344px
   of a 320px screen, so every page scrolled sideways by the width of the
   seal. The gutter, the seal and the letterspacing on the second line each
   give a little back. */
@media (max-width:400px){
  .wrap{padding:0 var(--s4)}
  .brand{gap:var(--s2)}
  .brand-mark{width:44px;height:44px}
  .wm-name{font-size:var(--t-base)}
  .wm-sub{font-size:11px;letter-spacing:.1em}
}

/* ---- section rhythm ---------------------------------------------------- */
section{padding:var(--s9) 0}
.hero{padding:var(--s9) 0 var(--s8)}
.page-hero{padding:var(--s8) 0 var(--s7);border-bottom:1px solid var(--line)}
/* Sections are paper by default. One tinted band per page, marked .band-tint.
   The old .halftone-* classes named a colour rather than a role and were
   also on <footer>, so renaming one silently repainted the footer three
   times. They are gone from the markup; do not reintroduce them. */
section{background:var(--paper)}
section.band-tint,section.services{background:var(--tint)}
@media (max-width:720px){section{padding:var(--s8) 0}}

.section-head{max-width:38em;margin:0 auto var(--s8);text-align:center}
.section-head h2{font-size:var(--t-lg)}
.section-head p.sub{color:var(--muted);margin-top:var(--s3);font-size:var(--t-base)}

.crumbs{font-family:var(--sans);font-size:var(--t-xs);letter-spacing:.04em;color:var(--muted);
  margin-bottom:var(--s5)}
.crumbs a{text-decoration:none;color:var(--muted)}
.crumbs a:hover{color:var(--text);text-decoration:underline}
.crumb-sep{padding:0 .4em;opacity:.5}

/* ---- hero -------------------------------------------------------------- */
.hero-grid{display:grid;grid-template-columns:1fr;gap:var(--s7);align-items:start}

/* A grid item defaults to min-width:auto, so it refuses to shrink below its
   own min-content and shoves the whole page wider instead of wrapping. That
   is how the home page came to scroll sideways at 360px, which is most
   Android handsets. Every layout grid opts its children out. */
.hero-grid>*,.diff-grid>*,.svc-grid>*,.town-grid>*,.foot-grid>*,
.quote-grid>*,.field-pair>*,.railed>*,.service-page-grid>*,
.rooms-grid>*,.where-grid>*,.guide-grid>*,.detail-body>*{min-width:0}
.hero .display-h{font-size:var(--t-display);line-height:1.04;letter-spacing:-.022em;
  margin:0 0 var(--s5);max-width:17ch}
.hero .lead,.page-hero .lead,.page-hero .lead-dark{font-size:var(--t-md);line-height:1.55;
  color:var(--muted);max-width:32em}
.hero .lead{max-width:40ch}
.est-line{display:flex;align-items:baseline;gap:var(--s3);flex-wrap:wrap;margin-top:var(--s5);
  font-size:var(--t-sm);color:var(--muted)}
.est-line .mini{color:var(--accent)}
.corner-tone{display:none}
.page-hero h1{font-size:var(--t-xl);max-width:20ch}

/* ---- panels: a hairline and space, not a box --------------------------- */
.card,.diff-card,.svc-card,.town-card,.detail-card,.contact-card,
.quote-card,.form-card,.service-side,.stat,.faq-item,.where-block,.county-block{
  background:var(--surface);
  border:1px solid var(--line);
  border-radius:0;
  box-shadow:none;
}
.svc-card,.town-card{text-decoration:none;color:inherit;display:block;
  transition:border-color .15s ease}
.svc-card:hover,.town-card:hover{border-color:var(--text)}

/* "why people call us" — four facts, the numeral in the accent */
.difference{border-top:1px solid var(--line)}
.diff-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--s5)}
.diff-card{padding:var(--s6) var(--s5);text-align:left}
.diff-card .big{font-family:var(--serif);font-size:var(--t-lg);font-weight:600;color:var(--accent);
  line-height:1;display:block;margin-bottom:var(--s3)}
.diff-card h3{font-size:var(--t-base);margin-bottom:var(--s2)}
.diff-card p{font-size:var(--t-base);color:var(--muted);line-height:1.55}
@media (max-width:980px){.diff-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:560px){.diff-grid{grid-template-columns:1fr}}

/* services grid */
.svc-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--s5)}
/* an odd number of services would leave the last one stranded beside a
   gap, so it takes the whole row instead */
.svc-grid>:last-child:nth-child(odd){grid-column:1 / -1}
.svc-card{display:flex;flex-direction:column}
.svc-head{padding:var(--s5) var(--s5) 0}
.svc-head h2,.svc-head h3{font-size:var(--t-md)}
.svc-body{padding:var(--s4) var(--s5) var(--s5);display:flex;flex-direction:column;gap:var(--s4);flex:1}
.svc-body p{font-size:var(--t-base);color:var(--muted);line-height:1.55;flex:1}
.svc-card .tag{color:var(--muted)}
@media (max-width:760px){.svc-grid{grid-template-columns:1fr}}
@media (max-width:560px){.svc-grid{grid-template-columns:1fr}}

/* service detail */
.detail{padding:var(--s9) 0}
.detail-card{margin-bottom:var(--s7)}
.detail-band{padding:var(--s5);border-bottom:1px solid var(--line);background:var(--surface)}
.detail-band h2,.detail-band h3{font-size:var(--t-md)}
.detail-band .strap{display:block;margin-top:var(--s2);font-family:var(--serif);font-style:italic;
  font-size:var(--t-base);color:var(--muted);text-transform:none;letter-spacing:0;font-weight:400}
.detail-body{display:grid;grid-template-columns:1fr 1fr;gap:var(--s6);padding:var(--s6) var(--s5)}
.detail-body .about p{color:var(--text);margin-bottom:var(--s4)}
.detail-body h4,.detail-body .inc-head{color:var(--muted);margin-bottom:var(--s3)}
.more-note{font-size:var(--t-base);color:var(--muted);margin-top:var(--s3)}
@media (max-width:820px){.detail-body{grid-template-columns:1fr;gap:var(--s5)}}

.service-page-grid{display:grid;grid-template-columns:1fr 360px;gap:var(--s8);
  align-items:start;margin-bottom:var(--s8)}
@media (max-width:980px){.service-page-grid{grid-template-columns:1fr;gap:var(--s6)}}
.service-copy p,.service-copy li,.about-copy p,.about p{max-width:var(--measure)}
.service-copy .h-small{margin-top:var(--s6)}
.service-copy .btn{margin-top:var(--s5)}
.service-side{padding:var(--s5);margin-bottom:var(--s5);position:sticky;top:104px}
@media (max-width:980px){.service-side{position:static}}
.side-note{font-size:var(--t-base);color:var(--muted);margin-top:var(--s3)}
.service-related{border-top:1px solid var(--line);padding-top:var(--s6)}
.related-list{list-style:none;margin-bottom:var(--s4)}
.related-list li{padding:var(--s2) 0;color:var(--muted);font-size:var(--t-base)}
.related-list a{display:inline-block;padding:var(--s2) 0}
@media (max-width:760px){
  .related-list li{padding:0}
  .related-list a{display:block;padding:.7rem 0;min-height:44px}
}

/* ---- marker system: one tick, one dash, nothing else ------------------- */
.check-list{list-style:none}
.check-list li{position:relative;padding:var(--s2) 0 var(--s2) var(--s5);max-width:var(--measure)}
.check-list li::before{content:"";position:absolute;left:0;top:.95em;width:11px;height:6px;
  border-left:1.5px solid var(--accent);border-bottom:1.5px solid var(--accent);
  transform:rotate(-45deg)}
.who-list{list-style:none}
.who-list li{padding:var(--s3) 0;border-top:1px solid var(--line);color:var(--muted);
  max-width:var(--measure)}
.who-list li:first-child{border-top:0}
.steps-list{padding-left:1.2em}
.steps-list li{padding:var(--s2) 0;max-width:var(--measure)}

/* ---- the checklist facsimile ------------------------------------------- */
/* The product Agnes actually sells is a written checklist and dated photos,
   so the site renders one as an object. It is the only "image" on the site
   and it is made of type and rules. */
.facsimile{background:var(--surface);border:1px solid var(--line);padding:var(--s6) var(--s5) var(--s5)}
.facsimile .fx-top{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;
  gap:var(--s2) var(--s4);padding-bottom:var(--s3);border-bottom:1.5px solid var(--text)}
.facsimile .fx-title{font-family:var(--serif);font-size:var(--t-md);font-weight:600}
.facsimile .fx-stamp{font-family:var(--sans);font-size:var(--t-xs);font-weight:650;letter-spacing:.14em;
  text-transform:uppercase;color:var(--accent);border:1px solid var(--accent);
  padding:.3em .6em;white-space:nowrap}
.facsimile ul{list-style:none;margin:0}
.facsimile li{display:flex;align-items:center;gap:var(--s3);padding:.62rem 0;
  border-bottom:1px solid var(--line);font-size:var(--t-base)}
.facsimile li::before{content:"";width:11px;height:6px;flex:none;
  border-left:1.5px solid var(--accent);border-bottom:1.5px solid var(--accent);
  transform:rotate(-45deg);margin-top:-4px}
.facsimile .fx-foot{display:flex;gap:var(--s5);margin-top:var(--s5);
  font-family:var(--sans);font-size:var(--t-xs);letter-spacing:.09em;text-transform:uppercase;
  color:var(--muted)}
.facsimile .fx-foot span{flex:1;border-top:1px solid var(--text);padding-top:var(--s2)}

/* ---- coverage ---------------------------------------------------------- */
.coverage{border-top:1px solid var(--line)}
.town-grid,.guide-grid,.where-grid,.rooms-grid{display:grid;gap:var(--s5)}
.guide-grid{grid-template-columns:repeat(2,1fr)}
@media (max-width:680px){.guide-grid{grid-template-columns:1fr}}
.town-grid{grid-template-columns:repeat(3,1fr)}
.rooms-grid{grid-template-columns:repeat(2,1fr)}
.where-grid{grid-template-columns:repeat(auto-fit,minmax(min(320px,100%),1fr))}
@media (max-width:980px){.town-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:680px){.town-grid,.rooms-grid{grid-template-columns:1fr}}
.tc-head{padding:var(--s4) var(--s5);border-bottom:1px solid var(--line)}
.tc-head h3{font-size:var(--t-md)}
.tc-body{padding:var(--s4) var(--s5) var(--s5)}
.policy-date{font-size:var(--t-sm);color:var(--muted);margin-bottom:var(--s5)}
.tc-line{color:var(--muted);font-size:var(--t-base)}
.cov-note{max-width:38em;margin:var(--s7) auto 0;text-align:center;color:var(--muted)}
.town-card{padding:0}
.tc-view{display:inline-block;margin-top:var(--s3);color:var(--accent);text-decoration:none}
.pc-chip{display:inline-block;color:var(--muted);margin-right:var(--s2)}
.pc-line{margin-top:var(--s2)}
.pc-summary{color:var(--muted);font-size:var(--t-base)}
.county-head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--s4);
  padding-bottom:var(--s3);border-bottom:1px solid var(--line);margin-bottom:var(--s5)}
.county-link{color:var(--accent);text-decoration:none}
.county-blurb{max-width:var(--measure);color:var(--muted)}
.county-block,.where-block{padding:var(--s5);margin-bottom:var(--s6)}
.town-link-list{list-style:none;display:flex;flex-wrap:wrap;gap:var(--s2) var(--s4)}
.coverage-listing{padding:var(--s9) 0}
.town-page{padding:var(--s8) 0}
.room-col h3{font-size:var(--t-md);margin-bottom:var(--s3)}

/* ---- FAQ --------------------------------------------------------------- */
.faq-sec{margin-bottom:var(--s7)}
.faq-item{border:0;border-bottom:1px solid var(--line);background:none;max-width:44em}
.faq-item>summary{font-family:var(--serif);font-size:var(--t-md);font-weight:600;
  padding:var(--s4) var(--s6) var(--s4) 0;cursor:pointer;list-style:none;position:relative;
  text-transform:none;letter-spacing:-.011em}
.faq-item>summary::-webkit-details-marker{display:none}
.faq-item>summary::after{content:"+";position:absolute;right:0;top:50%;transform:translateY(-50%);
  font-family:var(--sans);font-size:var(--t-md);color:var(--accent);font-weight:400;line-height:1}
.faq-item[open]>summary::after{content:"\2013"}
.faq-item>p{padding:0 var(--s6) var(--s5) 0;color:var(--muted);max-width:var(--measure)}

/* ---- prose pages ------------------------------------------------------- */
.h-mid{font-size:var(--t-lg);margin:var(--s8) 0 var(--s4)}
.h-mid:first-child{margin-top:0}
.about-sec,.about{padding:var(--s8) 0}
.about-grid{display:block}
.stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--s4);margin-top:var(--s6)}
.stat{padding:var(--s5);text-align:left}
.stat .num{font-family:var(--serif);font-size:var(--t-lg);font-weight:600;color:var(--accent);
  line-height:1;display:block}
.stat .lbl{display:block;margin-top:var(--s2);font-family:var(--sans);font-size:var(--t-xs);
  font-weight:650;letter-spacing:.09em;text-transform:uppercase;color:var(--muted)}
@media (max-width:760px){.stat-grid{grid-template-columns:repeat(2,1fr)}}

/* ---- forms ------------------------------------------------------------- */
.quote{padding:var(--s9) 0}
.quote-grid{display:grid;grid-template-columns:380px 1fr;gap:var(--s8);align-items:start}
@media (max-width:980px){.quote-grid{grid-template-columns:1fr;gap:var(--s6)}}
.contact-cards{display:flex;flex-direction:column;gap:var(--s5)}
.contact-card{padding:var(--s5)}
.contact-card h2,.contact-card h3{font-size:var(--t-md);margin-bottom:var(--s3);display:flex;align-items:center;gap:var(--s3)}
.contact-card .dot{width:7px;height:7px;background:var(--accent);flex:none;border-radius:50%}
.contact-card p{color:var(--muted);font-size:var(--t-base)}
.form-card{padding:var(--s6) var(--s5)}
.form-title{font-family:var(--serif);font-size:var(--t-lg);font-weight:600;text-transform:none;
  letter-spacing:-.011em;margin-bottom:var(--s3)}
.form-sub{color:var(--muted);margin-bottom:var(--s5);font-size:var(--t-base)}
.field{margin-bottom:var(--s5)}
.field-pair{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s4)}
.field-pair[hidden]{display:none}
@media (max-width:560px){.field-pair{grid-template-columns:1fr}}
.form-hint{font-size:var(--t-sm);color:var(--muted);margin:calc(-1 * var(--s3)) 0 var(--s5);line-height:1.5}
.field label,.tick-label{display:block;color:var(--muted);margin-bottom:var(--s2)}
.field input,.field textarea,.field select{
  width:100%;font-family:var(--serif);font-size:var(--t-base);color:var(--text);
  background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);
  padding:.85rem var(--s3);min-height:52px;
}
.field textarea{min-height:140px;resize:vertical;line-height:1.55}
.field input:focus,.field textarea:focus,.field select:focus{outline:2px solid var(--brand);outline-offset:1px;
  border-color:var(--brand)}
.tick-list{display:flex;flex-direction:column;gap:0;border:1px solid var(--line);
  border-radius:var(--radius);background:var(--paper)}
.tick{display:flex;align-items:center;gap:var(--s3);padding:.8rem var(--s3);cursor:pointer;
  min-height:52px;border-bottom:1px solid var(--line);font-size:var(--t-base)}
.tick:last-child{border-bottom:0}
.tick input{width:17px;height:17px;accent-color:var(--brand);flex:none;margin:0}
.tick:has(input:checked){background:var(--surface);font-weight:600}
.form-btns{display:flex;gap:var(--s3);flex-wrap:wrap;margin-top:var(--s5)}
.form-error{display:none;margin-top:var(--s3);color:var(--accent);font-size:var(--t-sm)}
.form-error.show{display:block}
.form-note{margin-top:var(--s4);font-size:var(--t-sm);color:var(--muted)}

/* ---- the one dark moment: CTA band, full bleed -------------------------- */
.cta-band{background:var(--brand);color:var(--paper);padding:var(--s9) 0;text-align:center}
.cta-band h2{color:var(--paper);font-size:var(--t-xl);max-width:18ch;margin:0 auto}
.cta-band p{color:var(--on-dark);margin-top:var(--s4);max-width:42ch;margin-left:auto;margin-right:auto}
.cta-band .btn{margin-top:var(--s6);background:var(--paper);color:var(--brand);border-color:var(--paper)}
.cta-band .btn:hover{background:var(--on-dark);color:var(--brand)}

/* ---- footer ------------------------------------------------------------ */
footer,footer.halftone-dark{background:var(--brand);color:var(--on-dark);padding:var(--s8) 0 var(--s6)}
.foot-grid{display:grid;grid-template-columns:1.4fr repeat(4,1fr);gap:var(--s6)}
@media (max-width:980px){.foot-grid{grid-template-columns:1fr 1fr}}
@media (max-width:560px){.foot-grid{grid-template-columns:1fr}}
footer h2{color:var(--accent-on-dark);margin-bottom:var(--s4);font-size:var(--t-xs)}
footer ul{list-style:none}
footer ul li{margin-bottom:var(--s2)}
footer a{color:var(--on-dark);text-decoration:none;font-size:var(--t-sm)}
footer a:hover{color:var(--paper);text-decoration:underline;text-decoration-color:var(--accent-on-dark)}
.foot-brand p{color:var(--on-dark);opacity:.8;margin-top:var(--s4);max-width:30ch;font-size:var(--t-sm)}
.wordmark--foot .wm-name{color:var(--paper)}
.wordmark--foot .wm-sub{color:var(--on-dark);opacity:.7}
.foot-bottom{margin-top:var(--s7);padding-top:var(--s5);border-top:1px solid rgba(255,255,255,.14);
  display:flex;justify-content:space-between;gap:var(--s4);flex-wrap:wrap;
  font-size:var(--t-sm);color:var(--on-dark)}
footer .legal{display:block;margin-top:var(--s3);font-size:var(--t-sm);opacity:.62;max-width:64ch}

/* ---- testimonials (hidden until there are real ones) -------------------- */
.quote-card{padding:var(--s5)}
.quote-card blockquote{font-family:var(--serif);font-size:var(--t-md);font-style:italic;
  max-width:var(--measure)}
.quote-card figcaption{margin-top:var(--s4);padding-top:var(--s3);border-top:1px solid var(--accent);
  font-family:var(--sans);font-size:var(--t-sm)}
.quote-card figcaption span{display:block;color:var(--muted)}
.quotes-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--s5)}
@media (max-width:900px){.quotes-grid{grid-template-columns:1fr}}

/* ---- misc -------------------------------------------------------------- */
.enq-card{background:var(--surface);border:1px solid var(--line);padding:var(--s5);margin-bottom:var(--s4)}
.reset-btn{font-family:var(--sans);font-size:var(--t-xs);letter-spacing:.09em;text-transform:uppercase}

/* ---- print -------------------------------------------------------------- */
@media print{
  /* the checklist guide tells people to print it and walk the property with
     it, so paper gets the content and none of the furniture */
  header,.nav-toggle,.cta-band,.form-btns,.skip-link,.corner-tone,
  .crumbs,.chip,.btn,.wa-btn,.foot-bottom{display:none!important}
  /* the four footer link columns go; the brand block stays, so a printed
     sheet still says who cleaned the property and how to reach her */
  .foot-grid>div:not(.foot-brand){display:none!important}
  body{background:#fff;color:#000;font-size:11pt}
  footer{background:#fff;color:#000;border-top:1px solid #000;padding:var(--s5) 0}
  footer h2,footer a,.foot-bottom,footer .legal,.foot-brand p{color:#000!important;opacity:1}
  .card,.svc-card,.detail-card,.faq-item,.facsimile{border-color:#000}
  a{text-decoration-color:#000}
  /* the footer mark is the reversed one, which is paper-coloured and so
     invisible on white. The wordmark carries it instead, in black. */
  .brand-mark--foot{display:none!important}
  .wordmark--foot .wm-name,.wordmark--foot .wm-sub{color:#000!important;opacity:1}
  /* a closed <details> prints as a question with no answer. JS opens them
     on beforeprint; this is the fallback when JS is off. */
  details.faq-item>p{display:block!important}
  .faq-item>summary::after{content:none!important}
  /* a checklist is no use if a room is split across a page break */
  li,.faq-item,.facsimile,.card{break-inside:avoid;page-break-inside:avoid}
  h1,h2,h3{break-after:avoid;page-break-after:avoid}
}
}

/* hero becomes two columns once there is room for the facsimile beside it */
.hero-grid--split{grid-template-columns:1fr}
@media (min-width:1000px){
  .hero-grid--split{grid-template-columns:1.1fr .9fr;gap:var(--s8);align-items:center}
}

/* ---- two-column prose pages -------------------------------------------
   /letting-agents/ and /about/ were each a single column of
   running text several thousand pixels long. The rail gives the eye
   somewhere to land and carries the proof a reader is actually looking
   for: the scope, the facts, and how to get a price. */
.railed{display:grid;grid-template-columns:minmax(0,1fr) 352px;gap:var(--s8);align-items:start}
@media (max-width:1020px){.railed{grid-template-columns:1fr;gap:var(--s7)}}
.railed .service-copy{max-width:var(--measure);min-width:0}
.railed .service-copy p,.railed .service-copy li{max-width:none}

.rail{display:flex;flex-direction:column;gap:var(--s5);position:sticky;top:104px}
@media (max-width:1020px){.rail{position:static}}
.rail .facsimile{padding:var(--s5) var(--s4) var(--s4)}
.rail .facsimile .fx-title{font-size:var(--t-base)}

.rail-panel{background:var(--surface);border:1px solid var(--line);padding:var(--s5) var(--s4)}
.rail-panel .h-small{margin-bottom:var(--s4)}
.rail-panel>p{font-size:var(--t-sm);color:var(--muted)}
.rail-panel--cta{background:var(--tint);border-color:transparent}
.rail-panel--cta .rail-lead{font-size:var(--t-base);color:var(--text);margin-bottom:var(--s2)}
.rail-panel--cta .rail-lead a{text-decoration-color:var(--accent)}
.rail-panel--cta .btn{margin-top:var(--s4);width:100%}

.fact-list{margin:0}
.fact{padding:var(--s3) 0;border-top:1px solid var(--line)}
.fact:first-child{border-top:0;padding-top:0}
.fact dt{font-family:var(--sans);font-size:var(--t-xs);font-weight:650;letter-spacing:.09em;
  text-transform:uppercase;color:var(--muted);margin-bottom:var(--s1)}
.fact dd{font-size:var(--t-sm);line-height:1.5}

.rail-list{list-style:none}
.rail-list li{padding:var(--s3) 0;border-top:1px solid var(--line);font-size:var(--t-sm)}
.rail-list li:first-child{border-top:0;padding-top:0}
.rail-list a{text-decoration:none}
.rail-list a:hover{text-decoration:underline;text-decoration-color:var(--accent)}

/* ---- nav drop-downs ----------------------------------------------------
   Services and Coverage have children; the other items do not, so they stay
   plain links. Hover and :focus-within do the work on desktop with no
   script, which means it keeps working for keyboard users. The chevron
   button exists for touch, where there is no hover, and on mobile where the
   menu becomes an accordion inside the collapsed nav. */
.has-menu{position:relative;display:flex;align-items:center}
.menu-btn{
  display:inline-flex;align-items:center;justify-content:center;
  width:26px;min-height:40px;margin-left:-6px;padding:0;
  background:none;border:0;cursor:pointer;color:var(--on-dark);
  border-radius:var(--radius);
}
.menu-btn svg{width:10px;height:6px;transition:transform .15s ease}
.menu-btn:hover{color:var(--paper)}
.has-menu:hover .menu-btn svg,
.has-menu.open .menu-btn svg{transform:rotate(180deg)}

.submenu{
  position:absolute;top:100%;left:-10px;z-index:60;
  min-width:260px;padding:var(--s2) 0;
  background:var(--surface);border:1px solid var(--line);
  box-shadow:0 12px 28px rgba(19,33,41,.10);
  opacity:0;visibility:hidden;transform:translateY(-4px);
  transition:opacity .14s ease,transform .14s ease,visibility .14s;
}
.has-menu:hover>.submenu,
.has-menu:focus-within>.submenu,
.has-menu.open>.submenu{opacity:1;visibility:visible;transform:translateY(0)}
/* a little bridge so the pointer can cross the gap without the menu closing */
.has-menu::after{content:"";position:absolute;top:100%;left:0;right:0;height:10px}

.nav nav .submenu a{
  display:block;width:100%;padding:var(--s3) var(--s4);min-height:44px;
  font-size:var(--t-xs);letter-spacing:.06em;color:var(--text);
  border-radius:0;white-space:nowrap;
}
.nav nav .submenu a:hover{background:var(--tint);color:var(--text)}
.nav nav .submenu a:last-child{
  border-top:1px solid var(--line);color:var(--muted);margin-top:var(--s2);padding-top:var(--s3);
}

@media (prefers-reduced-motion:reduce){
  .submenu{transition:none}
  .menu-btn svg{transition:none}
}

/* --- inside the collapsed mobile nav it becomes an accordion ----------- */
@media (max-width:1060px){
  .has-menu{display:grid;grid-template-columns:1fr auto;align-items:center;
    border-bottom:1px solid var(--brand-hover)}
  .nav nav .has-menu>a{border-bottom:0}
  .menu-btn{width:48px;min-height:48px;margin:0;color:var(--on-dark)}
  .has-menu::after{display:none}
  .submenu{
    grid-column:1 / -1;position:static;min-width:0;border:0;box-shadow:none;
    background:transparent;padding:0 0 var(--s3);transform:none;
    display:none;opacity:1;visibility:visible;
  }
  .has-menu.open>.submenu{display:block}
  /* hover must not open it on a phone, only the chevron */
  .has-menu:hover>.submenu,.has-menu:focus-within>.submenu{display:none}
  .has-menu.open>.submenu{display:block}
  .nav nav .submenu a{padding:var(--s3) 0 var(--s3) var(--s4);min-height:44px;color:var(--on-dark)}
  .nav nav .submenu a:hover{color:var(--paper)}
  .nav nav .submenu a:last-child{border-top:0;margin-top:0;color:var(--on-dark)}
}

/* ---- WhatsApp ---------------------------------------------------------- */
.wa-btn{gap:.55em}
.wa-btn svg{flex:none}
.rail-panel--cta .wa-btn{margin-top:var(--s2);width:100%}
.contact-card .wa-btn{margin-top:var(--s4)}
