@charset "utf-8";
/* ==========================================================================
   INFANTS TRAVELS — style.css
   Saint Joseph, Michigan. Luxury travel + private ground transport.

   HOW TO EDIT THIS FILE (for non-developers)
   ------------------------------------------
   * Every colour, size, space and speed in the site is defined once, in
     section 01 "DESIGN TOKENS". Change a value there and it changes
     everywhere. Do NOT paste raw hex colours (#ABC123) anywhere below
     section 01 — if you need a new colour, the answer is almost always one
     of the tokens that already exists. There are exactly three legitimate
     exceptions, and no others:
       a) rgba(...) inside gradients, scrims and shadows in sections 09, 12,
          24, 26 and 27 — CSS cannot put a var() inside rgba(). Every one of
          those values is a token colour with an alpha channel; the comment
          beside it names which token.
       b) #000 inside mask-image — that is an opacity stop, not a colour.
       c) #fff / #000 / #999 / #444 inside the @media print block in section
          28. Print is a separate colour space: real ink on real paper.
   * Sections are numbered. Use your editor's Find (Ctrl+F) for e.g. "10 —"
     to jump straight to a component.
   * Fonts are loaded by a <link> tag in each page's <head>, not from here.
     See section 03.
   * There is no build step. If you edit this file and the site looks
     unchanged, hard-refresh (Ctrl+Shift+R) — see the caching note in
     netlify.toml.

   CONTENTS
   01 — Design tokens
   02 — Reset and base elements
   03 — Fonts and typography
   04 — Layout: container, section, colour bands, grids
   05 — Utilities
   06 — Skip link
   07 — Site header and navigation
   08 — Buttons and links
   09 — Hero
   10 — Page header (interior pages)
   11 — Eyebrow, section head, lede
   12 — Cards and card grids
   13 — Icon tiles and feature grid
   14 — Split panel (image left / right)
   15 — Stat and figure rows
   16 — Numbered process / timeline
   17 — Accordion (FAQ)
   18 — Owner placeholders (testimonial, trust strip)
   19 — Service detail block
   20 — Tables
   21 — Tags and badges
   22 — Breadcrumb and jump nav
   23 — CTA band
   24 — Forms
   25 — Site footer
   26 — Art frames, gradient material, grain, inline SVG art
   27 — Motion and scroll reveal
   28 — Print
   ========================================================================== */


/* ==========================================================================
   01 — DESIGN TOKENS
   ========================================================================== */

:root {
  /* ---- Core palette (do not add a sixth hue) ---------------------------- */
  --ink:            #0B1219;  /* near-black, blue cast. All body text on light */
  --navy-900:       #0E2233;  /* deep midnight water. Primary dark surface     */
  --navy-800:       #143349;  /* raised surface on dark: cards, inputs         */
  --navy-700:       #1C4463;  /* mid-water. Hover on dark, quiet dividers      */
  --brass-300:      #E0B562;  /* brass as TEXT / link ON DARK ONLY             */
  --brass-500:      #C08A2E;  /* the accent: rules, buttons, the lamp          */
  --brass-600:      #B07C22;  /* hover only, under --ink text                  */
  --brass-700:      #845C14;  /* brass as TEXT / link ON LIGHT ONLY            */
  --sand:           #E9E0D2;  /* warm banding surface                          */
  --sand-50:        #F2EBDF;  /* warm banding surface, lighter                 */
  --mist:           #9BAAB6;  /* muted text on dark; hairline on light         */
  --mist-700:       #52657A;  /* secondary / muted text on light               */
  --mist-50:        #EDF0F2;  /* cool banding surface                          */
  --paper:          #FBF9F6;  /* page background — never pure white            */
  --white:          #FFFFFF;  /* cards only                                    */

  /* ---- Lines. Two tiers: decorative vs. functional (WCAG 1.4.11) -------- */
  --line:             #C9C3B7; /* DECORATIVE hairlines only. Never on inputs   */
  --line-strong:      #7E7669; /* FUNCTIONAL boundary on light (inputs etc.)   */
  --line-dark:        #2A5271; /* DECORATIVE hairline on navy                  */
  --line-strong-dark: #7089A0; /* FUNCTIONAL boundary on navy — 3.6:1 on navy-800 */

  /* ---- Semantic (enquiry form) ------------------------------------------ */
  --success:         #1F6B4A;
  --success-bg:      #E7F1EB;
  --success-on-dark: #6FC59A;
  --error:           #9E2B25;
  --error-bg:        #F7E7E5;
  --error-on-dark:   #F0968E;
  --focus:           #845C14;
  --focus-dark:      #E0B562;
  --disabled-bg:     #F1EEE9;
  --disabled-text:   #6F695E;
  /* There is deliberately NO warning/amber status colour. Brass is the brand
     accent and must never double as a status signal. Informational messages
     use --navy-700 on --mist-50. */

  /* ---- Contextual tokens -------------------------------------------------
     These are the ones components actually reference. They are re-pointed by
     .on-dark (section 04) so every component adapts to a navy band with no
     extra classes. This is what stops brass text ever landing on paper. */
  --fg:            var(--ink);
  --fg-muted:      var(--mist-700);
  --fg-accent:     var(--brass-700);
  --surface:       var(--paper);
  --surface-card:  var(--white);
  --surface-raised:var(--sand-50);
  --rule:          var(--line);
  --rule-strong:   var(--line-strong);
  --focus-ring:    var(--focus);

  --btn-primary-bg:        var(--navy-900);
  --btn-primary-fg:        var(--paper);
  --btn-primary-bg-hover:  var(--navy-700);
  --btn-primary-bg-active: var(--ink);
  --btn-ghost-tint:        rgba(14, 34, 51, .05);

  --field-bg:          var(--white);
  --field-border:      var(--line-strong);
  --field-text:        var(--ink);
  --field-placeholder: var(--mist-700);
  --field-focus:       var(--focus);
  --field-focus-glow:  rgba(132, 92, 20, .18);
  --msg-error:         var(--error);
  --msg-success:       var(--success);

  /* ---- Typography -------------------------------------------------------- */
  --font-display: 'Fraunces', 'Iowan Old Style', 'Palatino Linotype', Palatino,
                  'Book Antiqua', Georgia, 'Times New Roman', serif;
  --font-body:    'Source Sans 3', 'Source Sans Pro', -apple-system,
                  BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue',
                  Arial, sans-serif;

  /* Every clamp() middle term carries a rem component so browser zoom and
     WCAG 1.4.4 Resize Text keep working. Never remove the rem term. */
  --fs-overline: .75rem;
  --fs-caption:  .8125rem;
  --fs-sm:       .9375rem;
  --fs-body:     1.0625rem;
  --fs-lead:     1.25rem;
  --fs-h5:       1.125rem;
  --fs-h4:       1.5rem;
  --fs-h3:       clamp(1.5rem,   1.30rem + 0.80vw, 1.875rem);
  --fs-h2:       clamp(1.875rem, 1.50rem + 1.50vw, 2.5rem);
  --fs-h1:       clamp(2.25rem,  1.50rem + 3.00vw, 3.25rem);
  --fs-display:  clamp(2.75rem,  1.45rem + 5.20vw, 4.5rem);

  /* ---- Spacing. 4px base. Only these values appear in layout CSS. -------- */
  --space-2xs: .25rem;  /*   4px */
  --space-xs:  .5rem;   /*   8px */
  --space-sm:  .75rem;  /*  12px */
  --space-md:  1rem;    /*  16px */
  --space-lg:  1.5rem;  /*  24px */
  --space-xl:  2rem;    /*  32px */
  --space-2xl: 3rem;    /*  48px */
  --space-3xl: 4rem;    /*  64px */
  --space-4xl: 6rem;    /*  96px */
  --space-5xl: 8rem;    /* 128px */
  --space-6xl: 12rem;   /* 192px */

  /* ---- Layout ------------------------------------------------------------ */
  --wrap:        1200px;
  --wrap-narrow: 680px;
  --wrap-wide:   1440px;
  --gutter:      clamp(1.25rem, 5vw, 3rem);
  --section-pad: clamp(4rem, 9vw, 8rem);
  --header-h:    68px;

  /* ---- Radius. Nothing between 9px and 998px. Ever. ---------------------- */
  --r-0:    0;
  --r-xs:   2px;   /* every interactive control */
  --r-sm:   4px;   /* cards, panels, message boxes */
  --r-md:   8px;   /* contained photography, drawer */
  --r-pill: 999px; /* permitted on exactly one component: .tag */

  /* ---- Shadow. Navy-tinted, never black, never on dark surfaces. --------- */
  --shadow-0: none;
  --shadow-1: 0 1px 2px rgba(11,18,25,.06), 0 1px 1px rgba(11,18,25,.04);
  --shadow-2: 0 2px 8px rgba(11,18,25,.06), 0 8px 24px rgba(11,18,25,.06);
  --shadow-3: 0 12px 40px rgba(11,18,25,.10), 0 2px 8px rgba(11,18,25,.06);

  /* ---- Motion ------------------------------------------------------------ */
  --dur-fast:      120ms;
  --dur-base:      220ms;
  --dur-slow:      420ms;
  --dur-reveal:    640ms;
  --ease-standard: cubic-bezier(.2, 0, 0, 1);
  --ease-entrance: cubic-bezier(.16, 1, .3, 1);

  color-scheme: light;
}

@media (min-width: 64em) {
  :root { --header-h: 88px; }
}


/* ==========================================================================
   02 — RESET AND BASE ELEMENTS
   ========================================================================== */

*, *::before, *::after { box-sizing: border-box; }

* { margin: 0; }

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  scrollbar-gutter: stable;
  /* Never set html { font-size } below 100% — it breaks user zoom settings. */
}

@media (prefers-reduced-motion: no-preference) {
  html { scroll-behavior: smooth; }
}

