/*
 * VaultPac service pages.
 *
 * Loads after styles.css and adds only what the generated pages need. Every
 * colour here is one of the brand tokens already defined there — --green,
 * --green-text, --ink, --muted, --surface, --line — so the service pages cannot
 * drift into a second palette, and a brand change made in one file changes
 * ninety-two pages.
 *
 * The visual argument these pages have to make is "movement orchestration,
 * custody and dispatch", not "here is a black car". That is why the recurring
 * shapes are a timeline, a structural flow and a capability grid rather than
 * vehicle photography.
 */

/* ---- Skip link. Ninety-two pages of nav before the content is a lot of
   tabbing for somebody who cannot use a mouse. ---- */
.skip-link {
  position: absolute; left: -9999px; top: 0; z-index: 100;
  background: var(--ink); color: #fff; padding: 12px 20px; border-radius: 0 0 4px 0;
  font-size: 13px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase;
}
.skip-link:focus { left: 0; }

/* Visible focus everywhere. The default outline is removed in places by
   styles.css for inputs; this puts a consistent one back on everything
   interactive rather than leaving keyboard users to guess. */
.svc-doc a:focus-visible,
.svc-doc button:focus-visible,
.svc-doc input:focus-visible,
.svc-doc textarea:focus-visible {
  outline: 3px solid var(--green-text);
  outline-offset: 2px;
  border-radius: 2px;
}

.svc-doc { overflow-x: hidden; }
.svc-main { display: block; }
/* A reading measure, not a narrower page.
   `.wrap` centres itself, so constraining the wrap to 760px also re-centres it
   — and the left edge then jumps between a full-width section and a text one,
   which reads as two different templates stitched together. Constraining the
   children instead keeps every section starting on the same line while text
   still stops at a comfortable measure. */
.svc-narrow > * { max-width: 760px; }

/* ---- Reclaiming <nav> ----
   styles.css styles the bare `nav` element as the site header: fixed to the
   top, full width, flex, blurred background. That is fine while there is one
   nav on the page, and these pages have three — the header, the breadcrumb
   trail and the footer's family links. Both of the new ones are genuinely
   navigation and should stay `<nav>` for assistive technology, so the fix is
   to undo the header's positioning on them rather than to downgrade them to
   divs. Without this, the breadcrumbs and the footer links are both painted
   over the header and the header disappears.

   Four now, with the family strip. It is the same trap and it caught the same
   way: a new <nav> added to the footer rendered as a white bar floating over
   the top of the page, and the first sign of it was a contrast check
   reporting near-white links on a near-white ground. Anything semantically
   navigation that is not the header belongs in this list. */
.crumbs, .footer-fams, .footer-family {
  position: static;
  inset: auto;
  z-index: auto;
  display: block;
  padding: 0;
  background: transparent;
  backdrop-filter: none;
  border-bottom: none;
  justify-content: initial;
  align-items: initial;
}

/* ---- Breadcrumbs ---- */
.crumbs { border-bottom: 1px solid var(--line); background: var(--bg); }
.crumbs ol { list-style: none; display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; padding: 14px 0; margin: 0; font-size: 12.5px; }
.crumbs li { display: flex; align-items: center; gap: 10px; color: var(--muted); }
.crumbs li + li::before { content: '/'; color: var(--line); }
.crumbs a { color: var(--muted); font-weight: 600; }
.crumbs a:hover { color: var(--ink); text-decoration: underline; }
.crumbs [aria-current='page'] { color: var(--ink); font-weight: 600; }

/* ---- Hero ----
   Deliberately not the split-screen hero from the homepage. A service page is
   a reading page: one column, a wide measure for the heading and a narrow one
   for the sub, so long service titles wrap somewhere sensible. */
.svc-hero { padding: 54px 0 46px; border-bottom: 1px solid var(--line); background: linear-gradient(180deg, var(--surface) 0%, var(--bg) 100%); }
.svc-hero.has-media { border-bottom: 1px solid rgba(255,255,255,0.08); }
.svc-hero h1 { font-size: clamp(32px, 5.2vw, 56px); max-width: 17ch; margin: 0; line-height: 1.04; }
.svc-hero .svc-sub { font-size: clamp(16px, 2vw, 19px); color: var(--muted); max-width: 62ch; margin: 20px 0 0; line-height: 1.55; }
.fam-hero h1 { max-width: 20ch; }

