/* =========================================================
   AUTONOMY — Premium automotive · engineered
   White + Ink + MTC Blue · Manrope + JetBrains Mono (self-hosted)
   ========================================================= */

/* Self-hosted fonts (previously a render-blocking @import from Google Fonts). */
@font-face { font-family:'Manrope'; font-style:normal; font-weight:400 800; font-display:swap;
  src:url('/assets/fonts/manrope-latin.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family:'Manrope'; font-style:normal; font-weight:400 800; font-display:swap;
  src:url('/assets/fonts/manrope-latin-ext.woff2') format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family:'JetBrains Mono'; font-style:normal; font-weight:400 500; font-display:swap;
  src:url('/assets/fonts/jetbrains-mono-latin.woff2') format('woff2');
  unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family:'JetBrains Mono'; font-style:normal; font-weight:400 500; font-display:swap;
  src:url('/assets/fonts/jetbrains-mono-latin-ext.woff2') format('woff2');
  unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }

:root {
  /* ---- Color ---- */
  --paper: #FFFFFF;
  --bg: #F6F5F2;          /* very subtle warm off-white */
  --bg-2: #ECEAE5;        /* secondary surface */
  --line: rgba(14, 16, 20, 0.10);
  --line-soft: rgba(14, 16, 20, 0.06);
  --line-dark: rgba(255, 255, 255, 0.10);
  --line-dark-soft: rgba(255, 255, 255, 0.06);

  --ink-900: #0A0C10;     /* primary type */
  --ink-800: #14171C;
  --ink-700: #232830;
  --ink-500: #5A5F69;
  --ink-400: #80848D;
  --ink-300: #A8ACB3;
  --ink-200: #C8CBD0;

  --night: #08090C;       /* dark section */
  --night-2: #11141A;

  /* Autonomy accent — soft lavender blue from the existing site */
  --autonomy-blue: #5876E0;
  --autonomy-blue-dark: #3A57C5;
  --autonomy-blue-soft: rgba(88, 118, 224, 0.10);

  /* legacy aliases */
  --accent: var(--ink-900);
  --accent-dark: var(--ink-700);
  --accent-light: var(--ink-500);
  --accent-soft: rgba(14, 16, 20, 0.06);
  --mtc-blue: var(--ink-900);
  --mtc-blue-dark: var(--ink-700);
  --mtc-blue-light: var(--ink-300);
  --blue-glow: rgba(88, 118, 224, 0.12);

  --signal: var(--autonomy-blue);
  --signal-soft: var(--autonomy-blue);

  /* ---- Type ---- */
  --font-display: 'Manrope', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --font-body: 'Manrope', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', monospace;

  /* ---- Motion ---- */
  --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
  /* Motion system ("night drive"): fast-out expo easing, tuned durations and a
     stagger step. Every animation should draw on these, nothing ad hoc. */
  --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
  --dur-fast: 300ms;
  --dur-base: 500ms;
  --dur-slow: 700ms;
  --stagger: 60ms;

  /* ---- Layout ---- */
  --max: 1440px;
  --gutter: clamp(28px, 4vw, 64px);
  --nav-h: 68px;
}

/* Font theme variants — applied via [data-font] on <html> */
/* Alternate display fonts removed: only Manrope + JetBrains Mono are loaded now. */

* { box-sizing: border-box; }

/* Accessibility: honour reduced-motion globally. Near-instant durations (rather
   than 0) keep transitionend/animationend handlers firing. Catches the logo
   marquee, the pulsate dot, the carousel slide and any future animation, on top
   of the targeted disables elsewhere. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
}

html, body {
  margin: 0;
  padding: 0;
  background: var(--paper);
  /* Kill the elastic overscroll bounce: on macOS it exposes the white root
     background as a full-width flash against the dark hero (top) and dark
     footer (bottom) while scrolling. */
  overscroll-behavior: none;
  color: var(--ink-900);
  font-family: var(--font-body);
  /* NB the background above is overridden for html alone just below. */
  font-size: 16px;
  font-weight: 400;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  font-feature-settings: "ss01", "cv11";
}

/* The canvas takes its colour from html, not body. The viewport meta does not
   use viewport-fit=cover, so iOS insets the page and fills the home-indicator
   strip with that canvas colour: white, directly under the dark footer, which
   read as a white gap at the bottom on an iPhone (UB 8183737). Both ends of the
   document are dark (hero and footer) and --night already matches the declared
   theme-color, so the canvas takes it. body keeps --paper, so light pages are
   unchanged. */
html { background: var(--night); }

img, svg, video { display: block; max-width: 100%; }

a { color: inherit; text-decoration: none; }

button {
  font-family: inherit;
  font-size: inherit;
  cursor: pointer;
  border: 0;
  background: none;
  color: inherit;
}

::selection { background: var(--ink-900); color: #fff; }

/* =========================================================
   TYPE — weight contrast, no serif
   ========================================================= */

.eyebrow {
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-500);
  display: inline-flex;
  align-items: center;
  gap: 12px;
}
.eyebrow::before {
  content: '';
  display: none;
}

/* Display: BIG, tight, demibold. No internal weight contrast — emphasis via colour only */
.display {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(40px, 6vw, 96px);
  line-height: 1.04;
  letter-spacing: -0.034em;
  margin: 0;
  color: var(--ink-900);
}
.display em {
  font-style: normal;
  font-weight: inherit;
  color: inherit;
}

.h1 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(30px, 4.6vw, 64px);
  line-height: 1.06;
  letter-spacing: -0.028em;
  margin: 0;
  color: var(--ink-900);
}
.h1 em { font-style: normal; font-weight: inherit; color: inherit; }

.h2 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(26px, 3.4vw, 46px);
  line-height: 1.08;
  letter-spacing: -0.023em;
  margin: 0;
  color: var(--ink-900);
}
.h2 em { font-style: normal; font-weight: inherit; color: inherit; }

.h3 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(20px, 2vw, 28px);
  line-height: 1.2;
  letter-spacing: -0.015em;
  margin: 0;
}

/* =========================================================
   HOME-LEVEL DISPLAY SYSTEM (.disp / .title-2 / .title-3 / .eyebrow-row)
   Migrated from home.css so all pages can share the same vocabulary.
   ========================================================= */
.disp {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(44px, 6.8vw, 116px);
  line-height: 1;
  letter-spacing: -0.038em;
  margin: 0;
}
.title-2 {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(30px, 4.2vw, 60px);
  line-height: 1.06;
  letter-spacing: -0.03em;
  margin: 0;
}
.title-3 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(28px, 3vw, 42px);
  line-height: 1.05;
  letter-spacing: -0.028em;
  margin: 0;
}
.eyebrow-row {
  display: flex;
  align-items: center;
  gap: 14px;
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 0.04em;
  color: var(--ink-500);
  font-weight: 500;
  margin-bottom: 28px;
}
.eyebrow-row::before {
  content: '';
  display: none;
}
.eyebrow-row--dark { color: rgba(255,255,255,0.82); }
/* Platform page — too much else going on; drop the line accent before numbers */
/* Platform + Home pages — drop the line accent before section numbers (too much else going on) */
[data-page="platform"] .eyebrow-row::before,
[data-page="index"] .eyebrow-row::before { display: none; }
/* Platform page — align the right-column lede to the h2 baseline (skip the eyebrow row) */
[data-page="platform"] .two-col > .lede { padding-top: 44px; }
@media (max-width: 900px) { [data-page="platform"] .two-col > .lede { padding-top: 0; } }
/* Header two-cols where the right lede should align to the heading, not the eyebrow */
.two-col--lede-offset > .lede { padding-top: var(--lede-offset, 44px); }
@media (max-width: 900px) { .two-col--lede-offset > .lede { padding-top: 0; } }

/* <em> inside display headings — strip italic, keep weight, mute to ink-400 (matches home pattern) */
.disp em,
.title-2 em,
.title-3 em {
  font-style: normal;
  font-weight: inherit;
  color: var(--ink-400);
}
.section--dark .disp em,
.section--dark .title-2 em,
.section--dark .title-3 em {
  color: rgba(255,255,255,0.4);
}

.label {
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: -0.005em;
}

.lede {
  font-family: var(--font-body);
  font-size: clamp(17px, 1.35vw, 20px);
  font-weight: 500;
  line-height: 1.5;
  color: var(--ink-700);
  letter-spacing: -0.005em;
  max-width: 60ch;
}

.body { font-size: 16px; line-height: 1.6; color: var(--ink-700); font-weight: 500; }
.body p { margin: 0 0 1em 0; }

.tiny {
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-500);
}

.num {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(54px, 7vw, 96px);
  line-height: 0.95;
  letter-spacing: -0.04em;
  font-variant-numeric: tabular-nums;
  color: var(--ink-900);
}
.num em {
  font-style: normal;
  font-weight: inherit;
  font-size: 0.7em;
  color: var(--ink-400);
}

.mono {
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: -0.005em;
  font-variant-numeric: tabular-nums;
}

/* =========================================================
   NAV
   ========================================================= */