body {
  min-block-size: 100svh;
  background-color: var(--paper);
  color: var(--ink);
  font-family: var(--font-body);
  font-size: var(--fs-body);
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  overflow-x: hidden; /* belt and braces; nothing should ever need it */
}

img, picture, video, canvas, svg { display: block; max-inline-size: 100%; }
img, video { block-size: auto; }
svg { fill: currentColor; }

input, button, textarea, select { font: inherit; color: inherit; }

p, h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; }

ul, ol { padding: 0; }
li { list-style-position: outside; }

table { border-collapse: collapse; border-spacing: 0; }

hr {
  border: 0;
  border-block-start: 1px solid var(--rule);
  margin-block: var(--space-2xl);
}

/* Anchors must clear the sticky header (WCAG 2.4.11 Focus Not Obscured). */
[id] { scroll-margin-block-start: calc(var(--header-h) + var(--space-lg)); }

main:focus { outline: none; }

::selection { background: var(--brass-500); color: var(--ink); }

/* ---- Focus. Outline (not box-shadow) so it survives forced-colors mode. -- */
:focus-visible {
  outline: 3px solid var(--focus-ring);
  outline-offset: 2px;
  border-radius: var(--r-xs);
}
:focus:not(:focus-visible) { outline: none; }


/* ==========================================================================
   03 — FONTS AND TYPOGRAPHY

   Webfonts are requested by a <link> in each page's <head> (with preconnect
   to fonts.gstatic.com and display=swap) rather than by @import here — an
   @import inside a stylesheet is discovered late and delays first paint.
   The two families are Fraunces (display serif) and Source Sans 3 (humanist
   sans). Both fallback stacks below are chosen for close metrics so the page
   is readable and roughly correctly proportioned before the webfonts land.

   HOUSE RULES
   * Serif is for headings, the wordmark, pull quotes and the 01–04 service
     numerals only. Never for body copy, never for UI labels, never under
     1.125rem.
   * Sans is for everything else, including the lede paragraph.
   * Sentence case for headings. Title Case only for the wordmark and nav.
   * One <h1> per page. Never pick a heading level for its size — pick it for
     structure and add a .h1/.h2/.h3 class if you need a different size.
   ========================================================================== */

h1, h2, h3, h4, h5, h6,
.display, .h1, .h2, .h3, .h4, .h5 {
  font-family: var(--font-display);
  font-optical-sizing: auto;
  font-variant-ligatures: common-ligatures contextual;
  font-kerning: normal;
  font-weight: 600;
  color: var(--fg);
  text-wrap: balance; /* headings only — Chromium balances ~6 lines max */
}

.display, .h1, h1 {
  font-weight: 400;
  font-variation-settings: 'opsz' 144;
}
h2, .h2 { font-variation-settings: 'opsz' 144; }
h3, h4, h5, h6, .h3, .h4, .h5 { font-variation-settings: 'opsz' 24; }

.display {
  font-size: var(--fs-display);
  line-height: 1.02;
  letter-spacing: clamp(-.03em, -.018em - .12vw, -.014em);
}
h1, .h1 { font-size: var(--fs-h1); line-height: 1.08; letter-spacing: -.015em; }
h2, .h2 { font-size: var(--fs-h2); line-height: 1.14; letter-spacing: -.012em; }
h3, .h3 { font-size: var(--fs-h3); line-height: 1.22; letter-spacing: -.008em; }
h4, .h4 { font-size: var(--fs-h4); line-height: 1.30; }
h5, .h5 { font-size: var(--fs-h5); line-height: 1.35; }
h6      { font-size: var(--fs-body); line-height: 1.4; }

p, li, dd, dt, figcaption, blockquote { text-wrap: pretty; }

/* Measure caps live on the element that owns the font, because 1ch is the
   width of "0" in that element's computed font. */
.measure         { max-inline-size: 68ch; }
.measure-narrow  { max-inline-size: 54ch; }
.measure-tight   { max-inline-size: 36ch; }
.measure-h1      { max-inline-size: 18ch; }
.measure-h2      { max-inline-size: 24ch; }

.lede {
  font-family: var(--font-body);
  font-size: var(--fs-lead);
  line-height: 1.55;
  color: var(--fg-muted);
  max-inline-size: 54ch;
}

.text-sm      { font-size: var(--fs-sm); line-height: 1.55; }
.text-caption { font-size: var(--fs-caption); line-height: 1.45; color: var(--fg-muted); }
.text-muted   { color: var(--fg-muted); }
.text-accent  { color: var(--fg-accent); }
.nums         { font-variant-numeric: tabular-nums lining-nums; }
.nowrap       { white-space: nowrap; }

.pullquote {
  font-family: var(--font-display);
  font-weight: 400;
  font-style: italic;
  font-size: var(--fs-h3);
  line-height: 1.32;
  max-inline-size: 32ch;
  text-indent: -.42em; /* fake optical margin alignment */
}
@supports (hanging-punctuation: first) {
  .pullquote { hanging-punctuation: first last; text-indent: 0; }
}

/* Prose block: gives generous default rhythm to any run of body copy. */
.prose > * + *      { margin-block-start: var(--space-md); }
.prose > * + h2,
.prose > * + h3,
.prose > * + h4     { margin-block-start: var(--space-2xl); }
.prose p, .prose li { max-inline-size: 68ch; }
.prose ul, .prose ol { padding-inline-start: 1.35em; }
.prose li + li      { margin-block-start: var(--space-xs); }

/* Body-copy links stay underlined at rest. Refine, do not remove. */
.prose a, .text-link {
  color: var(--fg-accent);
  text-decoration-line: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: .18em;
  text-decoration-skip-ink: auto;
  text-decoration-color: color-mix(in oklab, currentColor 45%, transparent);
  transition: color var(--dur-fast) var(--ease-standard),
              text-decoration-color var(--dur-fast) var(--ease-standard);
}
.prose a:hover, .text-link:hover {
  color: var(--fg);
  text-decoration-color: var(--brass-500);
}


/* ==========================================================================
   04 — LAYOUT: CONTAINER, SECTION, COLOUR BANDS, GRIDS

   The page is built from full-width <section> "bands", each holding one
   .container. Nothing uses the "width:100vw; margin-left:calc(50% - 50vw)"
   full-bleed trick, which overflows horizontally whenever a classic
   scrollbar is present.
   ========================================================================== */

.container {
  inline-size: 100%;
  max-inline-size: var(--wrap);
  margin-inline: auto;
  padding-inline: var(--gutter);
}
.container--narrow { max-inline-size: calc(var(--wrap-narrow) + var(--gutter) * 2); }
.container--wide   { max-inline-size: var(--wrap-wide); }
.container--flush  { padding-inline: 0; }

.section { padding-block: var(--section-pad); }
.section--tight  { padding-block: clamp(2.5rem, 6vw, 4.5rem); }
.section--flush-top    { padding-block-start: 0; }
.section--flush-bottom { padding-block-end: 0; }

/* ---- Colour bands. Applying .on-dark re-points every contextual token. --- */
.band--paper { background-color: var(--paper); }
.band--white { background-color: var(--white); }
.band--sand  { background-color: var(--sand); }
.band--sand-50 { background-color: var(--sand-50); }
.band--mist  { background-color: var(--mist-50); }

.on-dark,
.band--navy,
.band--ink,
.site-header,
.site-footer,
.hero,
.page-header,
.cta-band {
  --fg:            var(--paper);
  --fg-muted:      var(--mist);
  --fg-accent:     var(--brass-300);
  --surface:       var(--navy-900);
  --surface-card:  var(--navy-800);
  --surface-raised:var(--navy-800);
  --rule:          var(--line-dark);
  --rule-strong:   var(--line-strong-dark);
  --focus-ring:    var(--focus-dark);

  --btn-primary-bg:        var(--paper);
  --btn-primary-fg:        var(--navy-900);
  --btn-primary-bg-hover:  var(--sand);
  --btn-primary-bg-active: var(--white);
  --btn-ghost-tint:        rgba(251, 249, 246, .08);

  --field-bg:          var(--navy-800);
  --field-border:      var(--line-strong-dark);
  --field-text:        var(--paper);
  --field-placeholder: var(--mist);
  --field-focus:       var(--brass-300);
  --field-focus-glow:  rgba(224, 181, 98, .22);
  --msg-error:         var(--error-on-dark);
  --msg-success:       var(--success-on-dark);

  color: var(--paper);
  background-color: var(--navy-900);
}
.band--ink { --surface: var(--ink); background-color: var(--ink); }

/* ---- Generic grids ------------------------------------------------------ */
.grid { display: grid; gap: var(--space-xl); }
.grid--gap-sm { gap: var(--space-lg); }
.grid--gap-lg { gap: var(--space-3xl); }

/* auto-fit decks: min(Xrem, 100%) is load-bearing — a bare minmax(Xrem,1fr)
   overflows at 320px. */
.grid--auto-lg { grid-template-columns: repeat(auto-fit, minmax(min(22rem, 100%), 1fr)); }
.grid--auto-md { grid-template-columns: repeat(auto-fit, minmax(min(18rem, 100%), 1fr)); }
.grid--auto-sm { grid-template-columns: repeat(auto-fit, minmax(min(14rem, 100%), 1fr)); }

/* Asymmetry is required by the brand. These are the editorial splits. */
@media (min-width: 64em) {
  .grid--7-5 { grid-template-columns: 7fr 5fr; }
  .grid--5-7 { grid-template-columns: 5fr 7fr; }
  .grid--8-4 { grid-template-columns: 8fr 4fr; }
  .grid--4-8 { grid-template-columns: 4fr 8fr; }
  .grid--6-6 { grid-template-columns: 1fr 1fr; }
}

.grid--align-center { align-items: center; }
.grid--align-end    { align-items: end; }