.svc-status { display: inline-block; margin-top: 22px; padding: 6px 14px; border-radius: 40px; font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; font-weight: 700; border: 1.5px solid; }
.st-expansion { color: var(--green-text); border-color: rgba(111,133,18,0.4); background: rgba(168,197,32,0.12); }
.st-later { color: #8a6d1f; border-color: rgba(138,109,31,0.35); background: rgba(138,109,31,0.08); }
.st-deprioritized, .st-future { color: #6b6f60; border-color: var(--line); background: var(--surface-2); }
.st-historical { color: var(--muted); border-color: var(--line); background: var(--surface); }

.svc-cta-row { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 30px; }
.svc-cta-row .btn { flex: 0 1 auto; }
.svc-cta-note { font-size: 13px; color: var(--muted); margin-top: 14px; }
.svc-fam-line { font-size: 12.5px; color: var(--muted); margin-top: 20px; letter-spacing: 0.02em; }
.svc-fam-line a { color: var(--green-text); font-weight: 600; text-decoration: underline; text-underline-offset: 2px; }

/* ---- Media hero ----
   The artwork is an <img> rather than a CSS background: it gets srcset, an
   explicit box so the page does not jump as it loads, and fetchpriority, none
   of which a background-image can have. The scrim is baked into the dark
   artwork, and the gradient here is the safety net for the photographic hero,
   which has no scrim of its own. */
.svc-hero.has-media { position: relative; isolation: isolate; background: var(--ink); border-bottom: none; padding: clamp(56px, 9vw, 104px) 0 clamp(48px, 7vw, 84px); overflow: hidden; }
.svc-hero-media { position: absolute; inset: 0; z-index: -2; }
.svc-hero-img { width: 100%; height: 100%; object-fit: cover; object-position: center right; display: block; }
/* The scrim is tuned per image rather than once.
   `tone-art` — the drawn heroes already carry a scrim baked into the SVG, so
     this is only a floor under the headline.
   `tone-dark` — photography in the approved direction: 71/255 mean luminance
     and 3% highlights. The heavy scrim turned that to mud, so it barely
     lifts a finger here and lets the picture be the picture.
   `tone-light` — a bright photograph like the convention concourse, where white
     type needs real help. */
.svc-hero.has-media::after {
  content: ''; position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(100deg, rgba(20,22,15,0.88) 0%, rgba(20,22,15,0.62) 38%, rgba(20,22,15,0.22) 72%, rgba(20,22,15,0.06) 100%);
}
.svc-hero.has-media.tone-dark::after {
  background: linear-gradient(100deg, rgba(20,22,15,0.9) 0%, rgba(20,22,15,0.8) 45%, rgba(20,22,15,0.46) 72%, rgba(20,22,15,0.12) 100%);
}
.svc-hero.has-media.tone-light::after {
  background: linear-gradient(100deg, rgba(20,22,15,0.94) 0%, rgba(20,22,15,0.82) 38%, rgba(20,22,15,0.45) 72%, rgba(20,22,15,0.2) 100%);
}
/* Below 900px the text column spans the full width, so a left-to-right scrim
   runs out underneath it — the CTA note and family line sit at the bottom
   right of the hero, which is exactly where it has cleared. Vertical coverage
   instead. Measured at 1.8:1 before this, against those elements' own colour
   rather than an assumed white, which is what hid it the first two times. */
@media (max-width: 900px) {
  .svc-hero.has-media::after {
    background: linear-gradient(180deg, rgba(20,22,15,0.86) 0%, rgba(20,22,15,0.8) 50%, rgba(20,22,15,0.82) 100%);
  }
  .svc-hero.has-media.tone-dark::after {
    background: linear-gradient(180deg, rgba(20,22,15,0.8) 0%, rgba(20,22,15,0.74) 50%, rgba(20,22,15,0.78) 100%);
  }
  .svc-hero.has-media.tone-light::after {
    background: linear-gradient(180deg, rgba(20,22,15,0.9) 0%, rgba(20,22,15,0.86) 50%, rgba(20,22,15,0.88) 100%);
  }
  .mv-band::after {
    background: linear-gradient(180deg, rgba(20,22,15,0.9) 0%, rgba(20,22,15,0.86) 100%);
  }
}

/* Photography gets a floor across the whole frame as well: a gradient alone
   leaves the bottom-right corner unprotected, which is where a hero's CTA note
   and family line sit. */
.svc-hero.has-media.tone-dark .svc-hero-body,
.svc-hero.has-media.tone-light .svc-hero-body { text-shadow: 0 1px 14px rgba(0,0,0,0.5); }
.svc-hero-body { position: relative; }
.svc-hero.has-media h1 { color: #fff; }
.svc-hero.has-media .eyebrow { color: var(--green-bright); }
.svc-hero.has-media .svc-sub { color: #e6e9dc; }
.svc-hero.has-media .svc-cta-note { color: #ced2c3; }
.svc-hero.has-media .svc-fam-line { color: #ced2c3; }
.svc-hero.has-media .svc-fam-line a { color: var(--green-bright); }
/* The outline button inherits ink-on-white from styles.css, which is invisible
   on a dark hero. */
.btn-on-dark { border-color: rgba(255,255,255,0.45); color: #fff; }
.btn-on-dark:hover { background: #fff; border-color: #fff; color: var(--ink); }
.svc-hero.has-media .st-expansion { color: var(--green-bright); border-color: rgba(188,212,53,0.5); background: rgba(188,212,53,0.14); }
.svc-hero.has-media .st-later { color: #e2c66a; border-color: rgba(226,198,106,0.45); background: rgba(226,198,106,0.12); }
.svc-hero.has-media .st-deprioritized,
.svc-hero.has-media .st-future { color: #c9cdbc; border-color: rgba(255,255,255,0.28); background: rgba(255,255,255,0.08); }

/* ---- Split text / media ---- */
.split { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr); gap: clamp(28px, 5vw, 64px); align-items: start; }
.split-text > p + p { margin-top: 16px; }
.split-media { margin: 0; border-radius: 8px; overflow: hidden; border: 1px solid var(--line); background: var(--surface); position: sticky; top: calc(var(--nav-h) + 26px); }
.split-media img { display: block; width: 100%; height: auto; }
/* A diagram is a figure with a caption, not a picture with a label. The rule
   above it separates the drawing from the reading. */
.fig-cap { padding: 14px 18px 16px; font-size: 13px; line-height: 1.5; color: var(--muted); border-top: 1px solid var(--line); background: var(--bg); }
.fig-k { display: block; font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; font-weight: 700; color: var(--green-text); margin-bottom: 5px; }
.split-media.is-diagram { background: var(--bg); }
@media (max-width: 900px) {
  .split { grid-template-columns: 1fr; }
  /* Above the text on a phone: a 4:3 panel wedged beside a paragraph at 390px
     is unreadable as both. */
  .split-media { position: static; order: -1; }
}

/* ---- Movement band ---- */
.mv-band { position: relative; isolation: isolate; background: var(--ink); color: #e7e9df; border-top: none; overflow: hidden; padding: clamp(56px, 8vw, 88px) 0; }
.mv-band-media { position: absolute; inset: 0; z-index: -2; }
.mv-band-img { width: 100%; height: 100%; object-fit: cover; display: block; }
.mv-band::after { content: ''; position: absolute; inset: 0; z-index: -1; background: linear-gradient(100deg, rgba(20,22,15,0.92) 0%, rgba(20,22,15,0.7) 55%, rgba(20,22,15,0.42) 100%); }
.mv-band-body { position: relative; }
.mv-band h2 { color: #fff; }
.mv-band .mv-label { color: #fff; }
.mv-band .mv-note { color: #b6bbaa; }
.mv-band .mv-dot { border-color: var(--ink); box-shadow: 0 0 0 2px var(--green-bright); background: var(--green-bright); }
.mv-band .mv-step:not(:last-child) .mv-dot::after { background: linear-gradient(180deg, var(--green-bright) 0%, rgba(188,212,53,0.2) 100%); }

/* ---- Vehicles ----
   Cut-outs on white, so they get a card rather than being dropped onto the
   page ground where they would float. */
.veh-sec { background: var(--surface); }
.veh-grid { list-style: none; margin: 26px 0 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px; }
.veh { background: #fff; border: 1px solid var(--line); border-radius: 8px; padding: 14px 14px 16px; text-align: center; }
.veh-img { display: block; width: 100%; height: auto; aspect-ratio: 4 / 3; object-fit: contain; mix-blend-mode: multiply; }
.veh-l { display: block; margin-top: 8px; font-family: 'Kanit', sans-serif; font-size: 15px; font-weight: 600; }
@media (max-width: 700px) { .veh-grid { grid-template-columns: repeat(2, 1fr); } }

/* ---- Sections ---- */
.svc-sec { padding: 62px 0; border-top: 1px solid var(--line); }
.svc-sec:first-of-type { border-top: none; }
.svc-sec.alt { background: var(--surface); }
.svc-sec h2 { font-size: clamp(25px, 3.4vw, 36px); margin-bottom: 22px; }
.svc-sec p { color: var(--ink); font-size: 16.5px; line-height: 1.68; }
.svc-sec .svc-narrow p + p { margin-top: 16px; }
.svc-lede { color: var(--muted) !important; max-width: 70ch; margin-bottom: 28px; }

/* ---- Movement timeline ----
   The connector is a CSS pseudo-element on the dot, so the sequence still reads
   correctly as an ordered list with styles off, and nothing meaning-bearing
   lives in a decoration. */
.mv-timeline { list-style: none; margin: 0; padding: 0; display: grid; gap: 0; max-width: 760px; }
.mv-step { position: relative; display: flex; gap: 18px; padding: 0 0 26px; }
.mv-step:last-child { padding-bottom: 0; }
.mv-dot { position: relative; flex: 0 0 14px; width: 14px; height: 14px; margin-top: 5px; border-radius: 50%; background: var(--green); border: 2px solid var(--bg); box-shadow: 0 0 0 2px var(--green-text); }
.mv-step:not(:last-child) .mv-dot::after { content: ''; position: absolute; left: 50%; top: 14px; transform: translateX(-50%); width: 2px; height: calc(100% + 26px); background: linear-gradient(180deg, var(--green) 0%, rgba(168,197,32,0.25) 100%); }
.mv-body { display: flex; flex-direction: column; gap: 4px; padding-top: 1px; }
.mv-label { font-family: 'Kanit', sans-serif; font-weight: 600; font-size: 18px; line-height: 1.25; }
.mv-note { font-size: 14.5px; color: var(--muted); line-height: 1.5; }

/* ---- Audience grid ---- */
.aud-grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 0 28px; }
.aud-grid li { padding: 11px 0; border-bottom: 1px solid var(--line); font-size: 15.5px; font-weight: 500; }
.aud-grid li::before { content: '—'; color: var(--green-text); margin-right: 10px; }

/* ---- Trip → services → movements ---- */
.model-flow { list-style: none; margin: 0 0 34px; padding: 0; display: flex; flex-wrap: wrap; align-items: stretch; gap: 10px; counter-reset: flow; }
.model-flow li { flex: 1 1 180px; background: var(--bg); border: 1px solid var(--line); border-left: 3px solid var(--green); border-radius: 5px; padding: 16px 18px; font-family: 'Kanit', sans-serif; font-weight: 600; font-size: 16px; display: flex; align-items: center; gap: 10px; }
.model-flow li::before { counter-increment: flow; content: counter(flow); font-size: 11px; font-weight: 700; color: var(--green-text); background: rgba(168,197,32,0.18); width: 22px; height: 22px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; flex: 0 0 22px; }

/* ---- Capability grid ----
   "Planned" is a border, a background and a word. Three signals, because
   relying on colour alone to mark what does not exist yet is exactly the
   failure mode this distinction exists to prevent. */
.cap-grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(270px, 1fr)); gap: 16px; }
.cap { background: var(--bg); border: 1px solid var(--line); border-radius: 6px; padding: 22px 24px; }
.cap h3 { font-size: 16.5px; margin: 0 0 8px; display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.cap p { font-size: 14.5px !important; color: var(--muted) !important; line-height: 1.55; margin: 0; }
.cap-planned { border-style: dashed; border-color: rgba(138,109,31,0.45); background: rgba(138,109,31,0.045); }
.cap-tag { font-family: 'Montserrat', sans-serif; font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; font-weight: 700; color: #6c5415; background: rgba(138,109,31,0.14); border: 1px solid rgba(138,109,31,0.3); border-radius: 3px; padding: 3px 7px; }
.cap-foot { font-size: 14px !important; color: var(--muted) !important; margin-top: 22px; max-width: 70ch; }

/* ---- Why list ---- */
.why-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 14px; }
.why-list li { position: relative; padding-left: 34px; font-size: 16.5px; line-height: 1.6; }
.why-list li::before { content: '✓'; position: absolute; left: 0; top: 1px; width: 22px; height: 22px; border-radius: 50%; background: var(--green); color: var(--ink-on-green); font-size: 12px; font-weight: 700; display: flex; align-items: center; justify-content: center; }

/* ---- Experience & disclaimers ----
   Both are quiet, bordered blocks rather than alarm boxes. The attribution and
   the limits are part of the argument these pages make, not a warning stapled
   to the end of one. */
.exp-sec { background: var(--surface-2); }
.exp-note { font-size: 14px !important; color: var(--muted) !important; margin-top: 16px; padding-top: 16px; border-top: 1px solid var(--line); }
.disclaim { border: 1px solid var(--line); border-left: 3px solid var(--muted); border-radius: 5px; padding: 26px 28px; background: var(--bg); }
.disclaim h2 { font-size: 19px !important; margin-bottom: 14px; }
.disclaim ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; }
.disclaim li { font-size: 14.5px; color: var(--muted); line-height: 1.6; padding-left: 20px; position: relative; }
.disclaim li::before { content: '•'; position: absolute; left: 4px; color: var(--muted); }

/* ---- FAQ ---- */
.faq { display: grid; gap: 26px; }
.faq-item h3 { font-size: 18.5px; margin-bottom: 8px; }
.faq-item p { font-size: 16px !important; color: var(--muted) !important; line-height: 1.65; }

/* ---- Related services ---- */
.rel-grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 16px; }
.rel-card { display: flex; flex-direction: column; gap: 7px; height: 100%; background: var(--bg); border: 1px solid var(--line); border-radius: 6px; padding: 22px 24px; transition: border-color 0.18s, box-shadow 0.18s, transform 0.18s; }
.rel-card:hover { border-color: var(--green); box-shadow: 0 12px 28px rgba(20,22,15,0.08); transform: translateY(-2px); }
.rel-fam { font-size: 10.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--green-text); font-weight: 700; }
.rel-t { font-family: 'Kanit', sans-serif; font-size: 18px; font-weight: 600; line-height: 1.2; }
.rel-d { font-size: 14px; color: var(--muted); line-height: 1.5; }

/* ---- Family & index cards ---- */
.fam-group { margin-top: 38px; }
.fam-group:first-of-type { margin-top: 26px; }
.fam-group h3 { font-size: 15px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--green-text); margin-bottom: 16px; font-family: 'Montserrat', sans-serif; font-weight: 700; }
.fam-grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(270px, 1fr)); gap: 16px; }
.fam-card { display: flex; flex-direction: column; gap: 8px; height: 100%; background: var(--bg); border: 1px solid var(--line); border-radius: 6px; padding: 24px 26px; transition: border-color 0.18s, box-shadow 0.18s, transform 0.18s; }
.fam-card:hover { border-color: var(--green); box-shadow: 0 12px 28px rgba(20,22,15,0.08); transform: translateY(-2px); }
.fc-t { font-family: 'Kanit', sans-serif; font-size: 20px; font-weight: 600; line-height: 1.2; }
.fc-d { font-size: 14.5px; color: var(--muted); line-height: 1.55; }
.fc-s, .fc-n { font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; font-weight: 700; color: var(--green-text); margin-top: auto; padding-top: 6px; }
.fam-all { margin-top: 36px; }
.fam-all a { color: var(--green-text); font-weight: 700; text-decoration: underline; text-underline-offset: 3px; }

/* ---- Catalogue index ---- */
.idx-key { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; font-size: 12.5px; color: var(--muted); margin-bottom: 34px; padding-bottom: 22px; border-bottom: 1px solid var(--line); }
.idx-sec { margin-top: 40px; }
.idx-sec h3 { font-size: 21px; margin-bottom: 14px; display: flex; align-items: baseline; gap: 10px; }
.idx-count { font-family: 'Montserrat', sans-serif; font-size: 11px; font-weight: 700; color: var(--muted); background: var(--surface-2); border-radius: 20px; padding: 3px 10px; }
.idx-list { list-style: none; margin: 0; padding: 0; }
.idx-list li { display: grid; grid-template-columns: minmax(200px, 1.1fr) auto; grid-template-areas: 'name status' 'desc desc'; gap: 4px 14px; padding: 15px 0; border-bottom: 1px solid var(--line); align-items: baseline; }
.idx-list li > a { grid-area: name; font-family: 'Kanit', sans-serif; font-size: 17px; font-weight: 600; }
.idx-list li > a:hover { color: var(--green-text); text-decoration: underline; }
.idx-d { grid-area: desc; font-size: 14px; color: var(--muted); line-height: 1.5; }
.idx-s { grid-area: status; font-size: 9.5px; letter-spacing: 0.13em; text-transform: uppercase; font-weight: 700; padding: 4px 9px; border-radius: 3px; border: 1px solid; white-space: nowrap; }
/* Status badges.
 *
 * Two problems, one rule each.
 *
 * `idx-core-now` carried the Bags green as a literal rgba, so on VaultExec and
 * on Expo a gold word sat in a green tint inside a green border — one brand's
 * colour on another brand's page. Mixed from `--green` instead, which is the
 * accent token each theme redefines, so the badge is gold where the site is.
 *
 * The other three were hand-picked against white and are set at 9.5px, where
 * AA wants 4.5:1: expansion was 4.49:1 on the lightest --surface-2,
 * later-optional 4.50:1 on its own tint, and deprioritized 3.31:1 on the page
 * and 2.88:1 on a surface. Each is darkened to clear 4.5:1 on the lightest
 * ground it can land on, keeping its hue. */
.idx-core-now { color: var(--green-text); border-color: color-mix(in srgb, var(--green) 45%, transparent); background: color-mix(in srgb, var(--green) 14%, transparent); }
.idx-expansion { color: #5e6255; border-color: var(--line); background: var(--surface-2); }
.idx-later-optional { color: #735a18; border-color: rgba(115,90,24,0.32); background: rgba(115,90,24,0.07); }
.idx-deprioritized { color: #666a5d; border-color: var(--line); background: transparent; }
.idx-key .idx-s { grid-area: auto; }

/* ---- Plan / enquiry section ---- */
.plan { background: var(--ink); color: #e7e9df; border-top: none; }
.plan .eyebrow { color: var(--green-bright); }
.plan h2 { color: #fff; }
.plan-lede { color: #b8bcae !important; max-width: 62ch; }
.plan-alt { margin-top: 22px; }
.plan .btn-outline-light { border-color: rgba(255,255,255,0.35); color: #fff; }
.plan .btn-outline-light:hover { background: #fff; color: var(--ink); border-color: #fff; }

.plan-form { margin-top: 30px; max-width: 680px; }
.pf-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.pf-field { display: flex; flex-direction: column; gap: 6px; margin-bottom: 16px; }
.pf-field label { font-size: 12px; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 700; color: #cfd2c6; }
.pf-field .req { color: var(--green-bright); }
.pf-field input, .pf-field textarea {
  background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.18); border-radius: 4px;
  padding: 13px 14px; color: #fff; font-family: 'Montserrat', sans-serif; font-size: 15px; width: 100%;
}
.pf-field input::placeholder, .pf-field textarea::placeholder { color: #8a8e80; }
.pf-field input:focus, .pf-field textarea:focus { border-color: var(--green); background: rgba(255,255,255,0.1); }
.pf-hint { font-size: 12.5px !important; color: #9a9d90 !important; margin: -4px 0 18px; }
/* The honeypot. Off-screen rather than display:none, because some bots skip
   anything that is not rendered — and hidden from assistive technology so a
   screen-reader user is never asked to fill in a trap. */
.pf-trap { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.pf-actions { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; margin-top: 6px; }
.pf-call { font-size: 14px; color: var(--green-bright); text-decoration: underline; text-underline-offset: 3px; }
.pf-msg { font-size: 14px !important; margin-top: 16px; min-height: 1.2em; color: #cfd2c6 !important; }
.pf-msg.ok { color: var(--green-bright) !important; font-weight: 600; }
.pf-msg.err { color: #ffb4a8 !important; }
.plan-form[data-sent='1'] .pf-row, .plan-form[data-sent='1'] .pf-field, .plan-form[data-sent='1'] .pf-actions, .plan-form[data-sent='1'] .pf-hint { display: none; }

/* ---- Cross-brand links ----
   One company, two storefronts. These are the only places either site names
   the other, and they are marked rather than blended: a visitor following one
   is changing domain, and the link should look like it. */
.nav-cross { color: var(--green-text) !important; font-weight: 700 !important; }
.nav-cross:hover { color: var(--ink) !important; }
@media (max-width: 1040px) { nav .links > a.nav-cross { display: none; } }

.footer-cross { margin: 22px auto 4px; max-width: 460px; padding: 16px 20px; border: 1px solid rgba(255,255,255,0.14); border-radius: 8px; }
.fc-k { display: block; font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; color: #9a9d90; font-weight: 700; margin-bottom: 6px; }
.footer-cross a { font-family: 'Kanit', sans-serif; font-size: 18px; font-weight: 600; color: var(--green-bright); }
.footer-cross a:hover { text-decoration: underline; }
.fc-b { display: block; font-size: 12.5px; color: #9a9d90; margin-top: 4px; }

.chooser-cross { border-style: dashed !important; }

/* ---- Footer family links ---- */
.footer-fams { margin-bottom: 34px; padding-bottom: 28px; border-bottom: 1px solid rgba(255,255,255,0.1); }
.footer-fams-h { font-family: 'Montserrat', sans-serif; font-size: 11px; letter-spacing: 0.2em; text-transform: uppercase; color: #9a9d90; font-weight: 700; margin-bottom: 14px; }
.footer-fams ul { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; justify-content: center; gap: 10px 26px; }
.footer-fams a { font-size: 13.5px; color: #e7e9df; font-weight: 500; }
.footer-fams a:hover { color: var(--green-bright); text-decoration: underline; }

/* ---- Responsive ----
   The single-column breakpoint is where two-up form fields and the index's
   name/status row stop fitting rather than at a device width. */
@media (max-width: 680px) {
  .pf-row { grid-template-columns: 1fr; gap: 0; }
  .svc-sec { padding: 46px 0; }
  .svc-hero { padding: 40px 0 36px; }
  .svc-cta-row .btn { width: 100%; text-align: center; }
  .idx-list li { grid-template-columns: 1fr; grid-template-areas: 'name' 'status' 'desc'; }
  .idx-s { justify-self: start; }
  .model-flow { flex-direction: column; }
}

@media (prefers-reduced-motion: reduce) {
  .split-media { position: static; }
  .rel-card, .fam-card { transition: none; }
  .rel-card:hover, .fam-card:hover { transform: none; }
}

/* Print: the movement plan is the thing people hand to a colleague. */
@media print {
  nav, .call-fab, .plan-form, .skip-link, .crumbs,
  .svc-hero-media, .mv-band-media, .split-media, .veh-sec { display: none !important; }
  .svc-hero.has-media, .mv-band { background: #fff; color: #000; }
  .svc-hero.has-media h1, .svc-hero.has-media .svc-sub, .mv-band h2, .mv-band .mv-label { color: #000 !important; }
  .svc-sec, .svc-hero { padding: 18px 0; border-color: #ddd; }
  .plan { background: #fff; color: #000; }
  .plan h2, .plan-lede { color: #000 !important; }
}

/* ═══ cross-brand ═══════════════════════════════════════════════════════════
 * One sentence above the footer, and the family strip inside it.
 *
 * Both are deliberately quiet. The brief's failure case is four competing
 * logos in a header and a footer block that reads as a referral to a company
 * nobody has heard of; the fix for both is weight, not wording. The cross-sell
 * is a rule, a question and a link — no card, no image, no button the size of
 * the page's own CTA.
 * ═══════════════════════════════════════════════════════════════════════════ */

.xsell {
  border-top: 1px solid var(--line);
  background: var(--surface);
}

.xsell-in {
  padding-top: 30px;
  padding-bottom: 30px;
  display: grid;
  gap: 24px;
}

/* One neighbour reads as a sentence with a link beside it. Two read as a
   choice, so they get equal columns rather than one being pushed to the edge
   — a hotel genuinely has two, and neither is the afterthought. */
.xsell-one {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 18px 32px;
}

.xsell-two .xsell-in {
  grid-template-columns: repeat(auto-fit, minmax(330px, 1fr));
  gap: 22px 28px;
}

.xsell-two .xsell-one {
  display: grid;
  gap: 14px;
  align-content: start;
  justify-items: start;
}

.xsell-ask {
  font-family: 'Kanit', sans-serif;
  font-size: clamp(17px, 1.8vw, 21px);
  font-weight: 600;
  line-height: 1.25;
  color: var(--ink);
  max-width: 44ch;
}

.xsell-go {
  display: grid;
  gap: 2px;
  padding: 14px 20px;
  border: 1px solid var(--line);
  border-left: 3px solid var(--green);
  border-radius: 8px;
  background: var(--bg);
  transition: border-color 0.15s, transform 0.15s;
}

.xsell-go:hover {
  border-color: var(--green);
  transform: translateY(-1px);
}

.xsell-brand {
  font-family: 'Kanit', sans-serif;
  font-size: 16px;
  font-weight: 700;
  color: var(--ink);
}

.xsell-desc {
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--muted);
}

.xsell-cta {
  margin-top: 8px;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--green-text);
}

/* ── the family strip, in the footer ──────────────────────────────────── */

.footer-family {
  grid-area: auto;
  margin-top: 30px;
  padding-top: 24px;
  border-top: 1px solid rgba(255, 255, 255, 0.12);
}

.footer-family .ff-k {
  display: block;
  font-size: 10.5px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: #84877a;
  margin-bottom: 14px;
}

.footer-family ul {
  list-style: none;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 10px 28px;
  justify-content: center;
}

.footer-family a,
.footer-family .ff-here {
  display: grid;
  gap: 2px;
  font-size: 14px;
  font-weight: 700;
  color: #e7e9df;
}

.footer-family a:hover {
  color: var(--green-bright);
}

/* The site you are already on is named but not linked — a link to here is a
   dead end for anyone tabbing through, and the strip's job is to say where
   this page sits in the family, which requires showing this one too. */
.footer-family .ff-here {
  color: var(--green-bright);
}

.footer-family .ff-d {
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: #9a9d90;
}

@media (max-width: 640px) {
  .xsell-in {
    flex-direction: column;
    align-items: stretch;
  }
  .xsell-go {
    justify-items: start;
  }
  .footer-family ul {
    flex-direction: column;
    gap: 14px;
    align-items: center;
  }
}