/* Skip-to-content link: first focusable element, off-screen until focused. */
.skip-link {
  position: absolute;
  top: 10px; left: 10px;
  z-index: 2000;
  padding: 10px 16px;
  border-radius: 8px;
  background: var(--ink-900);
  color: #fff;
  font-family: var(--font-body);
  font-size: 14px;
  font-weight: 600;
  text-decoration: none;
  transform: translateY(-150%);
  transition: transform 160ms var(--ease-out);
}
.skip-link:focus { transform: translateY(0); outline: 2px solid #fff; outline-offset: 2px; }
#main-content:focus { outline: none; }

/* Keyboard focus ring for every interactive element. :focus-visible keeps the
   ring off mouse/touch clicks, so it only appears for keyboard and assistive-tech
   navigation. Brand blue reads against both the light and dark sections; the
   outline follows each element's own border-radius, so pill buttons stay round. */
a:focus-visible,
button:focus-visible,
[role="button"]:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible,
summary:focus-visible,
[tabindex]:not([tabindex="-1"]):focus-visible {
  outline: 2px solid var(--autonomy-blue);
  outline-offset: 2px;
}

/* Screen-reader-only utility: visually hidden, still announced. */
.sr-only {
  position: absolute; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0;
}

.nav {
  position: fixed;
  top: 0; left: 0; right: 0;
  height: var(--nav-h);
  z-index: 100;
  display: flex;
  align-items: center;
  padding: 0 var(--gutter);
  background: transparent;
  transition: transform 360ms var(--ease-out), background 320ms var(--ease-out), color 320ms var(--ease-out);
}
.nav--scrolled {
  background: transparent;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border-bottom: 1px solid transparent;
  pointer-events: none; /* empty bar lets scroll/clicks pass through — children re-enable below */
}
.nav--scrolled .brand {
  opacity: 0;
  visibility: hidden;
  transform: translateY(-8px);
  transition: opacity 280ms var(--ease-out), transform 280ms var(--ease-out), visibility 0s linear 280ms;
}
.nav--scrolled .nav__links,
.nav--scrolled .nav__cta { pointer-events: auto; }
.brand img {
  transition: filter 280ms var(--ease-out);
}
.nav--dark { color: #fff; }
.nav--dark.nav--scrolled {
  background: transparent;
  border-bottom-color: transparent;
}

/* Mobile: hide the fixed nav on scroll down, reveal a frosted bar with the logo
   on scroll up. Driven by nav--hidden / nav--peek in assets/site.js. */
@media (max-width: 1024px) {
  .nav--hidden { transform: translateY(-100%); }
  .nav--peek {
    background: rgba(246, 245, 242, 0.72);
    backdrop-filter: saturate(160%) blur(18px);
    -webkit-backdrop-filter: saturate(160%) blur(18px);
    border-bottom: 1px solid var(--line);
    pointer-events: auto;
  }
  .nav--dark.nav--peek {
    background: rgba(10, 12, 16, 0.58);
    border-bottom-color: var(--line-dark);
  }
  /* Keep the logo present on mobile — the desktop scrolled state hides it. */
  .nav--scrolled .brand {
    opacity: 1; visibility: visible; transform: none;
    transition: opacity 240ms var(--ease-out);
  }
}

.nav__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  max-width: var(--max);
  margin: 0 auto;
  gap: 16px;
}
.nav__links {
  margin-left: auto;
}

.brand {
  display: inline-flex;
  align-items: center;
  line-height: 1;
}
.brand img {
  height: 24px;
  width: auto;
  display: block;
}
.nav--dark .brand img { filter: brightness(0) invert(1); }
.brand--white img { filter: brightness(0) invert(1); }

.nav__links {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  padding: 5px;
  background: rgba(14, 16, 20, 0.05);
  border-radius: 999px;
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border: 1px solid transparent;
  transition: background 280ms var(--ease-out), border-color 280ms var(--ease-out), box-shadow 280ms var(--ease-out);
}
.nav--scrolled .nav__links {
  background: rgba(255, 255, 255, 0.94);
  backdrop-filter: saturate(160%) blur(20px);
  -webkit-backdrop-filter: saturate(160%) blur(20px);
  border-color: var(--line-soft);
  box-shadow: 0 8px 28px rgba(10, 12, 18, 0.08);
}
.nav--dark.nav--scrolled .nav__links {
  background: rgba(20, 24, 30, 0.9);
  border-color: rgba(255, 255, 255, 0.10);
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.28);
}
.nav__link {
  font-size: 13px;
  font-weight: 500;
  letter-spacing: -0.005em;
  color: inherit;
  opacity: 0.75;
  padding: 8px 16px;
  border-radius: 999px;
  transition: opacity 200ms var(--ease-out), background 200ms var(--ease-out), color 200ms var(--ease-out);
  position: relative;
}
.nav__link:hover { opacity: 1; }
.nav__link--active {
  opacity: 1;
  background: var(--ink-900);
  color: #fff;
}
.nav--dark .nav__links { background: rgba(255, 255, 255, 0.08); }
.nav--dark .nav__link--active { background: #fff; color: var(--ink-900); }

.nav__cta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  white-space: nowrap;
  padding: 10px 18px;
  border-radius: 999px;
  background: var(--ink-900);
  color: #fff;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: -0.005em;
  transition: transform 240ms var(--ease-out), background 240ms var(--ease-out), color 240ms var(--ease-out);
}
.nav__cta:hover { transform: translateY(-1px); background: var(--accent); }
.nav--dark .nav__cta { background: var(--paper); color: var(--ink-900); }
.nav--dark .nav__cta:hover { background: var(--accent); color: #fff; }
.nav__link--active {
  transition: background 280ms var(--ease-out), color 280ms var(--ease-out);
}

/* =========================================================
   NAV — mobile
   ========================================================= */
@media (max-width: 760px) {
  .nav { padding: 0 var(--gutter); }
  .nav__inner { gap: 8px; }
  .nav__links {
    gap: 0;
    padding: 4px;
  }
  .nav__link {
    font-size: 12px;
    padding: 6px 10px;
  }
  .nav__cta {
    padding: 9px 14px;
    font-size: 12px;
    gap: 6px;
  }
  .nav__cta .arrow { width: 12px; }
}
@media (max-width: 520px) {
  /* On phones: hide pills entirely, keep just logo + Book a demo */
  .nav__links { display: none; }
  .nav__inner { justify-content: space-between; }
}

/* =========================================================
   BUTTON
   ========================================================= */

.btn {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 14px 24px;
  border-radius: 999px;
  font-family: var(--font-body);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: -0.005em;
  white-space: nowrap;
  transition: transform 240ms var(--ease-out), background 240ms var(--ease-out), color 240ms var(--ease-out), border-color 240ms var(--ease-out), box-shadow 240ms var(--ease-out);
  cursor: pointer;
  border: 1px solid transparent;
}
.btn--lg { padding: 18px 30px; font-size: 15px; }
.btn--sm { padding: 10px 16px; font-size: 12px; }

.btn--primary {
  background: var(--ink-900);
  color: #fff;
  padding-right: 8px;
}
.btn--primary:hover {
  background: var(--ink-700);
  transform: translateY(-1px);
  box-shadow: 0 12px 28px rgba(14, 16, 20, 0.20);
}
.btn--primary .btn__nub {
  background: #fff;
  color: var(--ink-900);
}

.btn--accent {
  background: var(--accent);
  color: #fff;
}
.btn--accent:hover {
  background: var(--accent-dark);
  transform: translateY(-1px);
  box-shadow: 0 12px 28px rgba(242, 107, 44, 0.30);
}

.btn--dark {
  background: var(--ink-900);
  color: #fff;
}
.btn--dark:hover {
  background: var(--ink-700);
  transform: translateY(-1px);
}

.btn--ghost {
  background: transparent;
  color: var(--ink-900);
  border-color: var(--line);
}
.btn--ghost:hover { border-color: var(--ink-900); background: var(--ink-900); color: #fff; }

.btn--invert {
  background: var(--paper);
  color: var(--ink-900);
  padding-right: 8px;
}
.btn--invert:hover { background: var(--ink-900); color: #fff; transform: translateY(-1px); }
.btn--invert .btn__nub {
  background: var(--ink-900);
  color: #fff;
}
.btn--invert:hover .btn__nub {
  background: #fff;
  color: var(--ink-900);
}

/* The circular arrow chip on the right of pill CTAs */
.btn__nub {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  min-width: 32px;
  border-radius: 50%;
  margin-left: 6px;
  transition: transform 280ms var(--ease-out), background 240ms var(--ease-out), color 240ms var(--ease-out);
}
.btn__nub .arrow { display: block; }
.btn:hover .btn__nub { transform: translateX(3px); }
.btn--lg { padding-right: 10px; }
.btn--lg .btn__nub { width: 38px; height: 38px; min-width: 38px; }

.btn--bare {
  padding: 0;
  background: none;
  border: 0;
  color: var(--ink-900);
  border-radius: 0;
  gap: 8px;
  font-weight: 600;
}
.btn--bare::after {
  content: '→';
  display: inline-block;
  margin-left: 4px;
  font-weight: 500;
  transition: transform 280ms var(--ease-out);
}
.btn--bare:hover::after { transform: translateX(4px); }

.btn .arrow {
  width: 18px; height: 8px;
  transition: transform 320ms var(--ease-out);
}
.btn:hover .arrow { transform: translateX(4px); }

/* =========================================================
   LAYOUT
   ========================================================= */

.section {
  padding: clamp(58px, 8.6vh, 115px) var(--gutter);
}
.section--dark {
  /* Inset rounded card on cream — matches the homepage Trusted-by treatment */
  background: var(--bg) !important;
  color: var(--ink-900);
  padding: clamp(17px, 2.9vh, 35px) clamp(16px, 2.5vw, 32px) !important;
}
.section--dark > .container,
.section--dark > .container--narrow {
  background: var(--night);
  color: #fff;
  border-radius: clamp(18px, 2vw, 28px);
  padding: clamp(40px, 5.8vh, 79px) clamp(28px, 4vw, 60px);
  max-width: var(--max);
  margin: 0 auto;
}
.section--dark .lede { color: var(--ink-300); }
.section--dark .eyebrow { color: var(--ink-300); }
.section--dark .display em,
.section--dark .h1 em,
.section--dark .h2 em { color: var(--ink-300); }
.section--bg { background: var(--bg); }

.container {
  max-width: var(--max);
  margin: 0 auto;
}
.container--narrow { max-width: 1080px; }
.container--text { max-width: 760px; }

.grid {
  display: grid;
  gap: clamp(20px, 2.4vw, 32px);
}
.grid--2 { grid-template-columns: repeat(2, 1fr); }
.grid--3 { grid-template-columns: repeat(3, 1fr); }
.grid--4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 900px) {
  .grid--2, .grid--3, .grid--4 { grid-template-columns: 1fr; }
}

/* =========================================================
   HERO (full-bleed)
   ========================================================= */

.hero {
  position: relative;
  min-height: 100vh;
  background: var(--night);
  color: #fff;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding: var(--gutter);
  padding-top: calc(var(--nav-h) + 40px);
}
.hero__stage {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
}
.hero__veil {
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(8,9,12,0.10) 0%, rgba(8,9,12,0.05) 35%, rgba(8,9,12,0.85) 100%);
  z-index: 1;
  pointer-events: none;
}
.hero__copy {
  position: relative;
  z-index: 2;
  max-width: var(--max);
  margin: 0 auto;
  width: 100%;
  display: grid;
  grid-template-columns: 1.4fr auto;
  align-items: end;
  gap: 60px;
  padding-bottom: 24px;
}
.hero__title { color: #fff; }
.hero__title em { color: var(--ink-300); }
.hero__sub {
  color: var(--ink-300);
  max-width: 380px;
  font-size: 15px;
  line-height: 1.55;
}
.hero__cta {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-top: 22px;
}

@media (max-width: 900px) {
  .hero__copy { grid-template-columns: 1fr; }
}

/* =========================================================
   BROWSER FRAME
   ========================================================= */

.browser {
  border-radius: 10px;
  background: var(--paper);
  box-shadow: 0 30px 80px rgba(0,0,0,0.35), 0 8px 20px rgba(0,0,0,0.18);
  overflow: hidden;
  border: 1px solid rgba(255,255,255,0.05);
}
.browser__bar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 14px;
  background: #F2F0EC;
  border-bottom: 1px solid var(--line);
}
.browser__dots { display: flex; gap: 6px; }
.browser__dot {
  width: 10px; height: 10px; border-radius: 50%;
  background: rgba(0,0,0,0.12);
}
.browser__url {
  flex: 1;
  background: rgba(255,255,255,0.7);
  border-radius: 6px;
  padding: 4px 12px;
  font-size: 11px;
  font-weight: 500;
  color: var(--ink-500);
  text-align: center;
  letter-spacing: -0.005em;
  margin: 0 60px 0 12px;
  font-family: var(--font-body);
}

/* =========================================================
   STATS
   ========================================================= */

.stats {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 40px;
  border-top: 1px solid var(--line);
  padding-top: 56px;
}
.stat__num {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(48px, 5vw, 80px);
  line-height: 0.95;
  letter-spacing: -0.045em;
  margin-bottom: 14px;
  font-variant-numeric: tabular-nums;
  color: var(--ink-900);
}
.stat__num em {
  font-style: normal;
  font-weight: inherit;
  font-size: 0.7em;
  color: var(--ink-400);
  margin-left: 1px;
  letter-spacing: -0.02em;
}
.stat__label {
  font-size: 13px;
  color: var(--ink-500);
  max-width: 180px;
  line-height: 1.45;
  letter-spacing: -0.005em;
}
.section--dark .stats { border-top-color: var(--line-dark); }
.section--dark .stat__num em { color: var(--ink-400); }
.section--dark .stat__label { color: var(--ink-300); }

@media (max-width: 900px) { .stats { grid-template-columns: repeat(2, 1fr); } }

/* =========================================================
   FEATURE LIST
   ========================================================= */

.feature {
  padding: 30px 0;
  border-top: 1px solid var(--line);
  /* The numeral sits above the title rather than in a 100px hanging column.
     That column cost every item a third of its width, which pushed the bodies
     taller, and three-up needs the width back. */
  display: block;
  transition: padding 320ms var(--ease-out);
}
.feature__no {
  font-family: var(--font-mono);
  font-size: 12px;
  font-weight: 500;
  color: var(--ink-400);
  letter-spacing: 0.04em;
  margin-bottom: 10px;
}
.feature__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(19px, 1.5vw, 22px);
  line-height: 1.18;
  letter-spacing: -0.018em;
  margin: 0 0 10px 0;
}
.feature__body {
  color: var(--ink-700);
  max-width: 60ch;
  font-size: 15px;
  line-height: 1.55;
}
/* Feature list laid out two-up so the items don't read as one tall stack;
   collapses to a single column on mobile. Each .feature keeps its top rule;
   the container closes the bottom edge. */