/* ---- Stack: vertical rhythm without margin collapse surprises ----------- */
.stack        { display: flex; flex-direction: column; }
.stack > * + * { margin-block-start: var(--stack-space, var(--space-md)); }
.stack--2xs   { --stack-space: var(--space-2xs); }
.stack--xs    { --stack-space: var(--space-xs); }
.stack--sm    { --stack-space: var(--space-sm); }
.stack--md    { --stack-space: var(--space-md); }
.stack--lg    { --stack-space: var(--space-lg); }
.stack--xl    { --stack-space: var(--space-xl); }
.stack--2xl   { --stack-space: var(--space-2xl); }
.stack--3xl   { --stack-space: var(--space-3xl); }

/* ---- Cluster: one-dimensional rows (buttons, tags, meta) ---------------- */
.cluster {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--cluster-space, var(--space-md));
}
.cluster--sm  { --cluster-space: var(--space-xs); }
.cluster--lg  { --cluster-space: var(--space-lg); }
.cluster--end { justify-content: flex-end; }
.cluster--between { justify-content: space-between; }
.cluster__push { margin-inline-start: auto; }

/* ---- Container queries: makes one .card correct in any column count ----- */
.cq { container-type: inline-size; }
/* Do not put .cq on an element that a position:sticky descendant depends on,
   and never on something that should shrink to fit its content. */


/* ==========================================================================
   05 — UTILITIES
   ========================================================================== */

.visually-hidden:not(:focus):not(:active) {
  clip-path: inset(50%);
  block-size: 1px;
  inline-size: 1px;
  overflow: hidden;
  position: absolute;
  white-space: nowrap;
}

.hide-below-md { display: none; }
@media (min-width: 48em) { .hide-below-md { display: revert; } }
@media (min-width: 64em) { .hide-above-lg { display: none; } }

.no-bullets { list-style: none; padding: 0; }
/* A generous tap target for inline phone/email links outside the footer. */
.tap-link { display: inline-flex; align-items: center; min-block-size: 44px; }
/* Large-set phone number: body sans, not the display serif — the serif is
   reserved for headings, the wordmark, pull quotes and service numerals. */
.phone-lg {
  font-family: var(--font-body);
  font-size: var(--fs-h4);
  font-weight: 600;
  font-variant-numeric: tabular-nums lining-nums;
  letter-spacing: .01em;
}
.address-plain { font-style: normal; }
.rule       { border: 0; border-block-start: 1px solid var(--rule); block-size: 0; }
.rule-brass { border: 0; border-block-start: 2px solid var(--brass-500); inline-size: 48px; block-size: 0; }
/* .mt-0 / .mb-0 live in section 29 at the very end of this file so they win
   against component margins by source order. */
.text-start  { text-align: start; }
.text-center { text-align: center; } /* at most one per page, by house rule */


/* ==========================================================================
   06 — SKIP LINK
   ========================================================================== */

.skip-link {
  /* The link paints its own navy panel, so the focus ring must use the
     dark-context colour regardless of what band it happens to sit over. */
  --focus-ring: var(--focus-dark);
  position: absolute;
  inset-block-start: 0;
  inset-inline-start: 0;
  z-index: 200;
  transform: translateY(-120%);
  padding: var(--space-sm) var(--space-lg);
  background: var(--navy-900);
  color: var(--paper);
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  text-decoration: none;
  border-radius: 0 0 var(--r-xs) 0;
  transition: transform var(--dur-fast) var(--ease-standard);
}
.skip-link:focus { transform: translateY(0); }


/* ==========================================================================
   07 — SITE HEADER AND NAVIGATION

   Desktop (>=1024px): a single row — brand, links, phone, quote button.
   Below 1024px: the links + actions move into a right-hand drawer.

   NO-JS BEHAVIOUR: the drawer's hidden state and the toggle button are both
   gated on html.js, which is set by a one-line inline script in <head>. With
   JavaScript off, the nav renders as a plain wrapped list of links and the
   toggle button is not shown. Never add `display:none` to .site-nav outside
   a `.js` selector.
   ========================================================================== */

.site-header {
  position: sticky;
  inset-block-start: 0;
  z-index: 100;
  background-color: var(--navy-900);
  color: var(--paper);
  border-block-end: 1px solid transparent;
  transition: background-color var(--dur-base) var(--ease-standard),
              border-color var(--dur-base) var(--ease-standard),
              box-shadow var(--dur-base) var(--ease-standard);
}
/* Pages whose first band is a dark hero may add class="has-hero" to <body>;
   the header then floats transparently over it until the page scrolls.
   ONLY use has-hero when the first element inside <main> is .hero (or another
   .on-dark band). Over a light band the paper-coloured nav text would be
   unreadable. Leave the class off and the header is solid navy — always safe. */
.has-hero .site-header { background-color: transparent; }
/* A soft top-down scrim keeps the nav legible once real dusk photography
   replaces the gradient panel behind it. It fades out as the solid navy
   background fades in. */
.has-hero .site-header::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background: linear-gradient(180deg, rgba(11, 18, 25, .55), rgba(11, 18, 25, 0));
  transition: opacity var(--dur-base) var(--ease-standard);
}
.has-hero .site-header.is-scrolled::before { opacity: 0; }
.site-header.is-scrolled {
  background-color: var(--navy-900);
  border-block-end-color: var(--line-dark);
  box-shadow: var(--shadow-2);
}

.site-header__inner {
  display: flex;
  align-items: center;
  /* Wrapping is the no-JS fallback: with scripting off the nav returns to
     normal flow and must be allowed onto a second row instead of being
     clipped by the body's overflow-x. JS pages restore the single row. */
  flex-wrap: wrap;
  gap: var(--space-lg);
  row-gap: var(--space-md);
  min-block-size: var(--header-h);
}
.js .site-header__inner { flex-wrap: nowrap; }
@media (max-width: 39.999em) {
  /* 320px budget: brand + gap + 48px toggle must fit a 280px content box,
     so tighten the gap and let the wordmark break onto two lines. */
  .site-header__inner { gap: var(--space-sm); }
  .brand__word { white-space: normal; }
}

/* ---- Brand lockup ------------------------------------------------------- */
.brand {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  color: var(--paper);
  text-decoration: none;
  margin-inline-end: auto;
  padding-block: var(--space-xs);
  transition: opacity var(--dur-fast) var(--ease-standard);
}
.brand:hover { opacity: .82; }
.brand__mark { inline-size: 28px; block-size: 28px; flex: none; }
@media (min-width: 64em) { .brand__mark { inline-size: 32px; block-size: 32px; } }
.brand__word {
  font-family: var(--font-display);
  font-weight: 500;
  font-variation-settings: 'opsz' 24;
  font-size: 1.0625rem;
  line-height: 1;
  letter-spacing: .10em;
  text-transform: uppercase;
  white-space: nowrap;
}

/* ---- Toggle ------------------------------------------------------------- */
.nav-toggle {
  display: none;
  align-items: center;
  justify-content: center;
  inline-size: 48px;
  block-size: 48px;
  min-inline-size: 48px;
  min-block-size: 48px;
  padding: 0;
  border: 1px solid var(--line-strong-dark);
  border-radius: var(--r-xs);
  background: transparent;
  color: var(--paper);
  cursor: pointer;
  touch-action: manipulation;
  transition: background-color var(--dur-fast) var(--ease-standard),
              border-color var(--dur-fast) var(--ease-standard);
}
.js .nav-toggle { display: inline-flex; }
@media (min-width: 64em) { .js .nav-toggle { display: none; } }
.nav-toggle:hover { background-color: var(--btn-ghost-tint); }
.nav-toggle__box { position: relative; inline-size: 20px; block-size: 14px; }
.nav-toggle__bar {
  position: absolute;
  inset-inline: 0;
  block-size: 1.5px;
  background: currentColor;
  transition: transform var(--dur-base) var(--ease-standard),
              opacity var(--dur-fast) var(--ease-standard);
}
.nav-toggle__bar:nth-child(1) { inset-block-start: 0; }
.nav-toggle__bar:nth-child(2) { inset-block-start: 6.25px; }
.nav-toggle__bar:nth-child(3) { inset-block-start: 12.5px; }
.nav-toggle[aria-expanded="true"] .nav-toggle__bar:nth-child(1) { transform: translateY(6.25px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] .nav-toggle__bar:nth-child(2) { opacity: 0; }
.nav-toggle[aria-expanded="true"] .nav-toggle__bar:nth-child(3) { transform: translateY(-6.25px) rotate(-45deg); }

/* ---- Nav container ------------------------------------------------------ */
.site-nav {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-lg) var(--space-xl);
}
.site-nav__list {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-lg);
  list-style: none;
  margin: 0;
}
.site-nav__link {
  display: inline-flex;
  align-items: center;
  min-block-size: 44px;
  color: var(--paper);
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: .06em;
  text-decoration: none;
  text-transform: uppercase;
  touch-action: manipulation;
  background-image: linear-gradient(var(--brass-300), var(--brass-300));
  background-size: 0% 1px;
  background-position: 0 calc(100% - 12px);
  background-repeat: no-repeat;
  transition: background-size var(--dur-base) var(--ease-entrance),
              color var(--dur-fast) var(--ease-standard);
}
.site-nav__link:hover,
.site-nav__link:focus-visible { background-size: 100% 1px; }
.site-nav__link[aria-current="page"] {
  color: var(--brass-300);
  background-size: 100% 1px;
}
.site-nav__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-md);
}
.site-nav__tel {
  display: inline-flex;
  align-items: center;
  gap: var(--space-xs);
  min-block-size: 44px;
  color: var(--paper);
  font-size: var(--fs-sm);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  letter-spacing: .02em;
  text-decoration: none;
  touch-action: manipulation;
  transition: color var(--dur-fast) var(--ease-standard);
}
.site-nav__tel:hover { color: var(--brass-300); }
.site-nav__tel svg { inline-size: 18px; block-size: 18px; flex: none; }

