/* ==========================================================================
   Poyser Plant Hire QLD — site styles
   --------------------------------------------------------------------------
   Design language: "the yard at night". Near-black ground taken straight from
   the logo plate, one cyan accent sampled from the logo lettering and the
   Sunward's paintwork, bone-white type, mono numerals for machine specs.

   Palette source: assets/img/brand/poyser-logo.jpg
     #000000  logo plate
     #51B4CF  "POYSER" lettering / excavator body  (dominant saturated pixel)
     #FFFFFF  "PLANT HIRE" lettering
     #C7CBD0  rubble grey

   Structure:
     01 Tokens          06 Hero
     02 Reset           07 Sections & modules
     03 Typography      08 Gallery
     04 Layout          09 Form
     05 Header / nav    10 Footer, motion, print
   ========================================================================== */

/* -- 01 Tokens ------------------------------------------------------------ */
:root {
  /* Ink / surface — the logo plate */
  --ink:        #0b0e11;
  --ink-soft:   #141920;
  --ink-line:   #222a33;
  --paper:      #f5f7f8;
  --paper-2:    #eaeef1;
  --paper-3:    #dde3e8;
  --line:       #ccd4da;
  --grey:       #626b74;
  --grey-2:     #8f99a3;

  /* Accent — cyan, sampled from the logo lettering (#51B4CF).
     --brand-lt is the on-dark voice (8.1:1 on --ink).
     --brand is the on-light voice, darkened to clear AA on white (7.5:1).
     Never print --brand-lt as body text on a light background. */
  --brand:      #175c70;
  --brand-lt:   #51b4cf;
  --brand-dim:  rgba(81, 180, 207, 0.14);

  /* Type */
  --sans: 'Archivo', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
          'Helvetica Neue', Arial, sans-serif;
  --mono: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;

  --step-h1: clamp(2.5rem, 6.4vw, 5rem);
  --step-h2: clamp(1.9rem, 4vw, 3.1rem);
  --step-h3: clamp(1.25rem, 2.1vw, 1.6rem);
  --step-lead: clamp(1.05rem, 1.5vw, 1.3rem);

  /* Space */
  --gutter: clamp(1.25rem, 5vw, 4rem);
  --section-y: clamp(4.5rem, 9vw, 8.5rem);
  --maxw: 1240px;
  --maxw-text: 68ch;

  --radius: 3px;
  --shadow: 0 1px 2px rgba(20, 23, 27, .05), 0 12px 32px -12px rgba(20, 23, 27, .18);

  --header-h: 76px;
}

/* -- 02 Reset ------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--sans);
  font-size: 17px;
  line-height: 1.6;
  font-synthesis-weight: none;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}
img, svg, video { display: block; max-width: 100%; }
img { height: auto; }
/* `picture` generates a box that breaks percentage heights and object-fit on
   the <img> inside it. Taking it out of the box tree makes the <img> a direct
   child of its container, so height:100% + object-fit: cover work everywhere. */
picture { display: contents; }
button, input, select, textarea { font: inherit; color: inherit; }
a { color: inherit; }

:focus-visible {
  outline: 2px solid var(--brand);
  outline-offset: 3px;
  border-radius: 2px;
}

.skip {
  position: absolute; left: -9999px; top: 0; z-index: 200;
  background: var(--ink); color: var(--paper);
  padding: .85rem 1.25rem; text-decoration: none; font-weight: 600;
}
.skip:focus { left: 0; }

.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* -- 03 Typography -------------------------------------------------------- */
h1, h2, h3, h4 { margin: 0; font-weight: 700; letter-spacing: -0.022em; line-height: 1.08; }
h1 { font-size: var(--step-h1); font-weight: 800; letter-spacing: -0.032em; }
h2 { font-size: var(--step-h2); }
h3 { font-size: var(--step-h3); line-height: 1.25; letter-spacing: -0.012em; }
p  { margin: 0 0 1.1em; }
p:last-child { margin-bottom: 0; }

.lead {
  font-size: var(--step-lead);
  line-height: 1.55;
  color: #33383f;
  max-width: 56ch;
}
/* A lead directly after a heading always needs breathing room. */
h1 + .lead, h2 + .lead, h3 + .lead { margin-top: 1.25rem; }

/* Eyebrow — a sheet-number style label with a leading rule */
.eyebrow {
  display: flex; align-items: center; gap: .75rem;
  font-family: var(--mono);
  font-size: .72rem;
  font-weight: 500;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--brand);
  margin: 0 0 1.5rem;
}
.eyebrow::before {
  content: ""; width: 34px; height: 1px; background: currentColor; flex: none; opacity: .55;
}
.eyebrow--light { color: var(--brand-lt); }

.num { font-family: var(--mono); font-variant-numeric: tabular-nums; }

/* Emphasis inside prose */
.mark { color: var(--brand); font-weight: 600; }

/* -- 04 Layout ------------------------------------------------------------ */
.wrap { width: 100%; max-width: var(--maxw); margin-inline: auto; padding-inline: var(--gutter); }
.section { padding-block: var(--section-y); position: relative; }
.section--tight { padding-block: clamp(3rem, 6vw, 5.5rem); }
.section--ink { background: var(--ink); color: var(--paper); }
.section--ink .lead { color: #b9bfc7; }
.section--paper2 { background: var(--paper-2); }
.rule { height: 1px; background: var(--line); border: 0; margin: 0; }
.section--ink .rule { background: var(--ink-line); }

/* Two-column editorial split: sticky heading beside flowing content */
.split { display: grid; gap: clamp(2rem, 5vw, 4.5rem); }
@media (min-width: 900px) {
  .split { grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); align-items: start; }
  .split__aside { position: sticky; top: calc(var(--header-h) + 2.5rem); }
}