.feature-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  column-gap: clamp(28px, 3vw, 52px);
  border-bottom: 1px solid var(--line);
}
@media (max-width: 1080px) {
  .feature-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 700px) {
  .feature-grid { grid-template-columns: 1fr; }
}

/* ---- Dealerships: trust wall -------------------------------------------
   The homepage wall is styled white-on-dark for its night band. This one sits
   on the cream section, so the rules are hairline-on-light instead. */
.trust-wall {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  border-top: 1px solid var(--line);
  border-left: 1px solid var(--line);
}
.trust-wall .cell {
  border-right: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  display: flex;
  align-items: center;
  justify-content: center;
  height: 128px;
  padding: 24px 32px;
  background: var(--paper);
  transition: background 240ms var(--ease-out);
}
.trust-wall .cell:hover { background: #fff; }
.trust-wall .cell img {
  max-height: 34px;
  max-width: 86%;
  width: auto;
  object-fit: contain;
  opacity: 0.82;
}
/* Per-logo heights, as the homepage wall does. These marks run from 1.67:1
   (Prestige) to 17.13:1 (Acklam), so one shared height renders the wide ones
   as slivers: max-width clamps them and object-fit shrinks the height to suit. */
.trust-wall .cell img[alt="Sandicliffe Motor Group"] { max-height: 30px; }
.trust-wall .cell img[alt="Windsor Motors"]          { max-height: 30px; }
.trust-wall .cell img[alt="Hippo Motor Group"]       { max-height: 44px; }
.trust-wall .cell img[alt="Batchelors"]              { max-height: 38px; }
.trust-wall .cell img[alt="Dales of Cornwall"]       { max-height: 42px; }
.trust-wall .cell img[alt="Prestige Cars Kent"]      { max-height: 54px; }
/* Stays four across on a phone: eight logos in two short rows rather than four
   tall ones. A logo wall reads fine small, and the page is long enough. */
@media (max-width: 900px) {
  .trust-wall { grid-template-columns: repeat(3, 1fr); }
  .trust-wall .cell { height: 92px; padding: 14px 14px; }
  .trust-wall .cell img { max-height: 26px; }
  .trust-wall .cell img[alt="Hippo Motor Group"] { max-height: 34px; }
  .trust-wall .cell img[alt="Prestige Cars Kent"] { max-height: 42px; }
}

/* ---- Dealerships: why us ---------------------------------------------- */
.whyus { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(28px, 3vw, 52px); }
@media (max-width: 900px) { .whyus { grid-template-columns: 1fr; gap: 36px; } }
.whyus__fig {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(40px, 4vw, 60px);
  line-height: 1;
  letter-spacing: -0.03em;
  color: var(--ink-900);
  font-variant-numeric: tabular-nums;
}
.whyus__fig em {
  font-style: normal;
  font-size: 0.3em;
  font-weight: 600;
  color: var(--ink-400);
  letter-spacing: 0;
  margin-left: 4px;
}
.whyus__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 19px;
  line-height: 1.2;
  letter-spacing: -0.015em;
  margin: 18px 0 8px;
}
.whyus__body { color: var(--ink-700); font-size: 14px; line-height: 1.55; margin: 0; }

/* ---- Dealerships: how a launch works ---------------------------------- */
.steps {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(24px, 2.6vw, 40px);
}
@media (max-width: 1000px) { .steps { grid-template-columns: repeat(2, minmax(0, 1fr)); row-gap: 36px; } }
@media (max-width: 380px)  { .steps { grid-template-columns: 1fr; } }
.step { border-top: 1px solid var(--line); padding-top: 20px; }
.step__no {
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--ink-400);
  letter-spacing: 0.04em;
  margin-bottom: 12px;
}
.step__title {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 18px;
  line-height: 1.2;
  letter-spacing: -0.015em;
  margin: 0 0 8px;
}
.step__body { color: var(--ink-700); font-size: 14px; line-height: 1.55; margin: 0; }

/* ---- Dealerships: results (dark band) --------------------------------- */
.results { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: clamp(24px, 2.6vw, 40px); }
@media (max-width: 1000px) { .results { grid-template-columns: repeat(2, minmax(0, 1fr)); row-gap: 44px; } }
@media (max-width: 380px)  { .results { grid-template-columns: 1fr; } }
.result { border-top: 1px solid rgba(255, 255, 255, 0.14); padding-top: 20px; }
.result__fig {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(42px, 4.4vw, 68px);
  line-height: 1;
  letter-spacing: -0.035em;
  color: #fff;
  font-variant-numeric: tabular-nums;
}
.result__fig em { font-style: normal; font-size: 0.4em; color: var(--ink-300); letter-spacing: 0; }
.result__what { margin-top: 14px; font-size: 15px; font-weight: 600; color: #fff; }
.result__who {
  margin-top: 4px;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.04em;
  color: var(--ink-300);
}

/* Leasing points. Plain stacked copy, no numerals and no hairlines, so the
   section reads differently from the numbered feature table above it. */
.lease-point + .lease-point { margin-top: clamp(24px, 2.4vw, 32px); }

/* =========================================================
   ACCORDION
   ========================================================= */

.acc {
  border-top: 1px solid var(--line);
}
.acc__item {
  border-bottom: 1px solid var(--line);
}
.acc__btn {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  padding: 28px 0;
  text-align: left;
  gap: 32px;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: clamp(20px, 1.8vw, 26px);
  line-height: 1.2;
  letter-spacing: -0.018em;
  color: var(--ink-900);
  transition: color 200ms var(--ease-out);
}
.acc__btn:hover { color: var(--accent); }
.acc__icon {
  width: 22px;
  height: 22px;
  flex-shrink: 0;
  position: relative;
}
.acc__icon::before,
.acc__icon::after {
  content: '';
  position: absolute;
  background: currentColor;
  transition: transform 320ms var(--ease-out);
}
.acc__icon::before {
  left: 0; right: 0; top: 50%;
  height: 1.5px;
  transform: translateY(-50%);
}
.acc__icon::after {
  top: 0; bottom: 0; left: 50%;
  width: 1.5px;
  transform: translateX(-50%);
}
.acc__item--open .acc__icon::after { transform: translateX(-50%) rotate(90deg); }
.acc__panel {
  max-height: 0;
  overflow: hidden;
  transition: max-height 380ms var(--ease-out);
}
.acc__panel-inner {
  padding: 0 0 32px 0;
  max-width: 64ch;
  color: var(--ink-700);
  font-size: 16px;
  line-height: 1.6;
}

/* =========================================================
   MODAL
   ========================================================= */

.modal {
  position: fixed;
  inset: 0;
  z-index: 1000;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 24px;
}
.modal[data-open="true"] { display: flex; }
.modal__veil {
  position: absolute; inset: 0;
  background: rgba(8, 9, 12, 0.6);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  animation: fadein 280ms var(--ease-out);
}
.modal__card {
  position: relative;
  background: var(--paper);
  border-radius: 14px;
  max-width: 560px;
  width: 100%;
  padding: 44px;
  box-shadow: 0 40px 120px rgba(0,0,0,0.4);
  animation: pop 320ms var(--ease-out);
  max-height: calc(100vh - 48px);
  overflow-y: auto;
}
.modal__close {
  position: absolute;
  top: 18px; right: 18px;
  width: 36px; height: 36px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(14,16,20,0.06);
  transition: background 200ms var(--ease-out);
}
.modal__close:hover { background: rgba(14,16,20,0.12); }
@keyframes fadein { from { opacity: 0; } to { opacity: 1; } }
@keyframes pop { from { opacity: 0; transform: translateY(12px) scale(0.98); } to { opacity: 1; transform: translateY(0) scale(1); } }

/* Slow idle bob for hero browser mockup */
@keyframes browser-float {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-10px); }
}
.pagehead__visual-inner {
  /* idle bob disabled — dashboard sits still */
}
@media (prefers-reduced-motion: reduce) {
  .pagehead__visual-inner { animation: none; }
}

/* Live indicator pulse on the floating tag eyebrow */
@keyframes live-pulse {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.45; }
}
.pagehead__tag-eyebrow::before {
  content: '';
  display: none; /* default: no pulse dot — only the --live variant gets it */
}
.pagehead__tag-eyebrow--live::before {
  content: '';
  display: inline-block;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--autonomy-blue);
  margin-right: 8px;
  vertical-align: middle;
  animation: live-pulse 1.6s ease-in-out infinite;
  box-shadow: 0 0 0 3px rgba(88, 118, 224, 0.18);
}