/* ---- Drawer (below 1024px, JS on) --------------------------------------- */
@media (max-width: 63.999em) {
  /* Without JS the nav renders inline and the header grows to several rows;
     a sticky multi-row header would shadow half the viewport and obscure
     anchor targets, so it rides at the top of the document instead. */
  html:not(.js) .site-header { position: static; }
  .js .site-nav {
    position: fixed;
    inset-block: 0;
    inset-inline-end: 0;
    z-index: 120;
    inline-size: min(22rem, 88vw);
    block-size: 100dvh;
    flex-direction: column;
    align-items: stretch;
    justify-content: flex-start;
    gap: var(--space-xl);
    padding: calc(var(--header-h) + var(--space-xl)) var(--space-xl) var(--space-2xl);
    background-color: var(--navy-900);
    border-inline-start: 1px solid var(--line-dark);
    box-shadow: var(--shadow-3);
    overflow-y: auto;
    overscroll-behavior: contain;
    transform: translateX(100%);
    visibility: hidden;
    transition: transform var(--dur-slow) var(--ease-entrance),
                visibility 0s linear var(--dur-slow);
  }
  .js .site-nav.is-open {
    transform: translateX(0);
    visibility: visible;
    transition: transform var(--dur-slow) var(--ease-entrance), visibility 0s;
  }
  .js .site-nav__list { flex-direction: column; align-items: stretch; gap: 0; }
  .js .site-nav__list li + li { border-block-start: 1px solid var(--line-dark); }
  .js .site-nav__link {
    min-block-size: 56px;
    font-size: var(--fs-body);
    background-position: 0 calc(100% - 14px);
  }
  .js .site-nav__actions { flex-direction: column; align-items: stretch; }
  .js .site-nav__actions .btn { inline-size: 100%; }
  .js .site-nav__tel { justify-content: flex-start; font-size: var(--fs-lead); }
}

.nav-scrim {
  position: fixed;
  inset: 0;
  z-index: 110;
  background: rgba(11, 18, 25, .6);
  opacity: 0;
  transition: opacity var(--dur-slow) var(--ease-standard);
}
.nav-scrim[hidden] { display: none; }
.nav-scrim.is-open { opacity: 1; }


/* ==========================================================================
   08 — BUTTONS AND LINKS
   ========================================================================== */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-xs);
  min-block-size: 48px;
  min-inline-size: 44px;
  padding-inline: 24px;
  border: 1px solid transparent;
  border-radius: var(--r-xs);
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: .08em;
  line-height: 1;
  text-transform: uppercase;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  touch-action: manipulation;
  transition: color var(--dur-fast) var(--ease-standard),
              background-color var(--dur-fast) var(--ease-standard),
              border-color var(--dur-fast) var(--ease-standard),
              transform var(--dur-base) var(--ease-standard),
              box-shadow var(--dur-base) var(--ease-standard);
}
@media (min-width: 48em) { .btn { min-block-size: 52px; padding-inline: 28px; } }
.btn--sm { min-block-size: 44px; padding-inline: 18px; font-size: var(--fs-caption); }
.btn--block { inline-size: 100%; }
.btn svg { inline-size: 16px; block-size: 16px; flex: none; }
.btn:focus-visible {
  outline: 3px solid var(--focus-ring);
  outline-offset: 2px;
}

.btn--primary {
  background-color: var(--btn-primary-bg);
  color: var(--btn-primary-fg);
}
.btn--primary:hover { background-color: var(--btn-primary-bg-hover); }
.btn--primary:active { background-color: var(--btn-primary-bg-active); }

.btn--secondary {
  background-color: transparent;
  border-color: var(--rule-strong);
  color: var(--fg);
}
.btn--secondary:hover {
  border-color: var(--fg);
  background-color: var(--btn-ghost-tint);
}

/* Maximum ONE brass button per page — the primary conversion CTA. */
.btn--brass {
  background-color: var(--brass-500);
  color: var(--ink);
}
.btn--brass:hover  { background-color: var(--brass-600); }
.btn--brass:active { background-color: var(--brass-700); color: var(--paper); }

.btn--ghost {
  background-color: transparent;
  color: var(--fg);
  padding-inline: 12px;
}
.btn--ghost:hover { background-color: var(--btn-ghost-tint); }

.btn:disabled,
.btn[aria-disabled="true"] {
  background-color: var(--disabled-bg);
  border-color: transparent;
  color: var(--disabled-text);
  cursor: not-allowed;
  pointer-events: none;
}

/* Text link with a chevron — the quiet "more" affordance. */
.btn-link {
  display: inline-flex;
  align-items: center;
  gap: var(--space-xs);
  min-block-size: 44px;
  color: var(--fg-accent);
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: .06em;
  text-transform: uppercase;
  text-decoration: none;
  touch-action: manipulation;
  transition: color var(--dur-fast) var(--ease-standard);
}
.btn-link__arrow {
  inline-size: 16px;
  block-size: 16px;
  flex: none;
  transition: transform var(--dur-base) var(--ease-entrance);
}
.btn-link:hover { color: var(--fg); }
.btn-link:hover .btn-link__arrow,
.btn-link:focus-visible .btn-link__arrow { transform: translateX(4px); }

.btn-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-start;
  gap: var(--space-md);
  margin-block-start: var(--space-xl); /* body -> CTA rhythm */
}


/* ==========================================================================
   09 — HERO (editorial, asymmetric)

   Copy occupies roughly 6 of 12 columns and never spans the full width. The
   art panel bleeds off the right edge behind it. Optical baseline sits near
   the fold via align-items:end. Uses svh, never vh.
   ========================================================================== */

.hero {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  display: grid;
  align-items: end;
  min-block-size: min(86svh, 56rem);
  padding-block: clamp(6rem, 14vw, 12rem) clamp(3.5rem, 8vw, 6rem);
}
.hero__inner { position: relative; z-index: 2; inline-size: 100%; }
.hero__eyebrow { margin-block-end: var(--space-sm); }
.hero__title {
  font-size: var(--fs-display);
  font-weight: 400;
  line-height: 1.02;
  letter-spacing: clamp(-.03em, -.018em - .12vw, -.014em);
  max-inline-size: 18ch;
  margin-block-end: var(--space-md);
}
.hero__lede { max-inline-size: 46ch; }
.hero__meta {
  margin-block-start: var(--space-2xl);
  padding-block-start: var(--space-lg);
  border-block-start: 1px solid var(--rule);
  font-size: var(--fs-sm);
  color: var(--fg-muted);
  font-variant-numeric: tabular-nums;
  max-inline-size: 52ch;
}

/* Art panel: full-bleed background at small sizes, right-side panel at large. */
.hero__art {
  position: absolute;
  inset: 0;
  z-index: 0;
  opacity: .55;
}
@media (min-width: 64em) {
  .hero__art {
    inset-inline-start: 46%;
    opacity: 1;
    -webkit-mask-image: linear-gradient(to right, transparent, #000 22%);
            mask-image: linear-gradient(to right, transparent, #000 22%);
  }
}
.hero__art img,
.hero__art .frame { block-size: 100%; inline-size: 100%; border-radius: 0; }
.hero__scrim {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, rgba(11,18,25,.25) 0%, rgba(11,18,25,.70) 100%);
}

/* Hero variant for interior pages that want less height. */
.hero--compact { min-block-size: auto; padding-block: clamp(5rem, 11vw, 9rem) clamp(3rem, 7vw, 5rem); }


/* ==========================================================================
   10 — PAGE HEADER (interior pages)
   ========================================================================== */

.page-header {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  padding-block: calc(var(--space-4xl)) var(--space-3xl);
}
.page-header__title { max-inline-size: 20ch; margin-block-end: var(--space-md); }
.page-header__lede  { max-inline-size: 54ch; }
.page-header__art {
  position: absolute;
  inset: 0;
  z-index: -1;
  opacity: .5;
}


/* ==========================================================================
   11 — EYEBROW, SECTION HEAD, LEDE
   ========================================================================== */

.eyebrow {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 12px;
  margin-block-end: var(--space-sm);
  font-family: var(--font-body);
  font-size: var(--fs-overline);
  font-weight: 600;
  line-height: 1;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--fg-accent);
}
.eyebrow::before {
  content: "";
  display: block;
  inline-size: 48px;
  block-size: 2px;
  background-color: var(--brass-500);
}
.eyebrow--bare::before { display: none; }

.section-head {
  max-inline-size: 40rem;
  margin-block-end: var(--space-2xl);
}
.section-head--wide { max-inline-size: 52rem; }
.section-head__title { max-inline-size: 24ch; }
.section-head > .lede { margin-block-start: var(--space-md); }

.section-divider {
  border: 0;
  border-block-start: 1px solid var(--rule);
  margin-block: 0;
}


/* ==========================================================================
   12 — CARDS AND CARD GRIDS
   ========================================================================== */