/* -- Buttons -------------------------------------------------------------- */
.btn {
  --btn-bg: var(--ink); --btn-fg: var(--paper); --btn-bd: var(--ink);
  display: inline-flex; align-items: center; justify-content: center; gap: .6rem;
  padding: 1.05rem 1.75rem;
  background: var(--btn-bg); color: var(--btn-fg);
  border: 1px solid var(--btn-bd); border-radius: var(--radius);
  font-weight: 600; font-size: .97rem; letter-spacing: .005em;
  text-decoration: none; cursor: pointer;
  transition: transform .18s ease, background-color .18s ease, border-color .18s ease, color .18s ease;
}
.btn:hover { transform: translateY(-2px); }
.btn:active { transform: translateY(0); }
.btn--accent { --btn-bg: var(--brand); --btn-bd: var(--brand); --btn-fg: #fff; }
.btn--accent:hover { --btn-bg: #0f4a5c; --btn-bd: #0f4a5c; }
.btn--ghost { --btn-bg: transparent; --btn-fg: var(--ink); --btn-bd: var(--line); }
.btn--ghost:hover { --btn-bd: var(--ink); }
.btn--onDark { --btn-bg: transparent; --btn-fg: var(--paper); --btn-bd: rgba(246,244,240,.34); }
.btn--onDark:hover { --btn-bd: var(--paper); background: rgba(246,244,240,.07); }
.btn--wide { width: 100%; }

.btn__icon { width: 17px; height: 17px; flex: none; }

/* Text link with an underline that grows */
.tlink {
  display: inline-flex; align-items: center; gap: .5rem;
  font-weight: 600; text-decoration: none;
  padding-bottom: 3px;
  background-image: linear-gradient(var(--brand), var(--brand));
  background-size: 0% 1.5px; background-repeat: no-repeat; background-position: 0 100%;
  transition: background-size .3s ease, color .2s ease;
}
.tlink:hover { background-size: 100% 1.5px; color: var(--brand); }
.tlink svg { width: 15px; height: 15px; transition: transform .25s ease; }
.tlink:hover svg { transform: translateX(3px); }

/* -- 05 Header ------------------------------------------------------------ */
.header {
  position: fixed; inset: 0 0 auto 0; z-index: 100;
  height: var(--header-h);
  display: flex; align-items: center;
  transition: background-color .3s ease, border-color .3s ease, box-shadow .3s ease;
  border-bottom: 1px solid transparent;
}
.header__inner {
  width: 100%; max-width: var(--maxw); margin-inline: auto;
  padding-inline: var(--gutter);
  display: flex; align-items: center; gap: 1.5rem;
}
.header.is-stuck {
  background: rgba(11, 14, 17, .92);
  backdrop-filter: saturate(1.4) blur(14px);
  -webkit-backdrop-filter: saturate(1.4) blur(14px);
  border-bottom-color: var(--ink-line);
}

.brand { display: flex; align-items: center; gap: .7rem; text-decoration: none; margin-right: auto; }
/* Brand lockup — the supplied logo, used whole. The asset is a JPEG on a
   solid black plate (no alpha), so the header and footer are held at --ink
   and the plate disappears into them. If Adam supplies a transparent PNG or
   an SVG, swap the file and this still works. */
.brand__logo { height: 38px; width: auto; display: block; }
@media (min-width: 900px) { .brand__logo { height: 44px; } }

.brand__text { display: flex; flex-direction: column; line-height: 1.05; }
.brand__name { font-weight: 800; font-size: 1.02rem; letter-spacing: -.01em; }
.brand__sub {
  font-family: var(--mono); font-size: .58rem; letter-spacing: .19em;
  text-transform: uppercase; opacity: .62; margin-top: 3px;
}
.header--onHero { color: var(--paper); }
/* The lockup is on a black plate, so the header never flips to light. */
.header--onHero.is-stuck { color: var(--paper); }

.nav { display: none; }
@media (min-width: 1000px) {
  .nav { display: flex; align-items: center; gap: 2rem; }
  .nav a {
    text-decoration: none; font-size: .93rem; font-weight: 500;
    opacity: .82; transition: opacity .2s ease;
  }
  .nav a:hover, .nav a[aria-current="page"] { opacity: 1; }
  .nav a[aria-current="page"] { color: var(--brand); }
}
.header__cta { display: none; }
@media (min-width: 760px) { .header__cta { display: inline-flex; padding: .7rem 1.25rem; font-size: .9rem; } }

/* Mobile menu */
.burger {
  display: inline-flex; flex-direction: column; justify-content: center; gap: 5px;
  width: 44px; height: 44px; padding: 0 10px;
  background: none; border: 0; cursor: pointer;
}
@media (min-width: 1000px) { .burger { display: none; } }
.burger span { display: block; height: 1.5px; background: currentColor; transition: transform .3s ease, opacity .2s ease; }
.burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
.burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }

.mobilenav {
  position: fixed; inset: var(--header-h) 0 0 0; z-index: 99;
  background: var(--ink); color: var(--paper);
  padding: 2rem var(--gutter) 3rem;
  display: flex; flex-direction: column; gap: .25rem;
  transform: translateY(-12px); opacity: 0; pointer-events: none;
  transition: opacity .28s ease, transform .28s ease;
  overflow-y: auto;
}
.mobilenav.is-open { opacity: 1; transform: none; pointer-events: auto; }
.mobilenav a {
  text-decoration: none; font-size: 1.45rem; font-weight: 700; letter-spacing: -.02em;
  padding: .85rem 0; border-bottom: 1px solid var(--ink-line);
}
.mobilenav .btn { margin-top: 2rem; }
body.nav-open { overflow: hidden; }

/* -- 06 Hero -------------------------------------------------------------- */
.hero {
  position: relative;
  min-height: min(94svh, 900px);
  display: flex; align-items: flex-end;
  color: var(--paper);
  background: var(--ink);
  overflow: hidden;
  padding-top: var(--header-h);
}
.hero__media { position: absolute; inset: 0; }
.hero__media img { width: 100%; height: 100%; object-fit: cover; }
.hero__media::after {
  content: ""; position: absolute; inset: 0;
  /* Two scrims: one up the page for the spec strip, one across from the left
     so the headline and eyebrow hold contrast over the pale fence line. */
  background:
    linear-gradient(to right, rgba(12,14,17,.62) 0%, rgba(12,14,17,.22) 48%, rgba(12,14,17,0) 78%),
    linear-gradient(to top, rgba(12,14,17,.86) 0%, rgba(12,14,17,.58) 26%, rgba(12,14,17,.26) 58%, rgba(12,14,17,.42) 100%);
}
.hero__inner { position: relative; width: 100%; padding-block: clamp(2.5rem, 6vw, 5rem); }
.hero h1 { max-width: 16ch; text-wrap: balance; }
.hero__sub {
  margin-top: 1.5rem; max-width: 48ch;
  font-size: var(--step-lead); line-height: 1.55; color: #d3d7dc;
}
.hero__actions { display: flex; flex-wrap: wrap; gap: .85rem; margin-top: 2.25rem; }

/* Spec strip under the hero headline */
.specstrip {
  margin-top: clamp(2.5rem, 5vw, 4rem);
  border-top: 1px solid rgba(246,244,240,.2);
  padding-top: 1.5rem;
  display: grid; gap: 1.25rem 2rem;
  grid-template-columns: repeat(2, minmax(0,1fr));
}
@media (min-width: 820px) { .specstrip { grid-template-columns: repeat(4, minmax(0,1fr)); } }
.specstrip dt {
  font-family: var(--mono); font-size: .66rem; letter-spacing: .17em;
  text-transform: uppercase; color: var(--brand-lt); margin-bottom: .4rem;
}
.specstrip dd { margin: 0; font-size: .96rem; font-weight: 500; color: #e4e7ea; line-height: 1.4; }

/* Page hero for interior pages */
.pagehero {
  position: relative; background: var(--ink); color: var(--paper);
  padding-top: calc(var(--header-h) + clamp(3.5rem, 8vw, 6.5rem));
  padding-bottom: clamp(3.5rem, 8vw, 6.5rem);
  overflow: hidden;
}
.pagehero__media { position: absolute; inset: 0; }
.pagehero__media img { width: 100%; height: 100%; object-fit: cover; opacity: .55; }
.pagehero__media::after {
  content: ""; position: absolute; inset: 0;
  background:
    linear-gradient(to right, rgba(12,14,17,.93) 0%, rgba(12,14,17,.66) 52%, rgba(12,14,17,.34) 100%),
    linear-gradient(to top, rgba(12,14,17,.55), rgba(12,14,17,0) 45%);
}
.pagehero__inner { position: relative; }
.pagehero h1 { max-width: 18ch; text-wrap: balance; }
.pagehero .lead { margin-top: 1.35rem; color: #ccd1d7; }

.crumbs {
  font-family: var(--mono); font-size: .7rem; letter-spacing: .12em; text-transform: uppercase;
  color: rgba(246,244,240,.6); margin-bottom: 1.5rem;
}
.crumbs a { text-decoration: none; }
.crumbs a:hover { color: var(--brand-lt); }
.crumbs span { margin-inline: .5rem; opacity: .5; }

/* Hero lead form ----------------------------------------------------------
   Every page puts a quote form in the hero, so the first screen is an offer
   and not just a claim. The copy and the form sit side by side from 1000px
   and stack below it, headline first. The hero drops its 94svh floor when it
   carries a form — the form, not empty photograph, is what should fill the
   space on a phone. */
.hero--lead { min-height: 0; align-items: center; }
.hero--lead .hero__inner { padding-block: clamp(3rem, 7vw, 5.5rem); }
.hero--lead h1 { max-width: 15ch; }
.hero--lead .hero__sub { max-width: 44ch; }

.herogrid { display: grid; gap: clamp(2.25rem, 5vw, 3rem); align-items: center; }
@media (min-width: 1000px) {
  .herogrid {
    grid-template-columns: minmax(0, 1.06fr) minmax(0, .94fr);
    gap: clamp(2.5rem, 5vw, 4.5rem);
  }
}
/* The scrim is tuned for text on the left; behind a white card on the right
   it only needs to stop the photo bleeding through the card's edge. */
.hero--lead .hero__media::after,
.pagehero--lead .pagehero__media::after {
  background:
    linear-gradient(to right, rgba(12,14,17,.80) 0%, rgba(12,14,17,.52) 46%, rgba(12,14,17,.34) 100%),
    linear-gradient(to top, rgba(12,14,17,.80) 0%, rgba(12,14,17,.40) 40%, rgba(12,14,17,.34) 100%);
}
.hero--lead .specstrip { margin-top: clamp(2.25rem, 4vw, 3rem); }
/* Below the side-by-side breakpoint the form sits under the headline, so the
   secondary jump link is 90px of nothing between a customer and the form.
   The sections it points at are a scroll away regardless. */
.hero--lead .hero__actions,
.pagehero--lead .hero__actions { display: none; }
@media (min-width: 1000px) {
  .hero--lead .hero__actions,
  .pagehero--lead .hero__actions { display: flex; }
}

.pagehero--lead { padding-bottom: clamp(3rem, 7vw, 5rem); }
.pagehero--lead h1 { max-width: 16ch; }
.pagehero--lead .lead { max-width: 46ch; }

/* -- 07 Modules ----------------------------------------------------------- */

/* Credentials bar — sits directly under the hero. Answers the objection the
   research ranks as structurally worst for a solo operator ("he'll take the
   deposit and disappear") in the first screen after the fold. */
.credbar { background: var(--paper); border-bottom: 1px solid var(--line); }
.section--ink + .credbar { border-top: 1px solid var(--line); }
.credbar__grid {
  display: grid; gap: 0;
  grid-template-columns: repeat(2, minmax(0, 1fr));
}
@media (min-width: 900px) { .credbar__grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
.credbar__item {
  padding: 1.5rem 1.25rem 1.5rem 0;
  border-top: 1px solid var(--line);
  display: flex; align-items: flex-start; gap: .85rem;
}
@media (min-width: 900px) {
  .credbar__item { border-top: 0; padding-block: 1.75rem; }
  .credbar__item + .credbar__item { border-left: 1px solid var(--line); padding-left: 1.75rem; }
}
@media (max-width: 899px) {
  .credbar__item:nth-child(odd) { padding-right: 1.25rem; }
  .credbar__item:nth-child(even) { padding-left: 1.25rem; border-left: 1px solid var(--line); }
  .credbar__item:nth-child(-n+2) { border-top: 0; }
}
.credbar__icon { flex: none; width: 20px; height: 20px; color: var(--brand); margin-top: 2px; }
.credbar dt {
  font-family: var(--mono); font-size: .62rem; letter-spacing: .16em;
  text-transform: uppercase; color: var(--grey); margin-bottom: .3rem;
}
.credbar dd { margin: 0; font-size: .93rem; font-weight: 600; line-height: 1.35; letter-spacing: -.005em; }
.credbar dd small { display: block; font-weight: 400; font-size: .8rem; color: var(--grey); margin-top: .15rem; letter-spacing: 0; }

/* Section head */
.head { max-width: var(--maxw-text); margin-bottom: clamp(2.5rem, 5vw, 4rem); }
.head h2 { text-wrap: balance; }
.head .lead { margin-top: 1.25rem; }

/* Quote-comparison cards — the campaign's core idea, made visual */
.quotes { display: grid; gap: 1.25rem; }
@media (min-width: 860px) { .quotes { grid-template-columns: repeat(3, 1fr); } }
.qcard {
  background: #fff; border: 1px solid var(--line); border-radius: var(--radius);
  padding: 1.75rem 1.5rem; display: flex; flex-direction: column;
}
.qcard--ours { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.qcard__tag {
  font-family: var(--mono); font-size: .67rem; letter-spacing: .16em; text-transform: uppercase;
  color: var(--grey); margin-bottom: 1.25rem;
}
.qcard--ours .qcard__tag { color: var(--brand-lt); }
.qcard__price { font-size: 1.85rem; font-weight: 800; letter-spacing: -.03em; margin-bottom: 1.35rem; }
.qspec { list-style: none; margin: 0; padding: 0; display: grid; gap: .1rem; }
.qspec li {
  display: flex; justify-content: space-between; gap: 1rem; align-items: baseline;
  padding: .7rem 0; border-top: 1px solid var(--line);
  font-size: .89rem;
}
.qcard--ours .qspec li { border-top-color: var(--ink-line); }
.qspec b { font-weight: 500; color: var(--grey); }
.qcard--ours .qspec b { color: var(--grey-2); }
.qspec span { font-family: var(--mono); font-size: .82rem; text-align: right; }
.qspec .miss { color: #b0503f; }
.qcard--ours .qspec span { color: var(--brand-lt); }

/* Numbered question list */
.qlist { list-style: none; margin: 0; padding: 0; counter-reset: q; display: grid; gap: 0; }
.qlist li {
  counter-increment: q;
  display: grid; grid-template-columns: auto 1fr; gap: 1.25rem;
  padding: 1.5rem 0; border-top: 1px solid var(--line);
}
.qlist li:last-child { border-bottom: 1px solid var(--line); }
.section--ink .qlist li { border-color: var(--ink-line); }
.qlist li::before {
  content: counter(q, decimal-leading-zero);
  font-family: var(--mono); font-size: .78rem; color: var(--brand);
  padding-top: .35rem;
}
.qlist h3 { margin-bottom: .45rem; }
/* Capped so a full-width qlist on a service page doesn't run to 120 characters. */
.qlist p { color: var(--grey); font-size: .95rem; max-width: 74ch; }
.section--ink .qlist p { color: #a9afb7; }

/* Slab cross-section diagram */
.diagram { background: #fff; border: 1px solid var(--line); border-radius: var(--radius); padding: clamp(1.25rem, 3vw, 2.25rem); }
.section--ink .diagram { background: var(--ink-soft); border-color: var(--ink-line); }
/* The cross-section has a fixed amount of labelled detail — below ~660px it
   scrolls sideways rather than shrinking the labels into illegibility. */
.diagram__scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.diagram svg { width: 100%; min-width: 620px; height: auto; }
.diagram__note {
  margin-top: 1.5rem; padding-top: 1.25rem; border-top: 1px solid var(--line);
  font-size: .88rem; color: var(--grey);
}
.section--ink .diagram__note { border-top-color: var(--ink-line); color: #a9afb7; }

/* Service cards */
.services { display: grid; gap: 1.5rem; }
@media (min-width: 800px) { .services { grid-template-columns: repeat(3, 1fr); } }
.svc {
  display: flex; flex-direction: column;
  background: #fff; border: 1px solid var(--line); border-radius: var(--radius);
  overflow: hidden; text-decoration: none;
  transition: transform .3s ease, box-shadow .3s ease, border-color .3s ease;
}
.svc:hover { transform: translateY(-4px); box-shadow: var(--shadow); border-color: var(--paper-3); }
.svc__media { aspect-ratio: 4 / 3; overflow: hidden; background: var(--paper-3); }
.svc__media img { width: 100%; height: 100%; object-fit: cover; transition: transform .6s cubic-bezier(.2,.7,.3,1); }
.svc:hover .svc__media img { transform: scale(1.045); }
.svc__body { padding: 1.6rem 1.5rem 1.75rem; display: flex; flex-direction: column; flex: 1; }
.svc__body h3 { margin-bottom: .6rem; }
.svc__body p { color: var(--grey); font-size: .93rem; flex: 1; }
.svc__more {
  margin-top: 1.35rem; font-family: var(--mono); font-size: .72rem; letter-spacing: .13em;
  text-transform: uppercase; color: var(--brand);
  display: inline-flex; align-items: center; gap: .5rem;
}
.svc__more svg { width: 14px; height: 14px; transition: transform .25s ease; }
.svc:hover .svc__more svg { transform: translateX(4px); }

/* Process steps */
.steps { counter-reset: s; display: grid; gap: 0; }
@media (min-width: 780px) { .steps { grid-template-columns: repeat(2, 1fr); column-gap: clamp(2rem,5vw,4rem); } }
.step { counter-increment: s; padding: 1.75rem 0; border-top: 1px solid var(--ink-line); }
.step__n {
  font-family: var(--mono); font-size: .72rem; letter-spacing: .14em;
  color: var(--brand-lt); margin-bottom: .8rem;
}
.step h3 { margin-bottom: .5rem; }
.step p { color: #a9afb7; font-size: .94rem; }

/* Feature row: image + copy */
.feature { display: grid; gap: clamp(2rem, 5vw, 4rem); align-items: center; }
@media (min-width: 900px) {
  .feature { grid-template-columns: repeat(2, minmax(0,1fr)); }
  .feature--flip .feature__media { order: 2; }
}
.feature__media { position: relative; border-radius: var(--radius); overflow: hidden; background: var(--paper-3); }
.feature__media img { width: 100%; aspect-ratio: 4/3; object-fit: cover; }
.feature__cap {
  position: absolute; left: 0; bottom: 0; right: 0;
  padding: 2.5rem 1.25rem 1.1rem;
  background: linear-gradient(to top, rgba(12,14,17,.82), transparent);
  color: var(--paper);
  font-family: var(--mono); font-size: .7rem; letter-spacing: .12em; text-transform: uppercase;
}

/* Bullet list with rule separators */
.ticks { list-style: none; margin: 1.75rem 0 0; padding: 0; }
.ticks li {
  position: relative; padding: .95rem 0 .95rem 1.9rem;
  border-top: 1px solid var(--line); font-size: .97rem;
}
.ticks li:last-child { border-bottom: 1px solid var(--line); }
.section--ink .ticks li { border-color: var(--ink-line); }
.ticks li::before {
  content: ""; position: absolute; left: 0; top: 1.45rem;
  width: 9px; height: 9px; border: 1.5px solid var(--brand); border-radius: 50%;
}

/* Stat / fact row */
/* auto-fit, because this block also sits inside narrow grid columns */
/* 170px, not 150px: at 150 the auto-fit tracks came out ~152px wide and the
   email address (~222px on one line, ~160px after the @) never fit in one. It
   was overflowing its cell at every breakpoint — invisible on desktop because
   it spilled into the 2rem gutter, but on a phone it widened the document past
   the viewport. min(100%, …) keeps auto-fit from overflowing a container that
   is itself narrower than the track minimum. */
.facts { display: grid; gap: 1.5rem 2rem; grid-template-columns: repeat(auto-fit, minmax(min(100%, 170px), 1fr)); }
.fact dt {
  font-family: var(--mono); font-size: .66rem; letter-spacing: .16em; text-transform: uppercase;
  color: var(--brand); margin-bottom: .5rem;
}
/* The email address is one 25-character unbreakable token and the grid cell is
   ~150px on a phone. Without this it overflows the cell, widens the whole
   document past the viewport, and every full-bleed section ends up narrower
   than the page — which reads as stray bands of background down the sides.
   `anywhere` rather than `break-word` because only `anywhere` also shrinks the
   min-content contribution, which is what the grid track is sized from. */
.fact dd { margin: 0; font-size: 1.02rem; font-weight: 500; line-height: 1.4; overflow-wrap: anywhere; }

/* Areas */
.areas { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: 2rem; }
.areas li {
  list-style: none;
  font-family: var(--mono); font-size: .78rem;
  padding: .5rem .85rem; border: 1px solid var(--line); border-radius: 100px;
  color: #3b4149;
}
.section--ink .areas li { border-color: var(--ink-line); color: #c3c9d0; }

/* FAQ */
.faq { border-top: 1px solid var(--line); }
.faq details { border-bottom: 1px solid var(--line); }
.faq summary {
  list-style: none; cursor: pointer;
  padding: 1.5rem 3rem 1.5rem 0; position: relative;
  font-size: 1.06rem; font-weight: 600; letter-spacing: -.01em;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after {
  content: ""; position: absolute; right: .5rem; top: 50%;
  width: 12px; height: 12px; margin-top: -6px;
  border-right: 1.5px solid var(--brand); border-bottom: 1.5px solid var(--brand);
  transform: rotate(45deg); transition: transform .25s ease;
}
.faq details[open] summary::after { transform: rotate(-135deg); }
.faq__body { padding: 0 clamp(1rem,4vw,3rem) 1.75rem 0; color: var(--grey); max-width: 62ch; }

/* Pull quote */
.pull {
  border-left: 2px solid var(--brand);
  padding: .35rem 0 .35rem 1.75rem;
  margin: 2.5rem 0;
  font-size: clamp(1.15rem, 2vw, 1.45rem);
  line-height: 1.45; font-weight: 500; letter-spacing: -.015em;
  max-width: 46ch;
}
.pull cite {
  display: block; margin-top: .9rem;
  font-family: var(--mono); font-size: .72rem; letter-spacing: .12em; text-transform: uppercase;
  color: var(--grey); font-style: normal;
}

/* CTA band */
.cta { background: var(--ink); color: var(--paper); }
.cta__inner { display: grid; gap: 2rem; align-items: center; }
@media (min-width: 880px) { .cta__inner { grid-template-columns: 1.4fr auto; } }
.cta h2 { max-width: 20ch; text-wrap: balance; }
.cta__actions { display: flex; flex-wrap: wrap; gap: .85rem; }

/* -- 08 Gallery ----------------------------------------------------------- */
.gallery {
  display: grid; gap: .75rem;
  grid-template-columns: repeat(2, 1fr);
}
@media (min-width: 760px) { .gallery { grid-template-columns: repeat(3, 1fr); gap: 1rem; } }
@media (min-width: 1100px) { .gallery { grid-template-columns: repeat(4, 1fr); } }
.gitem {
  position: relative; margin: 0; overflow: hidden; border-radius: var(--radius);
  background: var(--paper-3); cursor: zoom-in; border: 0; padding: 0;
  aspect-ratio: 4/3; display: block; width: 100%;
}
.gitem--tall { grid-row: span 2; aspect-ratio: 2/3; }
@media (max-width: 759px) { .gitem--tall { grid-row: span 1; aspect-ratio: 4/3; } }
.gitem img { width: 100%; height: 100%; object-fit: cover; transition: transform .6s cubic-bezier(.2,.7,.3,1); }
.gitem:hover img { transform: scale(1.05); }
.gitem figcaption {
  position: absolute; inset: auto 0 0 0;
  padding: 2.25rem .9rem .8rem;
  background: linear-gradient(to top, rgba(12,14,17,.86), transparent);
  color: var(--paper); text-align: left;
  font-family: var(--mono); font-size: .66rem; letter-spacing: .1em; text-transform: uppercase;
  opacity: 0; transform: translateY(6px); transition: opacity .3s ease, transform .3s ease;
}
.gitem:hover figcaption, .gitem:focus-visible figcaption { opacity: 1; transform: none; }
@media (hover: none) { .gitem figcaption { opacity: 1; transform: none; } }

/* Lightbox */
.lightbox {
  position: fixed; inset: 0; z-index: 200;
  background: rgba(10, 12, 14, .96);
  display: grid; place-items: center; padding: clamp(1rem, 4vw, 3rem);
  opacity: 0; pointer-events: none; transition: opacity .25s ease;
}
.lightbox.is-open { opacity: 1; pointer-events: auto; }
.lightbox img { max-width: 100%; max-height: 82vh; object-fit: contain; border-radius: var(--radius); }
.lightbox__cap {
  color: #c7ccd2; text-align: center; margin-top: 1.25rem;
  font-family: var(--mono); font-size: .72rem; letter-spacing: .12em; text-transform: uppercase;
}
.lightbox__close, .lightbox__nav {
  position: absolute; background: none; border: 1px solid rgba(246,244,240,.28);
  color: var(--paper); width: 46px; height: 46px; border-radius: 50%;
  display: grid; place-items: center; cursor: pointer;
  transition: border-color .2s ease, background-color .2s ease;
}
.lightbox__close:hover, .lightbox__nav:hover { border-color: var(--paper); background: rgba(246,244,240,.08); }
.lightbox__close { top: clamp(1rem,3vw,2rem); right: clamp(1rem,3vw,2rem); }
.lightbox__nav--prev { left: clamp(.5rem,2vw,2rem); top: 50%; margin-top: -23px; }
.lightbox__nav--next { right: clamp(.5rem,2vw,2rem); top: 50%; margin-top: -23px; }
.lightbox svg { width: 18px; height: 18px; }

/* -- 09 Form -------------------------------------------------------------- */
.formwrap {
  background: #fff; border: 1px solid var(--line); border-radius: var(--radius);
  padding: clamp(1.5rem, 4vw, 2.75rem);
  box-shadow: var(--shadow);
  /* The form card sits inside .section--ink, so reset the inherited light
     text colour — otherwise typed input text is near-white on near-white. */
  color: var(--ink);
}
.field { margin-bottom: 1.15rem; }
.field label {
  display: block; margin-bottom: .45rem;
  font-family: var(--mono); font-size: .68rem; letter-spacing: .14em; text-transform: uppercase;
  color: var(--grey);
}
.field input, .field select, .field textarea {
  width: 100%; padding: .9rem 1rem;
  background: var(--paper); color: var(--ink);
  border: 1px solid var(--line); border-radius: var(--radius);
  font-size: 1rem; transition: border-color .2s ease, background-color .2s ease;
}
.field input::placeholder, .field textarea::placeholder { color: #9aa0a7; }
.field textarea { min-height: 110px; resize: vertical; }
.field input:focus, .field select:focus, .field textarea:focus {
  background: #fff; border-color: var(--ink); outline: none;
}
.field select { appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%236c727a' stroke-width='1.5'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 1rem center; background-size: 12px; padding-right: 2.5rem; }
.field--row { display: grid; gap: 1.15rem; }
@media (min-width: 620px) { .field--row { grid-template-columns: 1fr 1fr; } }
.field--row .field { margin-bottom: 0; }
.hp { position: absolute; left: -9999px; opacity: 0; height: 0; width: 0; overflow: hidden; }
.formnote { margin-top: 1.15rem; font-size: .82rem; color: var(--grey); text-align: center; }
.formdone {
  display: none; text-align: center; padding: clamp(2rem,5vw,3.5rem) 1rem;
}
.formdone h3 { margin-bottom: .75rem; }
.formdone p { color: var(--grey); max-width: 40ch; margin-inline: auto; }
.formdone__tick {
  width: 54px; height: 54px; margin: 0 auto 1.5rem;
  border: 1.5px solid var(--brand); border-radius: 50%;
  display: grid; place-items: center; color: var(--brand);
}
form.is-sent { display: none; }
form.is-sent + .formdone { display: block; }

/* The hero copy of the card: tighter, because it has to fit on the first
   screen next to the headline rather than own a section of its own. */
.formwrap--hero { padding: clamp(1.35rem, 3vw, 1.9rem); box-shadow: 0 26px 64px -26px rgba(8,10,13,.85); }
.formwrap--hero .field { margin-bottom: .8rem; }
.formwrap--hero .field--row { gap: .8rem; margin-bottom: .8rem; }
.formwrap--hero .field input,
.formwrap--hero .field select { padding: .74rem .9rem; }
.formwrap--hero .formnote { margin-top: .8rem; font-size: .76rem; }
.formwrap--hero .formdone { padding: clamp(1.5rem, 4vw, 2.25rem) .5rem; }
.formhead { margin-bottom: 1.1rem; }
.formhead h2 { font-size: 1.2rem; letter-spacing: -.02em; margin: 0; }
.formhead p { font-size: .87rem; color: var(--grey); margin: .35rem 0 0; }

/* -- 10 Footer, sticky bar, motion --------------------------------------- */
.footer { background: var(--ink); color: #b0b6bd; padding-block: clamp(3.5rem, 7vw, 5.5rem) 2rem; }
.footer a { text-decoration: none; }
.footer a:hover { color: var(--paper); }
.footer__grid { display: grid; gap: 2.5rem; }
@media (min-width: 820px) { .footer__grid { grid-template-columns: 2fr 1fr 1fr 1.2fr; } }
.footer h4 {
  font-family: var(--mono); font-size: .66rem; letter-spacing: .17em; text-transform: uppercase;
  color: var(--grey-2); margin-bottom: 1.1rem; font-weight: 500;
}
.footer ul { list-style: none; margin: 0; padding: 0; display: grid; gap: .6rem; font-size: .93rem; }
.footer .brand { color: var(--paper); margin-bottom: 1.15rem; }
.footer__bottom {
  margin-top: clamp(2.5rem, 5vw, 4rem); padding-top: 1.75rem;
  border-top: 1px solid var(--ink-line);
  display: flex; flex-wrap: wrap; gap: 1rem; justify-content: space-between;
  font-size: .8rem; color: var(--grey);
}
.footer__tagline {
  flex: 1 0 100%;
  margin: 0;
  font-family: var(--mono);
  font-size: .78rem;
  font-weight: 500;
  letter-spacing: .04em;
  color: var(--brand-lt);
}

/* Sticky mobile call bar */
.callbar {
  position: fixed; inset: auto 0 0 0; z-index: 90;
  display: grid; grid-template-columns: 1fr 1fr; gap: 1px;
  background: var(--ink-line);
  transform: translateY(110%); transition: transform .3s ease;
  padding-bottom: env(safe-area-inset-bottom);
}
.callbar.is-visible { transform: none; }
@media (min-width: 760px) { .callbar { display: none; } }
.callbar a {
  background: var(--ink); color: var(--paper);
  padding: 1rem .75rem; text-align: center; text-decoration: none;
  font-weight: 600; font-size: .92rem;
  display: flex; align-items: center; justify-content: center; gap: .5rem;
}
.callbar a.is-accent { background: var(--brand); color: #fff; }
.callbar svg { width: 16px; height: 16px; }
@media (max-width: 759px) { body { padding-bottom: 0; } }

/* -- 11 Long-form legal pages -------------------------------------------- */
.legal { max-width: var(--maxw-text); }
.legal > h2 {
  font-size: var(--step-h3);
  margin-top: clamp(2.75rem, 5vw, 3.75rem);
  padding-top: 1.75rem;
  border-top: 1px solid var(--line);
}
.legal > h2:first-child { margin-top: 0; padding-top: 0; border-top: 0; }
.legal h3 { font-size: 1.02rem; margin-top: 1.9rem; }
.legal h2 + p, .legal h3 + p { margin-top: 1rem; }
.legal p, .legal li { font-size: 1rem; line-height: 1.68; }
.legal ul, .legal ol { margin: 1.1rem 0 1.1rem; padding-left: 1.3rem; display: grid; gap: .6rem; }
.legal li::marker { color: var(--brand); }
.legal a { text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1px; }
.legal a:hover { color: var(--brand); }
.legal strong { font-weight: 600; }

/* "Last updated" stamp under the page title */
.legal__stamp {
  font-family: var(--mono); font-size: .72rem; letter-spacing: .12em;
  text-transform: uppercase; color: rgba(246,244,240,.62); margin-top: 1.5rem;
}

/* Contents list at the top of a policy */
.toc { margin: 0 0 clamp(2.5rem,5vw,3.5rem); padding: 0; list-style: none; display: grid; gap: .5rem; counter-reset: toc; }
.toc li { counter-increment: toc; font-size: .95rem; }
.toc a { text-decoration: none; }
.toc a::before {
  content: counter(toc, decimal-leading-zero);
  font-family: var(--mono); font-size: .72rem; color: var(--brand);
  margin-right: .85rem;
}
.toc a:hover { color: var(--brand); }

/* A framed aside for the one thing on the page that must not be missed */
.callout {
  margin: 1.75rem 0; padding: 1.25rem 1.4rem;
  background: var(--paper-2); border-left: 2px solid var(--brand); border-radius: 0 var(--radius) var(--radius) 0;
}
.callout p { font-size: .96rem; }

/* Scroll reveal */
.reveal { opacity: 0; transform: translateY(18px); transition: opacity .7s cubic-bezier(.2,.7,.3,1), transform .7s cubic-bezier(.2,.7,.3,1); }
.reveal.is-in { opacity: 1; transform: none; }
.reveal[data-delay="1"] { transition-delay: .08s; }
.reveal[data-delay="2"] { transition-delay: .16s; }
.reveal[data-delay="3"] { transition-delay: .24s; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .01ms !important; animation-iteration-count: 1 !important;
    transition-duration: .01ms !important; scroll-behavior: auto !important;
  }
  .reveal { opacity: 1; transform: none; }
}

@media print {
  .header, .callbar, .lightbox, .mobilenav, .hero__media { display: none !important; }
  body { background: #fff; }
}

/* -- 12 Poyser additions --------------------------------------------------
   Layout modifiers for a two-machine yard (the CWH original assumed three
   services), plus the photo-slot placeholder that marks every image this
   skeleton is still waiting on.
   ------------------------------------------------------------------------ */

/* Two-up variants — the fleet is closed at two machines, so the three-column
   service grid and the 5/7 split both need an even sibling. */
@media (min-width: 800px) { .services--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 900px) {
  .split--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); align-items: center; }
  .credbar__grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .specstrip--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* Cyan hairline under the logo lockup in the hero eyebrow, so the accent
   appears above the fold even before any photography lands. */
.hero .eyebrow--light::before { background: var(--brand-lt); }

/* ---- PHOTO-SLOT ---------------------------------------------------------
   Every image on this skeleton is an empty, labelled box. It is deliberately
   visible: an unfilled slot should look unfinished, not like a design choice.
   The label comes from the element's own data-photo-slot attribute, so the
   brief for each shot lives next to the hole it fills.

   To fill one: put a <picture>/<img> inside the element and delete the
   data-photo-slot attribute. The rules below stop applying on their own.
   -------------------------------------------------------------------- */
[data-photo-slot] {
  position: relative;
  min-height: 220px;
  background-color: var(--paper-2);
  background-image:
    repeating-linear-gradient(135deg,
      rgba(23, 92, 112, .05) 0 12px,
      rgba(23, 92, 112, .11) 12px 24px);
  border: 1px dashed rgba(23, 92, 112, .40);
  border-radius: var(--radius);
  display: grid; place-items: center;
}
[data-photo-slot]::before {
  content: "PHOTO SLOT — " attr(data-photo-slot);
  font-family: var(--mono);
  font-size: .7rem; line-height: 1.5;
  letter-spacing: .04em; text-transform: uppercase;
  color: var(--brand);
  max-width: 30ch; text-align: center;
  padding: 1.25rem;
}

/* Dark contexts get the same hole in the negative. */
.section--ink [data-photo-slot],
.hero__media[data-photo-slot],
.pagehero__media[data-photo-slot] {
  background-color: var(--ink-soft);
  background-image:
    repeating-linear-gradient(135deg,
      rgba(81, 180, 207, .05) 0 12px,
      rgba(81, 180, 207, .12) 12px 24px);
  border-color: rgba(81, 180, 207, .38);
}
.section--ink [data-photo-slot]::before,
.hero__media[data-photo-slot]::before,
.pagehero__media[data-photo-slot]::before { color: var(--brand-lt); }

/* Card media is flush to the card edge, so it keeps only its bottom hairline. */
.svc__media[data-photo-slot] { min-height: 0; border-radius: 0; border-width: 0 0 1px; }

/* These two are absolutely positioned scrims; the generic rule above sets
   position:relative and would collapse them out of the area they fill. */
.hero__media[data-photo-slot],
.pagehero__media[data-photo-slot] {
  position: absolute; inset: 0;
  border: 0; border-radius: 0;
}
/* The hero slot sits behind the headline, so its label must not compete. */
.hero__media[data-photo-slot]::before,
.pagehero__media[data-photo-slot]::before { align-self: end; justify-self: end; opacity: .5; }

/* -- 13 Single column on phones ------------------------------------------
   The credentials bar and the hero spec strip both inherit a two-up grid from
   the template. At phone widths that puts two long labels side by side in
   ~170px each and the text wraps to four or five lines per cell. Below 640px
   they go to one column and read as a list.
   ------------------------------------------------------------------------ */
@media (max-width: 639px) {
  .credbar__grid { grid-template-columns: minmax(0, 1fr); }
  .credbar__item,
  .credbar__item:nth-child(odd),
  .credbar__item:nth-child(even) {
    padding: 1.15rem 0;
    border-left: 0;
  }
  .credbar__item:first-child { border-top: 0; }
  /* nth-child(-n+2) removed the top rule from BOTH cells of the first row in
     the two-up layout. In one column only the first cell should lose it. */
  .credbar__item:nth-child(2) { border-top: 1px solid var(--line); }

  .specstrip { grid-template-columns: minmax(0, 1fr); gap: 1.1rem; }
}

/* -- 14 Lead form band ----------------------------------------------------
   The same "send the job" block, repeated near the bottom of every page that
   isn't the thank-you page, so the form is never more than one scroll away.
   Dark ground, because it should read as the end of the page, not a section
   inside it.
   ------------------------------------------------------------------------ */
.formband { background: var(--ink); color: var(--paper); }
.formband__inner { display: grid; gap: clamp(2.25rem, 5vw, 3.5rem); align-items: start; }
@media (min-width: 940px) {
  .formband__inner { grid-template-columns: minmax(0, 1fr) minmax(0, 460px); gap: clamp(3rem, 6vw, 5rem); }
}
.formband h2 { max-width: 16ch; text-wrap: balance; }
.formband .lead { color: #b9c0c8; margin-top: 1.25rem; }
.formband__actions { display: flex; flex-wrap: wrap; gap: .85rem; margin-top: 2rem; }
.formband .ticks li { border-color: var(--ink-line); }
.formband .ticks li:last-child { border-bottom-color: var(--ink-line); }

/* The card itself is the light surface in a dark band, so the fields keep the
   same contrast they have on the contact page. */
.formband .formwrap { color: var(--ink); }

/* The "(optional)" qualifier on a field label: same size, but stepped back out
   of the uppercase mono treatment so it reads as an aside, not as the label. */
.label-opt { font-weight: 400; text-transform: none; letter-spacing: 0; opacity: .8; }

/* -- 15 Keep the phone above the fold ------------------------------------
   The template hides .hero__actions in the `hero--lead` variant, because on
   the site it came from the hero form was the only call to action. Here the
   phone IS the call to action — the ICP rings, it does not fill in carts — so
   the actions come back and sit above the form on a phone.
   ------------------------------------------------------------------------ */
.hero--lead .hero__actions,
.pagehero--lead .hero__actions { display: flex; }
.hero--lead .hero__actions { margin-top: 1.75rem; }

/* The hero form follows the copy in source order, so on a phone the call
   button lands directly under the sub-heading where a thumb expects it. */
@media (max-width: 999px) {
  .hero--lead .specstrip { margin-top: 2rem; }
}

/* -- 16 Cards on a dark section ------------------------------------------
   `.svc` is a white card, but `.section--ink` sets `color: var(--paper)` on
   everything inside it. The card's own paragraph and link name their colours,
   so they were fine — the h3 does not, so it inherited near-white and sat
   invisibly on white. Reset the card's text colour the way `.formwrap`
   already does, and give the heading an explicit value so it can never
   inherit its way back out.
   ------------------------------------------------------------------------ */
.section--ink .svc { color: var(--ink); }
.section--ink .svc h3,
.svc__body h3 { color: var(--ink); }
.section--ink .svc__body p { color: var(--grey); }
.section--ink .svc__more { color: var(--brand); }

/* -- Machine spec dialog --------------------------------------------------
   Clicking a machine card opens the full spec sheet. Native <dialog> so the
   browser handles focus trapping, Esc and the backdrop; the close button sits
   in a method="dialog" form so it still closes with JS off.
   ------------------------------------------------------------------------ */
.svc--machine { cursor: pointer; }
.svc--machine:focus-within { outline: 2px solid var(--brand); outline-offset: 3px; }

/* The affordance: a mono line telling the user the card is clickable. */
.svc__spec-cue {
  display: inline-flex; align-items: center; gap: .5rem;
  margin-top: 1.1rem;
  font-family: var(--mono); font-size: .7rem; letter-spacing: .13em;
  text-transform: uppercase; color: var(--brand);
  background: none; border: 0; padding: 0; cursor: pointer; text-align: left;
}
.svc__spec-cue svg { width: 14px; height: 14px; flex: none; }
.svc--machine:hover .svc__spec-cue { text-decoration: underline; text-underline-offset: 3px; }

.svc__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 1.25rem; margin-top: 1.1rem; }
.svc__actions .svc__spec-cue { margin-top: 0; }
/* The enquire link sits above the card-wide click handler. */
.svc__actions .svc__more { position: relative; z-index: 2; margin-top: 0; }

dialog.specs {
  width: min(700px, calc(100vw - 2rem));
  max-height: min(88svh, 940px);
  padding: 0; border: 0; border-radius: var(--radius);
  background: var(--paper); color: var(--ink);
  box-shadow: 0 40px 90px -30px rgba(6, 9, 12, .75);
  overflow: hidden;
}
dialog.specs[open] { display: flex; flex-direction: column; }
dialog.specs::backdrop { background: rgba(6, 9, 12, .74); }

.specs__head {
  background: var(--ink); color: var(--paper);
  padding: clamp(1.35rem, 4vw, 1.9rem) clamp(1.25rem, 4vw, 2rem) clamp(1.1rem, 3vw, 1.5rem);
  flex: none;
}
.specs__head h2 { font-size: clamp(1.35rem, 3.4vw, 1.8rem); letter-spacing: -.02em; }
.specs__head h2 .num { color: var(--brand-lt); font-weight: 500; }
.specs__sub {
  margin: .6rem 0 0; font-size: .88rem; color: #aab3bd;
  font-family: var(--mono); letter-spacing: .04em;
}
.specs__close {
  position: absolute; top: .75rem; right: .75rem; z-index: 3;
  width: 40px; height: 40px; border-radius: 50%;
  display: grid; place-items: center; cursor: pointer;
  background: rgba(245, 247, 248, .08); color: var(--paper);
  border: 1px solid rgba(245, 247, 248, .28);
  transition: background-color .2s ease, border-color .2s ease;
}
.specs__close:hover { background: rgba(245, 247, 248, .18); border-color: var(--paper); }
.specs__close svg { width: 16px; height: 16px; }

.specs__body {
  padding: clamp(1.25rem, 4vw, 2rem);
  overflow-y: auto; -webkit-overflow-scrolling: touch;
}
.specgroup + .specgroup { margin-top: 1.9rem; }
.specgroup h3 {
  font-family: var(--mono); font-size: .68rem; letter-spacing: .16em;
  text-transform: uppercase; color: var(--brand);
  font-weight: 500; margin-bottom: .35rem;
}
.specgroup .qspec span { color: var(--ink); font-weight: 500; }

.specs__foot {
  flex: none; padding: clamp(1.1rem, 3vw, 1.5rem) clamp(1.25rem, 4vw, 2rem);
  border-top: 1px solid var(--line); background: var(--paper-2);
  display: flex; flex-wrap: wrap; align-items: center; gap: 1rem;
}
.specs__foot .btn { flex: none; }
.specs__note { margin: 0; font-size: .78rem; color: var(--grey); flex: 1 1 16ch; line-height: 1.45; }

@media (prefers-reduced-motion: no-preference) {
  dialog.specs[open] { animation: specsIn .22s cubic-bezier(.2, .7, .3, 1); }
  @keyframes specsIn { from { opacity: 0; transform: translateY(10px) scale(.985); } }
}

/* -- 17 Service-area tiers ------------------------------------------------
   "Where we go" is three labelled groups rather than one flat list, so the
   local run and the regional reach can both be true on the same page without
   the reader having to guess which one applies to them.
   ------------------------------------------------------------------------ */
.tiers { display: grid; gap: clamp(1.75rem, 3.5vw, 2.75rem); margin-top: clamp(2rem, 4vw, 3rem); }
.tier .eyebrow { margin-bottom: 0; }
.tier .areas { margin-top: .9rem; }