/* Architecture stack — sticky cards that layer over each other on scroll */
.arch-stack {
  display: flex;
  flex-direction: column;
  gap: 28px;
  /* Trailing room so the last card can stack before the section ends. 24vh left
     278px of dead space under it once tier 4 lost its four service cards; 8vh is
     enough for the stack to resolve without the void. */
  padding-bottom: 8vh;
}
.arch-layer {
  position: sticky;
  background: var(--night-2);
  border: 1px solid var(--line-dark);
  border-radius: 14px;
  padding: 40px;
  min-height: 320px;
  z-index: 0;
  transition: transform 600ms var(--ease-out);
}
/* Cascade resting positions so cards peek from above each other when stacked */
.arch-layer:nth-of-type(1) { top: calc(var(--nav-h) + 32px); z-index: 1; }
.arch-layer:nth-of-type(2) { top: calc(var(--nav-h) + 56px); z-index: 2; }
.arch-layer:nth-of-type(3) { top: calc(var(--nav-h) + 80px); z-index: 3; }
.arch-layer:nth-of-type(4) { top: calc(var(--nav-h) + 104px); z-index: 4; }
.arch-layer--core { background: #15233A; border-color: rgba(88, 118, 224, 0.30); }
@media (max-width: 900px) {
  /* Sticky stacking is off below 900px, reversing an earlier decision to match
     desktop here. Measured at 440x956, tier 3 renders 1088px tall and rests at a
     114px offset, so 246px of it was clipped and its last bullets were
     unreachable; tier 4 lost 86px the same way. Tightening the offsets cannot
     fix that, because the card is taller than the viewport on its own. Static
     cards scroll normally and show all of their content, which is worth more on
     a phone than the stacking flourish. The trailing scroll room goes with it,
     since it only existed to let the stack resolve. */
  /* The nth-of-type cascade above still sets `top`, but it is inert once these
     are static, so it is left rather than overridden at higher specificity. */
  .arch-layer { position: static; min-height: 0; padding: 28px; }
  .arch-stack { padding-bottom: 0; }
}

/* Platform modules. Grouped rather than a flat grid of cards: nine equal boxes
   read as one repeated shape, and on a phone that was nine 240px blocks in a
   2288px column. Groups give the eye somewhere to land and collapse to a short
   outline on small screens, because the structure is an outline, not a layout. */
.modules { display: flex; flex-direction: column; gap: clamp(38px, 4.4vw, 56px); }

/* The heading sits on a hairline that runs out to the measure, the same idiom
   the homepage platform section uses for its numerals. */
/* A label, not a heading. At display weight it sat 25px against the 20px module
   names in the same face and colour, so the two read as one level. Mono uppercase
   makes it a divider in the site's existing label language and leaves the module
   name as the largest thing in the list, which is what it should be. */
.modgroup__title {
  display: flex;
  align-items: center;
  gap: 16px;
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--ink-400);
  margin: 0 0 clamp(20px, 2.2vw, 26px);
}
.modgroup__title::after {
  content: '';
  flex: 1 1 auto;
  height: 1px;
  background: var(--line);
}

/* Equal 1fr tracks, not flex: a no-grow flex basis aligned the columns but left
   cards at their 260px floor in a 319px container on a phone, and letting them
   grow to fill made widths differ between groups (572px in the twos against
   370px in the three). 1fr tracks always fill and always match.

   Two columns, not three. Every group now holds two modules, so two columns fill
   every row exactly: no empty trailing cell anywhere, which is what three
   columns left under each pair (UB 8183671). Keep this in step with
   data/modules.yml: if a group ever holds an odd number again, the last row of
   that group goes back to having a gap. */
.modgroup__items {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: clamp(24px, 2.6vw, 40px);
}
@media (max-width: 620px) { .modgroup__items { grid-template-columns: 1fr; } }
.mod { min-width: 0; }
/* Sharper contrast between name and detail, so the modules scan as a list of
   capabilities first and prose second rather than as a run of equal paragraphs. */
.mod__name {
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 20px;
  line-height: 1.18;
  letter-spacing: -0.018em;
  margin: 0 0 7px;
  color: var(--ink-900);
}
.mod__body { margin: 0; color: var(--ink-500); font-size: 13.5px; line-height: 1.6; }

/* Architecture layers — clickable jump targets */
/* Tier marker. The numeral is what tells you these four blocks sit on each
   other; without it they read as four unrelated cards that happen to stack. */
.arch-layer__tier { display: flex; align-items: baseline; gap: 10px; }
.arch-layer__no {
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 600;
  color: #fff;
  letter-spacing: 0.04em;
}
.arch-layer__label {
  font-family: var(--font-mono);
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--ink-300);
}

/* The stack is a diagram, not navigation: it carried a pointer cursor and a
   hover colour but the only thing a click did was nudge the page down a little.
   The site thumbnails inside it are the real links, so the affordance lives on
   them instead. */
.arch-shot { display: block; }
.arch-shot img { transition: transform 600ms var(--ease-out); }
.arch-shot:hover img,
.arch-shot:focus-visible img { transform: scale(1.04); }

/* =========================================================
   FORM
   ========================================================= */

/* reCAPTCHA v3's floating badge, bottom-right of every page. Google permits
   hiding it on one condition: the branding must appear visibly in the user flow
   instead, which is what the .form-legal line inside every form now carries.
   Hiding it WITHOUT that line breaches their terms, so the two belong together
   and neither should be removed on its own.
   visibility rather than display, because the widget still has to be laid out
   for reCAPTCHA to score the visitor. */
.grecaptcha-badge { visibility: hidden; }

/* The legal line under a form's submit button. It exists to carry the link
   underline, which was eight inline styles waiting to happen as soon as the two
   Google links joined the privacy one. */
.form-legal a { border-bottom: 1px solid currentColor; }

/* A pair of fields on one line. This is a class rather than the inline grid these
   rows used to carry, because an inline style outranks every selector: the modal
   had to fight its own markup with a [style*="grid-template-columns:1fr 1fr"]
   hack, spelled twice to catch the declaration written with and without a space
   after the colon. One class covers all four forms, and a fifth gets it free. */
.field-row {
  display: grid;
  /* minmax(0,1fr), not 1fr, so a long placeholder cannot push the track wider
     than its container and take the page sideways with it. */
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 20px;
}

/* One field per line on phones. Two columns left each field 116px wide at 390px,
   against a "you@dealership.co.uk" placeholder needing 176px and "Dealership or
   OEM" needing 145px, so both were cut off mid-word. The modal already collapsed
   at this width and the page forms did not, which is the inconsistency here. */
@media (max-width: 560px) {
  .field-row {
    grid-template-columns: minmax(0, 1fr);
    /* row-gap, not gap: .field already carries margin-bottom:18px, so leaving the
       20px on would stack the two and give 38px between the fields inside a row
       against 18px between one row and the next. Measured 38/18/38 down the
       stacked form. Zeroing it lets .field's own margin set one rhythm. */
    row-gap: 0;
  }
}

.field {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-bottom: 18px;
}
.field__label {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-500);
}
.field__input,
.field__textarea {
  width: 100%;
  border: 0;
  border-bottom: 1.5px solid var(--ink-900);
  background: transparent;
  font-family: inherit;
  font-size: 17px;
  font-weight: 500;
  color: var(--ink-900);
  padding: 8px 0 10px 0;
  outline: none;
  transition: border-color 200ms var(--ease-out);
  letter-spacing: -0.005em;
  /* Came out 43px, one pixel under the 44px minimum. */
  min-height: 44px;
}
.field__input::placeholder,
.field__textarea::placeholder { color: var(--ink-300); font-weight: 400; }
.field__input:focus,
.field__textarea:focus { border-color: var(--accent); }
.field__textarea { resize: vertical; min-height: 100px; font-family: inherit; }

/* =========================================================
   CHIPS / FILTERS
   ========================================================= */

.chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 16px;
  border-radius: 999px;
  border: 1px solid var(--line);
  background: transparent;
  font-size: 13px;
  font-weight: 600;
  color: var(--ink-700);
  transition: all 200ms var(--ease-out);
  letter-spacing: -0.005em;
  /* Set explicitly so the element type cannot change the height: a <button>
     takes the UA's line-height:normal and came out 36px, while the <a> and
     <span> chips inherited the body's 1.55 and came out 38px. Same component,
     same role (the /blog category links vs the /about and /work filters), two
     different heights across pages. */
  line-height: 20px;
}
/* Only chips that actually do something get a pointer and a hover state: the
   /work filters (button) and the blog category links (a). Static label chips
   are plain spans and must not invite a click that goes nowhere. */
button.chip,
a.chip { cursor: pointer; }
button.chip:not(.chip--active):hover,
a.chip:not(.chip--active):hover { border-color: var(--ink-900); color: var(--ink-900); }
.chip--active { background: var(--ink-900); color: #fff; border-color: var(--ink-900); }
/* The active chip is already near-black with white type, so it must not take
   the light-background hover colour — that lands ink on ink and the label
   disappears. Lift the surface instead and keep the text white. */
button.chip--active:hover,
a.chip--active:hover { background: var(--ink-700); border-color: var(--ink-700); color: #fff; }
/* On phones these filters are thumb targets, and 38px is under the 44px
   minimum. Only the interactive chips grow: the static label chips are not
   targets, and nowhere do the two sit in the same row. */
@media (max-width: 760px) {
  button.chip,
  a.chip { min-height: 44px; }
}

/* =========================================================
   INTEGRATIONS GRID
   ========================================================= */

.integ {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: 14px;
  overflow: hidden;
}
.integ__cell {
  aspect-ratio: 5/3;
  background: var(--paper);
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  padding: 22px;
  transition: background 220ms var(--ease-out);
}
.integ__cell:hover {
  background: #fff;
  z-index: 1;
}
.integ__cell img {
  width: auto;
  height: 38px;
  max-width: 85%;
  object-fit: contain;
  opacity: 0.88;
  transition: opacity 220ms var(--ease-out);
}
.integ__cell:hover img { opacity: 1; }
/* Aspect-ratio buckets — assigned by JS once the natural dimensions load */
.integ__cell[data-ar="square"]   img { height: 56px; }
.integ__cell[data-ar="boxy"]     img { height: 48px; }
.integ__cell[data-ar="normal"]   img { height: 36px; }
.integ__cell[data-ar="wide"]     img { height: 28px; max-width: 88%; }
.integ__cell[data-ar="ultrawide"] img { height: 22px; max-width: 90%; }
/* "See every integration": the long tail behind a disclosure, so the section
   leads with the marks a dealer already runs. <details>, so it opens with no JS. */
.integ-more { margin-top: 16px; }
.integ-more > summary { list-style: none; }
.integ-more > summary::-webkit-details-marker { display: none; }
.integ-more > summary::marker { content: ''; }
.integ-more > summary {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 12px 0;
  cursor: pointer;
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--ink-900);
  -webkit-tap-highlight-color: transparent;
}
.integ-more__mark {
  position: relative;
  width: 20px;
  height: 20px;
  border: 1px solid var(--line);
  border-radius: 50%;
  flex: 0 0 auto;
  transition: border-color 200ms var(--ease-out);
}
.integ-more > summary:hover .integ-more__mark { border-color: var(--ink-400); }
.integ-more__mark::before,
.integ-more__mark::after {
  content: '';
  position: absolute;
  left: 50%;
  top: 50%;
  width: 8px;
  height: 1px;
  background: var(--ink-900);
  transform: translate(-50%, -50%);
  transition: transform 240ms var(--ease-out), opacity 180ms linear;
}
.integ-more__mark::after { transform: translate(-50%, -50%) rotate(90deg); }
.integ-more[open] .integ-more__mark::after {
  transform: translate(-50%, -50%) rotate(0deg);
  opacity: 0;
}
.integ--rest { margin-top: 4px; }
@media (prefers-reduced-motion: reduce) {
  .integ-more__mark, .integ-more__mark::before, .integ-more__mark::after { transition: none; }
}

.integ__name {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 10px;
  text-align: center;
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--ink-400);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  font-weight: 600;
  opacity: 0;
  transition: opacity 220ms var(--ease-out);
  pointer-events: none;
}
.integ__cell:hover .integ__name { opacity: 1; }
.integ__hidden { display: none !important; }
/* Ten lead marks, two per category. Five and two divide into ten exactly; the
   default six, four and three would each leave empty tracks, and an empty track
   in this grid shows as a line-coloured block because the grid lines are drawn
   by the container background. */