/* Service card deck: 1-up below 768, 2-up 768–1023, 4-up at 1024+. */
.card-grid { display: grid; gap: var(--space-lg); }
@media (min-width: 48em) { .card-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-xl); } }
@media (min-width: 64em) { .card-grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
@media (min-width: 64em) { .card-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

.card {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: var(--space-sm);
  padding: var(--space-xl);
  background-color: var(--surface-card);
  border: 1px solid var(--rule);
  border-radius: var(--r-sm);
  /* shadow-1, not shadow-0: white cards sit on the paper band at barely 1.03:1,
     so elevation — not the hairline — is what makes the clickable region read. */
  box-shadow: var(--shadow-1);
  transition: border-color var(--dur-fast) var(--ease-standard),
              box-shadow var(--dur-base) var(--ease-standard),
              transform var(--dur-base) var(--ease-standard);
}
.card--flush { padding: 0; overflow: hidden; }
.card--flush .card__body { padding: var(--space-xl); }

/* Whole-card link: the <a> covers the card but the focus ring is drawn on
   the card, so it is never clipped. */
.card__link { position: static; text-decoration: none; color: inherit; }
.card__link::after { content: ""; position: absolute; inset: 0; border-radius: inherit; }
.card:focus-within { border-color: var(--navy-700); }
.card__link:focus-visible { outline: 3px solid var(--focus-ring); outline-offset: 2px; }
/* Where :has() is available, draw the ring around the whole card instead of
   the (zero-size) link. The rule above is the fallback, so keyboard focus is
   never invisible. */
@supports selector(:has(*)) {
  .card:has(.card__link:focus-visible) { outline: 3px solid var(--focus-ring); outline-offset: 2px; }
  .card__link:focus-visible { outline: none; }
}

@media (hover: hover) and (pointer: fine) {
  .card:hover { border-color: var(--navy-700); box-shadow: var(--shadow-1); transform: translateY(-3px); }
  .on-dark .card:hover, .band--navy .card:hover { border-color: var(--line-strong-dark); box-shadow: none; }
}

.card__index {
  font-family: var(--font-display);
  font-weight: 400;
  font-variation-settings: 'opsz' 24;
  font-size: var(--fs-h3);
  line-height: 1;
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--fg-accent);
  margin-block-end: var(--space-2xs);
}
.card__title { font-size: var(--fs-h4); }
.card__text  { color: var(--fg-muted); max-inline-size: 46ch; }
.card__list {
  list-style: none;
  padding: 0;
  margin-block-start: var(--space-xs);
  display: flex;
  flex-direction: column;
  gap: var(--space-xs);
  font-size: var(--fs-sm);
  color: var(--fg-muted);
  font-variant-numeric: tabular-nums;
}
.card__list li {
  position: relative;
  padding-inline-start: var(--space-md);
}
.card__list li::before {
  content: "";
  position: absolute;
  inset-inline-start: 0;
  inset-block-start: .68em;
  inline-size: 8px;
  block-size: 1px;
  background-color: var(--brass-500);
}
.card__foot { margin-block-start: auto; padding-block-start: var(--space-md); }
.card__media { margin: 0; }
.card--flush .card__media img { border-radius: 0; }

/* Cross-card alignment of title/body/CTA regardless of copy length. */
@supports (grid-template-rows: subgrid) {
  @media (min-width: 48em) {
    .card-grid--subgrid { align-items: stretch; }
    .card-grid--subgrid > .card {
      display: grid;
      grid-row: span 4;
      grid-template-rows: subgrid;
      row-gap: var(--space-sm);
    }
  }
}


/* ==========================================================================
   13 — ICON TILES AND FEATURE GRID
   ========================================================================== */

.feature-grid { display: grid; gap: var(--space-xl); }
@media (min-width: 48em) { .feature-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 64em) { .feature-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

.icon-tile {
  display: flex;
  flex-direction: column;
  gap: var(--space-sm);
  padding-block-start: var(--space-lg);
  border-block-start: 1px solid var(--rule);
}
/* --bare: a declared text-only variant (no .icon-tile__icon inside). Use it
   whenever a tile ships without an icon so the difference between an icon-led
   tile and a top-ruled text block is a decision, not an accident. */
.icon-tile--bare { justify-content: flex-start; }
.icon-tile__icon {
  inline-size: 24px;
  block-size: 24px;
  color: var(--fg);
  margin-block-end: var(--space-2xs);
}
.on-dark .icon-tile__icon, .band--navy .icon-tile__icon { color: var(--brass-300); }
.icon-tile__title { font-size: var(--fs-h5); }
.icon-tile__text  { color: var(--fg-muted); font-size: var(--fs-sm); max-inline-size: 42ch; }

/* Shared rules for every inline icon in the set: 24x24, 1.5 stroke, square
   caps, mitred joins, no fills, no two-tone. */
.icon {
  inline-size: 24px;
  block-size: 24px;
  flex: none;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.5;
  stroke-linecap: square;
  stroke-linejoin: miter;
}
.icon--sm { inline-size: 16px; block-size: 16px; }
.icon--lg { inline-size: 32px; block-size: 32px; }


/* ==========================================================================
   14 — SPLIT PANEL (image left / right)
   ========================================================================== */

.split { display: grid; gap: var(--space-2xl); align-items: center; }
@media (min-width: 64em) {
  .split { grid-template-columns: 7fr 5fr; gap: var(--space-3xl); column-gap: clamp(2rem, 5vw, 5rem); }
  .split--reverse { grid-template-columns: 5fr 7fr; }
  .split--reverse .split__media { order: -1; }
  .split--even { grid-template-columns: 1fr 1fr; }
}
.split__body { max-inline-size: 46rem; }
.split__media { margin: 0; }
.split__caption {
  margin-block-start: var(--space-sm);
  font-size: var(--fs-caption);
  color: var(--fg-muted);
  max-inline-size: 36ch;
}


/* ==========================================================================
   15 — STAT AND FIGURE ROWS
   ========================================================================== */

.stat-row {
  display: grid;
  gap: var(--space-lg);
  grid-template-columns: repeat(auto-fit, minmax(min(13rem, 100%), 1fr));
}
.stat-row--bordered { border-block-start: 1px solid var(--rule); padding-block-start: var(--space-xl); }

.stat {
  display: flex;
  flex-direction: column;
  gap: var(--space-2xs);
  padding-inline-start: var(--space-md);
  border-inline-start: 2px solid var(--brass-500);
}
.stat__figure {
  font-family: var(--font-display);
  font-weight: 400;
  font-variation-settings: 'opsz' 144;
  font-size: var(--fs-h3);
  line-height: 1.1;
  letter-spacing: -.01em;
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--fg);
}
.stat__label {
  font-size: var(--fs-sm);
  color: var(--fg-muted);
  max-inline-size: 26ch;
}

/* Proof strip: short factual tiles across a band. */
.proof-strip {
  display: grid;
  gap: 1px;
  background-color: var(--rule);
  border-block: 1px solid var(--rule);
}
@media (min-width: 40em) { .proof-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 64em) { .proof-strip { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
.proof-strip__item {
  background-color: var(--surface);
  padding: var(--space-lg) var(--space-md);
  display: flex;
  flex-direction: column;
  gap: var(--space-2xs);
}
.proof-strip__value {
  font-family: var(--font-display);
  font-weight: 600;
  font-variation-settings: 'opsz' 24;
  font-size: var(--fs-h5);
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--fg);
}
.proof-strip__label {
  font-size: var(--fs-caption);
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--fg-muted);
}


/* ==========================================================================
   16 — NUMBERED PROCESS / TIMELINE
   ========================================================================== */

.process { display: grid; gap: var(--space-xl); counter-reset: step; }
@media (min-width: 48em) { .process { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2xl); } }
.process--4 { }
@media (min-width: 64em) { .process--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } }

.process__step {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: var(--space-sm);
  padding-block-start: var(--space-lg);
  border-block-start: 1px solid var(--rule);
  counter-increment: step;
}
.process__step::before {
  content: counter(step, decimal-leading-zero);
  font-family: var(--font-display);
  font-weight: 400;
  font-variation-settings: 'opsz' 24;
  font-size: var(--fs-h4);
  line-height: 1;
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--fg-accent);
}
.process__title { font-size: var(--fs-h5); }
.process__text  { color: var(--fg-muted); font-size: var(--fs-sm); max-inline-size: 40ch; }

/* Vertical variant for long-form pages. */
.timeline { display: flex; flex-direction: column; counter-reset: step; }
.timeline__step {
  position: relative;
  padding: var(--space-lg) 0 var(--space-lg) var(--space-3xl);
  border-block-start: 1px solid var(--rule);
  counter-increment: step;
}
.timeline__step:last-child { border-block-end: 1px solid var(--rule); }
.timeline__step::before {
  content: counter(step, decimal-leading-zero);
  position: absolute;
  inset-inline-start: 0;
  inset-block-start: var(--space-lg);
  font-family: var(--font-display);
  font-weight: 400;
  font-variation-settings: 'opsz' 24;
  font-size: var(--fs-h5);
  line-height: 1.4;
  font-variant-numeric: tabular-nums lining-nums;
  color: var(--fg-accent);
}


/* ==========================================================================
   17 — ACCORDION (FAQ)

   Answers are in the DOM and VISIBLE with JavaScript disabled. The collapsed
   state is applied only under html.js. Never hide answers behind a fetch.
   ========================================================================== */

.accordion { border-block-start: 1px solid var(--rule); }
.accordion__item { border-block-end: 1px solid var(--rule); }

.accordion__heading { margin: 0; }
.accordion__trigger {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-lg);
  inline-size: 100%;
  min-block-size: 56px;
  padding: var(--space-lg) 0;
  border: 0;
  background: transparent;
  color: var(--fg);
  font-family: var(--font-display);
  font-weight: 600;
  font-variation-settings: 'opsz' 24;
  font-size: var(--fs-h5);
  line-height: 1.35;
  text-align: start;
  cursor: pointer;
  touch-action: manipulation;
  transition: color var(--dur-fast) var(--ease-standard);
}
.accordion__trigger:hover { color: var(--fg-accent); }
/* Without JS the panels are permanently open and the trigger is inert:
   drop the pointer affordance and the chevron so it reads as a heading. */
html:not(.js) .accordion__trigger { cursor: default; }
html:not(.js) .accordion__trigger:hover { color: var(--fg); }
html:not(.js) .accordion__icon { display: none; }
.accordion__icon {
  inline-size: 16px;
  block-size: 16px;
  flex: none;
  margin-block-start: .35em;
  color: var(--fg-accent);
  transition: transform var(--dur-base) var(--ease-standard);
}
.accordion__trigger[aria-expanded="true"] .accordion__icon { transform: rotate(180deg); }