.integ--lead { grid-template-columns: repeat(5, 1fr); }
@media (max-width: 1100px) {
  .integ { grid-template-columns: repeat(4, 1fr); }
  .integ--lead { grid-template-columns: repeat(5, 1fr); }
}
@media (max-width: 700px) {
  .integ { grid-template-columns: repeat(3, 1fr); }
  /* Three, not two: the lead row holds fifteen marks, and two columns leaves a
     lone cell in a final row with the container's line colour showing beside it.
     Three divides cleanly and matches the grid directly below it. */
  .integ--lead { grid-template-columns: repeat(3, 1fr); }
  /* let grid items shrink below their logo's intrinsic width so 3 cols fit the phone viewport */
  .integ__cell { min-width: 0; padding: 14px; }
}

/* =========================================================
   FOOTER
   ========================================================= */

.footer {
  background: var(--night);
  color: #fff;
  padding: clamp(43px, 5.8vh, 72px) var(--gutter) 32px;
}
.footer__inner {
  max-width: var(--max);
  margin: 0 auto;
}
.footer__top {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr 1fr;
  gap: 60px;
  padding-bottom: 60px;
  border-bottom: 1px solid var(--line-dark);
}
.footer__brand img {
  height: 32px;
  width: auto;
  filter: brightness(0) invert(1);
  display: block;
}
.footer__tag {
  margin-top: 24px;
  color: var(--ink-300);
  max-width: 320px;
  font-size: 14px;
  line-height: 1.55;
}
/* Footer column headings are <h2> for a correct heading outline; this rule
   restyles them down to the small uppercase label they appear as. */
.footer__col h2 {
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ink-300);
  margin: 0 0 18px 0;
  line-height: 1.55;
}
/* Footer columns are <details open>. Above the one-column breakpoint the
   summary is inert and reads as a plain heading, so the footer looks exactly as
   it did; below it, each column becomes a tappable accordion row. Shipping them
   open means a no-JS visitor gets every list expanded rather than three headings
   they cannot open. */
.footer__col > summary {
  list-style: none;
  display: block;
  /* Above the breakpoint it is a heading, not a control: no pointer, and
     partials.js takes it out of the tab order so a keyboard user cannot
     collapse a column whose chevron is hidden. */
  cursor: default;
  pointer-events: none;
}
.footer__col > summary::-webkit-details-marker { display: none; }
.footer__col > summary::marker { content: ''; }
.footer__toggle { display: none; }

.footer__col ul { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 10px; }
.footer__col a, .footer__col li {
  font-size: 14px;
  color: #fff;
  opacity: 0.78;
  transition: opacity 200ms var(--ease-out);
  line-height: 1.5;
}
.footer__col a:hover { opacity: 1; color: var(--accent-light); }
.footer__bot {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-top: 32px;
  font-size: 12px;
  color: var(--ink-300);
  letter-spacing: -0.005em;
  flex-wrap: wrap;
  gap: 20px;
}
.footer__bot a { color: var(--ink-300); }
.footer__mtc {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-size: 12px;
  color: var(--ink-300);
}
/* The mtc. mark is a white-on-transparent PNG, so it is used as a mask and the
   colour comes from background-color. That is the only way to land an exact
   brand hex on hover from a raster asset: a filter chain cannot hit a specific
   colour, and swapping to mtc-logo.png would give #0F55C4, not #1055C4. */
.footer__mtc-link {
  display: inline-block;
  height: 14px;
  aspect-ratio: 800 / 316;
  background-color: #fff;
  opacity: 0.78;
  -webkit-mask-image: url("/assets/mtc-logo-white.png");
          mask-image: url("/assets/mtc-logo-white.png");
  -webkit-mask-repeat: no-repeat;
          mask-repeat: no-repeat;
  -webkit-mask-position: center;
          mask-position: center;
  -webkit-mask-size: contain;
          mask-size: contain;
  transition: background-color 200ms var(--ease-out), opacity 200ms var(--ease-out);
  position: relative;
}
/* The mark is only 14px tall, so give it a 44px hit area without moving it,
   the same trick .cstory-dot uses. Padding is not an option here: the mask is
   positioned against the border box, so it would scale with it. */
.footer__mtc-link::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 100%;
  min-width: 44px;
  height: 44px;
}
.footer__mtc-link:hover,
.footer__mtc-link:focus-visible { background-color: #1055C4; opacity: 1; }
.footer__mtc-link:focus-visible { outline: 2px solid #fff; outline-offset: 3px; }

@media (max-width: 900px) {
  .footer__top { grid-template-columns: 1fr 1fr; gap: 40px; }
}
@media (max-width: 480px) {
  /* P4: stack the footer to one column so "Proud product of" no longer wraps
     against the mtc. logo and the blurb column isn't squeezed. */
  .footer__top { grid-template-columns: 1fr; gap: 32px; }

  /* One column is where three expanded lists make the footer a long scroll, so
     this is where they collapse. Each row carries its own rule, so the grid gap
     goes, and so does the block's 60px bottom padding, which would otherwise
     leave a gap between the last row and the closing rule above the legal line. */
  .footer__top { gap: 0; padding-bottom: 0; }
  .footer__top > div:first-child { margin-bottom: 28px; }
  /* Measured from the reference screenshot (990x896 at 2x, so every value
     halves): 1px rules, 18px left inset, 16px bold heading, 15px links 36px
     apart baseline to baseline, an 18px circle with a 7x2 bar, 61px closed row. */
  .footer__col { border-top: 1px solid rgba(255, 255, 255, 0.18); }
  .footer__col > summary {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 21px 0;
    cursor: pointer;
    pointer-events: auto;
    -webkit-tap-highlight-color: transparent;
  }
  .footer__col > summary h2 {
    margin: 0;
    font-family: var(--font-display);
    font-size: 16px;
    font-weight: 700;
    letter-spacing: -0.01em;
    text-transform: none;
    color: #fff;
    line-height: 1.2;
  }
  .footer__toggle {
    display: block;
    position: relative;
    flex: 0 0 auto;
    width: 18px;
    height: 18px;
    border-radius: 50%;
    background: #fff;
  }
  .footer__toggle::before,
  .footer__toggle::after {
    content: '';
    position: absolute;
    left: 50%;
    top: 50%;
    width: 7px;
    height: 2px;
    background: var(--ink-900);
    transform: translate(-50%, -50%);
    transition: transform 240ms var(--ease-out), opacity 180ms linear;
  }
  .footer__toggle::after { transform: translate(-50%, -50%) rotate(90deg); }
  .footer__col[open] > summary .footer__toggle::after {
    transform: translate(-50%, -50%) rotate(0deg);
    opacity: 0;
  }
  /* 36px between baselines: 15px type on a 1.2 line box plus an 18px gap. */
  .footer__col > ul { gap: 18px; padding: 3px 0 24px; }
  .footer__col > ul a, .footer__col > ul li {
    font-size: 15px;
    font-weight: 400;
    line-height: 1.2;
    opacity: 0.9;
  }
}
@media (max-width: 480px) and (prefers-reduced-motion: reduce) {
  .footer__toggle::before, .footer__toggle::after { transition: none; }
}

/* =========================================================
   REVEAL
   ========================================================= */
/* Page transitions (section 5.5): cross-document view transitions so moving
   between pages feels like one product. Graceful — unsupported browsers just
   navigate. Quick fade, disabled under reduced motion. */
@view-transition { navigation: auto; }
::view-transition-old(root),
::view-transition-new(root) { animation-duration: 220ms; animation-timing-function: var(--ease-out); }
@media (prefers-reduced-motion: reduce) {
  @view-transition { navigation: none; }
}

.reveal {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity var(--dur-slow) var(--ease-out-expo), transform var(--dur-slow) var(--ease-out-expo);
  transition-delay: var(--delay, 0ms);
}
.reveal--in {
  opacity: 1;
  transform: translateY(0);
}
/* Above-the-fold reveals use a short, undelayed transition so hero content is
   visible within ~300ms of load (item 12); below-the-fold keeps the 800ms fade. */
.reveal--now {
  transition-duration: 280ms;
  transition-delay: 0ms;
}

/* Entrance motion is an enhancement only: with reduced motion requested, show
   content immediately and skip the transitions and parallax (item 12). */
@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
  .kw { opacity: 1 !important; transform: none !important; transition: none !important; }
  [data-parallax] { transform: none !important; }
}

/* =========================================================
   PAGE-HEAD
   ========================================================= */
.pagehead {
  padding: calc(var(--nav-h) + 90px) var(--gutter) clamp(58px, 8.6vh, 101px);
  background: var(--paper);
}
.pagehead__inner {
  max-width: var(--max);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 80px;
  align-items: end;
}
.pagehead__title {
  font-size: clamp(48px, 6.4vw, 100px);
  font-weight: 600;
  letter-spacing: -0.036em;
  line-height: 1;
}
.pagehead__meta { padding-bottom: 10px; }

/* Pagehead with hero media on the right — used on platform.html */
.pagehead__inner--media {
  grid-template-columns: 1.05fr 1fr;
  align-items: center;
  gap: 64px;
}
.pagehead__inner--media .pagehead__title {
  font-size: clamp(48px, 6.4vw, 100px);
  letter-spacing: -0.036em;
  line-height: 1;
  font-weight: 600;
}
.pagehead__visual {
  position: relative;
}
.pagehead__visual-inner {
  position: relative;
  perspective: 1800px;
}
.pagehead__browser {
  background: #11141B;
  border: 1px solid rgba(255,255,255,0.10);
  border-radius: 12px;
  overflow: hidden;
  box-shadow:
    0 60px 120px -20px rgba(15,16,22,0.35),
    0 30px 60px -30px rgba(15,16,22,0.30);
  transform: rotateY(-7deg) rotateX(2deg) rotate(-0.4deg);
  transform-origin: 60% 50%;
}
.pagehead__browser-bar {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 10px 14px;
  border-bottom: 1px solid rgba(255,255,255,0.08);
  font-family: var(--font-mono);
  font-size: 10px;
  color: rgba(255,255,255,0.55);
}
.pagehead__dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: rgba(255,255,255,0.18);
  display: inline-block;
}
.pagehead__url {
  margin-left: auto;
  margin-right: auto;
  padding-right: 70px;
}
.pagehead__tag {
  position: absolute;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: 12px;
  padding: 14px 18px;
  box-shadow: 0 20px 50px -10px rgba(15,16,22,0.18);
  z-index: 2;
  max-width: 220px;
}
.pagehead__tag--tl { left: -32px; top: 8%;    transform: rotate(-1.5deg); }
.pagehead__tag--tr { right: -28px; top: 6%;   transform: rotate(2.5deg); }
.pagehead__tag--bl { left: -24px;  bottom: 12%; transform: rotate(1.5deg); }
.pagehead__tag--br { right: -36px; bottom: 16%; transform: rotate(-2deg); }
.pagehead__tag-eyebrow {
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--ink-400);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  font-weight: 600;
}
.pagehead__tag-title {
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: -0.012em;
  margin-top: 6px;
  line-height: 1.25;
  color: var(--ink-900);
}

@media (max-width: 900px) {
  .pagehead__inner { grid-template-columns: 1fr; gap: 32px; }
  .pagehead__inner--media { gap: 40px; }
  .pagehead__browser { transform: none; }
  .pagehead__tag--tl { left: 8px; top: -16px; }
  /* keep things readable on mobile — hide the secondary tags */
  .pagehead__tag--tr,
  .pagehead__tag--bl,
  .pagehead__tag--br { display: none; }
}

/* =========================================================
   CASE CARDS
   ========================================================= */
.case {
  display: block;
  position: relative;
  overflow: hidden;
  border-radius: 10px;
  background: var(--ink-900);
  color: #fff;
  aspect-ratio: 4 / 5;
  transition: transform 480ms var(--ease-out), box-shadow 480ms var(--ease-out);
  will-change: transform;
}
.case:hover {
  transform: translateY(-6px);
  box-shadow: 0 28px 60px rgba(10, 12, 18, 0.22);
}
/* A tile carrying a verified result runs double-width, so the grid's hierarchy
   follows the evidence. The frame drops lower to leave room for the figure. */
.case--wide { grid-column: span 2; aspect-ratio: 16 / 10; }
.case--wide .case__frame { top: 148px; }
.case .browser img { transition: transform 600ms var(--ease-out); }
.case:hover .browser img { transform: scale(1.03); }
.case__frame {
  position: absolute;
  left: 6%; right: 6%; top: 104px; bottom: 24px;
  z-index: 1;
  display: flex; align-items: center; justify-content: center;
  transition: transform 600ms var(--ease-out);
}
.case__frame .browser { width: 100%; }
.case:hover .case__frame { transform: translateY(-4px) scale(1.015); }
.case__frame .browser {
  box-shadow: 0 24px 50px rgba(8, 10, 16, 0.45);
}
.case__veil { transition: opacity 480ms var(--ease-out); }
.case:hover .case__veil { opacity: 1; }
.case__brand { transition: transform 480ms var(--ease-out); }
.case:hover .case__brand { transform: translateY(-3px); }
.case__body {
  position: absolute;
  left: 26px; right: 26px; top: 22px;
  z-index: 2;
}
.case__brand {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 26px;
  letter-spacing: -0.024em;
  line-height: 1.05;
  text-shadow: 0 1px 14px rgba(0,0,0,0.55);
}
.case__type {
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.04em;
  color: rgba(255,255,255,0.78);
  margin-top: 9px;
  text-shadow: 0 1px 10px rgba(0,0,0,0.55);
}
.case__tag {
  font-size: 12px;
  font-weight: 500;
  opacity: 0.8;
  margin-top: 8px;
  letter-spacing: -0.005em;
}
/* Headline result on a case tile. Sized to read as evidence rather than as a
   caption, since on a portfolio page the number is the argument. */
.case__result {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 30px;
  letter-spacing: -0.032em;
  line-height: 1;
  margin-top: 14px;
  text-shadow: 0 1px 14px rgba(0, 0, 0, 0.6);
}
.case__veil {
  position: absolute; inset: 0;
  z-index: 1;
  background: linear-gradient(180deg, rgba(0,0,0,0.82) 0%, rgba(0,0,0,0.42) 22%, rgba(0,0,0,0) 45%);
}
/* .case__body is absolutely positioned and grows downwards, while .case__frame
   sits at a fixed offset. On a phone the tile is only ~267px wide, so a 26px
   brand name and a 30px result each wrap onto extra lines, the body outgrows
   that offset and the text (z-index 2) ends up printed over the mockup. Bring
   the type down to the tile's actual width and drop the frame to match. */
@media (max-width: 700px) {
  .case__brand { font-size: 19px; }
  .case__result { font-size: 21px; margin-top: 10px; }
  .case__type { margin-top: 7px; }
  .case__frame { top: 92px; }
  .case--wide .case__frame { top: 124px; }
}
/* The longest brand name ("Sandicliffe Motor Group") still ran into the mockup
   at 360px, which is a common phone width, so step the type down once more. */
@media (max-width: 430px) {
  .case__brand { font-size: 17px; }
  .case__result { font-size: 19px; }
  .case__frame { top: 100px; }
  .case--wide .case__frame { top: 132px; }
}

/* =========================================================
   TWO-COL
   ========================================================= */
.two-col {
  display: grid;
  grid-template-columns: 1fr 1.4fr;
  gap: clamp(40px, 6vw, 100px);
  align-items: start;
}
@media (max-width: 900px) { .two-col { grid-template-columns: 1fr; gap: 32px; } }

/* =========================================================
   UTILITIES
   ========================================================= */
.mt-1 { margin-top: 9px; }
.mt-2 { margin-top: 17px; }
/* The two-button CTA rows all carry .mt-3 plus an inline display:flex. With no
   wrap, the pair's min-content set the width of the whole block: on /platform
   "Book a demo" + "Browse integrations" pushed the page head 13px past a 360px
   viewport. flex-wrap is inert on the non-flex .mt-3 elements, so one rule here
   covers every row, including the generated blog pages. */
.mt-3 { margin-top: 29px; flex-wrap: wrap; }
.mt-4 { margin-top: 46px; }
.mt-5 { margin-top: 69px; }
.mb-3 { margin-bottom: 29px; }
.mb-4 { margin-bottom: 46px; }
.text-center { text-align: center; }
.muted { color: var(--ink-500); }
.divider { height: 1px; background: var(--line); border: 0; margin: 0; }
.divider--dark { background: var(--line-dark); }

/* =========================================================
   HERO SHELL — starts full-bleed, shrinks into inset card on scroll
   ========================================================= */
.hero-shell {
  --p: 0; /* 0 = full bleed, 1 = inset (driven by scroll JS) */
  --inset: 60px; /* clamped down by JS on narrow viewports so card never insets past the nav gutter */
  background: transparent;
  padding-top: 0;
  padding-right: calc(var(--p) * var(--inset));
  padding-bottom: 0;
  padding-left: calc(var(--p) * var(--inset));
}
.hero-shell__inner {
  margin: 0 auto;
  max-width: none;
}
.hero-shell .hero-card {
  position: relative;
  min-height: 100vh;
  min-height: 100svh;
  background: #07080A;
  border-radius: calc(var(--p) * clamp(18px, 2vw, 28px));
  overflow: hidden;
  color: #fff;
  isolation: isolate;
}
.hero-card__media {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: saturate(0.85) brightness(0.7) contrast(1.05);
  z-index: 0;
  opacity: 0;
  transition: opacity 1200ms var(--ease-out);
  /* Slow Ken Burns drift — paused until video is playing */
  transform: scale(1.04);
  animation: hero-ken-burns 28s ease-in-out 0s infinite alternate;
  animation-play-state: paused;
  will-change: transform, opacity;
}
.hero-card__media.is-playing {
  opacity: 1;
  animation-play-state: running;
}
@keyframes hero-ken-burns {
  0%   { transform: scale(1.04) translate3d(0, 0, 0); }
  100% { transform: scale(1.10) translate3d(-1.2%, -0.8%, 0); }
}
@media (prefers-reduced-motion: reduce) {
  .hero-card__media { animation: none; transform: none; }
}
.hero-card__poster {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: saturate(0.85) brightness(0.7) contrast(1.05);
  z-index: 0;
  transition: opacity 1400ms var(--ease-out);
}
.hero-card__media.is-playing ~ .hero-card__poster { opacity: 0; }
.hero-card__veil {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(180deg, rgba(8,9,12,0.30) 0%, rgba(8,9,12,0.10) 35%, rgba(8,9,12,0.85) 100%),
    radial-gradient(ellipse 70% 60% at 70% 35%, rgba(8,9,12,0) 0%, rgba(8,9,12,0.35) 100%);
  z-index: 1;
  pointer-events: none;
}

/* Top-left brand chip */
.hero-card__chip {
  position: absolute;
  top: clamp(20px, 3vw, 32px);
  left: clamp(20px, 3vw, 32px);
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 8px 16px;
  background: rgba(255,255,255,0.08);
  backdrop-filter: blur(20px) saturate(160%);
  -webkit-backdrop-filter: blur(20px) saturate(160%);
  border: 1px solid rgba(255,255,255,0.14);
  border-radius: 999px;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  font-weight: 600;
  color: rgba(255,255,255,0.92);
}
.hero-card__chip-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--autonomy-blue);
}

/* Top-right floating glass tag */
.hero-card__tag {
  position: absolute;
  top: clamp(20px, 3vw, 32px);
  right: clamp(20px, 3vw, 32px);
  z-index: 3;
  padding: 16px 20px;
  background: rgba(255,255,255,0.10);
  backdrop-filter: blur(20px) saturate(160%);
  -webkit-backdrop-filter: blur(20px) saturate(160%);
  border: 1px solid rgba(255,255,255,0.16);
  border-radius: 14px;
  max-width: 220px;
}
.hero-card__tag-eyebrow {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.85);
  display: flex;
  align-items: center;
  gap: 8px;
  font-weight: 600;
}
.hero-card__tag-eyebrow .pulse-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #5ED27F;
  animation: pulse-dot 1.6s ease-in-out infinite;
}
.hero-card__tag-title {
  margin-top: 8px;
  font-family: var(--font-display);
  font-size: 14px;
  font-weight: 600;
  line-height: 1.25;
  letter-spacing: -0.012em;
}

/* Bottom content block */
.hero-card__content {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding-top: clamp(23px, 2.9vh, 40px);
  padding-bottom: clamp(23px, 2.9vh, 40px);
  /* Content padding shrinks by exactly the card's inset — so text viewport-x always = nav gutter */
  padding-left: calc(var(--gutter) - var(--p) * var(--inset));
  padding-right: calc(var(--gutter) - var(--p) * var(--inset));
  z-index: 4;
}
.hero-card__content-inner {
  max-width: var(--max);
  margin: 0 auto;
  width: 100%;
}
.hero-card__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(46px, 6.2vw, 104px);
  line-height: 0.92;
  letter-spacing: -0.045em;
  margin: 0;
  max-width: 15ch;
  text-shadow: 0 2px 40px rgba(0,0,0,0.5);
}
.hero-card__row {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: clamp(24px, 4vw, 60px);
  align-items: end;
  margin-top: clamp(14px, 2.2vh, 26px);
}
.hero-card__lede {
  margin: 0;
  max-width: 48ch;
  font-size: clamp(14px, 1.05vw, 17px);
  line-height: 1.5;
  color: rgba(255,255,255,0.82);
  font-weight: 500;
}
.hero-card__actions {
  display: flex;
  align-items: center;
  gap: 18px;
  flex-wrap: wrap;
}