.accordion__panel { padding-block-end: var(--space-lg); color: var(--fg-muted); }
.accordion__panel-inner > * { max-inline-size: 66ch; }
.accordion__panel-inner > * + * { margin-block-start: var(--space-md); }
.accordion__panel-inner ul,
.accordion__panel-inner ol { padding-inline-start: 1.35em; }

.js .accordion__panel {
  display: grid;
  grid-template-rows: 0fr;
  visibility: hidden;
  padding-block-end: 0;
  transition: grid-template-rows var(--dur-base) var(--ease-standard),
              padding-block-end var(--dur-base) var(--ease-standard),
              visibility 0s linear var(--dur-base);
}
.js .accordion__panel > .accordion__panel-inner { min-block-size: 0; overflow: hidden; }
.js .accordion__item.is-open > .accordion__panel {
  grid-template-rows: 1fr;
  visibility: visible;
  padding-block-end: var(--space-lg);
  transition: grid-template-rows var(--dur-base) var(--ease-standard),
              padding-block-end var(--dur-base) var(--ease-standard),
              visibility 0s;
}


/* ==========================================================================
   18 — OWNER PLACEHOLDERS

   Anywhere the site would normally carry a testimonial, a press logo, an
   award or a statistic, use one of these. They are deliberately visible and
   read as an instruction to the owner — never as a real quote from a real
   person. Delete the whole block before launch if it is not going to be
   filled in. Do not "tidy" them by inventing content.
   ========================================================================== */

.placeholder {
  padding: var(--space-lg);
  background-color: var(--surface-raised);
  border: 1px dashed var(--rule-strong);
  border-radius: var(--r-sm);
  color: var(--fg-muted);
}
.placeholder__label {
  display: block;
  margin-block-end: var(--space-xs);
  font-size: var(--fs-overline);
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--fg-accent);
}
.placeholder__text { font-size: var(--fs-sm); max-inline-size: 52ch; }

.testimonial-placeholder {
  display: flex;
  flex-direction: column;
  gap: var(--space-md);
  padding: var(--space-xl);
  background-color: var(--surface-raised);
  border: 1px dashed var(--rule-strong);
  border-radius: var(--r-sm);
}
.testimonial-placeholder__quote {
  font-family: var(--font-display);
  font-weight: 400;
  font-variation-settings: 'opsz' 24;
  font-size: var(--fs-h5);
  line-height: 1.4;
  color: var(--fg-muted);
  max-inline-size: 40ch;
}
.testimonial-placeholder__meta {
  font-size: var(--fs-caption);
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--fg-accent);
}

.trust-strip {
  display: grid;
  gap: var(--space-md);
  grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr));
  padding: var(--space-lg);
  border: 1px dashed var(--rule-strong);
  border-radius: var(--r-sm);
  background-color: var(--surface-raised);
}
.trust-strip__slot {
  display: flex;
  align-items: center;
  justify-content: center;
  min-block-size: 56px;
  border: 1px solid var(--rule);
  border-radius: var(--r-xs);
  font-size: var(--fs-caption);
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--fg-muted);
  text-align: center;
  padding: var(--space-sm);
}


/* ==========================================================================
   19 — SERVICE DETAIL BLOCK (no prices, ever)
   ========================================================================== */

.service-detail {
  padding-block: var(--space-3xl);
  border-block-start: 1px solid var(--rule);
}
.service-detail:first-of-type { border-block-start: 0; padding-block-start: 0; }
.service-detail__head { margin-block-end: var(--space-xl); }
.service-detail__title { max-inline-size: 22ch; }
.service-detail__grid { display: grid; gap: var(--space-2xl); }
@media (min-width: 64em) {
  .service-detail__grid { grid-template-columns: 7fr 5fr; column-gap: clamp(2rem, 5vw, 5rem); }
}

/* Definition-style list of concrete inclusions. */
.spec-list { display: grid; gap: 0; margin: 0; }
.spec-list__row {
  display: grid;
  gap: var(--space-2xs) var(--space-lg);
  padding-block: var(--space-md);
  border-block-start: 1px solid var(--rule);
}
@media (min-width: 40em) { .spec-list__row { grid-template-columns: 12rem 1fr; } }
.spec-list__row:last-child { border-block-end: 1px solid var(--rule); }
.spec-list__term {
  font-size: var(--fs-overline);
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--fg-accent);
  padding-block-start: .25em;
}
.spec-list__desc { color: var(--fg); font-size: var(--fs-sm); max-inline-size: 56ch; }

/* Plain tick list for "what's included" copy. */
.check-list { list-style: none; padding: 0; display: grid; gap: var(--space-sm); }
.check-list li {
  position: relative;
  padding-inline-start: var(--space-lg);
  color: var(--fg-muted);
}
.check-list li::before {
  content: "";
  position: absolute;
  inset-inline-start: 0;
  inset-block-start: .62em;
  inline-size: 10px;
  block-size: 1px;
  background-color: var(--brass-500);
}


/* ==========================================================================
   20 — TABLES

   Always wrap in .table-wrap with role="region", an aria-label and
   tabindex="0" so the scroll region is keyboard reachable.
   ========================================================================== */

.table-wrap {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  border: 1px solid var(--rule);
  border-radius: var(--r-sm);
  background-color: var(--surface-card);
}
.table-wrap:focus-visible { outline: 3px solid var(--focus-ring); outline-offset: 2px; }

.table {
  inline-size: 100%;
  min-inline-size: 30rem;
  font-variant-numeric: tabular-nums lining-nums;
  font-size: var(--fs-sm);
  text-align: start;
}
.table caption {
  padding: var(--space-md) var(--space-lg);
  text-align: start;
  font-size: var(--fs-caption);
  letter-spacing: .1em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--fg-muted);
  border-block-end: 1px solid var(--rule);
}
.table th, .table td {
  padding: var(--space-md) var(--space-lg);
  text-align: start;
  vertical-align: baseline;
}
.table thead th {
  font-family: var(--font-body);
  font-size: var(--fs-overline);
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--fg-muted);
  border-block-end: 1px solid var(--rule);
  white-space: nowrap;
}
.table tbody tr + tr th,
.table tbody tr + tr td { border-block-start: 1px solid var(--rule); }
.table tbody th { font-family: var(--font-body); font-weight: 600; color: var(--fg); }
.table td { color: var(--fg-muted); }
.table__note {
  margin-block-start: var(--space-sm);
  font-size: var(--fs-caption);
  color: var(--fg-muted);
  max-inline-size: 60ch;
}


/* ==========================================================================
   21 — TAGS AND BADGES
   ========================================================================== */

.tag {
  display: inline-flex;
  align-items: center;
  block-size: 28px;
  padding-inline: 12px;
  border: 1px solid var(--rule-strong);
  border-radius: var(--r-pill); /* the only pill in the system */
  font-size: var(--fs-caption);
  font-weight: 600;
  letter-spacing: .06em;
  color: var(--fg-muted);
  white-space: nowrap;
}
.tag--accent { border-color: var(--brass-500); color: var(--fg-accent); }

.badge {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2xs);
  padding: 2px 8px;
  border-radius: var(--r-xs);
  background-color: var(--surface-raised);
  font-size: var(--fs-overline);
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--fg-accent);
}


/* ==========================================================================
   22 — BREADCRUMB AND JUMP NAV
   ========================================================================== */

.breadcrumb { font-size: var(--fs-caption); color: var(--fg-muted); }
.breadcrumb ol {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-xs);
  list-style: none;
  padding: 0;
}
.breadcrumb li { display: flex; align-items: center; gap: var(--space-xs); }
.breadcrumb li + li::before { content: "/"; color: var(--rule-strong); }
.breadcrumb a {
  color: var(--fg-muted);
  text-decoration: none;
  min-block-size: 24px;
  display: inline-flex;
  align-items: center;
  transition: color var(--dur-fast) var(--ease-standard);
}
.breadcrumb a:hover { color: var(--fg-accent); text-decoration: underline; text-underline-offset: .18em; }
.breadcrumb [aria-current="page"] { color: var(--fg); }

.jump-nav { border-block: 1px solid var(--rule); padding-block: var(--space-md); }
.jump-nav__list {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-xs) var(--space-lg);
  list-style: none;
  padding: 0;
}
.jump-nav__link {
  display: inline-flex;
  align-items: center;
  min-block-size: 44px;
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: .04em;
  color: var(--fg-muted);
  text-decoration: none;
  transition: color var(--dur-fast) var(--ease-standard);
}
.jump-nav__link:hover { color: var(--fg-accent); }


/* ==========================================================================
   23 — CTA BAND
   ========================================================================== */

.cta-band {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  padding-block: clamp(4rem, 9vw, 7rem);
}
.cta-band__inner { display: grid; gap: var(--space-xl); align-items: end; }
@media (min-width: 64em) {
  .cta-band__inner { grid-template-columns: 7fr 5fr; column-gap: clamp(2rem, 6vw, 6rem); }
}
.cta-band__title { max-inline-size: 20ch; }
.cta-band__text  { color: var(--fg-muted); max-inline-size: 46ch; margin-block-start: var(--space-md); }
.cta-band__actions { display: flex; flex-wrap: wrap; gap: var(--space-md); }
@media (min-width: 64em) { .cta-band__actions { justify-content: flex-end; } }
.cta-band__art { position: absolute; inset: 0; z-index: -1; opacity: .55; }


/* ==========================================================================
   24 — FORMS

   Rules that are not negotiable:
   * Every control has a visible <label for>. Placeholders are never labels.
   * Required fields carry the required attribute AND the word "(required)"
     in the visible label — never a coloured asterisk alone.
   * Optional fields say "(optional)".
   * Focus is never removed without a visible replacement.
   * Touch targets are at least 48px tall.
   ========================================================================== */