/* Mobile — card narrower, content stacks */
@media (max-width: 760px) {
  .hero-card { aspect-ratio: auto; min-height: 600px; }
  .hero-card__row { grid-template-columns: 1fr; gap: 24px; align-items: start; }
  .hero-card__tag { max-width: 180px; padding: 12px 14px; }
  .hero-card__chip { padding: 6px 12px; font-size: 10px; }
}

/* ---- Dark-electric hero treatment ------------------------------------- */
/* Hero CTAs: strong white primary + ghost secondary on the dark canvas. */
.btn--hero {
  display: inline-flex; align-items: center; gap: 10px;
  background: #fff; color: #08090B;
  padding: 15px 26px; border-radius: 999px;
  font-weight: 700; font-size: 15px; letter-spacing: -0.01em;
  border: 0; cursor: pointer;
  transition: transform .25s var(--ease-out), box-shadow .25s var(--ease-out);
}
.btn--hero:hover { transform: translateY(-2px); box-shadow: 0 16px 44px rgba(255, 255, 255, 0.22); }
.btn--hero .arrow { transition: transform .25s var(--ease-out); }
.btn--hero:hover .arrow { transform: translateX(4px); }
.btn--hero-ghost {
  display: inline-flex; align-items: center; gap: 10px;
  color: #fff; padding: 15px 24px; border-radius: 999px;
  font-weight: 600; font-size: 15px;
  border: 1px solid rgba(255, 255, 255, 0.28);
  transition: border-color .25s var(--ease-out), background .25s var(--ease-out);
}
.btn--hero-ghost:hover { border-color: #fff; background: rgba(255, 255, 255, 0.07); }

/* =========================================================
   FACTS — three-up stat cards (BC reference)
   ========================================================= */
.facts {
  background: var(--bg);
  padding: clamp(29px, 4.3vh, 52px) clamp(16px, 2.5vw, 32px);
}
.facts__inner {
  max-width: var(--max);
  margin: 0 auto;
}
.facts__head {
  max-width: 560px;
  margin-bottom: clamp(20px, 2.9vh, 35px);
}
.facts__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}
.fact-card {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: 18px;
  padding: 36px;
  min-height: 220px;
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: 14px;
  transition: transform 600ms var(--ease-out), opacity 600ms var(--ease-out);
}
.fact-card__chip {
  position: absolute;
  top: 28px;
  right: 28px;
  padding: 6px 12px;
  border: 1px solid var(--line);
  border-radius: 999px;
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--ink-500);
}
.fact-card__num {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(48px, 5.5vw, 84px);
  letter-spacing: -0.045em;
  line-height: 0.95;
  color: var(--ink-900);
}
.fact-card__label {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-500);
  font-weight: 600;
  max-width: 30ch;
}
.fact-card--dark {
  background: var(--ink-900);
  border-color: transparent;
  color: #fff;
}
.fact-card--dark .fact-card__num { color: #fff; }
.fact-card--dark .fact-card__label { color: rgba(255,255,255,0.65); }
.fact-card--dark .fact-card__chip {
  color: rgba(255,255,255,0.85);
  border-color: rgba(255,255,255,0.18);
  background: rgba(255,255,255,0.04);
}

@media (max-width: 900px) {
  .facts__grid { grid-template-columns: 1fr 1fr; }
  .fact-card:last-child { grid-column: 1 / -1; }
}
@media (max-width: 600px) {
  .facts__grid { grid-template-columns: 1fr; }
  .fact-card:last-child { grid-column: auto; }
  .fact-card { padding: 28px; min-height: 180px; }
}

/* Split cards (Dealerships / OEMs) — bold editorial entry points */
.split-card { cursor: pointer; }
.split-card .split-card__bg { will-change: transform, filter; }
.split-card:hover .split-card__bg { transform: scale(1.05); filter: saturate(0.95) brightness(0.7) contrast(1.05); }


/* Mobile sticky demo CTA (section 8): slim, bottom-anchored, thumb reach,
   appears after the hero, dismissable, safe-area aware. Desktop hides it. */
.demo-bar { display: none; }
@media (max-width: 900px) {
  .demo-bar {
    display: flex; align-items: center; gap: 8px;
    position: fixed; left: 12px; right: 12px;
    bottom: calc(12px + env(safe-area-inset-bottom, 0px));
    z-index: 90;
    background: rgba(10, 12, 16, 0.9);
    backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);
    border: 1px solid rgba(255, 255, 255, 0.12);
    border-radius: 999px;
    padding: 8px;
    box-shadow: 0 12px 40px rgba(0, 0, 0, 0.3);
    transform: translateY(160%); opacity: 0; pointer-events: none;
    transition: transform var(--dur-base) var(--ease-out-expo), opacity var(--dur-fast) var(--ease-out);
  }
  .demo-bar.is-visible { transform: translateY(0); opacity: 1; pointer-events: auto; }
  .demo-bar__cta {
    flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    background: #fff; color: #0A0C10; text-decoration: none;
    font-weight: 700; font-size: 15px; border-radius: 999px; padding: 13px 18px;
  }
  .demo-bar__close {
    flex: 0 0 auto; width: 44px; height: 44px; border-radius: 999px;
    background: transparent; border: 0; color: rgba(255, 255, 255, 0.7);
    cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
  }
}
@media (max-width: 900px) and (prefers-reduced-motion: reduce) {
  .demo-bar { transition: opacity var(--dur-fast) var(--ease-out); transform: none; }
  .demo-bar.is-visible { transform: none; }
}

/* Keyword strip under the title */
.split-card__keys {
  margin-top: 22px;
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  font-family: var(--font-mono);
  font-size: 11px;
  color: rgba(255,255,255,0.75);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  font-weight: 600;
}
.split-card__keys span:nth-child(even) { color: rgba(255,255,255,0.3); }

/* Big circular arrow CTA — anchored bottom-right, grows on hover */
.split-card__cta {
  position: absolute;
  right: 30px;
  bottom: 30px;
  width: 72px;
  height: 72px;
  border-radius: 50%;
  background: #fff;
  color: #0A0C12;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 14px 32px rgba(0,0,0,0.30);
  transition: transform 360ms var(--ease-out), background 360ms var(--ease-out), color 360ms var(--ease-out);
  z-index: 4;
}
.split-card__cta svg { transition: transform 320ms var(--ease-out); }
.split-card:hover .split-card__cta {
  background: var(--ink-900);
  color: #fff;
  transform: scale(1.15) rotate(-2deg);
}
.split-card:hover .split-card__cta svg { transform: translateX(3px); }

.split-card:hover .split-card__title {
  /* subtle lift */
  transform: translateY(-2px);
}
.split-card__title { transition: transform 360ms var(--ease-out); }

@media (max-width: 700px) {
  .split-card__cta { width: 56px; height: 56px; right: 16px; bottom: 16px; }
}

/* =========================================================
   RESPONSIVE — mobile nav, modal, grid safety nets
   ========================================================= */

/* ---- Mobile hamburger + slide-down menu ---- */
.nav__burger { display: none; }
.nav__mobile { display: none; }