.form { display: flex; flex-direction: column; gap: var(--space-lg); }
.form__row { display: grid; gap: var(--space-lg); }
@media (min-width: 40em) { .form__row--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

.field { display: flex; flex-direction: column; gap: var(--space-xs); }

.field__label {
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  font-weight: 600;
  letter-spacing: .10em;
  text-transform: uppercase;
  color: var(--fg-muted);
}
.field__hint { font-size: var(--fs-caption); color: var(--fg-muted); }
.field__optional { text-transform: none; letter-spacing: .02em; font-weight: 400; }

.input, .select, .textarea {
  inline-size: 100%;
  min-block-size: 52px;
  padding: 12px 16px;
  background-color: var(--field-bg);
  border: 1px solid var(--field-border);
  border-radius: var(--r-xs);
  color: var(--field-text);
  font-family: var(--font-body);
  font-size: var(--fs-body);
  line-height: 1.5;
  transition: border-color var(--dur-fast) var(--ease-standard),
              box-shadow var(--dur-fast) var(--ease-standard);
}
.textarea { min-block-size: 144px; resize: vertical; }

.input::placeholder, .textarea::placeholder { color: var(--field-placeholder); opacity: 1; }

.select {
  appearance: none;
  padding-inline-end: 44px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%2352657A' stroke-width='1.5'%3E%3Cpath d='M3 6l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 16px center;
  background-size: 16px 16px;
}
.on-dark .select, .band--navy .select, .site-footer .select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%239BAAB6' stroke-width='1.5'%3E%3Cpath d='M3 6l5 5 5-5'/%3E%3C/svg%3E");
}

.input:focus, .select:focus, .textarea:focus {
  outline: none;
  border-color: var(--field-focus);
  box-shadow: 0 0 0 3px var(--field-focus-glow);
}
.input:focus-visible, .select:focus-visible, .textarea:focus-visible {
  outline: 3px solid var(--focus-ring);
  outline-offset: 1px;
}

.input:disabled, .select:disabled, .textarea:disabled {
  background-color: var(--disabled-bg);
  border-color: var(--rule);
  color: var(--disabled-text);
  cursor: not-allowed;
}

.input[aria-invalid="true"],
.select[aria-invalid="true"],
.textarea[aria-invalid="true"] { border-color: var(--msg-error); }

/* ---- Inline field error ------------------------------------------------- */
.field__error {
  display: flex;
  align-items: flex-start;
  gap: var(--space-xs);
  font-size: var(--fs-sm);
  color: var(--msg-error);
}
.field__error[hidden] { display: none; }
.field__error svg { inline-size: 16px; block-size: 16px; flex: none; margin-block-start: .18em; }

/* ---- Fieldset / radio / checkbox ---------------------------------------- */
.fieldset { border: 0; padding: 0; margin: 0; min-inline-size: 0; }
.fieldset__legend {
  padding: 0;
  margin-block-end: var(--space-sm);
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  font-weight: 600;
  letter-spacing: .10em;
  text-transform: uppercase;
  color: var(--fg-muted);
}
.choice-list { display: grid; gap: var(--space-xs); }
@media (min-width: 48em) { .choice-list--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

.choice {
  display: flex;
  align-items: flex-start;
  gap: var(--space-sm);
  min-block-size: 48px;
  padding: 12px 14px;
  border: 1px solid var(--field-border);
  border-radius: var(--r-xs);
  background-color: var(--field-bg);
  color: var(--field-text);
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease-standard),
              background-color var(--dur-fast) var(--ease-standard);
}
.choice:hover { border-color: var(--field-focus); }
.choice__control {
  inline-size: 20px;
  block-size: 20px;
  flex: none;
  margin: 0;
  margin-block-start: .18em;
  accent-color: var(--brass-700);
  cursor: pointer;
}
.on-dark .choice__control, .band--navy .choice__control, .site-footer .choice__control { accent-color: var(--brass-500); }
.choice__text { font-size: var(--fs-sm); line-height: 1.45; }
.choice__control:focus-visible { outline: 3px solid var(--focus-ring); outline-offset: 2px; }
@supports selector(:has(*)) {
  .choice:has(:checked) { border-color: var(--field-focus); }
  .choice:has(:focus-visible) { outline: 3px solid var(--focus-ring); outline-offset: 2px; }
  .choice__control:focus-visible { outline: none; }
}

/* ---- Messages ----------------------------------------------------------- */
.form-message {
  display: flex;
  align-items: flex-start;
  gap: var(--space-sm);
  padding: var(--space-md) var(--space-lg);
  border-radius: var(--r-sm);
  font-size: var(--fs-sm);
}
.form-message[hidden] { display: none; }
.form-message svg { inline-size: 20px; block-size: 20px; flex: none; margin-block-start: .1em; }

.form-message--success {
  background-color: var(--success-bg);
  border: 1px solid rgba(31, 107, 74, .35);
  color: var(--success);
}
.form-message--error {
  background-color: var(--error-bg);
  border: 1px solid rgba(158, 43, 37, .35);
  color: var(--error);
}
.form-message--info {
  background-color: var(--mist-50);
  border: 1px solid var(--rule);
  color: var(--navy-700);
}
/* On navy the tinted panels would be unreadable — swap to navy-800 + accent
   text, which is measured to pass on --navy-800. */
.on-dark .form-message--success,
.band--navy .form-message--success,
.site-footer .form-message--success {
  background-color: var(--navy-800);
  border-color: rgba(111, 197, 154, .45);
  color: var(--success-on-dark);
}
.on-dark .form-message--error,
.band--navy .form-message--error,
.site-footer .form-message--error {
  background-color: var(--navy-800);
  border-color: rgba(240, 150, 142, .45);
  color: var(--error-on-dark);
}
.on-dark .form-message--info,
.band--navy .form-message--info,
.site-footer .form-message--info {
  background-color: var(--navy-800);
  border-color: var(--line-dark);
  color: var(--paper);
}

.form-errors__title { font-size: var(--fs-h5); margin-block-end: var(--space-xs); color: inherit; }
.form-errors__list { margin: 0; padding-inline-start: 1.2em; }
.form-errors__list a { color: inherit; }
.form-errors:focus { outline: none; }
.form-errors:focus-visible { outline: 3px solid var(--focus-ring); outline-offset: 2px; }

/* Honeypot. Must not be display:none — bots read the computed style. */
.honeypot {
  position: absolute;
  inline-size: 1px;
  block-size: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

.form__footer { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-md); }
.form__legal { font-size: var(--fs-caption); color: var(--fg-muted); max-inline-size: 48ch; }


/* ==========================================================================
   25 — SITE FOOTER
   ========================================================================== */

.site-footer {
  padding-block: var(--space-4xl) var(--space-2xl);
  border-block-start: 1px solid var(--line-dark);
}
.footer-grid { display: grid; gap: var(--space-2xl); }
@media (min-width: 40em) { .footer-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 64em) { .footer-grid { grid-template-columns: 1.5fr 1fr 1fr 1fr; column-gap: var(--space-2xl); } }

.footer-col__title {
  font-family: var(--font-body);
  font-size: var(--fs-overline);
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--brass-300);
  margin-block-end: var(--space-md);
}
.footer-list { list-style: none; padding: 0; display: grid; gap: 0; }
.footer-list a, .footer-link {
  display: inline-flex;
  align-items: center;
  min-block-size: 44px;
  color: var(--paper);
  font-size: var(--fs-sm);
  text-decoration: none;
  touch-action: manipulation;
  transition: color var(--dur-fast) var(--ease-standard);
}
.footer-list a:hover, .footer-link:hover {
  color: var(--brass-300);
  text-decoration: underline;
  text-underline-offset: .18em;
}
.footer-list .nums, .footer-list a .nums { font-variant-numeric: tabular-nums; }

.footer-col { min-inline-size: 0; } /* long link text must not blow out the grid track */
.footer-brand { display: flex; flex-direction: column; gap: var(--space-md); }
.footer-brand .brand { margin-inline-end: 0; }
.footer-brand__line { color: var(--mist); font-size: var(--fs-sm); max-inline-size: 34ch; }

.footer-address {
  font-style: normal;
  display: grid;
  gap: var(--space-2xs);
  font-size: var(--fs-sm);
  color: var(--mist);
}
.footer-address a { color: var(--paper); text-decoration: none; display: inline-flex; align-items: center; min-block-size: 44px; }
.footer-address a:hover { color: var(--brass-300); text-decoration: underline; text-underline-offset: .18em; }

.footer-area {
  margin-block-start: var(--space-md);
  font-size: var(--fs-caption);
  color: var(--mist);
  max-inline-size: 34ch;
}

.footer-bottom {
  margin-block-start: var(--space-3xl);
  padding-block-start: var(--space-lg);
  border-block-start: 1px solid var(--line-dark);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-md);
  font-size: var(--fs-caption);
  color: var(--mist);
}
.footer-bottom a {
  color: var(--mist);
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  min-block-size: 44px;
}
.footer-bottom a:hover { color: var(--brass-300); text-decoration: underline; text-underline-offset: .18em; }


/* ==========================================================================
   26 — ART FRAMES, GRADIENT MATERIAL, GRAIN, INLINE SVG ART

   The site ships with no photography. These build palette-consistent art
   panels from CSS alone, and hold the exact space real photographs will
   occupy later so nothing reflows when they are dropped in.

   When real images arrive: put <img> inside .frame with width/height
   attributes, loading="lazy" below the fold, and alt text that names the
   place. Delete .material from that frame.
   ========================================================================== */

.frame {
  position: relative;
  overflow: hidden;
  isolation: isolate;
  border-radius: var(--r-md);
  background-color: var(--navy-800);
  aspect-ratio: 3 / 2;
}
.frame--portrait  { aspect-ratio: 3 / 4; }
.frame--wide      { aspect-ratio: 16 / 9; }
.frame--editorial { aspect-ratio: 5 / 4; }
.frame--band      { aspect-ratio: 21 / 9; }
.frame--square    { aspect-ratio: 1 / 1; }
.frame--flush     { border-radius: var(--r-0); }
.frame--fill      { aspect-ratio: auto; block-size: 100%; }
/* Vary the ratios down the page. A 3:4 portrait beside a 16:9 reads as art
   direction; 16:9 everywhere reads as a template. */

.frame > img {
  inline-size: 100%;
  block-size: 100%;
  object-fit: cover;
  filter: saturate(.92) contrast(1.03);
}
.frame__scrim {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, rgba(11,18,25,.25) 0%, rgba(11,18,25,.70) 100%);
}
.frame__overlay {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: rgba(11, 18, 25, .18);
  transition: background-color var(--dur-base) var(--ease-standard);
}
@media (hover: hover) and (pointer: fine) {
  .card:hover .frame__overlay { background: rgba(11, 18, 25, .30); }
}
.frame__caption {
  position: absolute;
  inset-block-end: 0;
  inset-inline: 0;
  z-index: 2;
  padding: var(--space-md) var(--space-lg);
  font-size: var(--fs-caption);
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--paper);
}

/* ---- Layered gradient "material". Three layers minimum: a broad radial
   light source, an offset radial at a different colour temperature, and a
   conic for structure. One flat linear-gradient is the template tell. ----- */
.material {
  background-color: var(--navy-800);
  background-image:
    radial-gradient(120% 80% at 12% -10%, rgba(192, 138, 46, .30), transparent 60%),
    radial-gradient(90% 70% at 92% 8%, rgba(155, 170, 182, .22), transparent 55%),
    conic-gradient(from 210deg at 30% 110%, rgba(14, 34, 51, .95), rgba(28, 68, 99, .70) 40%, rgba(14, 34, 51, .95));
  background-blend-mode: normal, screen, normal;
}
.material--dusk {
  background-color: var(--navy-900);
  background-image:
    radial-gradient(100% 60% at 50% 108%, rgba(192, 138, 46, .40), transparent 62%),
    radial-gradient(140% 90% at 10% -20%, rgba(28, 68, 99, .85), transparent 65%),
    linear-gradient(180deg, rgba(11, 18, 25, .10), rgba(11, 18, 25, .55));
}
.material--sand {
  background-color: var(--sand-50);
  background-image:
    radial-gradient(110% 80% at 8% 0%, rgba(233, 224, 210, .9), transparent 60%),
    radial-gradient(90% 70% at 96% 10%, rgba(155, 170, 182, .22), transparent 55%),
    conic-gradient(from 200deg at 70% 110%, rgba(233, 224, 210, .8), rgba(242, 235, 223, .4) 45%, rgba(233, 224, 210, .8));
}
.material--mist {
  background-color: var(--mist-50);
  background-image:
    radial-gradient(120% 80% at 15% -10%, rgba(155, 170, 182, .35), transparent 60%),
    radial-gradient(90% 70% at 92% 100%, rgba(192, 138, 46, .12), transparent 55%);
}
/* Dissolve a panel into the page instead of ending on a hard edge. */
.material--fade {
  -webkit-mask-image: linear-gradient(to bottom, #000 55%, transparent);
          mask-image: linear-gradient(to bottom, #000 55%, transparent);
}

/* ---- Horizon rule: a single brass line at the material's optical horizon - */
.material--horizon::before {
  content: "";
  position: absolute;
  inset-inline: 0;
  inset-block-start: 68%;
  block-size: 1px;
  background: linear-gradient(to right, transparent, rgba(192, 138, 46, .55) 22%, rgba(192, 138, 46, .55) 78%, transparent);
  z-index: 1;
}

/* ---- Film grain. Inline data URI: no network request, works offline. ---- */
.grain::after {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 2;
  opacity: .055;
  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='0.86' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
}
@media (max-width: 48em) { .grain::after { opacity: .03; } }
@media (prefers-reduced-transparency: reduce) { .grain::after { display: none; } }

/* ---- Oversized numeral / monogram clipped by the frame ------------------ */
.frame__numeral {
  position: absolute;
  inset-block-end: -.18em;
  inset-inline-start: -.04em;
  z-index: 1;
  font-family: var(--font-display);
  font-weight: 400;
  font-variation-settings: 'opsz' 144;
  font-size: clamp(6rem, 22cqi, 14rem);
  line-height: .8;
  color: var(--paper);
  opacity: .10;
  pointer-events: none;
  font-variant-numeric: tabular-nums lining-nums;
}

/* ---- Inline SVG art: hairlines stay 1px at any scale -------------------- */
.art {
  inline-size: 100%;
  block-size: 100%;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.25;
  vector-effect: non-scaling-stroke;
}
.art--brass { color: var(--brass-500); }
.art--mist  { color: var(--mist); }

/* Two-layer blueprint grid, faded out from the centre. */
.blueprint::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  background-image:
    linear-gradient(to right, rgba(251, 249, 246, .06) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(251, 249, 246, .06) 1px, transparent 1px),
    linear-gradient(to right, rgba(251, 249, 246, .04) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(251, 249, 246, .04) 1px, transparent 1px);
  background-size: 64px 64px, 64px 64px, 8px 8px, 8px 8px;
  -webkit-mask-image: radial-gradient(80% 70% at 50% 45%, #000, transparent);
          mask-image: radial-gradient(80% 70% at 50% 45%, #000, transparent);
}


/* ==========================================================================
   27 — MOTION AND SCROLL REVEAL

   Content is VISIBLE BY DEFAULT. The hidden state below is scoped to
   html.js, which is only set when JavaScript runs. A JS failure therefore
   leaves a fully readable page.

   Never scroll-reveal above-the-fold hero content.
   ========================================================================== */

.js [data-reveal],
.js .reveal {
  opacity: 0;
  transform: translate3d(0, var(--reveal-y, 14px), 0);
  transition: opacity var(--dur-reveal) var(--ease-entrance),
              transform var(--dur-reveal) var(--ease-entrance);
  transition-delay: var(--reveal-delay, 0ms);
}
.js [data-reveal].is-in,
.js .reveal.is-in { opacity: 1; transform: none; }

/* Stagger: 70ms per step, capped at 6 steps / 420ms total. Anything longer
   reads as a slow page, not as choreography. */
.stagger > :nth-child(1) { --reveal-delay: 0ms; }
.stagger > :nth-child(2) { --reveal-delay: 70ms; }
.stagger > :nth-child(3) { --reveal-delay: 140ms; }
.stagger > :nth-child(4) { --reveal-delay: 210ms; }
.stagger > :nth-child(5) { --reveal-delay: 280ms; }
.stagger > :nth-child(6) { --reveal-delay: 350ms; }
.stagger > :nth-child(n+7) { --reveal-delay: 420ms; }

/* Duration .01ms, not 0s: with 0s, transitionend never fires and any
   cleanup or chaining logic silently breaks. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    /* Also zero the delays: the drawer and accordion hide themselves via a
       DELAYED visibility transition, which would otherwise leave off-screen
       content in the tab order for ~420ms after the transform snaps. */
    transition-delay: 0s !important;
    scroll-behavior: auto !important;
  }
  .js [data-reveal], .js .reveal { opacity: 1 !important; transform: none !important; }
  .btn-link:hover .btn-link__arrow { transform: none; }
}

@media (prefers-reduced-transparency: reduce) {
  .site-header { backdrop-filter: none; }
}


/* ==========================================================================
   28 — PRINT

   Aim: a caller can print the contact page or a quote confirmation and get
   one clean page with the phone number, email and service area on it.
   ========================================================================== */

@media print {
  @page { margin: 14mm; }

  :root {
    --fg: #000;
    --fg-muted: #333;
    --fg-accent: #000;
    --rule: #999;
    --rule-strong: #666;
  }

  html { scrollbar-gutter: auto; }

  body {
    background: #fff !important;
    color: #000 !important;
    font-size: 11pt;
    line-height: 1.4;
  }

  .site-header,
  .nav-toggle,
  .site-nav,
  .nav-scrim,
  .skip-link,
  .cta-band,
  .btn,
  .btn-row,
  .btn-link,
  .jump-nav,
  .hero__art,
  .page-header__art,
  .cta-band__art,
  .grain::after,
  .trust-strip,
  .frame { display: none !important; }

  .on-dark, .band--navy, .band--ink, .site-footer, .hero, .page-header {
    background: #fff !important;
    color: #000 !important;
  }
  .site-footer { border-block-start: 1px solid #999; padding-block: 8mm 0; }
  .footer-grid { grid-template-columns: repeat(2, 1fr) !important; gap: 6mm; }
  .footer-col__title, .footer-address, .footer-list a, .footer-brand__line { color: #000 !important; }

  .section { padding-block: 6mm !important; }
  .card, .table-wrap, .accordion__item, .placeholder { break-inside: avoid; }
  .js .accordion__panel {
    grid-template-rows: 1fr !important;
    visibility: visible !important;
    padding-block-end: 3mm !important;
  }
  .js [data-reveal], .js .reveal { opacity: 1 !important; transform: none !important; }

  h1, h2, h3, h4 { break-after: avoid; page-break-after: avoid; }
  table, figure, img { break-inside: avoid; }

  a[href^="http"]::after,
  a[href^="/"]::after { content: " (" attr(href) ")"; font-size: 9pt; color: #444; }
  a[href^="#"]::after,
  a[href^="tel:"]::after,
  a[href^="mailto:"]::after { content: ""; }
}


/* ==========================================================================
   29 — LAST-WORD UTILITIES

   These sit at the very end of the file ON PURPOSE: they exist to override
   component margins, so they must win by source order. Do not move them
   earlier and do not add components below them.
   ========================================================================== */

.mt-0 { margin-block-start: 0; }
.mb-0 { margin-block-end: 0; }
.mt-2xl { margin-block-start: var(--space-2xl); }