@media (max-width: 860px) {
  .enquiry-grid { grid-template-columns: 1fr !important; }
}
@media (max-width: 1024px) {
  .nav__links { display: none !important; }
  .nav__cta { display: none; }   /* lives inside the mobile menu instead */
  .nav__burger {
    display: flex; flex-direction: column; justify-content: center; gap: 5px;
    width: 44px; height: 44px; margin-left: auto; padding: 0 11px;
    border-radius: 12px; background: rgba(14,16,20,0.06);
    color: inherit; cursor: pointer; border: 0;
    /* Pull the button out by its own padding so the visible bars sit on the
       gutter, level with the wordmark opposite. The button box was already
       correct at 28px; the bars landed 11px inside it, which reads as an uneven
       nav. Touch target stays 44px. */
    margin-right: -11px;
  }
  .nav--dark .nav__burger { background: rgba(255,255,255,0.12); }
  .nav__burger span {
    display: block; height: 2px; width: 100%; background: currentColor; border-radius: 2px;
    transition: transform 280ms var(--ease-out), opacity 180ms var(--ease-out);
  }
  .nav__burger[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
  .nav__burger[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
  .nav__burger[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

  .nav__mobile {
    display: block;
    position: fixed; top: var(--nav-h); left: 0; right: 0; bottom: 0;
    overflow-y: auto;
    background: var(--paper);
    border-bottom: 1px solid var(--line);
    box-shadow: 0 30px 40px -12px rgba(10,12,18,0.16);
    padding: 10px 0 22px;
    transform: translateY(-12px);
    opacity: 0; visibility: hidden; pointer-events: none;
    transition: opacity 260ms var(--ease-out), transform 260ms var(--ease-out), visibility 0s linear 260ms;
    z-index: 99;
  }
  .nav__mobile[data-open="true"] {
    opacity: 1; visibility: visible; pointer-events: auto; transform: translateY(0);
    transition: opacity 260ms var(--ease-out), transform 260ms var(--ease-out);
  }
  /* Full-height opaque panel (.nav__mobile: top:nav-h -> bottom:0) covers the
     page while open, so no separate dim backdrop is needed. Scroll lock is
     applied to <body> from partials.js. */
  /* While the menu is open, fill the top bar so the page no longer shows
     through the strip above the panel (the "gap at the top"). The panel is
     always light, so force the burger + logo to ink regardless of nav theme.
     :has() outranks .nav--dark.nav--scrolled, which otherwise keeps it clear. */
  .nav:has(.nav__mobile[data-open="true"]) {
    background: var(--paper);
    /* Clear the peek frost and any hide transform while the menu is open: both
       backdrop-filter and transform make .nav the containing block for the fixed
       .nav__mobile panel, collapsing it to the bar height. */
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    transform: none;
  }
  .nav:has(.nav__mobile[data-open="true"]) .nav__burger {
    background: rgba(14, 16, 20, 0.06);
    color: var(--ink-900);
  }
  .nav:has(.nav__mobile[data-open="true"]) .brand img {
    filter: none;
  }
  /* Keep the logo visible in the open menu even when the nav is scrolled
     (.nav--scrolled otherwise hides .brand). */
  .nav:has(.nav__mobile[data-open="true"]) .brand {
    opacity: 1; visibility: visible; transform: none;
  }
  .nav__mobile-link {
    display: block; padding: 15px var(--gutter);
    font-family: var(--font-display); font-size: 19px; font-weight: 600;
    color: var(--ink-900); letter-spacing: -0.018em;
    border-bottom: 1px solid var(--line-soft);
  }
  .nav__mobile-link.nav__link--active {
    background: none;
    color: var(--ink-900);
    box-shadow: inset 3px 0 0 var(--ink-900);
  }
  .nav__mobile-cta {
    margin: 18px var(--gutter) 0;
    display: flex; justify-content: center;
  }
}
.nav--scrolled .nav__burger { pointer-events: auto; }

/* U4: the primary action stays reachable regardless of the card's height. The
   card is the scroll container, so the submit sticks to its bottom edge instead
   of sitting 90px below the fold. No fields removed, no wording changed. */
.modal__card form > button[type="submit"] {
  position: sticky;
  bottom: 0;
  z-index: 2;
}
.modal__card form > button[type="submit"]::before {
  /* a short fade so content scrolling underneath does not collide with the pill */
  content: '';
  position: absolute;
  left: -22px; right: -22px; bottom: 100%;
  height: 20px;
  background: linear-gradient(to top, var(--paper), rgba(255,255,255,0));
  pointer-events: none;
}
.modal__card:focus-visible { outline: none; }

/* ---- Modal: comfortable on small screens ---- */
@media (max-width: 560px) {
  .modal { padding: 12px; }
  .modal__card { padding: 30px 22px; max-height: calc(100vh - 24px); }
  .modal__card h3 { font-size: 30px !important; }
  /* The two [style*="grid-template-columns…"] selectors that used to live here
     are gone: those rows carry .field-row now, which collapses at this same
     560px in the FORM section, for the page forms as well as this one. */
}

/* ---- Grid safety: collapse multi-column layouts on small screens ---- */
/* minmax(0,1fr) (not 1fr) + min-width:0 so a wide/unbreakable child can't blow
   the track past the container and cause horizontal page overflow. */
@media (max-width: 820px) {
  .rg-4, .rg-5, .rg-6 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
  .rg-2to1 { grid-template-columns: minmax(0, 1fr) !important; }
  [data-page="work"] [data-integ-grid]:not(.integ) { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
  .rg-2to1 > *, .rg-3 > *, .rg-4 > *, .rg-5 > *, .rg-6 > * { min-width: 0; }
}
@media (max-width: 560px) {
  .rg-3, .rg-4, .rg-5, .rg-6 { grid-template-columns: minmax(0, 1fr) !important; }
  [data-page="work"] [data-integ-grid]:not(.integ) { grid-template-columns: minmax(0, 1fr) !important; }
}
/* Opt back out of that single-column fallback for the featured-case figures.
   They are only four characters wide, so stacking three of them ate most of a
   phone screen and pushed the site mock out of view (UB 8183751). Overriding
   .rg-3's !important needs !important back, and the figure size is an inline
   style, so that needs it too. */
@media (max-width: 560px) {
  .statrow {
    grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
    gap: 12px !important;
  }
  .statrow .num { font-size: 30px !important; }
  .statrow .tiny { font-size: 10px; letter-spacing: 0.02em; }
}

/* ---- Work page: case grid becomes a swipe carousel on phones ---- */
@media (max-width: 700px) {
  [data-page="work"] [data-integ-grid]:not(.integ) {
    display: flex !important;
    grid-template-columns: none !important;
    flex-wrap: nowrap;
    gap: 16px;
    overflow-x: auto;
    overflow-y: hidden;
    scroll-snap-type: x mandatory;
    scroll-padding: 0 var(--gutter);
    -webkit-overflow-scrolling: touch;
    margin-left: calc(var(--gutter) * -1);
    margin-right: calc(var(--gutter) * -1);
    padding: 6px var(--gutter) 18px;
    scrollbar-width: none;
  }
  [data-page="work"] [data-integ-grid]:not(.integ)::-webkit-scrollbar { display: none; }
  [data-page="work"] [data-integ-grid]:not(.integ) .case {
    flex: 0 0 80%;
    scroll-snap-align: center;
  }
  /* Every card in the mobile carousel is the same width, so a "wide" tile would
     just be a short one. Match the standard ratio; the frame keeps its lower
     offset so the result figure still has room. */
  [data-page="work"] [data-integ-grid]:not(.integ) .case--wide {
    grid-column: auto;
    aspect-ratio: 4 / 5;
  }
}



/* =========================================================
   UX AUDIT, BATCH 1
   ========================================================= */

/* U1: the sticky demo bar is 67px tall with a 12px inset, so it covers the
   carousel's dots at the one scroll position where the section snaps to the top
   of the viewport. Reserving clearance below the control row means the dots can
   always be brought clear, and stops the bar clipping the logo wall at the end
   of the page. Not a z-index change: the bar has to stay above content. */
:root { --bar-h: 79px; }   /* 67px bar + 12px inset */
@media (max-width: 900px) {
  .cstory__dots { margin-bottom: var(--bar-h); }
  body:has([data-demo-bar].is-visible) { padding-bottom: var(--bar-h); }
}

/* U5: the direct contact routes. Both are 44px targets. */
.nav__mobile-direct {
  display: flex; flex-direction: column;
  margin: 18px var(--gutter) 0;
  border-top: 1px solid var(--line);
  padding-top: 6px;
}
.nav__mobile-contact {
  display: flex; align-items: center; min-height: 44px;
  font-size: 16px; font-weight: 500;
  color: var(--ink-700); text-decoration: none;
}
.nav__mobile-contact:hover { color: var(--ink-900); }
.cta-direct {
  /* Separated from the button row rather than crowding it: the two routes are an
     alternative to the primary action, not a caption for it. */
  margin-top: 36px;
  padding-top: 28px;
  border-top: 1px solid rgba(255,255,255,0.14);
  display: flex;
  gap: 4px 44px;
  justify-content: center;
  flex-wrap: wrap;
}
.cta-direct__link {
  display: inline-flex;
  align-items: center;
  min-height: 44px;          /* WCAG 2.5.8 target size */
  padding: 4px 2px;
  color: rgba(255,255,255,0.92);
  text-decoration-line: underline;
  text-decoration-color: rgba(255,255,255,0.3);
  text-underline-offset: 5px;   /* the underline sat tight against the text */
  text-decoration-thickness: 1px;
  font-size: 16px;
  font-weight: 500;
}
.cta-direct__link:hover,
.cta-direct__link:focus-visible { color: #fff; text-decoration-color: #fff; }


/* =========================================================
   UX AUDIT, BATCH 2
   ========================================================= */

/* U11: --ink-400 (#80848D) measures 3.44:1 on cream and 3.75:1 on paper, so it
   clears the 3:1 large-text threshold and fails the 4.5:1 normal-text one. The
   01 to 04 feature numerals render at 11px on desktop, where that is a WCAG
   1.4.3 failure. --ink-500 measures 5.88:1 on cream. */
/* Matched at the specificity of the rule it has to beat: home.css carries
   .pin.pin--light .stage__no { color: var(--ink-400) } for inactive stages, which
   is where the 3.75:1 reading came from. The active stage was already ink-900. */
.pin .stage__no,
.pin.pin--light .stage__no,
.pin.pin--light .stage:not(.is-active) .stage__no { color: var(--ink-500); }

/* U6, WCAG 2.5.8 Target Size Minimum: 24 of 40 interactive elements were under
   44x44 at 390. Hit areas grow via padding; no font size changes, since type is
   out of scope for this audit. */
.footer__col a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}
.footer__col ul { gap: 0; }            /* the min-height now supplies the rhythm */
.footer__bot a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}
/* The footer column headings double as the collapse toggles and were 260x17. */
.footer__col summary { min-height: 44px; display: flex; align-items: center; }
/* The three live case-study URLs were 17px tall and are the links that prove the
   work is real. */
.cstory__site {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}
/* Text CTAs: "See selected work", "See all case studies", "Or say hello". */
.btn--bare { min-height: 44px; }
/* The logotype was a 160x24 target. */
.brand { min-height: 44px; }
.skip-link { min-height: 44px; box-sizing: border-box; }

/* U13, WCAG 1.4.13: these states existed on :hover only, so touch and keyboard
   users never saw them. Pairing each with :focus-visible, and using :focus-within
   where the state belongs to a container holding the focusable element. */
.logo-wall .cell:focus-within img { opacity: 1; }
.integ__cell:focus-within img { opacity: 1; }
.integ__cell:focus-within .integ__name { opacity: 1; }
.case:focus-within .case__veil { opacity: 1; }
.case:focus-within .browser img { transform: scale(1.03); }
.case:focus-within .case__frame { transform: translateY(-4px) scale(1.015); }
.case:focus-within .case__brand { transform: translateY(-3px); }
.work-strip__more:focus-visible::after { transform: translateX(4px); }
.btn--bare:focus-visible::after { transform: translateX(4px); }

/* =========================================================
   Cookie consent banner (partials/consent.html)
   =========================================================
   Injected on every page by build.py whenever GTM_ID is set. Fixed rather than
   in the flow: site.js unhides it after reading the stored choice, and a banner
   entering the flow at that moment would shove the page down under whoever was
   already reading it.
   z-index sits above the mobile demo bar (90) but below the mobile menu (99),
   the nav (100) and the modal (1000), so it never covers navigation chrome. */

/* `hidden` alone is not enough here: the UA's [hidden]{display:none} loses to
   any author display value, so .consent's own display below would defeat the
   attribute. This rule (0,2,0) restores it. */
.consent[hidden] { display: none; }

.consent {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 95;
  display: flex;
  justify-content: center;
  padding: 0 var(--gutter) clamp(14px, 2vh, 24px);
  /* The wrapper spans the viewport so the card can centre in it. Without this
     its empty flanks would swallow clicks on the page behind. */
  pointer-events: none;
}

.consent__card {
  pointer-events: auto;
  width: 100%;
  max-width: 820px;
  display: flex;
  align-items: center;
  gap: clamp(16px, 2vw, 28px);
  padding: 18px clamp(18px, 2vw, 24px);
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: clamp(18px, 2vw, 28px);
  box-shadow: 0 18px 50px rgba(10, 12, 16, 0.18);
}

.consent__text {
  margin: 0;
  font-size: 13.5px;
  line-height: 1.55;
  color: var(--ink-500);
}
.consent__lead { font-weight: 700; color: var(--ink-900); }
.consent__link { color: var(--ink-900); border-bottom: 1px solid currentColor; }

.consent__actions { flex: 0 0 auto; display: flex; gap: 10px; }

/* Both actions are the same size and both are solid-edged: see the note in
   partials/consent.html on why reject cannot be the quieter one. */
.consent__btn {
  font-size: 13px;
  padding: 12px 18px;
  min-height: 44px;
  box-sizing: border-box;
  justify-content: center;
}
.consent__btn--accept { background: var(--ink-900); color: #fff; border: 1px solid var(--ink-900); }
.consent__btn--accept:hover { background: var(--ink-700); border-color: var(--ink-700); }
.consent__btn--reject { background: transparent; color: var(--ink-900); border: 1px solid var(--ink-900); }
.consent__btn--reject:hover { background: var(--bg-2); }

/* Two bottom-anchored bars at once is one too many. The demo bar is only ever
   displayed below 900px, at (0,1,0) inside its media query; this (0,3,0)
   outranks it without needing !important. */
body:has(.consent:not([hidden])) .demo-bar { display: none; }

@media (max-width: 700px) {
  .consent__card { flex-direction: column; align-items: stretch; gap: 14px; }
  .consent__actions { display: grid; grid-template-columns: 1fr 1fr; }
}
