/*
Theme Name:   Synergy The7 Child
Theme URI:    https://synergyyachtsales.com
Description:  Synergy Yacht Sales design system on The7. Do not edit parent theme.
Author:       Synergy Yacht Sales
Template:     dt-the7
Version:      2.7.71
*/

/* =============================================================
   SYNERGY DESIGN SYSTEM v2.7.71 — scoped under body.syn-page
   (custom field syn_page = 1 adds the body class)
   Fully supports the Home v2 WPBakery markup: syn-hero, syn-stats,
   syn-marquee, syn-fleet (stage+list), syn-svc, syn-band, syn-news.
   ============================================================= */

.syn-page {
  --syn-header-h: 90px;      /* The7 header height — see Theme Options */
  --syn-midnight: #021E38;
  --syn-ivory:    #F7F5F0;
  --syn-deepwater:#01335C;
  --syn-ocean:    #01629F;
  --syn-sand:     #DCC49A;   /* fills only */
  --syn-sand-lt:  #E8D5AB;   /* text on dark */
  --syn-gold:     #C2A05C;   /* rules/dots only */
  --syn-gold-dp:  #6EB1BC;   /* v2.7.21 — marine teal, replaces the bronze */
  --syn-shell:    #EFE9DC;
  --syn-serif: 'Instrument Serif', Georgia, serif;
  --syn-ui:    'Inter Tight', system-ui, sans-serif;
  --syn-mono:  'IBM Plex Mono', ui-monospace, monospace;
  --syn-max: 1560px;
  --syn-pad: clamp(1.25rem, 5vw, 5.5rem);
}

body.syn-page,
.syn-page #main,
.syn-page #content {
  background: var(--syn-ivory);
  color: var(--syn-deepwater);
  font-family: var(--syn-ui);
  font-weight: 300;
  -webkit-font-smoothing: antialiased;
}

.syn-page img { max-width: 100%; height: auto; }

/* ---- Type ---- */
.syn-page h1, .syn-page .syn-h1,
.syn-page h2, .syn-page .syn-h2,
.syn-page h3, .syn-page .syn-h3 {
  font-family: var(--syn-serif);
  font-weight: 400;
  color: var(--syn-midnight);
  line-height: 1.08;
  letter-spacing: -0.01em;
  margin: 0 0 .55em;
}
.syn-page h1, .syn-page .syn-h1 { font-size: clamp(3rem, 6.4vw, 6rem); }
.syn-page h2, .syn-page .syn-h2 { font-size: clamp(2.4rem, 4.8vw, 4.2rem); }
.syn-page .syn-h2--xl           { font-size: clamp(2.8rem, 5.6vw, 5rem); }
.syn-page h3, .syn-page .syn-h3 { font-size: clamp(1.5rem, 2.3vw, 2.1rem); }
.syn-page p { line-height: 1.7; }
.syn-page a { color: var(--syn-ocean); text-decoration: none; transition: color .3s; }
.syn-page a:hover { color: var(--syn-gold-dp); }
.syn-page .syn-lede { font-size: clamp(1.15rem, 1.6vw, 1.5rem); line-height: 1.6; max-width: 40em; }
.syn-page .syn-body { line-height: 1.75; }

/* ---- Eyebrow / kicker ---- */
.syn-page .syn-eyebrow {
  font-family: var(--syn-mono);
  font-size: .72rem;
  font-weight: 500;
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--syn-gold-dp);
  display: inline-flex;
  align-items: center;
  gap: .8rem;
  margin: 0 0 1.1rem;
}
.syn-page .syn-eyebrow::before { content: ""; width: 34px; height: 1px; background: currentColor; opacity: .85; }

/* ---- Buttons ---- */
.syn-page .syn-btn-row { display: flex; flex-wrap: wrap; gap: 1rem; margin-top: 1.6rem; }
.syn-page .syn-btn, .syn-page .syn-btn:visited {
  display: inline-block;
  font-family: var(--syn-mono);
  font-size: .78rem;
  font-weight: 500;
  letter-spacing: .16em;
  text-transform: uppercase;
  padding: .95rem 1.9rem;
  border-radius: 1px;
  background: var(--syn-sand);
  color: var(--syn-midnight);
  border: 1px solid var(--syn-sand);
  transition: all .35s;
}
.syn-page .syn-btn:hover { background: var(--syn-midnight); color: var(--syn-ivory); border-color: var(--syn-midnight); }
.syn-page .syn-btn--solid { /* alias of default */ }
.syn-page .syn-btn--ghost { background: transparent; color: var(--syn-midnight); border-color: rgba(2,30,56,.45); }
.syn-page .syn-btn--ghost:hover { background: var(--syn-midnight); color: var(--syn-ivory); }

/* ---- Section rhythm ---- */
.syn-page .vc_row.syn-section { padding-top: clamp(4rem, 9vw, 8rem); padding-bottom: clamp(4rem, 9vw, 8rem); }
.syn-page .syn-section--dark,
.syn-page .vc_row.syn-section--dark { background: var(--syn-midnight); color: rgba(247,245,240,.85); }
.syn-page .syn-section--dark h2, .syn-page .syn-section--dark .syn-h2,
.syn-page .syn-section--dark h3, .syn-page .syn-section--dark .syn-h3 { color: var(--syn-ivory); }
.syn-page .syn-section--dark .syn-eyebrow { color: var(--syn-sand-lt); }
.syn-page .syn-section--dark .syn-eyebrow::before { background: currentColor; }

/* =============================================================
   HERO — row background image (parallax on), scrim via ::after
   ============================================================= */
.syn-page .vc_row.syn-hero {
  position: relative;
  min-height: calc(100svh - var(--syn-header-h));
  display: grid;                 /* grid tolerates WPBakery's floated columns */
  grid-template-columns: 1fr;
  align-content: end;            /* content packs to the bottom, in flow */
  margin-top: 0;
  overflow: visible;
  padding: clamp(2rem, 4vw, 3rem) 0 clamp(2rem, 4vw, 3.5rem);
}
/* force the column back into normal flow so its content is laid out INSIDE
   the hero rather than positioned from its bottom edge */
.syn-page .vc_row.syn-hero > .wpb_column,
.syn-page .vc_row.syn-model-hero > .wpb_column {
  position: static;
  float: none;
  width: 100%;
  height: auto;
  min-height: 0;
}
.syn-page .vc_row.syn-hero > .wpb_column > .vc_column-inner,
.syn-page .vc_row.syn-model-hero > .wpb_column > .vc_column-inner {
  position: static;
  height: auto;
  min-height: 0;
}
.syn-page .vc_row.syn-hero > .wpb_column > .vc_column-inner > .wpb_wrapper,
.syn-page .vc_row.syn-model-hero > .wpb_column > .vc_column-inner > .wpb_wrapper {
  display: block;
  height: auto;
}
.syn-page .vc_row.syn-hero::after {
  content: "";
  position: absolute; inset: 0; z-index: 1; pointer-events: none;
  display: block;   /* v2.7.40: WPBakery clearfix sets display:table on
                       .vc_row::after — shrink-to-fit ignores inset:0 and the
                       scrim collapsed to nothing. This is why no hero was
                       ever darkened. */
  /* v2.7.29: mid-stop lifted .06 -> .22 and top .28 -> .38. The copy sits
     in the middle band, which was effectively transparent — ivory text
     vanished over pale hulls and bright sky. */
  background: linear-gradient(180deg,
    rgba(2,30,56,.08) 0%,
    rgba(2,30,56,.14) 40%,
    rgba(2,30,56,.34) 70%,
    rgba(2,30,56,.62) 100%);
  /* v2.7.41: soft rise from the base. Earlier values (.52/.38/.92) were
     raised twice while the scrim was collapsed and painting nothing, so
     they were tuned against a problem darkening never fixed. The image
     stays legible top to bottom; the copy gains ground only where it sits. */
}
.syn-page .vc_row.syn-hero > .wpb_column,
.syn-page .vc_row.syn-hero .vc_column-inner { position: relative; z-index: 2; }
.syn-page .syn-hero .syn-h1, .syn-page .syn-hero h1 { color: var(--syn-ivory); }
.syn-page .syn-hero .syn-h1 em, .syn-page .syn-hero h1 em { font-style: italic; color: var(--syn-sand-lt); }
.syn-page .syn-hero .syn-eyebrow { color: var(--syn-sand-lt); }
.syn-page .syn-hero .syn-eyebrow::before { background: currentColor; }
.syn-page .syn-hero .syn-lede { color: rgba(247,245,240,.88); }
.syn-page .syn-hero .syn-btn--ghost { color: var(--syn-ivory); border-color: rgba(247,245,240,.5); }
.syn-page .syn-hero .syn-btn--ghost:hover { background: var(--syn-ivory); color: var(--syn-midnight); }

/* =============================================================
   STATS STRIP — .syn-hero-stats row with 4 columns
   ============================================================= */
.syn-page .vc_row.syn-hero-stats {
  background: var(--syn-midnight);
  border-top: 1px solid rgba(247,245,240,.16);
  margin: 0;
}
.syn-page .vc_row.syn-hero-stats > .wpb_column > .vc_column-inner {
  padding: 1.6rem 1.6rem;
  border-left: 1px solid rgba(247,245,240,.12);
}
.syn-page .vc_row.syn-hero-stats > .wpb_column:first-child > .vc_column-inner { border-left: 0; }
.syn-page .syn-stats__val {
  font-family: var(--syn-serif);
  font-size: clamp(1.9rem, 3vw, 2.7rem);
  color: var(--syn-sand-lt);
  line-height: 1.1;
}
.syn-page .syn-stats__label {
  font-family: var(--syn-mono);
  font-size: .62rem;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: rgba(247,245,240,.6);
  margin-top: .35rem;
}
@media (max-width: 767px) {
  .syn-page .vc_row.syn-hero-stats > .wpb_column { width: 50%; float: left; }
  .syn-page .vc_row.syn-hero-stats > .wpb_column:nth-child(3) > .vc_column-inner { border-left: 0; }
  .syn-page .vc_row.syn-hero-stats > .wpb_column > .vc_column-inner { border-top: 1px solid rgba(247,245,240,.12); }
}

/* =============================================================
   MARQUEE — CSS animation; syn.js clones the run span for a loop
   ============================================================= */
.syn-page .vc_row.syn-marquee-row { background: var(--syn-midnight); border-top: 1px solid rgba(247,245,240,.1); margin: 0; }
.syn-page .syn-marquee { overflow: hidden; padding: .85rem 0; }
.syn-page .syn-marquee__track { display: inline-flex; white-space: nowrap; animation: syn-marquee 36s linear infinite; }
.syn-page .syn-marquee__run {
  font-family: var(--syn-mono);
  font-size: .68rem;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: rgba(247,245,240,.65);
  display: inline-flex;
  align-items: center;
  padding-right: 2.4rem;
}
.syn-page .syn-marquee__dot { display: inline-block; width: 5px; height: 5px; border-radius: 50%; background: var(--syn-gold); margin: 0 1.2rem; }
@keyframes syn-marquee { to { transform: translateX(-50%); } }
@media (prefers-reduced-motion: reduce) { .syn-page .syn-marquee__track { animation: none; } }

/* =============================================================
   SPLIT INTRO — "One office."
   ============================================================= */
.syn-page .vc_row.syn-split-row { padding-top: clamp(4rem, 9vw, 8rem); padding-bottom: clamp(4rem, 9vw, 8rem); }

/* =============================================================
   FLEET — dark register: stage (crossfading images) + list rows
   ============================================================= */
.syn-page .vc_row.syn-fleet-row { background: var(--syn-midnight); margin: 0; }.syn-page .syn-fleet__head { padding: clamp(3.5rem, 7vw, 6rem) 0 0; margin-bottom: 0; }
.syn-page .vc_row.syn-section--dark.syn-section { padding-bottom: 0; }

.syn-page .syn-stage { position: relative; min-height: clamp(380px, 60vh, 640px); overflow: hidden; }.syn-page .syn-stage img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0; transition: opacity .7s ease; object-position: center 68%; }
.syn-page .syn-stage img.is-active { opacity: 1; }
.syn-page .syn-stage__tag {
  position: absolute; left: 1.4rem; bottom: 1.2rem; z-index: 2;
  font-family: var(--syn-mono); font-size: .62rem; letter-spacing: .2em; text-transform: uppercase;
  color: var(--syn-midnight); background: var(--syn-sand);
  padding: .45rem .9rem; border-radius: 1px;
}

.syn-page .syn-list .wpb_text_column { margin-bottom: 0; }
.syn-page a.syn-row {
  display: block;
  padding: 1.15rem .8rem;
  border-bottom: 1px solid rgba(247,245,240,.12);
  transition: background .3s;
}
.syn-page a.syn-row:hover { background: rgba(247,245,240,.05); }
.syn-page .syn-row__top { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; }
.syn-page .syn-row__name { font-family: var(--syn-serif); font-size: clamp(1.35rem, 2.1vw, 1.85rem); color: var(--syn-ivory); }
.syn-page .syn-row__tag {
  font-family: var(--syn-mono); font-size: .58rem; letter-spacing: .16em; text-transform: uppercase;
  color: var(--syn-sand-lt); border: 1px solid rgba(232,213,171,.4);
  padding: .25rem .6rem; border-radius: 1px; white-space: nowrap;
}
.syn-page .syn-row__specs {
  display: block; margin-top: .4rem;
  font-family: var(--syn-mono); font-size: .64rem; letter-spacing: .14em; text-transform: uppercase;
  color: rgba(247,245,240,.55);
}
.syn-page .syn-row__price {
  display: block; margin-top: .4rem;
  font-family: var(--syn-mono); font-size: .78rem; letter-spacing: .08em;
  color: var(--syn-sand-lt);
}
.syn-page .syn-list__note {
  margin: 1.4rem .8rem 0;
  font-family: var(--syn-mono); font-size: .66rem; letter-spacing: .14em;
  color: rgba(247,245,240,.5);
}
@media (max-width: 991px) { .syn-page .syn-stage { min-height: 320px; } }

/* =============================================================
   SERVICES — three cells with gold top rules
   ============================================================= */
.syn-page .vc_row.syn-section#services,

.syn-page .vc_row.syn-svc-row { padding-bottom: clamp(4rem, 8vw, 7rem); }
.syn-page .syn-svc__cell > .vc_column-inner { border-top: 1px solid var(--syn-gold); padding-top: 1.6rem; margin-top: 1rem; }
.syn-page .syn-svc__num {
  font-family: var(--syn-mono); font-size: .66rem; letter-spacing: .2em; text-transform: uppercase;
  color: var(--syn-gold-dp); margin-bottom: .9rem;
}

/* =============================================================
   CHARTER BAND — full-bleed media + scrim + copy
   ============================================================= */
.syn-page .vc_row.syn-band {
  position: relative;
  background-color: var(--syn-midnight);
  min-height: clamp(480px, 72vh, 760px);
  display: flex;
  align-items: center;
  overflow: hidden;
  margin: 0;
}
.syn-page .syn-band__copy .syn-h2, .syn-page .syn-band__copy h2 { color: var(--syn-ivory); }
.syn-page .syn-band__copy .syn-eyebrow { color: var(--syn-sand-lt); }
.syn-page .syn-band__copy .syn-body,
.syn-page .syn-band__copy p { color: rgba(247,245,240,.85); }
.syn-page .syn-band__copy .syn-btn-row { margin-top: 1.8rem; }
.syn-page .syn-band .syn-btn--ghost { color: var(--syn-ivory); border-color: rgba(247,245,240,.5); }
.syn-page .syn-band .syn-btn--ghost:hover { background: var(--syn-ivory); color: var(--syn-midnight); }

/* =============================================================
   NEWS — ledger rows
   ============================================================= */

.syn-page .vc_row.syn-news-row { padding-bottom: clamp(4rem, 8vw, 7rem); }
.syn-page .syn-news .wpb_text_column { margin-bottom: 0; }
.syn-page a.syn-news__item {
  display: grid;
  grid-template-columns: 140px 1fr auto;
  grid-template-areas: "date title arrow" "date desc arrow";
  gap: .2rem 1.6rem;
  align-items: center;
  padding: 1.3rem 0;
  border-bottom: 1px solid rgba(2,30,56,.12);
  transition: background .3s;
}
.syn-page a.syn-news__item:hover { background: rgba(2,30,56,.03); }
.syn-page .syn-news__date { grid-area: date; font-family: var(--syn-mono); font-size: .7rem; letter-spacing: .16em; text-transform: uppercase; color: var(--syn-gold-dp); }
.syn-page .syn-news__title { grid-area: title; font-family: var(--syn-serif); font-weight: 400; font-size: clamp(1.25rem, 1.9vw, 1.7rem); color: var(--syn-midnight); }
.syn-page .syn-news__desc { grid-area: desc; font-size: 1.02rem; color: rgba(1,51,92,.72); }
.syn-page .syn-news__arrow { grid-area: arrow; font-size: 1.2rem; color: var(--syn-gold-dp); }
@media (max-width: 767px) {
  .syn-page a.syn-news__item { grid-template-columns: 1fr auto; grid-template-areas: "date arrow" "title arrow" "desc arrow"; }
}

/* =============================================================
   CONTACT
   ============================================================= */
.syn-page .vc_row.syn-contact-row { padding-top: clamp(4rem, 9vw, 8rem); padding-bottom: clamp(4rem, 9vw, 8rem); }
.syn-page .syn-contact__info p { margin: .3rem 0; }
.syn-page .syn-contact__info .syn-mono { font-family: var(--syn-mono); font-size: .82rem; letter-spacing: .06em; }

/* =============================================================
   REVEAL — progressive enhancement (visible until syn-js exists)
   ============================================================= */
.syn-js .syn-page .syn-rv { opacity: 0; transform: translateY(18px); }
.syn-js .syn-page .syn-rv.is-in { opacity: 1; transform: none; transition: opacity .8s ease, transform .8s ease; }

/* =============================================================
   THE7 HEADER SKIN
   ============================================================= */
.masthead.sticky-on,
.phantom-sticky .masthead {
  background: rgba(2,30,56,.45) !important;
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
}
.masthead .main-nav > li > a .menu-item-text {
  font-family: 'IBM Plex Mono', monospace;
  font-size: .74rem;
  letter-spacing: .16em;
  text-transform: uppercase;
}

/* =============================================================
   HYGIENE — kill WPBakery default text-block bottom margins doubling
   section gaps inside our scoped rows
   ============================================================= */
.syn-page .syn-hero .wpb_text_column,
.syn-page .syn-fleet__head .wpb_text_column { margin-bottom: .4rem; }

/* =============================================================
   v2.1.1 — Fleet stage: equal columns + sticky full-height panel
   ============================================================= */
.syn-page .vc_row.syn-fleet-row { display: flex; flex-wrap: wrap; align-items: stretch; }
.syn-page .vc_row.syn-fleet-row::before,
.syn-page .vc_row.syn-fleet-row::after { display: none; }
.syn-page .vc_row.syn-fleet-row > .wpb_column { float: none; }
.syn-page .wpb_column.syn-stage { min-height: 0; }.syn-page .wpb_column.syn-stage > .vc_column-inner { padding: 0; position: relative; top: 0; height: 100svh; overflow: hidden; }
.syn-page .syn-stage .wpb_raw_html { margin: 0; height: 100%; }
@media (max-width: 991px) { .syn-page .wpb_column.syn-stage > .vc_column-inner { position: relative; height: 340px; } }

/* =============================================================
   v2.1.2 — Header logo sizing (caps regardless of file dimensions)
   ============================================================= */
.masthead .branding img,
.masthead .branding a img { max-height: 52px; width: auto; }
.phantom-sticky .masthead .branding img,
.masthead.sticky-on .branding img { max-height: 40px; }
.bottom-bar .branding img { max-height: 34px; width: auto; }
@media (max-width: 778px) { .masthead .branding img { max-height: 40px; } }

/* =============================================================
   v2.3.0 — HEADER: scroll-driven two-state (from the design system)
   Glass midnight over hero -> ivory once scrolled past 40px.
   syn.js toggles body.syn-scrolled. Applies site-wide, so no
   per-page transparent-header flag is needed.
   ============================================================= */
body.syn-scrolled .masthead,
body.syn-scrolled .masthead.sticky-on,
body.syn-scrolled .phantom-sticky .masthead {
  background: rgba(247,245,240,.94) !important;
  box-shadow: 0 1px 0 rgba(1,51,92,.14);
}
body.syn-scrolled .masthead .main-nav > li > a .menu-item-text { color: #01335C !important; }
body.syn-scrolled .masthead .main-nav > li > a:hover .menu-item-text { color: #6EB1BC !important; }   /* v2.7.21: matches --syn-gold-dp; hard-coded because the header sits outside .syn-page scope */
body.syn-scrolled .masthead .branding img.syn-logo-dark { display: none; }
body.syn-scrolled .masthead .branding img.syn-logo-light { display: inline-block; }
body.syn-scrolled .masthead .soc-ico a, body.syn-scrolled .masthead .mini-search a { color: #01335C !important; }
/* the Enquire menu CTA keeps its fill in both states */
.main-nav > li.syn-menu-cta > a {
  background: #DCC49A !important; padding: 12px 22px !important;
  margin-left: 10px; border-radius: 1px;
}
.main-nav > li.syn-menu-cta > a .menu-item-text { color: #021E38 !important; }
.main-nav > li.syn-menu-cta > a:hover { background: #021E38 !important; }
.main-nav > li.syn-menu-cta > a:hover .menu-item-text { color: #F7F5F0 !important; }
.main-nav > li.syn-menu-cta > a::after,
.main-nav > li.syn-menu-cta > a::before { display: none !important; }

/* =============================================================
   v2.3.0 — MODEL PAGE
   ============================================================= */

/* ---- 1. Hero ---- */
.syn-page .vc_row.syn-model-hero {
  position: relative; min-height: calc(92svh - var(--syn-header-h));
  display: grid; grid-template-columns: 1fr; align-content: end;
  margin-top: 0; overflow: visible;
  padding: clamp(2rem, 4vw, 3rem) var(--syn-pad) clamp(2rem, 4vw, 3.5rem);
}
.syn-page .vc_row.syn-model-hero::after {
  content: ""; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  display: block;   /* v2.7.40: WPBakery clearfix sets display:table on
                       .vc_row::after — shrink-to-fit ignores inset:0 and the
                       scrim collapsed to nothing. This is why no hero was
                       ever darkened. */
  background: linear-gradient(180deg,
    rgba(2,30,56,.10) 0%,
    rgba(2,30,56,.18) 40%,
    rgba(2,30,56,.40) 70%,
    rgba(2,30,56,.66) 100%);   /* v2.7.41 — see note on .syn-hero::after */
}
.syn-page .vc_row.syn-model-hero > .wpb_column,
.syn-page .vc_row.syn-model-hero .vc_column-inner { position: relative; z-index: 2; }
.syn-page .syn-model-hero .wpb_text_column { margin-bottom: 0; }

.syn-page .syn-listing-line { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin: 0 0 1.1rem; }
.syn-page .syn-listing-line .syn-eyebrow { margin: 0; color: var(--syn-sand-lt); }
.syn-page .syn-listing-line .syn-eyebrow::before { background: currentColor; }
.syn-page .syn-status {
  font-family: var(--syn-mono); font-size: .62rem; letter-spacing: .18em;
  text-transform: uppercase; padding: .45rem .8rem; border-radius: 1px;
  background: var(--syn-sand); color: var(--syn-midnight);
}
.syn-page .syn-status--new     { background: var(--syn-ivory);   color: var(--syn-midnight); }
.syn-page .syn-status--offer   { background: var(--syn-gold);    color: var(--syn-midnight); }
.syn-page .syn-status--sold    { background: var(--syn-gold-dp); color: var(--syn-ivory); }

.syn-page .syn-title-row {
  display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between;
  gap: 1.5rem 3rem;
}
.syn-page .syn-model-hero h1, .syn-page .syn-model-hero .syn-h1 {
  margin: 0; color: var(--syn-ivory); font-size: clamp(2.8rem, 7vw, 6.2rem);
  line-height: .95; text-wrap: balance; text-shadow: 0 2px 30px rgba(2,30,56,.55);
}
.syn-page .syn-price { font-family: var(--syn-mono); text-align: right; }
.syn-page .syn-price__label {
  margin: 0; font-size: .62rem; letter-spacing: .2em; text-transform: uppercase;
  color: rgba(247,245,240,.65);
}
.syn-page .syn-price__value {
  margin: .4rem 0 0; font-size: clamp(1.2rem, 2vw, 1.7rem); letter-spacing: .08em;
  color: var(--syn-sand-lt); text-shadow: 0 1px 16px rgba(2,30,56,.55);
}
@media (max-width: 600px) { .syn-page .syn-price { text-align: left; } }

/* key-stat rail — inside the hero, matching the design */
.syn-page .syn-keystats {
  display: flex; flex-wrap: wrap; gap: 0;
  margin-top: clamp(1.6rem,3vw,2.5rem);
  border-top: 1px solid rgba(247,245,240,.25);
}
.syn-page .syn-keystats > div {
  padding: 1.2rem clamp(1.4rem,3vw,2.8rem) .2rem 0;
  border-right: 1px solid rgba(247,245,240,.18);
  margin-right: clamp(1.4rem,3vw,2.8rem);
}
.syn-page .syn-keystats > div:last-child { border-right: 0; margin-right: 0; }
.syn-page .syn-keystats__label {
  margin: 0; font-family: var(--syn-mono); font-size: .6rem; letter-spacing: .2em;
  text-transform: uppercase; color: rgba(247,245,240,.6);
}
.syn-page .syn-keystats__value {
  margin: .45rem 0 0; font-family: var(--syn-serif);
  font-size: clamp(1.4rem,2.2vw,2rem); color: var(--syn-ivory);
}

/* ---- Overview: meta chips + highlights panel (design section) ---- */
.syn-page .syn-meta-line {
  display: flex; flex-wrap: wrap; gap: 0; margin-top: 2rem;   /* v2.7.17: dividers replace the gap */
  font-family: var(--syn-mono); font-size: .7rem; letter-spacing: .16em; text-transform: uppercase;
}
.syn-page .syn-meta-line span { color: var(--syn-ocean); }
.syn-page .syn-overview-media .wpb_single_image { margin-bottom: 0; }
.syn-page .syn-overview-media .wpb_single_image img { width: 100%; aspect-ratio: 16/9; object-fit: cover; }
.syn-page .wpb_column.syn-highlights > .vc_column-inner {
  background: var(--syn-midnight); padding: clamp(1.6rem,2.5vw,2.4rem); height: 100%;
  display: flex; flex-direction: column; justify-content: space-between; gap: 2rem;
}
.syn-page .syn-highlights .wpb_text_column { margin-bottom: 0; }
.syn-page .syn-highlights__title {
  margin: 0 0 1.6rem; font-family: var(--syn-mono); font-size: .68rem; letter-spacing: .24em;
  text-transform: uppercase; color: var(--syn-sand-lt);
}
.syn-page ul.syn-highlights__list {
  margin: 0; padding: 0; list-style: none;
  display: flex; flex-direction: column; gap: 1.1rem;
  font-size: .95rem; line-height: 1.6; color: rgba(247,245,240,.9);
}
.syn-page ul.syn-highlights__list li {
  border-bottom: 1px solid rgba(247,245,240,.14); padding-bottom: 1.1rem;
}
.syn-page ul.syn-highlights__list li:last-child { border-bottom: 0; padding-bottom: 0; }
.syn-page .syn-h2 em { font-style: italic; color: var(--syn-gold); }

/* ---- 2. Section headers with numbering ---- */
.syn-page .syn-sec-head {
  display: flex; flex-wrap: wrap; justify-content: space-between;
  align-items: baseline;   /* v2.7.17: note sits on the heading baseline */
  gap: 1.5rem 3rem;
}
.syn-page .syn-sec-head > div { min-width: 0; }
.syn-page .syn-sec-head h2,
.syn-page .syn-sec-head .syn-h2 { margin-bottom: 0; }
.syn-page .syn-sec-head .syn-eyebrow { margin-bottom: 1.2rem; }
/* the text block that carries a section head owns the gap to what follows */
.syn-page .syn-head-block .wpb_wrapper > .syn-sec-head:only-child,
.syn-page .syn-head-block { margin-bottom: 0; }
.syn-page .syn-sec-note {
  margin: 0; font-family: var(--syn-mono); font-size: .66rem; letter-spacing: .16em;
  text-transform: uppercase; color: rgba(1,51,92,.55);
}
.syn-page .syn-section--dark .syn-sec-note { color: rgba(247,245,240,.55); }

/* ---- 3. Specifications: three grouped columns ---- */
/* Design uses CSS grid here; WPBakery's floated columns + gutters cannot
   reproduce it, so the inner row is re-declared as the grid itself. */
.syn-page .syn-specs-grid { margin-top: clamp(2.5rem,4vw,3.5rem); }
.syn-page .syn-specs-grid > .wpb_column > .vc_column-inner { padding: 0 clamp(.75rem,1.5vw,1.5rem); }
.syn-page .syn-specs-grid > .wpb_column:first-child > .vc_column-inner { padding-left: 0; }
.syn-page .syn-specs-grid > .wpb_column:last-child > .vc_column-inner { padding-right: 0; }
.syn-page .syn-specs-grid .wpb_text_column { margin-bottom: 0; }

.syn-page .syn-specgroup__title {
  margin: 0 0 1.2rem; font-family: var(--syn-mono); font-size: .64rem; letter-spacing: .22em;
  text-transform: uppercase; color: var(--syn-gold);
  border-bottom: 1px solid rgba(220,196,154,.3); padding-bottom: .8rem;
}.syn-page table.syn-spec { width: 100%; border-collapse: collapse; table-layout: fixed; }
.syn-page table.syn-spec td {
  padding: .7rem 0; border-bottom: 1px solid rgba(247,245,240,.1); vertical-align: top;
}.syn-page table.syn-spec td:first-child { font-size: .9rem; color: rgba(247,245,240,.65); padding-right: 1rem; width: 48%; }
.syn-page table.syn-spec td:last-child {
  font-family: var(--syn-mono); font-size: .78rem; letter-spacing: .04em;
  color: var(--syn-ivory); text-align: right;
  overflow-wrap: anywhere;          /* long values wrap instead of overflowing */
}
.syn-page .syn-awaiting { color: rgba(247,245,240,.42) !important; font-style: italic; white-space: normal !important; }

/* ---- 4. Gallery: expanding filmstrip ---- */
.syn-page .vc_row.syn-gallery-band { background: #01162A; margin: 0; padding: clamp(4rem,7vw,6rem) 0; }
.syn-page .syn-gallery-band .wpb_text_column,
.syn-page .syn-gallery-band .wpb_raw_html { margin-bottom: 0; }
.syn-page .syn-gallery-band .syn-sec-head { margin-bottom: 0; }
.syn-page .syn-strip {
  display: flex; gap: .8rem; margin-top: clamp(2rem,4vw,3rem); margin-bottom: 0;
  height: clamp(380px, 52vh, 580px);
}
.syn-page .syn-strip figure {
  margin: 0; position: relative; overflow: hidden; isolation: isolate;
  flex: 1 1 0; min-width: 0; background: var(--syn-midnight); cursor: pointer;
  transition: flex 1.1s cubic-bezier(.22,.9,.3,1);
}
.syn-page .syn-strip figure:hover,
.syn-page .syn-strip figure:focus-within,
.syn-page .syn-strip figure.is-open { flex: 3.4; }
.syn-page .syn-strip img {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  filter: saturate(.92); transition: filter 1s;
}
.syn-page .syn-strip figure:hover img { filter: saturate(1); }
.syn-page .syn-strip figcaption {
  pointer-events: none; position: absolute; inset: auto 0 0 0;
  display: flex; align-items: flex-end; justify-content: space-between; gap: 1rem;
  padding: 2.6rem 1.2rem 1.1rem;
  background: linear-gradient(180deg, transparent, rgba(2,30,56,.82));
  font-family: var(--syn-mono); font-size: .62rem; letter-spacing: .18em;
  text-transform: uppercase; color: var(--syn-ivory);
}
.syn-page .syn-strip figcaption .syn-strip__idx { color: var(--syn-sand-lt); flex: none; }
.syn-page .syn-strip__tag {
  pointer-events: none; position: absolute; top: 1rem; left: 1.2rem;
  font-family: var(--syn-mono); font-size: .6rem; letter-spacing: .2em; text-transform: uppercase;
  color: rgba(247,245,240,.8); white-space: nowrap;
}
.syn-page .syn-strip__foot {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: 1.5rem 3rem; margin-top: 1.6rem;
  border-top: 1px solid rgba(247,245,240,.14); padding-top: 1.6rem;
}
.syn-page .syn-strip__quote {
  margin: 0; font-family: var(--syn-serif); font-size: clamp(1.2rem,1.6vw,1.5rem);
  line-height: 1.3; color: var(--syn-ivory);
}
.syn-page .syn-strip__quote em { font-style: italic; color: var(--syn-sand); }
.syn-page .syn-strip__meta { font-family: var(--syn-mono); font-size: .68rem; letter-spacing: .12em; color: var(--syn-sand-lt); }
.syn-page .syn-strip__link {
  font-family: var(--syn-mono); font-size: .68rem; letter-spacing: .16em; text-transform: uppercase;
  color: var(--syn-ivory); border-bottom: 1px solid var(--syn-gold); padding-bottom: .35rem;
}
.syn-page .syn-strip__link:hover { color: var(--syn-sand-lt); }
/* Touch + small screens: horizontal scroll instead of hover-expand */
@media (max-width: 900px), (hover: none) {
  .syn-page .syn-strip {
    height: auto; overflow-x: auto; scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch; padding-bottom: .5rem;
  }
  .syn-page .syn-strip figure {
    flex: 0 0 78%; height: 58vw; max-height: 420px; scroll-snap-align: center;
    transition: none;
  }
  .syn-page .syn-strip figure:hover, .syn-page .syn-strip figure.is-open { flex: 0 0 78%; }
}

/* ---- 5. Layouts / General arrangement ---- */
.syn-page .vc_row.syn-layout-row { padding-bottom: clamp(2rem,4vw,3rem); }
.syn-page .syn-decktabs { display: flex; gap: .6rem; flex-wrap: wrap; }
.syn-page .syn-decktabs button {
  font-family: var(--syn-mono); font-size: .68rem; letter-spacing: .16em; text-transform: uppercase;
  padding: .8rem 1.3rem; border-radius: 1px; cursor: pointer;
  border: 1px solid rgba(1,51,92,.25); background: transparent; color: var(--syn-deepwater);
  transition: all .3s;
}
.syn-page .syn-decktabs button[aria-selected="true"] { background: var(--syn-deepwater); color: var(--syn-ivory); border-color: var(--syn-deepwater); }
.syn-page .syn-variants { display: flex; flex-wrap: wrap; gap: .6rem; margin-top: 1.4rem; }
.syn-page .syn-variants button {
  font-family: var(--syn-mono); font-size: .62rem; letter-spacing: .14em; text-transform: uppercase;
  padding: .6rem 1rem; border-radius: 1px; cursor: pointer;
  border: 1px dashed rgba(1,51,92,.25); background: transparent; color: #567A99; transition: all .3s;
}
.syn-page .syn-variants button[aria-selected="true"] { background: var(--syn-shell); color: var(--syn-gold-dp); border-color: var(--syn-gold); }
.syn-page .syn-plan {
  position: relative; margin-top: 1.4rem; background: #fff;
  border: 1px solid rgba(1,51,92,.12); aspect-ratio: 16/9;
  display: grid; place-items: center; padding: clamp(1rem,2vw,2rem); overflow: hidden;
}
.syn-page .syn-plan img {
  max-width: min(620px, 100%); max-height: 100%; width: auto; height: auto;
  object-fit: contain; opacity: 0; position: absolute; transition: opacity .5s ease;
}
.syn-page .syn-plan img.is-active { opacity: 1; position: relative; }
.syn-page .syn-plan__empty {
  font-family: var(--syn-mono); font-size: .68rem; letter-spacing: .18em; text-transform: uppercase;
  color: #567A99; text-align: center;
}
.syn-page .syn-plan__caption {
  position: absolute; left: 1.2rem; bottom: 1rem;
  font-family: var(--syn-mono); font-size: .62rem; letter-spacing: .16em;
  text-transform: uppercase; color: #567A99;
}
.syn-page .syn-options-row { margin-top: 1.2rem; }
.syn-page .syn-options-row > .wpb_column > .vc_column-inner { padding: 0 .6rem; }
.syn-page .syn-options-row > .wpb_column:first-child > .vc_column-inner { padding-left: 0; }
.syn-page .syn-options-row > .wpb_column:last-child > .vc_column-inner { padding-right: 0; }

.syn-page .syn-optioncard > .vc_column-inner { background: var(--syn-shell); padding: 1.4rem 1.5rem; height: 100%; }
.syn-page .syn-optioncard .wpb_text_column { margin-bottom: 0; }
.syn-page .syn-optioncard em {
  display: block; font-style: normal; font-family: var(--syn-mono); font-size: .62rem;
  letter-spacing: .2em; text-transform: uppercase; color: var(--syn-gold-dp); margin-bottom: .7rem;
}
.syn-page .syn-optioncard p { margin: 0; font-size: .9rem; line-height: 1.65; color: #0B4A72; }

/* ---- 6. Enquire ---- */
.syn-page .vc_row.syn-enquire {
  background: var(--syn-midnight); margin: 0;
  padding-top: clamp(4rem,7vw,6.5rem); padding-bottom: clamp(4rem,7vw,6.5rem);
  /* v2.7.15 — champagne hairline separating the enquire block from the footer.
     In CSS rather than Design Options so every page gets it automatically and
     it survives shortcode regeneration. */
  border-bottom: 1px solid var(--syn-sand-lt);
  align-items: center;   /* consolidated from a duplicate definition, v2.7.15 */
}
.syn-page .syn-enquire h2, .syn-page .syn-enquire .syn-h2 { color: var(--syn-ivory); text-wrap: balance; }
.syn-page .syn-enquire .syn-h2 em { font-style: italic; color: var(--syn-sand); }
.syn-page .syn-enquire .syn-eyebrow { color: var(--syn-sand-lt); }
.syn-page .syn-enquire p { color: rgba(247,245,240,.85); }
.syn-page .syn-enquire .syn-btn--ghost { color: var(--syn-ivory); border-color: rgba(247,245,240,.35); }
.syn-page .syn-enquire .syn-btn--ghost:hover { background: var(--syn-ivory); color: var(--syn-midnight); }
.syn-page .syn-glance > .vc_column-inner {
  border: 1px solid rgba(247,245,240,.18); padding: clamp(1.6rem,2.5vw,2.4rem);
}
.syn-page .syn-glance .wpb_text_column { margin-bottom: 0; }
.syn-page .syn-glance__title {
  margin: 0 0 1.4rem; font-family: var(--syn-mono); font-size: .64rem; letter-spacing: .22em;
  text-transform: uppercase; color: var(--syn-gold);
}
.syn-page table.syn-glance-table { width: 100%; border-collapse: collapse; }
.syn-page table.syn-glance-table td { padding: .75rem 0; border-bottom: 1px solid rgba(247,245,240,.1); }
.syn-page table.syn-glance-table td:first-child { font-size: .9rem; color: rgba(247,245,240,.65); }
.syn-page table.syn-glance-table td:last-child {
  font-family: var(--syn-mono); font-size: .8rem; letter-spacing: .06em;
  color: var(--syn-sand-lt); text-align: right;
}

/* =============================================================
   v2.3.6 — FIDELITY PASS (float-safe)
   The design expresses these bands as CSS grid. Re-declaring the
   WPBakery rows as grid turned the builder's own helper divs into
   grid items and displaced every column, so layout is left to
   WPBakery's native columns and only the design's spacing,
   proportions and typography are applied here.
   ============================================================= */

/* Overview split — design ratio is ~.9fr / 1.1fr; the shortcode's
   5/12 + 7/12 columns are the closest native equivalent. */
.syn-page .vc_row.syn-split-row { padding: clamp(4rem,8vw,7rem) var(--syn-pad) 0; }
.syn-page .vc_row.syn-split-row .wpb_text_column { margin-bottom: 0; }
.syn-page .syn-split-row .syn-h2 { margin: 1.2rem 0 0; }
.syn-page .syn-body p {
  font-size: clamp(1.06rem, 1.35vw, 1.28rem);
  line-height: 1.75; color: #0B4A72; max-width: 60ch; margin: 0 0 1.15rem;
}
.syn-page .syn-body p:last-child { margin-bottom: 0; }

/* Overview media band — image 2/3, highlights panel 1/3, bottom aligned */
.syn-page .vc_row.syn-overview-media { padding-top: clamp(3rem,6vw,5rem); }
.syn-page .vc_row.syn-overview-media .wpb_single_image { margin-bottom: 0; }

/* Section rhythm from the design: gap between bands, padding within */
.syn-page .vc_row#specs,
.syn-page .vc_row#gallery,
.syn-page .vc_row#enquire { margin-top: clamp(4rem,8vw,7rem); }
.syn-page .vc_row.syn-layout-row { padding-top: clamp(4rem,8vw,7rem); }
.syn-page .vc_row#specs { padding-top: clamp(4rem,7vw,6rem); padding-bottom: clamp(4rem,7vw,6rem); }
.syn-page .vc_row#gallery { padding-top: clamp(4rem,7vw,6rem); padding-bottom: clamp(4rem,7vw,6rem); }

@media (max-width: 778px) {
  .syn-page { --syn-header-h: 64px; }
  .syn-page .vc_row.syn-hero,
  .syn-page .vc_row.syn-model-hero { min-height: calc(85svh - var(--syn-header-h)); }
}

/* =============================================================
   v2.3.7 — Content page hero (About, Contact, Services)
   Shorter than a model hero; no key-stat rail.
   ============================================================= */
.syn-page .vc_row.syn-page-hero { min-height: 56svh; }
.syn-page .syn-page-hero .syn-listing-line { margin-bottom: .6rem; }
.syn-page .syn-page-hero .syn-h1 { font-size: clamp(2.4rem, 5vw, 4.4rem); }
/* card body copy inside shell cards */
.syn-page .syn-optioncard strong { color: var(--syn-gold-dp); font-weight: 500; }

/* =============================================================
   v2.3.8 — Content page layout variants
   Four patterns so the eight simple pages don't read as one
   template repeated: ledger rows, statement band, checklist
   columns, and a triad. All reuse existing tokens.
   ============================================================= */

/* --- Ledger: numbered rows, for pages that are really a list of
       capabilities (fleet management, end-to-end services) --- */
.syn-page .syn-ledger { border-top: 1px solid rgba(2,30,56,.14); }
.syn-page .syn-ledger__row {
  display: grid; grid-template-columns: 68px minmax(0,1fr) minmax(0,1.35fr);
  gap: 1rem 2.5rem; align-items: start;
  padding: 1.6rem 0; border-bottom: 1px solid rgba(2,30,56,.12);
}
.syn-page .syn-ledger__num {
  font-family: var(--syn-mono); font-size: .7rem; letter-spacing: .18em;
  color: var(--syn-gold-dp); padding-top: .35rem;
}
.syn-page .syn-ledger__title {
  font-family: var(--syn-serif); font-size: clamp(1.15rem,1.7vw,1.5rem);
  color: var(--syn-midnight); line-height: 1.2;
}
.syn-page .syn-ledger__sub {
  display: block; margin-top: .4rem; font-family: var(--syn-mono);
  font-size: .6rem; letter-spacing: .16em; text-transform: uppercase; color: rgba(1,51,92,.5);
}
.syn-page .syn-ledger__body { font-size: 1.05rem; line-height: 1.7; color: #0B4A72; }
.syn-page .syn-section--dark .syn-ledger { border-color: rgba(247,245,240,.18); }
.syn-page .syn-section--dark .syn-ledger__row { border-color: rgba(247,245,240,.12); }
.syn-page .syn-section--dark .syn-ledger__title { color: var(--syn-ivory); }
.syn-page .syn-section--dark .syn-ledger__body { color: rgba(247,245,240,.8); }
.syn-page .syn-section--dark .syn-ledger__num { color: var(--syn-sand-lt); }
@media (max-width: 767px) {
  .syn-page .syn-ledger__row { grid-template-columns: 44px 1fr; }
  .syn-page .syn-ledger__body { grid-column: 2 / -1; }
}

/* --- Statement: a single large serif line on midnight, used to
       break up long pages --- */
.syn-page .syn-statement {
  font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(1.8rem, 3.4vw, 3rem); line-height: 1.18;
  color: var(--syn-ivory); max-width: 26ch; margin: 0; text-wrap: balance;
}
.syn-page .syn-statement em { font-style: italic; color: var(--syn-sand); }
.syn-page .syn-statement__note {
  margin: 1.6rem 0 0; font-family: var(--syn-mono); font-size: .68rem;
  letter-spacing: .18em; text-transform: uppercase; color: var(--syn-sand-lt);
}

/* --- Checklist: paired requirement/benefit columns --- */
.syn-page ul.syn-checklist { margin: 0; padding: 0; list-style: none; }
.syn-page ul.syn-checklist li {
  padding: .85rem 0 .85rem 1.6rem; position: relative;
  border-bottom: 1px solid rgba(2,30,56,.12); font-size: .95rem; color: #0B4A72;
}
.syn-page ul.syn-checklist li::before {
  content: ""; position: absolute; left: 0; top: 1.25rem;
  width: 6px; height: 6px; background: var(--syn-gold);
}
.syn-page .syn-section--dark ul.syn-checklist li {
  border-color: rgba(247,245,240,.14); color: rgba(247,245,240,.85);
}

/* --- Triad: three big numbered pillars (the 3X factor) --- */
.syn-page .syn-triad__num {
  font-family: var(--syn-serif); font-size: clamp(2.4rem,4vw,3.6rem);
  color: var(--syn-sand); line-height: 1; display: block; margin-bottom: .6rem;
}
.syn-page .syn-triad__label {
  font-family: var(--syn-mono); font-size: .66rem; letter-spacing: .2em;
  text-transform: uppercase; color: var(--syn-sand-lt);
}

/* =============================================================
   v2.3.9 — Home register: keep the stage flush and make the
   hover affordance unmistakable.
   ============================================================= */
/* the fleet bands must stay edge-to-edge; no inherited side padding */
.syn-page .vc_row.syn-fleet-row,

.syn-page .vc_row.syn-fleet-row { margin-top: 0; }

/* row hover: tint, gold edge and a small shift so it reads as live */
.syn-page a.syn-row {
  position: relative;
  transition: background .3s ease;
}
.syn-page a.syn-row::before {
  content: ""; position: absolute; left: 0; top: 0; bottom: 0;
  width: 2px; background: var(--syn-gold);
  transform: scaleY(0); transform-origin: bottom;
  transition: transform .35s ease;
}
.syn-page a.syn-row:hover,
.syn-page a.syn-row:focus-visible { background: rgba(247,245,240,.06); }
.syn-page a.syn-row:hover::before,
.syn-page a.syn-row:focus-visible::before { transform: scaleY(1); transform-origin: top; }
.syn-page a.syn-row:hover .syn-row__name { color: var(--syn-sand-lt); }
.syn-page a.syn-row .syn-row__name { transition: color .3s ease; }
.syn-page a.syn-row:hover .syn-row__tag { border-color: var(--syn-sand); color: var(--syn-sand); }

/* =============================================================
   v2.4.0 — VERTICAL RHYTHM (the real fix for stray gaps)
   WPBakery gives every element a 35px bottom margin, and every
   row a bottom margin of its own. Those stack invisibly and are
   what forces per-row "margin-bottom: 150px" hacks in Design
   Options. Zero them inside the design system and let the
   section classes own all spacing.
   ============================================================= */
.syn-page .wpb_content_element,
.syn-page .wpb_text_column,
.syn-page .wpb_raw_html,
.syn-page .wpb_single_image,
.syn-page .vc_row { margin-bottom: 0; }

/* Deliberate spacing, applied only where a section needs it */
.syn-page .vc_row.syn-section { padding-top: clamp(4rem, 8vw, 7rem); padding-bottom: clamp(4rem, 8vw, 7rem); }
.syn-page .vc_row.syn-hero-stats,
.syn-page .vc_row.syn-marquee-row,
.syn-page .vc_row.syn-fleet-row,
.syn-page .vc_row.syn-band { padding-top: 0; padding-bottom: 0; }

/* Home: the register heading band sits directly on the stage */
.syn-page .vc_row#fleet.syn-section { padding-bottom: clamp(2rem, 4vw, 3rem); }

/* Home: services + news rows follow their heading without a second gap */
.syn-page .vc_row#services.syn-section { padding-bottom: clamp(1.5rem, 3vw, 2.5rem); }
.syn-page .vc_row.syn-svc-row { padding-bottom: clamp(4rem, 8vw, 7rem); }
.syn-page .vc_row#news.syn-section { padding-bottom: clamp(1.5rem, 3vw, 2.5rem); }
.syn-page .vc_row.syn-contact-row { padding-top: clamp(4rem, 8vw, 7rem); padding-bottom: clamp(4rem, 8vw, 7rem); }

/* Gutter between the two register columns should be zero — the stage
   image must meet the list edge to edge, whatever gap= the row carries */

/* =============================================================
   v2.4.0 — BRAND STRIP (represented marques)
   ============================================================= */
.syn-page .vc_row.syn-brands { background: var(--syn-shell); padding-top: clamp(2rem,4vw,3rem); padding-bottom: clamp(2rem,4vw,3rem); margin: 0; }
.syn-page .syn-brands__inner {
  display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: 1.2rem 2.5rem; max-width: var(--syn-max); margin: 0 auto;
}
.syn-page .syn-brands__label {
  font-family: var(--syn-mono); font-size: .64rem; letter-spacing: .22em;
  text-transform: uppercase; color: var(--syn-gold-dp); margin: 0;
}
.syn-page .syn-brands__list { display: flex; flex-wrap: wrap; gap: 1rem 2.2rem; margin: 0; }
.syn-page a.syn-brands__item {
  font-family: var(--syn-serif); font-size: clamp(1.1rem,1.6vw,1.45rem);
  color: var(--syn-midnight); position: relative; padding-bottom: .2rem;
}
.syn-page a.syn-brands__item::after {
  content: ""; position: absolute; left: 0; right: 100%; bottom: 0; height: 1px;
  background: var(--syn-gold); transition: right .35s ease;
}
.syn-page a.syn-brands__item:hover { color: var(--syn-gold-dp); }
.syn-page a.syn-brands__item:hover::after { right: 0; }

/* =============================================================
   v2.4.0 — SERVICE LINK LIST (under the three disciplines)
   ============================================================= */
.syn-page .syn-svc__links { margin: 1.2rem 0 0; padding: 0; list-style: none; }
.syn-page .syn-svc__links li { border-top: 1px solid rgba(2,30,56,.12); }
.syn-page .syn-svc__links a {
  display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  padding: .7rem 0; font-family: var(--syn-mono); font-size: .68rem;
  letter-spacing: .14em; text-transform: uppercase; color: var(--syn-deepwater);
  transition: color .3s, padding-left .3s;
}
.syn-page .syn-svc__links a:hover { color: var(--syn-gold-dp); padding-left: .5rem; }
.syn-page .syn-svc__links a::after { content: "→"; color: var(--syn-gold); }

/* =============================================================
   v2.4.1 — Hero stretch-mode agnostic + fleet gutter control
   ============================================================= */

/* Hero content is capped and centred inside the column, so the row
   works identically whether its Row stretch is set to "Stretch row"
   or "Stretch row and content (no paddings)". No Design Options
   value needs to change per page. */
.syn-page .vc_row.syn-hero > .wpb_column > .vc_column-inner,
.syn-page .vc_row.syn-model-hero > .wpb_column > .vc_column-inner {
  max-width: var(--syn-max);
  width: 100%;
  margin-left: auto;
  margin-right: auto;
  padding-left: 0;
  padding-right: 0;
}

/* Fleet register: the stage image must sit flush, and the list keeps a
   deliberate optical gutter from it. Neutralise WPBakery's own column
   padding first so the row's gap= setting is irrelevant. */

/* =============================================================
   v2.4.4 — Overflow fix + register alignment
   ============================================================= */

/* WPBakery full-width rows are sized with inline width:100vw. Adding side
   padding to those pushed their content box past the viewport, producing a
   horizontal scroll — which is why the first stat and the marquee appeared
   clipped at the left edge. Border-box keeps the padding inside the 100vw. */
.syn-page .vc_row,
.syn-page .vc_row > .wpb_column,
.syn-page .vc_row > .wpb_column > .vc_column-inner { box-sizing: border-box; }
body.syn-page { overflow-x: hidden; }
/* v2.7.62: the clip variant here is reverted too — body is an ancestor of
   the fixed header, and clip would remove it. overflow-x:hidden as before. */

/* Contact Form 7 inside the design system */
.syn-page .wpcf7 label {
  display: block; font-family: var(--syn-mono); font-size: .66rem;
  letter-spacing: .16em; text-transform: uppercase; color: rgba(1,51,92,.65);
  margin-bottom: 1.2rem;
}
.syn-page .wpcf7 input[type="text"],
.syn-page .wpcf7 input[type="email"],
.syn-page .wpcf7 input[type="tel"],
.syn-page .wpcf7 textarea {
  width: 100%; margin-top: .5rem; padding: .85rem 1rem;
  background: #fff; border: 1px solid rgba(2,30,56,.18); border-radius: 1px;
  font-family: var(--syn-ui); font-size: .95rem; font-weight: 300; color: var(--syn-deepwater);
  transition: border-color .3s;
}
.syn-page .wpcf7 input:focus, .syn-page .wpcf7 textarea:focus {
  outline: none; border-color: var(--syn-gold);
}
.syn-page .wpcf7 textarea { min-height: 140px; resize: vertical; }
.syn-page .syn-section--dark .wpcf7 label,
.syn-page .syn-enquire .wpcf7 label { color: rgba(247,245,240,.7); }
.syn-page .syn-section--dark .wpcf7 input,
.syn-page .syn-section--dark .wpcf7 textarea,
.syn-page .syn-enquire .wpcf7 input,
.syn-page .syn-enquire .wpcf7 textarea {
  background: rgba(247,245,240,.06); border-color: rgba(247,245,240,.22); color: var(--syn-ivory);
}

/* =============================================================
   v2.4.6 — ONE RAIL (final approach)
   Two kinds of row exist on the page:
     · rows inside The7's container — their edge is the container
     · rows stretched full width — WPBakery marks these
       data-vc-full-width="true"
   Aligning them means padding only the stretched ones by the
   distance from the viewport edge to the container edge. No
   max-width on rows, no pseudo-element backgrounds (those clash
   with WPBakery's own .vc_row::before clearfix, which is what
   stripped the midnight bands in v2.4.5).
   ============================================================= */
.syn-page {
  --syn-container: 1560px;   /* The7 → Theme Options → Content width */
  --syn-side: 50px;          /* The7 → Main area paddings, left/right */
}

.syn-page .vc_row {
  max-width: none;
  margin-left: 0;
  margin-right: 0;
  padding-left: 0;
  padding-right: 0;
}

.syn-page .vc_row[data-vc-full-width] {
  padding-left: max(var(--syn-side), calc((100vw - var(--syn-container)) / 2 + var(--syn-side)));
  padding-right: max(var(--syn-side), calc((100vw - var(--syn-container)) / 2 + var(--syn-side)));
}
@media (max-width: 778px) {
  .syn-page .vc_row[data-vc-full-width] { padding-left: 20px; padding-right: 20px; }
}

/* Columns keep WPBakery's own padding so the builder's "Column gap"
   setting works. Only rows that must sit flush opt out (below). */
.syn-page .vc_row > .wpb_column > .vc_column-inner { max-width: none; }

/* the marquee track must run edge to edge, so it opts out */
.syn-page .vc_row.syn-marquee-row { padding-left: 0; padding-right: 0; }

/* register: image on the rail's left edge, list gutter preserved */

/* =============================================================
   v2.4.7 — Column gaps are edited in WPBakery, not in CSS
   Row settings → Column gap now behaves. WPBakery creates the gap
   by padding every column, which also pads the outer edges and
   would push content off the rail; these negative row margins
   cancel exactly that outer half-gap.
   ============================================================= */
.syn-page .vc_row.vc_column-gap-1 { margin-left: -0.5px; margin-right: -0.5px; }
.syn-page .vc_row.vc_column-gap-2 { margin-left: -1px; margin-right: -1px; }
.syn-page .vc_row.vc_column-gap-3 { margin-left: -1.5px; margin-right: -1.5px; }
.syn-page .vc_row.vc_column-gap-4 { margin-left: -2px; margin-right: -2px; }
.syn-page .vc_row.vc_column-gap-5 { margin-left: -2.5px; margin-right: -2.5px; }
.syn-page .vc_row.vc_column-gap-10 { margin-left: -5px; margin-right: -5px; }
.syn-page .vc_row.vc_column-gap-15 { margin-left: -7.5px; margin-right: -7.5px; }
.syn-page .vc_row.vc_column-gap-20 { margin-left: -10px; margin-right: -10px; }
.syn-page .vc_row.vc_column-gap-25 { margin-left: -12.5px; margin-right: -12.5px; }
.syn-page .vc_row.vc_column-gap-30 { margin-left: -15px; margin-right: -15px; }
.syn-page .vc_row.vc_column-gap-35 { margin-left: -17.5px; margin-right: -17.5px; }

/* Rows that must sit flush regardless of any gap setting.
   v2.7.40: this rule had lost its declaration block. The selector list ran
   on through the comments below and joined the .syn-stage rule, so the hero
   rows and their column-inners were silently receiving
   `position:absolute; inset:0; height:100%; width:100%`. */
.syn-page .vc_row.syn-hero > .wpb_column > .vc_column-inner,
.syn-page .vc_row.syn-model-hero > .wpb_column > .vc_column-inner,
.syn-page .vc_row.syn-hero,
.syn-page .vc_row.syn-model-hero {
  margin-left: 0; margin-right: 0;
  padding-left: 0; padding-right: 0;
}

/* =============================================================
   v2.5.0 — NATIVE ELEMENTS (no Raw HTML on content pages)
   Everything the team edits is now a Text Block or a Single
   Image element. These rules make the native markup behave the
   way the hand-written HTML used to.
   ============================================================= */

/* Register stage built from Single Image elements.
   WPBakery nests the image several wrappers deep:
     .wpb_single_image > .wpb_wrapper > .vc_figure
       > .vc_single_image-wrapper > img
   Every level needs a height or the chain collapses to zero and
   nothing renders — which is what happened in v2.5.0/2.5.1. */
.syn-page .syn-stage .wpb_single_image {
  position: absolute; inset: 0; margin: 0; height: 100%; width: 100%;
  transition: opacity .7s ease;
}
.syn-page .syn-stage .wpb_single_image > .wpb_wrapper,
.syn-page .syn-stage .wpb_single_image .vc_figure,
.syn-page .syn-stage .wpb_single_image .vc_single_image-wrapper,
.syn-page .syn-stage .wpb_single_image figure,
.syn-page .syn-stage .wpb_single_image a { display: block; height: 100%; width: 100%; }
.syn-page .syn-stage .wpb_single_image img {
  width: 100%; height: 100%; object-fit: cover; object-position: center 68%;
}

/* Progressive enhancement: images are visible without JS; the crossfade
   only takes over once syn.js has run. */
.syn-js .syn-page .syn-stage .wpb_single_image { opacity: 0; }
.syn-js .syn-page .syn-stage .wpb_single_image.is-active { opacity: 1; }
.syn-js .syn-page .syn-stage .wpb_single_image:first-of-type { opacity: 1; }
.syn-js .syn-page .syn-stage .wpb_single_image:first-of-type:not(.is-active) { opacity: 0; }

/* Charter band: media comes from the row's own background image, so the
   parallax and the picture are both editable in Design Options.
   Scrim is painted on the column (never the row — WPBakery uses
   .vc_row::before/::after for its clearfix). */
.syn-page .vc_row.syn-band {
  background-size: cover !important;
  background-position: center !important;
}.syn-page .vc_row.syn-band > .wpb_column > .vc_column-inner { position: relative; padding-top: clamp(4rem, 8vw, 7rem); padding-bottom: clamp(4rem, 8vw, 7rem); }
.syn-page .vc_row.syn-band > .wpb_column > .vc_column-inner::before {
  content: ""; position: absolute; z-index: 0; pointer-events: none;
  display: block;   /* v2.7.40: a builder clearfix setting display:table here
                       makes the element shrink-to-fit, and the gradient
                       vanishes. This is why the band never darkened. */
  /* v2.7.43: the row is full-bleed but .vc_column-inner is container-width,
     so inset:0 stopped the gradient at the content edge and left a visible
     vertical seam. Break out to the full viewport instead. */
  top: 0; bottom: 0;
  left: 50%; right: auto;
  width: 100vw; max-width: 100vw;
  transform: translateX(-50%);
  background: linear-gradient(90deg, rgba(2,30,56,.9) 0%, rgba(2,30,56,.6) 45%, rgba(2,30,56,.18) 100%);
}
.syn-page .vc_row.syn-band .wpb_text_column,
.syn-page .vc_row.syn-band .syn-btn-row { position: relative; z-index: 1; }

/* Marquee inside a Text Block */
.syn-page .wpb_text_column .syn-marquee { margin: 0; }

/* Button rows written as ordinary links in a Text Block */
.syn-page .wpb_text_column .syn-btn-row { margin-top: 1.6rem; }
.syn-page .wpb_text_column p .syn-btn { margin-right: .8rem; }

/* =============================================================
   v2.5.1 — Charter band, single coherent definition
   Media is the row background; the scrim is on the column; the
   copy takes the rail padding from the row and is width-limited
   by measure, not by a fixed pixel box.
   ============================================================= */
.syn-page .vc_row.syn-band > .wpb_column { position: relative; z-index: 1; }
.syn-page .syn-band__copy { position: relative; z-index: 1; max-width: 46ch; padding: 0; }
@media (max-width: 900px) {
  .syn-page .vc_row.syn-band > .wpb_column > .vc_column-inner::before {
    background: linear-gradient(180deg, rgba(2,30,56,.75) 0%, rgba(2,30,56,.9) 100%);
  }
  .syn-page .syn-band__copy { max-width: none; }
}

/* =============================================================
   v2.5.3 — Defeat The7's image-appearance layer inside our stages
   The7 sets opacity:0 on <img> and fades it in via its own script
   once the image "appears". Absolutely-positioned frames inside a
   sticky panel never trigger that, so the image stayed invisible
   even though it had loaded at full size. We own the crossfade, so
   the image itself must always be opaque.
   ============================================================= */
/* v2.7.69: every selector below required .wpb_single_image — a WPBakery
   image element. The cursor-preview panel's <img> is created by syn.js as a
   bare element with no classes, so this rule had NEVER matched it, and the
   panel rendered correctly but empty. Bare <img> inside our own containers
   is now covered too. The three .wpb_single_image selectors are unchanged. */
.syn-page .syn-stage .wpb_single_image img,
.syn-page .syn-gallery__cell .wpb_single_image img,
.syn-page .syn-plan .wpb_single_image img,
.syn-page .svc-peek img,
.syn-page .svc-stage__img img {
  opacity: 1 !important;
  animation: none !important;
  transition: none !important;
  visibility: visible !important;
  transform: none !important;
}
/* The7's hover overlay markup adds a tint layer we do not want here */
.syn-page .syn-stage .vc_single_image-wrapper::before,
.syn-page .syn-stage .vc_single_image-wrapper::after,
.syn-page .syn-stage .dt-hover-effect,
.syn-page .syn-stage .rollover-content { display: none !important; }

/* =============================================================
   v2.5.4 — Register gutter, declared ONCE
   The space between the stage image and the yacht list. Change
   the first value of --syn-register-gap to widen or narrow it;
   nothing else in the file touches this.
   ============================================================= */
.syn-page { --syn-register-gap: 0px; }   /* gap is set in WPBakery: Row settings -> Column gap */

.syn-page .syn-list > .vc_column-inner {
  padding-top: clamp(1.5rem, 3vw, 3rem);
  padding-right: 0;
  padding-bottom: clamp(2.5rem, 5vw, 4rem);
  padding-left: var(--syn-register-gap);
}
@media (max-width: 991px) {
  .syn-page .syn-list > .vc_column-inner {
    padding: 2rem 0 2.5rem 0;
  }
}

/* =============================================================
   v2.5.6 — The register gutter is a WPBakery setting
   Row settings -> Column gap now controls the space between the
   stage image and the yacht list, like any other row on the site.
   Nothing here forces those columns' padding any more.
   ============================================================= */
.syn-page .syn-list > .vc_column-inner {
  padding-top: clamp(1.5rem, 3vw, 3rem);
  padding-bottom: clamp(2.5rem, 5vw, 4rem);
}
/* the stage image fills whatever width the gap leaves it */
.syn-page .wpb_column.syn-stage > .vc_column-inner {
  position: sticky; top: 0; height: 100svh; overflow: hidden;
}
@media (max-width: 991px) {
  .syn-page .wpb_column.syn-stage > .vc_column-inner { position: relative; height: 340px; }
}

/* =============================================================
   v2.7.0 — Hero as one full-viewport section
   The stat rail is an inner row INSIDE the hero, sitting on the
   photograph under a hairline, exactly as in the design. It is no
   longer a separate midnight band that can collide with the copy.
   ============================================================= */
.syn-page .syn-hero .syn-hero-stats {
  background: transparent;
  border-top: 1px solid rgba(247,245,240,.28);
  margin: clamp(1.8rem, 4vw, 3rem) 0 0;
  padding: 0;
}
.syn-page .syn-hero .syn-hero-stats > .wpb_column > .vc_column-inner {
  padding: clamp(1rem, 2vw, 1.6rem) 0 0;
  border-left: 0;
  border-top: 0;
}
.syn-page .syn-hero .syn-stats__val {
  font-family: var(--syn-serif);
  font-size: clamp(1.8rem, 3vw, 2.7rem);
  line-height: 1;
  color: var(--syn-ivory);
  text-shadow: 0 2px 24px rgba(2,30,56,.6);
}
.syn-page .syn-hero .syn-stats__label {
  margin-top: .5rem;
  font-family: var(--syn-mono);
  font-size: .62rem;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: rgba(247,245,240,.72);
}
/* hero copy sits directly above the rail */
.syn-page .syn-hero .wpb_text_column { margin-bottom: 0; }
.syn-page .syn-hero .syn-lede { margin-bottom: clamp(1.2rem, 2vw, 1.8rem); }
@media (max-width: 767px) {
  .syn-page .syn-hero .syn-hero-stats > .wpb_column { width: 50%; }
  .syn-page .syn-hero .syn-hero-stats > .wpb_column > .vc_column-inner { padding-top: 1rem; }
}

/* =============================================================
   v2.7.2 — Hero responsiveness
   Type and spacing scale with viewport HEIGHT as well as width, so
   the composition holds on laptops and short windows instead of
   pushing the stat rail past the fold.
   ============================================================= */
@media (max-height: 800px) {
  .syn-page .syn-hero .syn-h1 { font-size: clamp(2.2rem, 4.6vw, 3.6rem); }
  .syn-page .syn-hero .syn-lede { font-size: 1rem; margin-bottom: 1rem; }
  .syn-page .syn-hero .syn-btn { padding: .75rem 1.5rem; }
  .syn-page .syn-hero .syn-hero-stats { margin-top: 1.2rem; }
  .syn-page .syn-hero .syn-stats__val { font-size: clamp(1.4rem, 2.2vw, 1.9rem); }
}
@media (max-height: 640px) {
  /* v2.7.52: was a fixed 620px, which on a 462px-tall window made the hero
     TALLER than the screen — the opposite of fullscreen. The viewport unit
     is correct at every height; the stat rail still steps aside so the
     headline is never crowded out. */
  .syn-page .vc_row.syn-hero { min-height: 100svh; }
  .syn-page .syn-hero .syn-hero-stats { display: none; }   /* copy first on very short screens */
}
@media (max-width: 767px) {
  .syn-page .syn-hero .syn-h1 { font-size: clamp(2.1rem, 9vw, 3rem); }
  .syn-page .syn-hero .syn-btn-row { display: flex; flex-wrap: wrap; gap: .6rem; }
  .syn-page .syn-hero .syn-btn { flex: 1 1 auto; text-align: center; }
}

/* =============================================================
   v2.7.3 — Hero background layers must fill the row
   WPBakery / Ultimate parallax inject a background layer sized
   once at load. When the hero is taller than that measurement the
   image stops short and the copy appears to fall out of the hero.
   Force every known background layer to the full row box.
   ============================================================= */
.syn-page .vc_row.syn-hero,
.syn-page .vc_row.syn-model-hero { isolation: isolate; }

.syn-page .vc_row.syn-hero > .vc-parallax,
.syn-page .vc_row.syn-hero > .upb_row_bg,
.syn-page .vc_row.syn-hero > .vc_parallax,
.syn-page .vc_row.syn-hero > .vc_row-background,
.syn-page .vc_row.syn-model-hero > .vc-parallax,
.syn-page .vc_row.syn-model-hero > .upb_row_bg,
.syn-page .vc_row.syn-model-hero > .vc_parallax,
.syn-page .vc_row.syn-model-hero > .vc_row-background {
  position: absolute !important;
  inset: 0 !important;
  width: 100% !important;
  height: 100% !important;
  min-height: 100% !important;
  z-index: 0 !important;
  background-size: cover !important;
  background-position: center !important;
}
.syn-page .vc_row.syn-hero > .vc-parallax .vc-parallax-inner,
.syn-page .vc_row.syn-model-hero > .vc-parallax .vc-parallax-inner {
  position: absolute !important;
  inset: 0 !important;
  height: 100% !important;
  background-size: cover !important;
  background-position: center !important;
}
/* content sits above whatever background layer is in play */
.syn-page .vc_row.syn-hero > .wpb_column,
.syn-page .vc_row.syn-model-hero > .wpb_column { position: relative; z-index: 2; }

/* =============================================================
   v2.7.4 — HERO: deterministic full-viewport section
   Intended behaviour, stated plainly:
     · the background image fills the viewport on every device
     · the copy sits inside that box, anchored to the bottom
     · nothing after the hero can overlap it
   Earlier versions relied on the WPBakery column laying out in
   normal flow; it collapses to Bootstrap's 1px min-height in some
   states, which dropped the copy below the section. This anchors
   the content deterministically instead of depending on that.

   v2.7.51 — TRUE FULLSCREEN. The header is absolutely positioned
   and overlays the hero, so subtracting --syn-header-h left a
   visible strip of the following section at the bottom of the
   fold. Both heroes are now exactly one viewport tall.
   `svh` (small viewport height) is deliberate: `vh` on iOS counts
   the retracted address bar, which would push the stat rail below
   the fold until the user scrolls — the fault v2.7.4 was written
   to prevent.
   ============================================================= */
.syn-page .vc_row.syn-hero,
.syn-page .vc_row.syn-model-hero {
  position: relative;
  display: block;                    /* no flex/grid dependency */
  min-height: 100vh;                 /* fallback for older engines */
  min-height: 100svh;                /* v2.7.51 — one full viewport */
  overflow: hidden;                  /* the image is clipped to the box */
  padding: 0;
}
.syn-page .vc_row.syn-model-hero { min-height: 100vh; min-height: 100svh; }

/* the column becomes the content layer, pinned to the bottom of the box */
.syn-page .vc_row.syn-hero > .wpb_column,
.syn-page .vc_row.syn-model-hero > .wpb_column {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  z-index: 2;
  width: auto;
  float: none;
  min-height: 0;
  padding: 0 max(var(--syn-side), calc((100vw - var(--syn-container)) / 2 + var(--syn-side)))
             clamp(2rem, 4vw, 3.5rem);
}
.syn-page .vc_row.syn-hero > .wpb_column > .vc_column-inner,
.syn-page .vc_row.syn-model-hero > .wpb_column > .vc_column-inner {
  position: static; height: auto; min-height: 0; max-width: none;
  padding: 0; margin: 0;
}

/* short viewports: still exactly one viewport. v2.7.52 — the old 620px pin
   pre-dated svh support and was insurance against clipping; the mobile and
   landscape blocks below now handle that by letting the box GROW past
   100svh when the copy needs it, so a fixed pin is no longer required. */
@media (max-height: 640px) {
  .syn-page .vc_row.syn-hero,
  .syn-page .vc_row.syn-model-hero { min-height: 100svh; }
}
@media (max-width: 767px) {
  .syn-page .vc_row.syn-hero > .wpb_column,
  .syn-page .vc_row.syn-model-hero > .wpb_column { padding-left: 20px; padding-right: 20px; }
}


/* =============================================================
   v2.7.5 — HERO background parallax layer
   syn.js lifts the row's own background-image onto .syn-hero__bg,
   which is oversized vertically so it has travel to translate.

   Why not WPBakery's Parallax setting: v2.7.3 pins every injected
   parallax layer to inset:0 / height:100% !important (that fixed the
   hero image falling short on tall rows). WPBakery's parallax needs
   that layer TALLER than the row to have any travel. The two cannot
   both be satisfied, so we own the layer instead.

   Set the row's Parallax to "None" in Design Options; keep the
   background image — that image is what this reads.

   Budget: layer is 130% tall, overhanging 15% top and bottom.
   syn.js translates by at most 10% of row height, so ~33% headroom
   remains and no edge is ever exposed. If you change one number,
   change the other: travel factor must stay well under 0.15.

   Stacking is unchanged: bg 0 · scrim ::after 1 · column 2.
   Progressive enhancement — without JS the row keeps its own
   background and only the drift is lost.
   ============================================================= */
.syn-page .vc_row.syn-hero > .syn-hero__bg,
.syn-page .vc_row.syn-model-hero > .syn-hero__bg {
  position: absolute;
  left: 0; right: 0;
  top: -15%; height: 130%;          /* the travel budget */
  z-index: 0;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  will-change: transform;
  transform: translate3d(0, 0, 0);
  pointer-events: none;
}

/* once the layer exists, stop the row painting the same image behind it
   (the static copy would not move and would show through at the edges) */
.syn-page .vc_row.syn-hero.syn-bg-lifted,
.syn-page .vc_row.syn-model-hero.syn-bg-lifted {
  background-image: none !important;
}

/* optional slow ken-burns drift on top of the parallax.
   Add  syn-kb  to the row's Extra class name to enable. */
/* v2.7.26 — ken-burns DISABLED.
   It animated background-size/background-position on .syn-hero__bg while
   initHeroParallax translates that same element every scroll frame. The two
   fought each other: the drift jittered and never settled. Parallax is the
   better effect and is on every hero, so the drift is removed rather than
   the two being made to share.

   syn-kb is left as a harmless no-op so pages already carrying the class
   need no edit. To bring the effect back, apply it to a separate layer —
   never to .syn-hero__bg. */
.syn-page .vc_row.syn-kb > .syn-hero__bg { animation: none; }

/* reduced motion: flat cover image, no oversize, no animation */
@media (prefers-reduced-motion: reduce) {
  .syn-page .vc_row.syn-hero > .syn-hero__bg,
  .syn-page .vc_row.syn-model-hero > .syn-hero__bg {
    top: 0; height: 100%; animation: none;
  }
}


/* =============================================================
   v2.7.6 — HEADER: the over-hero state
   Diagnosed 9 Aug 2026 by measuring both mastheads. The scrolled
   state was already correct (rules ~109/110/113, body.syn-scrolled).
   The over-hero state was never styled at all: it is the ABSENCE of
   .syn-scrolled, so none of those rules apply and The7's own
   light-preset-color default won — rgba(255,255,255,.9) with white
   text, i.e. white on white over the hero.

   The visible header is #phantom (The7's fixed clone); .masthead is
   the static original. Both are styled so the state is correct
   whichever is on screen during the transition.

   Selectors here are :not(.syn-scrolled) only, so they never overlap
   the scrolled-state rules above — one definition per selector.

   Design system: over hero = rgba(2,30,56,.45) + blur, ivory text,
   champagne-light subline. Scrolled = ivory + rule, deep water text.
   ============================================================= */
body.syn-page:not(.syn-scrolled) #phantom,
body.syn-page:not(.syn-scrolled) .masthead {
  background-color: rgba(2, 30, 56, 0.45) !important;
  -webkit-backdrop-filter: saturate(140%) blur(14px);
  backdrop-filter: saturate(140%) blur(14px);
  box-shadow: none !important;
  border-bottom: 1px solid rgba(247, 245, 240, 0.14) !important;
  transition: background-color .35s ease, border-color .35s ease;
}

/* The7 paints the bar background on inner wrappers in some presets;
   clear them so the glass above is what shows through. */
body.syn-page:not(.syn-scrolled) #phantom .masthead-row,
body.syn-page:not(.syn-scrolled) #phantom .header-bar,
body.syn-page:not(.syn-scrolled) .masthead .masthead-row,
body.syn-page:not(.syn-scrolled) .masthead .header-bar {
  background-color: transparent !important;
}

/* Text: ivory over the hero (design system value, not raw white) */
body.syn-page:not(.syn-scrolled) #phantom .main-nav > li > a .menu-item-text,
body.syn-page:not(.syn-scrolled) #phantom .branding a,
body.syn-page:not(.syn-scrolled) #phantom .soc-ico a,
body.syn-page:not(.syn-scrolled) #phantom .mini-search a,
body.syn-page:not(.syn-scrolled) .masthead .main-nav > li > a .menu-item-text,
body.syn-page:not(.syn-scrolled) .masthead .branding a,
body.syn-page:not(.syn-scrolled) .masthead .soc-ico a,
body.syn-page:not(.syn-scrolled) .masthead .mini-search a {
  color: var(--syn-ivory) !important;
}

/* Hover / active over the hero: champagne light, matching the spec */
body.syn-page:not(.syn-scrolled) #phantom .main-nav > li > a:hover .menu-item-text,
body.syn-page:not(.syn-scrolled) #phantom .main-nav > li.act > a .menu-item-text,
body.syn-page:not(.syn-scrolled) .masthead .main-nav > li > a:hover .menu-item-text,
body.syn-page:not(.syn-scrolled) .masthead .main-nav > li.act > a .menu-item-text {
  color: var(--syn-sand-lt) !important;
}

/* Mobile menu icon must invert with the state too */
body.syn-page:not(.syn-scrolled) #phantom .dt-mobile-menu-icon .lines,
body.syn-page:not(.syn-scrolled) #phantom .dt-mobile-menu-icon .lines::before,
body.syn-page:not(.syn-scrolled) #phantom .dt-mobile-menu-icon .lines::after,
body.syn-page:not(.syn-scrolled) .masthead .dt-mobile-menu-icon .lines,
body.syn-page:not(.syn-scrolled) .masthead .dt-mobile-menu-icon .lines::before,
body.syn-page:not(.syn-scrolled) .masthead .dt-mobile-menu-icon .lines::after {
  background-color: var(--syn-ivory) !important;
}

/* Logo swap: The7 serves both marks and toggles them. Until the sticky
   (dark) logo is uploaded this simply has no effect — it never hides a
   logo that is the only one present. */
body.syn-page:not(.syn-scrolled) #phantom .branding img[class*="sticky"],
body.syn-page:not(.syn-scrolled) .masthead .branding img[class*="sticky"] {
  opacity: 0;
}

/* =============================================================
   v2.7.8 — Ledger rows as links
   The ledger was designed with <div> rows. On Home the rows link
   through to the service pages, so anchors need the underline reset
   and a hover affordance. New selectors only — the existing
   .syn-ledger__row rules are untouched and still govern layout.
   ============================================================= */
.syn-page a.syn-ledger__row {
  text-decoration: none;
  transition: background-color .25s ease, padding-left .25s ease;
}
.syn-page a.syn-ledger__row:hover {
  background: rgba(2, 30, 56, .03);
  padding-left: .6rem;
}
.syn-page .syn-section--dark a.syn-ledger__row:hover {
  background: rgba(247, 245, 240, .05);
}
.syn-page a.syn-ledger__row:hover .syn-ledger__title { color: var(--syn-gold-dp); }
.syn-page .syn-section--dark a.syn-ledger__row:hover .syn-ledger__title { color: var(--syn-sand-lt); }
.syn-page a.syn-ledger__row:focus-visible {
  outline: 2px solid var(--syn-gold);
  outline-offset: 3px;
}

/* =============================================================
   v2.7.9 — Option cards: separate the gutter from the card surface
   Bug: `.syn-options-row > .wpb_column > .vc_column-inner` (4 classes)
   out-specifies `.syn-optioncard > .vc_column-inner` (3), so the card
   inherited `padding: 0 .6rem` — no vertical padding, text flush to
   the shell edge, and card backgrounds touching with no gap.

   Fix: the COLUMN keeps the gutter, the WRAPPER inside becomes the
   card surface. Two jobs, two elements, no specificity race.
   Applies to Home (#endless-blue) and every model page's factory
   option cards from the same pattern.
   ============================================================= */
.syn-page .syn-options-row > .wpb_column.syn-optioncard > .vc_column-inner {
  background: none;
  padding: 0 .6rem;          /* gutter only */
  height: 100%;
  display: flex;
}
.syn-page .syn-options-row > .wpb_column.syn-optioncard:first-child > .vc_column-inner { padding-left: 0; }
.syn-page .syn-options-row > .wpb_column.syn-optioncard:last-child  > .vc_column-inner { padding-right: 0; }

.syn-page .syn-optioncard > .vc_column-inner > .wpb_wrapper {
  flex: 1 1 auto;
  background: var(--syn-shell);
  padding: 1.5rem 1.6rem;    /* the card's own breathing room */
  /* v2.7.15 — the visual editor strips the <p> around card body text, leaving
     a bare text node that `.syn-optioncard p` cannot reach. Styling the
     wrapper keeps the card correct either way. */
  font-size: .9rem;
  line-height: 1.65;
  color: #0B4A72;
}

/* the row itself needs to clear the section's bottom edge */
.syn-page .syn-options-row { margin-bottom: .5rem; }

@media (max-width: 767px) {
  .syn-page .syn-options-row > .wpb_column.syn-optioncard > .vc_column-inner {
    padding: 0 0 .8rem;
  }
}

/* =============================================================
   v2.7.10 — Split-row heading panel (.syn-panel)
   A deep-water panel behind the heading column, so a split row can
   carry weight without a photograph. Follows the proven .syn-highlights
   mechanism (background + padding on .vc_column-inner, height:100%)
   rather than a row background — Design Options backgrounds sit outside
   the stylesheet and are lost when a shortcode is regenerated.

   Requires equal_height="yes" on the row so the panel matches the
   height of the copy beside it.

   Usage: add  syn-panel  to the heading column's Extra class name.
   ============================================================= */
.syn-page .wpb_column.syn-panel > .vc_column-inner {
  background: var(--syn-deepwater);
  padding: clamp(2rem, 3.5vw, 3.2rem);
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.syn-page .syn-panel .wpb_text_column { margin-bottom: 0; }
.syn-page .syn-panel .syn-eyebrow { color: var(--syn-sand-lt); }
.syn-page .syn-panel .syn-eyebrow::before { background: currentColor; }
.syn-page .syn-panel h2,
.syn-page .syn-panel .syn-h2 { color: var(--syn-ivory); margin: 1.1rem 0 0; }
.syn-page .syn-panel h2 em,
.syn-page .syn-panel .syn-h2 em { color: var(--syn-sand-lt); }
.syn-page .syn-panel p { color: rgba(247, 245, 240, .85); }

@media (max-width: 767px) {
  .syn-page .wpb_column.syn-panel > .vc_column-inner { padding: 1.8rem 1.5rem; }
}

/* Meta line: guarantee separation even if the wrapping div is lost to
   the visual editor, and tolerate <br> injected by wpautop. */
.syn-page .syn-meta-line br { display: none; }
.syn-page .syn-meta-line span + span { margin-left: 0; }
.syn-page .syn-meta-line span:not(:last-child)::after {
  content: "\00B7";              /* v2.7.17: visible divider, survives a lost flex container */
  display: inline-block;
  margin: 0 1.4rem;
  color: var(--syn-gold-dp);
  opacity: .6;
}

/* =============================================================
   v2.7.11 — Self-closing dark sections (.syn-section--closed)
   `.syn-section--dark.syn-section` sets padding-bottom:0 so the fleet
   register's dark heading can sit flush against the register row that
   follows it. A dark section that ends on its own content — Endless
   Blue on Home, and the brand pages to come — needs that bottom back.

   Usage: add  syn-section--closed  alongside syn-section syn-section--dark.
   Specificity 5 beats the 4-class rule it corrects, so it resolves
   deterministically rather than by source order.
   ============================================================= */
.syn-page .vc_row.syn-section.syn-section--dark.syn-section--closed {
  padding-bottom: clamp(4rem, 8vw, 7rem);
}

/* =============================================================
   v2.7.13 — SITE FOOTER, styling The7's native markup
   Path B: structure comes from Theme Options + widgets, so the team
   edits links via Appearance > Menus and socials via Theme Options.
   This only supplies typography, colour and spacing.

   The7 emits:  footer.footer.solid-bg
                .widget.wf-cell.wf-1-4      (equal quarter columns)
                .widget-title               (column label)
                ul.contact-info             (contact-info widget)
   NOT scoped under .syn-page — the footer renders on every page,
   including ones without the syn_page flag, so it declares its own
   tokens rather than inheriting them.
   ============================================================= */
.footer.solid-bg {
  --syn-f-midnight: #021E38;
  --syn-f-ivory:    #F7F5F0;
  --syn-f-sand:     #DCC49A;
  --syn-f-sand-lt:  #E8D5AB;
  --syn-f-gold:     #C2A05C;
  --syn-f-serif: 'Instrument Serif', Georgia, serif;
  --syn-f-ui:    'Inter Tight', system-ui, sans-serif;
  --syn-f-mono:  'IBM Plex Mono', ui-monospace, monospace;

  background: var(--syn-f-midnight) !important;
  color: rgba(247, 245, 240, .82);
  font-family: var(--syn-f-ui);
  font-weight: 300;
}
.footer.solid-bg a { color: rgba(247,245,240,.82); transition: color .25s ease; }
.footer.solid-bg a:hover { color: var(--syn-f-sand-lt); }

/* column labels */
.footer.solid-bg .widget-title {
  margin: 0 0 1.1rem;
  font-family: var(--syn-f-mono); font-weight: 400;
  font-size: .62rem; letter-spacing: .2em; text-transform: uppercase;
  color: var(--syn-f-gold);
}
.footer.solid-bg .widget { font-size: .95rem; line-height: 1.7; }
.footer.solid-bg .widget p { line-height: 1.7; }

/* menus + contact-info lists share one treatment */
.footer.solid-bg .widget ul.menu,
.footer.solid-bg .widget ul.contact-info,
.footer.solid-bg .widget ul {
  margin: 0; padding: 0; list-style: none;
}
.footer.solid-bg .widget ul li {
  margin: 0 0 .7rem; padding: 0; border: 0; font-size: .95rem;
}
.footer.solid-bg .widget ul li::before { display: none; }

/* social icons */
.footer.solid-bg .soc-ico a { background: none !important; }
.footer.solid-bg .soc-ico a .soc-font-icon,
.footer.solid-bg .soc-ico a::before { color: rgba(247,245,240,.75) !important; }
.footer.solid-bg .soc-ico a:hover .soc-font-icon,
.footer.solid-bg .soc-ico a:hover::before { color: var(--syn-f-sand-lt) !important; }

/* bottom bar */
.bottom-bar, .bottom-bar.solid-bg {
  background: var(--syn-f-midnight, #021E38) !important;
  border-top: 1px solid rgba(247,245,240,.14);
  font-family: 'IBM Plex Mono', ui-monospace, monospace;
  font-size: .62rem; letter-spacing: .14em; text-transform: uppercase;
  color: rgba(247,245,240,.55);
}
.bottom-bar a { color: rgba(247,245,240,.55); }
.bottom-bar a:hover { color: #E8D5AB; }

/* ---- CTA band: a Custom HTML widget forced to full width ----
   :has() lets one widget break out of The7's quarter-column grid
   without touching the theme's own markup. */
.footer.solid-bg .widget:has(.syn-foot-cta) {
  width: 100%; max-width: 100%; flex-basis: 100%;
  margin-bottom: clamp(2.5rem, 5vw, 3.5rem);
  padding-bottom: clamp(2.5rem, 5vw, 3.5rem);
  border-bottom: 1px solid rgba(247,245,240,.16);
}
.footer.solid-bg .widget:has(.syn-foot-cta) .widget-title { display: none; }
.syn-foot-cta {
  display: flex; flex-wrap: wrap; align-items: flex-end;
  justify-content: space-between; gap: 2rem 3rem;
}
.syn-foot-cta h2 {
  margin: 0; font-family: var(--syn-f-serif, 'Instrument Serif', Georgia, serif);
  font-weight: 400; font-size: clamp(2.2rem, 4.2vw, 3.6rem); line-height: 1.05;
  color: #F7F5F0; letter-spacing: -0.01em; max-width: 16ch;
}
.syn-foot-cta h2 em { font-style: italic; color: #E8D5AB; }
.syn-foot-cta__btns { display: flex; flex-wrap: wrap; gap: 1rem; }
.syn-foot-cta__btns a {
  display: inline-block; font-family: 'IBM Plex Mono', ui-monospace, monospace;
  font-size: .68rem; letter-spacing: .18em; text-transform: uppercase;
  padding: 1.05rem 1.9rem; border: 1px solid transparent; text-decoration: none;
}
.syn-foot-cta__btns .is-solid { background: #DCC49A; color: #021E38 !important; }
.syn-foot-cta__btns .is-solid:hover { background: #E8D5AB; color: #021E38 !important; }
.syn-foot-cta__btns .is-ghost { border-color: rgba(247,245,240,.45); color: #F7F5F0 !important; }
.syn-foot-cta__btns .is-ghost:hover { background: #F7F5F0; color: #021E38 !important; }

/* brand lockup in the first column */
.syn-foot-brand { display: flex; align-items: center; gap: 1rem; margin-bottom: 1.3rem; }
.syn-foot-brand img { max-height: 46px; width: auto; }
.syn-foot-brand__txt { border-left: 1px solid rgba(247,245,240,.3); padding-left: 1rem; }
.syn-foot-brand__name {
  margin: 0; font-weight: 500; font-size: 1.05rem; letter-spacing: .22em;
  text-transform: uppercase; color: #F7F5F0;
}
.syn-foot-brand__tag {
  margin: .3rem 0 0; font-family: 'IBM Plex Mono', ui-monospace, monospace;
  font-size: .56rem; letter-spacing: .2em; text-transform: uppercase; color: #DCC49A;
}
.syn-foot-hours {
  margin: .9rem 0 0; font-family: 'IBM Plex Mono', ui-monospace, monospace;
  font-size: .62rem; letter-spacing: .14em; text-transform: uppercase;
  color: rgba(247,245,240,.6);
}

@media (max-width: 600px) {
  .syn-foot-cta h2 { max-width: none; }
}

/* =============================================================
   v2.7.14 — Footer link + social polish
   The7 underlines widget links by default; nothing else in the
   design system is underlined. Social row rendered as mono labels
   to match the eyebrow language used site-wide.
   ============================================================= */
.footer.solid-bg .widget a,
.footer.solid-bg .widget ul.contact-info a { text-decoration: none; }
.footer.solid-bg .widget a:hover,
.footer.solid-bg .widget ul.contact-info a:hover {
  text-decoration: none; color: #E8D5AB;
}

.syn-foot-social { display: flex; flex-wrap: wrap; gap: 1.4rem; margin-top: 1.4rem; }
.syn-foot-social a {
  font-family: 'IBM Plex Mono', ui-monospace, monospace;
  font-size: .62rem; letter-spacing: .16em; text-transform: uppercase;
  color: rgba(247, 245, 240, .75) !important;
  text-decoration: none !important;
}
.syn-foot-social a:hover { color: #E8D5AB !important; }

/* a .widget-title written inside a Custom HTML widget must match the
   titles The7 renders for the other columns */
.footer.solid-bg .widget p.widget-title {
  margin: 0 0 1.1rem;
  font-family: 'IBM Plex Mono', ui-monospace, monospace;
  font-weight: 400; font-size: .62rem; letter-spacing: .2em;
  text-transform: uppercase; color: #C2A05C;
}

/* =============================================================
   v2.7.16 — YACHT STORE
   .syn-brandstrip — the filmstrip mechanic (flex-expand on hover)
   applied to brand tiles that are links rather than photographs
   with captions. Images are WPBakery Single Image elements inside
   each tile, so they stay builder-editable per the images rule.

   .syn-store-note — the small print under a listings ledger.
   ============================================================= */
.syn-page .syn-brandstrip {
  display: flex; gap: .8rem; flex-wrap: wrap;
  margin-top: clamp(2rem, 4vw, 3rem);
  height: clamp(300px, 42vh, 460px);
}
.syn-page .syn-brandstrip > .wpb_column {
  position: relative; overflow: hidden; isolation: isolate;
  flex: 1 1 0; min-width: 0; width: auto;
  background: var(--syn-midnight);
  transition: flex 1.1s cubic-bezier(.22,.9,.3,1);
}
.syn-page .syn-brandstrip > .wpb_column:hover,
.syn-page .syn-brandstrip > .wpb_column:focus-within { flex: 2.6; }
.syn-page .syn-brandstrip > .wpb_column > .vc_column-inner { height: 100%; padding: 0; }
.syn-page .syn-brandstrip > .wpb_column > .vc_column-inner > .wpb_wrapper { height: 100%; }
.syn-page .syn-brandstrip .wpb_single_image,
.syn-page .syn-brandstrip .wpb_single_image .vc_figure,
.syn-page .syn-brandstrip .wpb_single_image .vc_single_image-wrapper {
  position: absolute; inset: 0; margin: 0; width: 100%; height: 100%;
}
.syn-page .syn-brandstrip .wpb_single_image img {
  width: 100%; height: 100%; object-fit: cover;
  filter: saturate(.9) brightness(.82); transition: filter 1s, transform 1.4s;
}
.syn-page .syn-brandstrip > .wpb_column:hover .wpb_single_image img {
  filter: saturate(1) brightness(.92); transform: scale(1.04);
}
.syn-page .syn-brandstrip .wpb_text_column {
  position: absolute; inset: auto 0 0 0; z-index: 2; margin: 0;
  padding: 2.8rem 1.2rem 1.2rem;
  background: linear-gradient(180deg, transparent, rgba(2,30,56,.86));
  pointer-events: none;
}
.syn-page .syn-brandstrip .syn-brandstrip__name {
  margin: 0; font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(1.2rem, 1.8vw, 1.6rem); line-height: 1.1; color: var(--syn-ivory);
}
.syn-page .syn-brandstrip .syn-brandstrip__meta {
  margin: .45rem 0 0; font-family: var(--syn-mono); font-size: .58rem;
  letter-spacing: .18em; text-transform: uppercase; color: var(--syn-sand-lt);
}
.syn-page .syn-brandstrip a.syn-brandstrip__link {
  position: absolute; inset: 0; z-index: 3; text-indent: -9999px; overflow: hidden;
}
.syn-page .syn-brandstrip a.syn-brandstrip__link:focus-visible {
  outline: 2px solid var(--syn-gold); outline-offset: -4px;
}
@media (max-width: 900px) {
  .syn-page .syn-brandstrip { height: auto; }
  .syn-page .syn-brandstrip > .wpb_column { flex: 1 1 46%; height: 240px; }
  .syn-page .syn-brandstrip > .wpb_column:hover { flex: 1 1 46%; }
}
@media (max-width: 560px) {
  .syn-page .syn-brandstrip > .wpb_column { flex: 1 1 100%; }
}

.syn-page .syn-store-note {
  margin: 1.4rem 0 0; font-family: var(--syn-mono); font-size: .62rem;
  letter-spacing: .14em; text-transform: uppercase; color: rgba(1,51,92,.55);
}
.syn-page .syn-section--dark .syn-store-note { color: rgba(247,245,240,.55); }

/* =============================================================
   v2.7.17 — Dark-section text contrast
   `.syn-body p`, `.syn-lede`, `.syn-ledger__sub` and `.syn-meta-line`
   are all coloured for ivory backgrounds (deep water / ocean). On a
   midnight section they sit at roughly 2:1 contrast — legible on a
   good monitor, invisible on a laptop in daylight.

   The dark variants below mirror the ivory ones: body copy at 85%
   ivory, supporting labels in champagne. Applies wherever a dark
   section carries body copy — Yacht Store pre-owned, Endless Blue on
   Home, About's purpose-driven section, and the model-page specs band.
   ============================================================= */
.syn-page .syn-section--dark .syn-body p,
.syn-page .syn-section--dark p.syn-body,
.syn-page .syn-enquire .syn-body p {
  color: rgba(247, 245, 240, .85);
}
.syn-page .syn-section--dark .syn-lede,
.syn-page .syn-enquire .syn-lede {
  color: rgba(247, 245, 240, .82);
}
.syn-page .syn-section--dark .syn-ledger__sub {
  color: var(--syn-sand-lt);
  opacity: .75;
}
.syn-page .syn-section--dark .syn-meta-line span {
  color: var(--syn-sand-lt);
}
.syn-page .syn-section--dark .syn-store-note,
.syn-page .syn-section--dark .syn-glance__title {
  color: rgba(247, 245, 240, .6);
}
.syn-page .syn-section--dark strong { color: var(--syn-sand-lt); }

/* Brand strip: even breathing room above the next section */
.syn-page .syn-brandstrip { margin-bottom: .5rem; }

/* =============================================================
   v2.7.18 — ABOUT PAGE PATTERNS (from the Claude Design export)
   Every selector below uses a class name that appears nowhere else
   in this stylesheet, so nothing already published can change.
   Verified against v2.7.17 before adding.

   .syn-statcards  white bordered figure cards on ivory
   .syn-splitpanel photo one side, dark numbered list the other
   .syn-methodlist numbered rows inside that dark panel
   .syn-people     portrait cards with initials watermark
   .syn-partners   bordered dealer cards on midnight
   ============================================================= */

/* ---- Stat cards ---------------------------------------------------- */
.syn-page .syn-statcards { margin-top: clamp(2rem, 4vw, 3rem); }
.syn-page .syn-statcards > .wpb_column > .vc_column-inner { padding: 0 .5rem; }
.syn-page .syn-statcards > .wpb_column:first-child > .vc_column-inner { padding-left: 0; }
.syn-page .syn-statcards > .wpb_column:last-child > .vc_column-inner { padding-right: 0; }
.syn-page .syn-statcard > .vc_column-inner > .wpb_wrapper {
  background: #FFFFFF;
  border: 1px solid rgba(2, 30, 56, .10);
  padding: clamp(1.6rem, 2.6vw, 2.2rem) clamp(1.4rem, 2.2vw, 1.8rem);
  height: 100%;
}
.syn-page .syn-statcard__val {
  margin: 0; font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(2.2rem, 3.6vw, 3.2rem); line-height: 1;
  color: var(--syn-deepwater);
}
.syn-page .syn-statcard__label {
  margin: 1.1rem 0 0; font-family: var(--syn-mono); font-size: .62rem;
  letter-spacing: .18em; text-transform: uppercase; color: var(--syn-gold-dp);
}

/* ---- Split panel: media one side, dark method list the other -------- */
.syn-page .vc_row.syn-splitpanel { margin-top: clamp(2.5rem, 5vw, 4rem); }
.syn-page .syn-splitpanel > .wpb_column > .vc_column-inner { padding: 0; }
.syn-page .syn-splitpanel .wpb_single_image,
.syn-page .syn-splitpanel .wpb_single_image .vc_figure,
.syn-page .syn-splitpanel .wpb_single_image .vc_single_image-wrapper,
.syn-page .syn-splitpanel .wpb_single_image img { display: block; width: 100%; margin: 0; }
.syn-page .syn-splitpanel .wpb_single_image img { height: 100%; object-fit: cover; min-height: 340px; }
.syn-page .syn-splitpanel__dark > .vc_column-inner > .wpb_wrapper {
  background: var(--syn-midnight);
  padding: clamp(2rem, 3.4vw, 3rem);
  height: 100%;
}
.syn-page .syn-splitpanel__dark .syn-eyebrow { color: var(--syn-sand-lt); }
.syn-page .syn-splitpanel__dark .syn-eyebrow::before { background: currentColor; }

/* ---- Method list (inside the dark panel) --------------------------- */
.syn-page .syn-methodlist { margin: 1.6rem 0 0; }
.syn-page .syn-methodlist__row {
  display: grid; grid-template-columns: 44px minmax(0, 1fr);
  gap: .2rem 1rem; padding: 1.15rem 0;
  border-bottom: 1px solid rgba(247, 245, 240, .14);
}
.syn-page .syn-methodlist__row:last-child { border-bottom: 0; padding-bottom: 0; }
.syn-page .syn-methodlist__num {
  grid-row: span 2; font-family: var(--syn-mono); font-size: .66rem;
  letter-spacing: .16em; color: var(--syn-sand-lt); padding-top: .25rem;
}
.syn-page .syn-methodlist__title {
  font-family: var(--syn-ui); font-weight: 400; font-size: 1.02rem;
  color: var(--syn-ivory); line-height: 1.3;
}
.syn-page .syn-methodlist__body {
  font-size: .9rem; line-height: 1.6; color: rgba(247, 245, 240, .7);
}

/* ---- People cards -------------------------------------------------- */
.syn-page .syn-people { margin-top: clamp(2rem, 4vw, 3rem); }
.syn-page .syn-people > .wpb_column > .vc_column-inner { padding: 0 .5rem; }
.syn-page .syn-people > .wpb_column:first-child > .vc_column-inner { padding-left: 0; }
.syn-page .syn-people > .wpb_column:last-child > .vc_column-inner { padding-right: 0; }
.syn-page .syn-person > .vc_column-inner > .wpb_wrapper {
  background: var(--syn-shell); height: 100%; position: relative;
}
.syn-page .syn-person .wpb_single_image,
.syn-page .syn-person .wpb_single_image img { display: block; width: 100%; margin: 0; }
.syn-page .syn-person .wpb_single_image img { aspect-ratio: 3/4; object-fit: cover; }
.syn-page .syn-person__meta { padding: 1.1rem 1.2rem 1.3rem; }
.syn-page .syn-person__name {
  margin: 0; font-family: var(--syn-ui); font-weight: 400; font-size: 1rem;
  color: var(--syn-deepwater);
}
.syn-page .syn-person__role {
  margin: .5rem 0 0; font-family: var(--syn-mono); font-size: .58rem;
  letter-spacing: .18em; text-transform: uppercase; color: var(--syn-gold-dp);
}
.syn-page .syn-person__cred {
  margin: .45rem 0 0; font-family: var(--syn-mono); font-size: .62rem;
  color: rgba(1, 51, 92, .6);
}

/* ---- Shipyard partner cards (on midnight) -------------------------- */
.syn-page .syn-partners { margin-top: 0; }
/* v2.7.19: syn-partner sits on a Text Block, not a column, so the card
   surface is .wpb_text_column itself. The earlier column-scoped selector
   matched nothing — no border, no padding, cards running together. */
.syn-page .wpb_text_column.syn-partner {
  border: 1px solid rgba(247, 245, 240, .22);
  padding: clamp(1.5rem, 2.4vw, 2rem) clamp(1.5rem, 2.4vw, 2.1rem);
  margin-bottom: 1.1rem;
}
.syn-page .wpb_text_column.syn-partner:last-of-type { margin-bottom: 1.4rem; }
.syn-page .syn-partner__top {
  display: flex; flex-wrap: wrap; align-items: baseline;
  justify-content: space-between; gap: .6rem 1.5rem;
}
.syn-page .syn-partner__name {
  margin: 0; font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(1.3rem, 2vw, 1.7rem); color: var(--syn-ivory); line-height: 1.1;
}
.syn-page .syn-partner__badge {
  margin: 0; font-family: var(--syn-mono); font-size: .58rem;
  letter-spacing: .18em; text-transform: uppercase; color: var(--syn-sand-lt);
}
.syn-page .syn-partner__meta {
  margin: .7rem 0 0; font-size: .95rem; color: rgba(247, 245, 240, .78);
}

@media (max-width: 900px) {
  .syn-page .syn-statcards > .wpb_column > .vc_column-inner,
  .syn-page .syn-people > .wpb_column > .vc_column-inner { padding: 0 0 1rem; }
  .syn-page .syn-splitpanel .wpb_single_image img { min-height: 260px; }
}

/* =============================================================
   v2.7.22 — YACHT STORE FLEET GRID (from the Fleet Store design)
   All selectors use class names absent from v2.7.21, so nothing
   already published can change.

   .syn-filtertabs  brand filter pills (JS-driven, see syn.js)
   .syn-fleethead   active title + result count
   .syn-fleetgrid   card grid of listings
   .syn-fleetcard   one listing: image, badge, brand, name, price, particulars
   .syn-yardcard    shipyard cards on midnight
   ============================================================= */

/* ---- Filter tabs ---- */
.syn-page .syn-filtertabs {
  display: flex; flex-wrap: wrap; gap: .6rem;
  margin-top: clamp(1.2rem, 2.4vw, 1.8rem);
}
.syn-page .syn-filtertabs button {
  font-family: var(--syn-mono); font-size: .62rem; letter-spacing: .16em;
  text-transform: uppercase; padding: .7rem 1.3rem; cursor: pointer;
  background: transparent; color: var(--syn-deepwater);
  border: 1px solid rgba(2, 30, 56, .18);
  transition: background .25s, color .25s, border-color .25s;
}
.syn-page .syn-filtertabs button:hover { border-color: var(--syn-gold-dp); color: var(--syn-gold-dp); }
.syn-page .syn-filtertabs button[aria-selected="true"] {
  background: var(--syn-midnight); color: var(--syn-ivory); border-color: var(--syn-midnight);
}
/* over a dark section the pills invert */
.syn-page .syn-section--dark .syn-filtertabs button {
  background: rgba(2, 30, 56, .4); color: var(--syn-ivory);
  border-color: rgba(247, 245, 240, .35);
}
.syn-page .syn-section--dark .syn-filtertabs button[aria-selected="true"] {
  background: var(--syn-sand); color: var(--syn-midnight); border-color: var(--syn-sand);
}

/* ---- Fleet head ---- */
.syn-page .syn-fleethead {
  display: flex; flex-wrap: wrap; align-items: baseline;
  justify-content: space-between; gap: 1rem 2rem;
  padding-bottom: 1.4rem; border-bottom: 1px solid rgba(2, 30, 56, .14);
}
.syn-page .syn-fleethead__title {
  margin: 0; font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(1.6rem, 2.6vw, 2.3rem); color: var(--syn-midnight); line-height: 1.1;
}
.syn-page .syn-fleethead__count {
  margin: 0; font-family: var(--syn-mono); font-size: .62rem;
  letter-spacing: .18em; text-transform: uppercase; color: var(--syn-gold-dp);
}

/* ---- Fleet grid + cards ---- */
.syn-page .syn-fleetgrid { margin-top: clamp(1.8rem, 3.5vw, 2.6rem); }
.syn-page .syn-fleetgrid > .wpb_column > .vc_column-inner { padding: 0 .6rem 1.6rem; }
.syn-page .syn-fleetcard.is-hidden { display: none; }
.syn-page .syn-fleetcard > .vc_column-inner > .wpb_wrapper {
  background: var(--syn-shell); height: 100%;
  display: flex; flex-direction: column;
}
.syn-page .syn-fleetcard .wpb_single_image,
.syn-page .syn-fleetcard .wpb_single_image .vc_figure,
.syn-page .syn-fleetcard .wpb_single_image .vc_single_image-wrapper { display: block; margin: 0; width: 100%; }
.syn-page .syn-fleetcard .wpb_single_image img {
  width: 100%; aspect-ratio: 4/3; object-fit: cover; display: block;
  transition: transform 1.2s cubic-bezier(.22,.9,.3,1);
}
.syn-page .syn-fleetcard:hover .wpb_single_image img { transform: scale(1.04); }
.syn-page .syn-fleetcard .wpb_single_image { overflow: hidden; position: relative; }
.syn-page .syn-fleetcard__body { padding: 1.3rem 1.4rem 1.5rem; flex: 1 1 auto; }
.syn-page .syn-fleetcard__badge {
  display: inline-block; margin: 0 0 .9rem;
  font-family: var(--syn-mono); font-size: .56rem; letter-spacing: .18em;
  text-transform: uppercase; padding: .4rem .8rem;
  background: var(--syn-sand); color: var(--syn-midnight);
}
.syn-page .syn-fleetcard__badge--used { background: var(--syn-deepwater); color: var(--syn-ivory); }
.syn-page .syn-fleetcard__brand {
  margin: 0 0 .35rem; font-family: var(--syn-mono); font-size: .58rem;
  letter-spacing: .2em; text-transform: uppercase; color: var(--syn-gold-dp);
}
.syn-page .syn-fleetcard__name {
  margin: 0; font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(1.2rem, 1.8vw, 1.5rem); color: var(--syn-midnight); line-height: 1.15;
}
.syn-page .syn-fleetcard__price {
  margin: .5rem 0 0; font-family: var(--syn-mono); font-size: .72rem;
  letter-spacing: .1em; color: var(--syn-deepwater);
}
.syn-page .syn-fleetcard__specs {
  display: flex; flex-wrap: wrap; gap: 1.2rem; margin: 1.1rem 0 0;
  padding-top: .9rem; border-top: 1px solid rgba(2, 30, 56, .12);
  font-family: var(--syn-mono); font-size: .6rem; letter-spacing: .12em;
  text-transform: uppercase; color: rgba(1, 51, 92, .65);
}
.syn-page .syn-fleetcard__link {
  display: inline-block; margin: 1.1rem 0 0; text-decoration: none;
  font-family: var(--syn-mono); font-size: .62rem; letter-spacing: .16em;
  text-transform: uppercase; color: var(--syn-gold-dp);
  transition: padding-left .25s;
}
.syn-page .syn-fleetcard__link:hover { padding-left: .4rem; }

/* ---- Shipyard cards on midnight ---- */
.syn-page .syn-yardcard > .vc_column-inner > .wpb_wrapper {
  border: 1px solid rgba(247, 245, 240, .22);
  padding: clamp(1.4rem, 2.2vw, 1.9rem); height: 100%;
}
.syn-page .syn-yardcard__name {
  margin: 0; font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(1.3rem, 2vw, 1.6rem); color: var(--syn-ivory); line-height: 1.1;
}
.syn-page .syn-yardcard__desc {
  margin: .7rem 0 1.1rem; font-size: .92rem; line-height: 1.6;
  color: rgba(247, 245, 240, .75);
}
.syn-page .syn-yardcard__status {
  margin: 0; font-family: var(--syn-mono); font-size: .56rem;
  letter-spacing: .18em; text-transform: uppercase; color: var(--syn-sand-lt);
}

@media (max-width: 900px) {
  .syn-page .syn-fleetgrid > .wpb_column > .vc_column-inner { padding: 0 0 1.4rem; }
}

/* =============================================================
   v2.7.24 — HERO LEGIBILITY MODIFIERS
   Ivory hero copy disappears over pale photographs (white hulls,
   bright sky, sun-bleached water). These are opt-in per page —
   add the class in Row settings > Extra class name. All names are
   new, so no existing page changes.

     syn-hero--scrim   strengthen the whole scrim (try this first)
     syn-hero--deep    deep-water wash over the lower half
     syn-keystats--panel   glass band behind the stat rail only
     syn-keystats--sand    champagne band, midnight text
   ============================================================= */

/* --- 1. Stronger scrim: same gradient, more weight at the base --- */
.syn-page .vc_row.syn-hero--scrim::after,
.syn-page .vc_row.syn-model-hero.syn-hero--scrim::after {
  background: linear-gradient(180deg,
    rgba(2, 30, 56, .42) 0%,
    rgba(2, 30, 56, .18) 38%,
    rgba(2, 30, 56, .94) 100%);
}

/* --- 2. Deep-water wash: for images that are pale throughout --- */
.syn-page .vc_row.syn-hero--deep::after,
.syn-page .vc_row.syn-model-hero.syn-hero--deep::after {
  background: linear-gradient(180deg,
    rgba(1, 51, 92, .30) 0%,
    rgba(1, 51, 92, .55) 45%,
    rgba(2, 30, 56, .96) 100%);
}

/* --- 3. Glass band behind the stat rail only ---
   Keeps the photograph visible while guaranteeing the numbers read.
   Matches the header's over-hero glass, so it looks intentional. */
.syn-page .syn-keystats--panel {
  background: rgba(2, 30, 56, .55);
  -webkit-backdrop-filter: saturate(140%) blur(10px);
  backdrop-filter: saturate(140%) blur(10px);
  border-top: 1px solid rgba(247, 245, 240, .28);
  padding: .2rem clamp(1rem, 2vw, 1.6rem) 1rem;
  margin-left: calc(clamp(1rem, 2vw, 1.6rem) * -1);
  margin-right: calc(clamp(1rem, 2vw, 1.6rem) * -1);
}

/* --- 4. Champagne band: for dark images where a light block reads better --- */
.syn-page .syn-keystats--sand {
  background: rgba(220, 196, 154, .93);
  border-top: 1px solid rgba(2, 30, 56, .18);
  padding: .2rem clamp(1rem, 2vw, 1.6rem) 1rem;
  margin-left: calc(clamp(1rem, 2vw, 1.6rem) * -1);
  margin-right: calc(clamp(1rem, 2vw, 1.6rem) * -1);
}
.syn-page .syn-keystats--sand > div { border-right-color: rgba(2, 30, 56, .18); }
.syn-page .syn-keystats--sand .syn-keystats__label { color: rgba(2, 30, 56, .68); }
.syn-page .syn-keystats--sand .syn-keystats__value { color: var(--syn-midnight); }

/* --- 5. Text shadow fallback: cheapest possible insurance ---
   Add syn-hero--shadow when a band would be too heavy but the copy
   still needs lifting off a busy image. */
.syn-page .syn-hero--shadow .syn-keystats__value,
.syn-page .syn-hero--shadow .syn-keystats__label,
.syn-page .syn-hero--shadow .syn-lede,
.syn-page .syn-hero--shadow .syn-eyebrow {
  text-shadow: 0 1px 18px rgba(2, 30, 56, .85);
}

/* =============================================================
   v2.7.25 — GALLERY FILMSTRIP, BUILDER-NATIVE (.syn-photostrip)
   Same behaviour as .syn-strip (flex-expand on hover, caption over
   a gradient) but built from WPBakery Single Image elements, so the
   team picks photographs from the Media Library instead of pasting
   URLs into Raw HTML. .syn-strip is left untouched for the pages
   already using it.

   Markup: inner row carries class="vc_row vc_inner" — NOT vc_row_inner.
           Qualifying on vc_row_inner silently matches nothing.
           inner row.syn-photostrip > vc_column_inner.syn-photocell
             > vc_single_image  +  vc_column_text (tag, caption, index)
   ============================================================= */
.syn-page .syn-photostrip {
  display: flex; flex-wrap: nowrap; gap: .8rem;
  margin-top: clamp(2rem, 4vw, 3rem);
  height: clamp(380px, 52vh, 580px);
}
.syn-page .syn-photostrip > .wpb_column {
  position: relative; overflow: hidden; isolation: isolate;
  flex: 1 1 0; min-width: 0; width: auto;
  background: var(--syn-midnight); cursor: pointer;
  transition: flex 1.1s cubic-bezier(.22,.9,.3,1);
}
.syn-page .syn-photostrip > .wpb_column:hover,
.syn-page .syn-photostrip > .wpb_column:focus-within,
.syn-page .syn-photostrip > .wpb_column.is-open { flex: 3.4; }
.syn-page .syn-photostrip > .wpb_column > .vc_column-inner { height: 100%; padding: 0; }
.syn-page .syn-photostrip > .wpb_column > .vc_column-inner > .wpb_wrapper { height: 100%; }
.syn-page .syn-photostrip .wpb_single_image,
.syn-page .syn-photostrip .wpb_single_image .vc_figure,
.syn-page .syn-photostrip .wpb_single_image .vc_single_image-wrapper {
  position: absolute; inset: 0; margin: 0; width: 100%; height: 100%;
}
.syn-page .syn-photostrip .wpb_single_image img {
  width: 100%; height: 100%; object-fit: cover;
  filter: saturate(.92); transition: filter 1s;
}
.syn-page .syn-photostrip > .wpb_column:hover .wpb_single_image img { filter: saturate(1); }

/* caption block: same visual contract as .syn-strip figcaption */
.syn-page .syn-photostrip .wpb_text_column {
  position: absolute; inset: auto 0 0 0; z-index: 2; margin: 0;
  padding: 2.6rem 1.2rem 1.1rem; pointer-events: none;
  background: linear-gradient(180deg, transparent, rgba(2,30,56,.82));
}
.syn-page .syn-photostrip .syn-photocell__cap {
  display: flex; align-items: flex-end; justify-content: space-between; gap: 1rem;
  margin: 0; font-family: var(--syn-mono); font-size: .62rem; letter-spacing: .18em;
  text-transform: uppercase; color: var(--syn-ivory);
}
.syn-page .syn-photostrip .syn-photocell__idx { color: var(--syn-sand-lt); flex: none; }
.syn-page .syn-photostrip .syn-photocell__tag {
  position: absolute; top: 1rem; left: 1.2rem; z-index: 2; margin: 0;
  font-family: var(--syn-mono); font-size: .6rem; letter-spacing: .2em;
  text-transform: uppercase; color: var(--syn-sand-lt); pointer-events: none;
}

@media (max-width: 900px) {
  .syn-page .syn-photostrip { flex-wrap: wrap; height: auto; }
  .syn-page .syn-photostrip > .wpb_column { flex: 1 1 46%; height: 240px; }
  .syn-page .syn-photostrip > .wpb_column:hover { flex: 1 1 46%; }
  .syn-page .syn-photostrip > .wpb_column.is-open { flex: 1 1 100%; height: 320px; }
}

/* =============================================================
   v2.7.28 — SERVICES PAGE (from the Claude Design export)
   Five new class names, absent from v2.7.27, so nothing already
   published can change. Everything else on the page reuses existing
   patterns: syn-ledger for the index, syn-marquee for the ticker,
   syn-section/--dark for the chapter bands, syn-btn for the CTAs.

     .syn-chapter    a service band, positioning context for the ghost number
     .syn-ghostnum   oversized serif numeral bleeding behind the content
     .syn-svctags    the mono keyword line under a chapter heading
     .syn-svcgrid    2x2 tile grid of key points
     .syn-svctile    one tile: mono label + body line
   ============================================================= */
.syn-page .vc_row.syn-chapter { overflow: hidden; }
.syn-page .syn-chapter > .wpb_column { position: relative; isolation: isolate; }
.syn-page .syn-ghostnum {
  position: absolute; top: clamp(.5rem, 2vw, 1.5rem); right: clamp(1.25rem, 5vw, 5.5rem);
  z-index: 0; margin: 0; pointer-events: none; user-select: none;
  font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(8rem, 18vw, 17rem); line-height: 1;
  color: rgba(1, 51, 92, .06);
}
.syn-page .syn-section--dark .syn-ghostnum { color: rgba(247, 245, 240, .05); }
.syn-page .syn-chapter .wpb_text_column { position: relative; z-index: 1; }

.syn-page .syn-svctags {
  margin: 1.6rem 0 0; font-family: var(--syn-mono); font-size: .68rem;
  letter-spacing: .18em; text-transform: uppercase; line-height: 2.1;
  color: var(--syn-gold-dp);
}
.syn-page .syn-section--dark .syn-svctags { color: var(--syn-sand-lt); }

.syn-page .syn-svcgrid {
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 1px;
  background: rgba(1, 51, 92, .16); border: 1px solid rgba(1, 51, 92, .16);
  margin-top: 2rem;
}
.syn-page .syn-section--dark .syn-svcgrid {
  background: rgba(247, 245, 240, .16); border-color: rgba(247, 245, 240, .16);
}
.syn-page .syn-svctile {
  background: var(--syn-ivory); padding: 1.3rem 1.4rem;
  transition: background .35s ease;
}
.syn-page .syn-svctile:hover { background: var(--syn-shell); }
.syn-page .syn-section--dark .syn-svctile { background: var(--syn-midnight); }
.syn-page .syn-section--dark .syn-svctile:hover { background: var(--syn-deepwater); }
.syn-page .syn-svctile b {
  display: block; margin-bottom: .5rem; font-weight: 400;
  font-family: var(--syn-mono); font-size: .6rem; letter-spacing: .18em;
  text-transform: uppercase; color: var(--syn-gold);
}
.syn-page .syn-svctile span { font-size: .9rem; line-height: 1.6; color: #0B4A72; }
.syn-page .syn-section--dark .syn-svctile span { color: rgba(247, 245, 240, .78); }

@media (max-width: 767px) {
  .syn-page .syn-svcgrid { grid-template-columns: 1fr; }
  .syn-page .syn-ghostnum { font-size: clamp(5rem, 22vw, 8rem); opacity: .7; }
}

/* =============================================================
   v2.7.30 — CONTACT PAGE (from the Claude Design export)
   Base CF7 field styling already exists (v2.x, ~line 958). This adds
   only the reason chips and the field grid. New class names, so
   nothing already published changes.

     .syn-reasons   the "what brings you here?" radio row, as chips
     .syn-fieldrow  two fields side by side
     .syn-formnote  the routing / response note under the form
   ============================================================= */
.syn-page .syn-reasons .wpcf7-radio { display: flex; flex-wrap: wrap; gap: .6rem; }
.syn-page .syn-reasons .wpcf7-list-item { margin: 0; }
.syn-page .syn-reasons .wpcf7-list-item input[type="radio"] {
  position: absolute; opacity: 0; width: 0; height: 0;
}
.syn-page .syn-reasons .wpcf7-list-item label { margin: 0; cursor: pointer; }
.syn-page .syn-reasons .wpcf7-list-item-label {
  display: inline-block;
  font-family: var(--syn-mono); font-size: .62rem; letter-spacing: .16em;
  text-transform: uppercase; padding: .75rem 1.3rem;
  color: var(--syn-deepwater); background: transparent;
  border: 1px solid rgba(1, 30, 56, .28);
  transition: background .25s, color .25s, border-color .25s;
}
.syn-page .syn-reasons .wpcf7-list-item-label:hover {
  border-color: var(--syn-gold-dp); color: var(--syn-gold-dp);
}
.syn-page .syn-reasons input[type="radio"]:checked + .wpcf7-list-item-label {
  background: var(--syn-deepwater); color: var(--syn-ivory);
  border-color: var(--syn-deepwater);
}
.syn-page .syn-reasons input[type="radio"]:focus-visible + .wpcf7-list-item-label {
  outline: 2px solid var(--syn-gold); outline-offset: 2px;
}

.syn-page .syn-fieldrow { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem 1.2rem; }
@media (max-width: 600px) { .syn-page .syn-fieldrow { grid-template-columns: 1fr; } }

.syn-page .syn-formnote {
  margin: 1.2rem 0 0; font-family: var(--syn-mono); font-size: .62rem;
  letter-spacing: .14em; text-transform: uppercase; color: rgba(1, 51, 92, .55);
}
.syn-page .syn-section--dark .syn-formnote { color: rgba(247, 245, 240, .55); }

/* CF7 submit button adopts the design-system solid button */
/* v2.7.34: The7 paints its own accent gradient on buttons via
   background-image. A background-color alone never displaces it — hence
   the teal/green wash on hover. background-image:none is the fix; the
   !important flags are needed because The7's rules carry them too. */
.syn-page .wpcf7 input[type="submit"],
.syn-page .wpcf7 button[type="submit"] {
  font-family: var(--syn-mono); font-size: .68rem; letter-spacing: .18em;
  text-transform: uppercase; padding: 1.05rem 1.9rem; cursor: pointer;
  background-image: none !important;
  background-color: var(--syn-deepwater) !important;
  color: var(--syn-ivory) !important;
  border: 1px solid var(--syn-deepwater) !important;
  border-radius: 0 !important;
  box-shadow: none !important;
  text-shadow: none !important;
  transition: background-color .3s ease, color .3s ease, border-color .3s ease;
}
.syn-page .wpcf7 input[type="submit"]:hover,
.syn-page .wpcf7 button[type="submit"]:hover {
  background-image: none !important;
  background-color: var(--syn-gold) !important;
  border-color: var(--syn-gold) !important;
  color: var(--syn-midnight) !important;
}

/* =============================================================
   v2.7.31 — CONTACT PAGE, matched to the design export
     .syn-officecard   dark card, labelled rows with hairlines
     .syn-yachtfields  submission-only fields, hidden until chosen
     .syn-routenote    "Routed to …" line under the reason chips
   Also: field labels are visually hidden — the design carries all
   guidance in the placeholders — and placeholders keep sentence case
   rather than inheriting the uppercase treatment.
   ============================================================= */

/* ---- Office card ---- */
/* v2.7.32: syn-officecard sits on the COLUMN and each row is its own Text
   Block, so the card is assembled from builder elements rather than one
   block of markup. The card surface is therefore the column's wrapper —
   the same lesson as the partner cards: match the element the class is
   actually on, or the rule matches nothing. */
.syn-page .wpb_column.syn-officecard > .vc_column-inner > .wpb_wrapper {
  background: var(--syn-midnight);
  padding: clamp(2rem, 3.4vw, 3rem);
  height: 100%;
}
.syn-page .syn-officecard .syn-eyebrow { color: var(--syn-sand-lt); margin-bottom: 1.8rem; }
.syn-page .wpb_text_column.syn-officecard__row {
  padding: 0 0 1.3rem; margin: 0 0 1.3rem;
  border-bottom: 1px solid rgba(247, 245, 240, .16);
}
.syn-page .wpb_text_column.syn-officecard__row:last-of-type { border-bottom: 0; margin-bottom: 0; }
.syn-page .syn-officecard__label {
  display: block; margin: 0 0 .6rem;
  font-family: var(--syn-mono); font-size: .6rem; letter-spacing: .2em;
  text-transform: uppercase; color: rgba(247, 245, 240, .55);
}
.syn-page .syn-officecard__val {
  margin: 0; font-size: .98rem; line-height: 1.7; color: var(--syn-ivory);
}
.syn-page .syn-officecard__val a { color: var(--syn-ivory); text-decoration: none; }
.syn-page .syn-officecard__val a:hover { color: var(--syn-sand-lt); }
.syn-page .syn-officecard__val--mono {
  font-family: var(--syn-mono); font-size: .8rem; letter-spacing: .06em;
}
.syn-page .syn-officecard__val--coords { color: var(--syn-sand-lt); }
.syn-page .syn-officecard__link {
  display: inline-block; margin-top: 1.6rem; padding-bottom: .5rem;
  font-family: var(--syn-mono); font-size: .64rem; letter-spacing: .16em;
  text-transform: uppercase; color: var(--syn-ivory); text-decoration: none;
  border-bottom: 1px solid var(--syn-gold);
  transition: color .25s, border-color .25s;
}
.syn-page .syn-officecard__link:hover { color: var(--syn-sand-lt); border-color: var(--syn-sand-lt); }

/* ---- Form: placeholders carry the guidance, labels are for screen readers ---- */
.syn-page .syn-form .wpcf7 label > span:first-child,
.syn-page .syn-form label.syn-sr {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap;
}
.syn-page .syn-form .wpcf7 input::placeholder,
.syn-page .syn-form .wpcf7 textarea::placeholder {
  text-transform: none; letter-spacing: 0;
  font-family: var(--syn-ui); font-size: .95rem; color: rgba(1, 51, 92, .45);
}
.syn-page .syn-form .wpcf7 p { margin: 0 0 1rem; }

/* ---- Routing note ---- */
.syn-page .syn-routenote {
  margin: 1rem 0 1.6rem; font-family: var(--syn-mono); font-size: .68rem;
  letter-spacing: .06em; color: rgba(1, 51, 92, .55); text-transform: none;
}

/* ---- Submission-only fields: hidden until the reason is chosen ---- */
.syn-page .syn-yachtfields { display: none; }
.syn-page .syn-yachtfields.is-open { display: block; }

/* =============================================================
   v2.7.33 — MOBILE FIXES (iPhone, reported 9 Aug)
   Three faults, all narrow-viewport only:

   1. STAT RAIL used float:left in a 2-up grid. Floats do not clear
      when cells differ in height, so "25 / Years on the water" wrapping
      to two lines pushed the next cell into a staircase with large
      voids. Replaced with grid, which needs no clearing.

   2. HERO COPY was clipped at the top. The column is pinned to the
      bottom of the box and the row has overflow:hidden; when the copy
      is taller than the box on a phone, the top is cut off. On narrow
      viewports the column returns to normal flow and the hero grows
      with its content.

   3. LOGO rendered far larger than the 40px cap. The existing rule is
      out-specified by The7's mobile header CSS, so the cap is restated
      at the mobile-header selectors it actually uses.
   ============================================================= */

/* ---- 1. Stat rail: grid, not floats ---- */
@media (max-width: 767px) {
  /* v2.7.37: grid displaced the cells — WPBakery injects helper elements
     inside the row and each became a grid item, pushing "25" into slot 2
     and leaving slot 1 empty. Flex ignores empty helpers (they collapse to
     zero width) while still giving a clean 2-up with no float clearing. */
  .syn-page .vc_row.syn-hero-stats {
    display: flex; flex-wrap: wrap; gap: 0;
  }
  /* v2.7.44: a stray flex item kept taking the first 50% slot, pushing "25"
     into the second cell and leaving a gap. Rather than identify which
     builder helper it is, exclude everything that is not a real column —
     clearfix pseudo-elements included. */
  .syn-page .vc_row.syn-hero-stats::before,
  .syn-page .vc_row.syn-hero-stats::after { display: none !important; }
  .syn-page .vc_row.syn-hero-stats > *:not(.wpb_column) { display: none !important; }
  .syn-page .vc_row.syn-hero-stats > .wpb_column {
    flex: 0 0 50%; max-width: 50%; width: 50%; float: none; margin: 0;
  }
  .syn-page .vc_row.syn-hero-stats > .wpb_column > .vc_column-inner {
    height: 100%; padding: 1rem 1rem 1.1rem;
  }
  .syn-page .vc_row.syn-hero-stats > .wpb_column:nth-child(odd) > .vc_column-inner { border-left: 0; }
  .syn-page .syn-hero-stats .syn-stats__label { line-height: 1.5; }
}

/* ---- 2. Hero: let the copy flow rather than be clipped ---- */
@media (max-width: 767px) {
  .syn-page .vc_row.syn-hero,
  .syn-page .vc_row.syn-model-hero {
    /* v2.7.38: display:block + min-height:0 lets the box grow to fit its
       content, so nothing is clipped — but overflow stays HIDDEN. v2.7.37
       set it visible, which let the parallax layer (130% tall, -15% offset)
       spill out of the hero and collide with the section beneath it. */
    /* v2.7.52: min-height is a FLOOR, not a fixed height — the hero fills
       the phone screen, and still grows if the copy needs more room. */
    min-height: 100svh; height: auto;
    display: block;
    overflow: hidden;
    padding-top: calc(var(--syn-header-h, 90px) + clamp(1.5rem, 5vh, 3rem));
    padding-bottom: clamp(1.5rem, 5vh, 2.5rem);
  }
  .syn-page .vc_row.syn-hero > .wpb_column,
  .syn-page .vc_row.syn-model-hero > .wpb_column {
    position: static;
    padding: 0 var(--syn-side) clamp(1.6rem, 5vw, 2.4rem);
    /* v2.7.52: the COLUMN (not the row) anchors the copy to the bottom of
       the fold. Flex is safe here — a column's only child is
       .vc_column-inner, whereas the ROW carries WPBakery helper elements
       that would become stray flex items (the v2.7.44 stat-rail fault). */
    min-height: calc(100svh - var(--syn-header-h, 90px) - clamp(3rem, 10vh, 5.5rem));
    display: flex; flex-direction: column; justify-content: flex-end;
  }
  .syn-page .syn-hero .syn-h1,
  .syn-page .syn-model-hero .syn-h1 { text-wrap: balance; }
}

/* ---- 3. Logo cap, restated at The7's mobile-header selectors ---- */
@media (max-width: 991px) {
  .masthead .branding img,
  #phantom .branding img,
  .masthead.mobile-header-view .branding img,
  .dt-mobile-header .branding img,
  .masthead .branding .h-logo img,
  .masthead .branding a img {
    max-height: 38px !important;
    width: auto !important;
    height: auto !important;
  }
  .masthead .branding, #phantom .branding { max-width: 62%; }
}

/* =============================================================
   v2.7.35 — MOBILE LEGIBILITY & TAP TARGETS
   Measured on the live site: several mono micro-labels render at
   9–11px. Those are fixed rem sizes, so they do not shrink on a
   phone — they are simply hard to read at arm's length. Raised to a
   ~11px floor below 768px only; desktop keeps the finer setting.

   Tap targets: social icons render 26px and the header contact line
   17px, against the 44px accessibility guideline. Padding is added
   rather than font-size, so nothing visibly changes except the
   clickable area.
   ============================================================= */
@media (max-width: 767px) {
  /* --- legibility floor --- */
  .syn-page .syn-row__tag        { font-size: .68rem; }
  .syn-page .syn-row__specs      { font-size: .7rem;  letter-spacing: .1em; }
  .syn-page .syn-brands__label   { font-size: .68rem; }
  .syn-page .syn-marquee__run    { font-size: .72rem; }
  .syn-page .syn-sec-note        { font-size: .7rem;  }
  .syn-page .syn-news__date      { font-size: .7rem;  }
  .syn-page .syn-list__note      { font-size: .78rem; }
  .syn-page .syn-eyebrow         { font-size: .72rem; }
  .syn-page .syn-keystats__label { font-size: .68rem; }
  .syn-page .syn-stats__label    { font-size: .68rem; }
  .syn-page .syn-fleetcard__specs,
  .syn-page .syn-fleetcard__brand,
  .syn-page .syn-photocell__cap,
  .syn-page .syn-photocell__tag  { font-size: .68rem; }
  .syn-page .syn-svctile b,
  .syn-page .syn-officecard__label { font-size: .66rem; }
  .syn-page .syn-glance-table td,
  .syn-page .syn-spec td         { font-size: .82rem; }

  /* --- tap targets: 44px minimum, no visual change --- */
  .masthead .soc-ico a,
  #phantom .soc-ico a,
  .footer .soc-ico a {
    min-width: 44px; min-height: 44px;
    display: inline-flex; align-items: center; justify-content: center;
  }
  .masthead .mini-contacts a,
  #phantom .mini-contacts a { display: inline-block; padding: .7rem 0; }
  .syn-page .syn-btn,
  .syn-page .wpcf7 input[type="submit"] { min-height: 48px; width: 100%; text-align: center; }
  .syn-page .syn-btn-row { display: flex; flex-direction: column; gap: .7rem; }
  .syn-page .syn-reasons .wpcf7-list-item-label { min-height: 44px; display: inline-flex; align-items: center; }
  .syn-page .syn-filtertabs button { min-height: 44px; }
  .syn-page .syn-ledger__row,
  .syn-page a.syn-row { min-height: 56px; }

  /* long unbreakable strings (email, coordinates) must not force width */
  .syn-page .syn-glance-table td,
  .syn-page .syn-officecard__val { word-break: break-word; overflow-wrap: anywhere; }
}

/* =============================================================
   v2.7.36 — CONTACT: align the two columns
   The office card is shorter than the form beside it, and its eyebrow
   sits ~48px lower because the card's own padding pushes it down while
   the form column has none. Stretching the card and matching that
   inset on the form puts "01 — Write to us" and "02 — The office" on
   the same line and squares the two columns off at the bottom.
   Requires equal_height="yes" on the row.
   ============================================================= */
@media (min-width: 768px) {
  .syn-page .wpb_column.syn-form > .vc_column-inner {
    padding-top: clamp(2rem, 3.4vw, 3rem);
  }
  .syn-page .wpb_column.syn-officecard,
  .syn-page .wpb_column.syn-officecard > .vc_column-inner { height: 100%; }
  .syn-page .wpb_column.syn-officecard > .vc_column-inner > .wpb_wrapper {
    display: flex; flex-direction: column; height: 100%;
  }
  /* the map link settles at the foot of the card rather than floating
     mid-way when the form column is tall */
  .syn-page .syn-officecard > .vc_column-inner > .wpb_wrapper > .wpb_text_column:last-child {
    margin-top: auto; padding-top: 1.4rem;
  }
}

/* =============================================================
   v2.7.38 — iPhone corrections
   1. Hero overflow restored to hidden (see the note above) so the
      parallax layer cannot bleed into the next section.
   2. Buttons rendered several times taller than intended: .syn-btn-row
      is a flex container and the buttons were stretching on the cross
      axis. Height is now pinned to content plus padding.
   3. The stat rail sits over the photograph by design. On a phone the
      hairline alone is not enough separation once the rail wraps to two
      rows, so it takes a translucent midnight band — legible over any
      image without becoming a solid block.
   4. The hero eyebrow wrapped mid-phrase and left its rule stranded.
      Tightened so it holds one line, or breaks cleanly if it cannot.
   ============================================================= */
@media (max-width: 767px) {
  /* --- buttons: content height, not stretched --- */
  .syn-page .syn-btn-row {
    display: flex; flex-direction: column; align-items: stretch; gap: .7rem;
    margin: 1.6rem 0 0;
  }
  .syn-page .syn-btn {
    height: auto; min-height: 0;
    padding: 1.05rem 1.4rem;
    line-height: 1.2;
    align-self: stretch;
    box-sizing: border-box;
  }

  /* --- stat rail: readable band over the photograph --- */
  .syn-page .syn-hero .syn-hero-stats {
    background: rgba(2, 30, 56, .55);
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
    margin-top: clamp(1.4rem, 4vw, 2rem);
    padding: .4rem .8rem .8rem;
  }
  .syn-page .syn-hero .syn-hero-stats > .wpb_column > .vc_column-inner {
    padding: .9rem .6rem .5rem;
  }

  /* --- eyebrow: keep the rule with its text --- */
  .syn-page .syn-hero .syn-eyebrow,
  .syn-page .syn-model-hero .syn-eyebrow {
    font-size: .64rem; letter-spacing: .12em; line-height: 1.6;
    align-items: flex-start;
  }
  .syn-page .syn-hero .syn-eyebrow::before,
  .syn-page .syn-model-hero .syn-eyebrow::before {
    width: 22px; margin-top: .55em; flex: none;
  }
}

/* =============================================================
   v2.7.39 — SEA GLASS PANE (.syn-glass)
   Hero copy over bright photography, without darkening the picture.
   backdrop-filter blurs and saturates whatever is behind the pane, so
   the water stays visible but the text always has something to sit on.
   A hairline border and a diagonal light streak give it the read of
   glass catching sun rather than a flat overlay.

   Preferred over strengthening the scrim: the scrim dims the entire
   photograph to solve a problem that only exists where the text is.

   Usage — add  syn-glass  to the hero COLUMN's Extra class name
   (not the row, not the Text Block).

   Fallback: where backdrop-filter is unsupported (Safari < 15.4,
   Firefox with it disabled) the @supports block below supplies a
   solid-enough tint so the copy never sits unreadable on bare photo.
   ============================================================= */
.syn-page .wpb_column.syn-glass > .vc_column-inner > .wpb_wrapper {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  padding: clamp(1.6rem, 4vw, 3rem) clamp(1.4rem, 3.4vw, 2.8rem);
  background: rgba(247, 245, 240, .10);
  border: 1px solid rgba(247, 245, 240, .26);
  -webkit-backdrop-filter: blur(18px) saturate(150%);
  backdrop-filter: blur(18px) saturate(150%);
  transition: background .5s ease, border-color .5s ease;
}

/* diagonal light streak — the "catching sun" pass across the pane */
.syn-page .syn-glass > .vc_column-inner > .wpb_wrapper::before {
  content: "";
  display: block;
  position: absolute; inset: 0; z-index: -1; pointer-events: none;
  background: linear-gradient(115deg,
    transparent 28%,
    rgba(255, 255, 255, .16) 44%,
    rgba(255, 255, 255, .04) 52%,
    transparent 66%);
}

.syn-page .wpb_column.syn-glass:hover > .vc_column-inner > .wpb_wrapper {
  background: rgba(247, 245, 240, .15);
  border-color: rgba(247, 245, 240, .38);
}

/* copy sits above the streak */
.syn-page .syn-glass .wpb_text_column,
.syn-page .syn-glass .vc_row_inner { position: relative; z-index: 1; }

/* the pane already separates the copy, so the stat rail inside it needs
   no band of its own */
.syn-page .syn-glass .syn-hero-stats {
  background: transparent;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  border-top-color: rgba(247, 245, 240, .3);
}

/* no backdrop-filter support: tint harder so the text is never stranded */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .syn-page .wpb_column.syn-glass > .vc_column-inner > .wpb_wrapper {
    background: rgba(2, 30, 56, .58);
  }
}

@media (max-width: 767px) {
  .syn-page .wpb_column.syn-glass > .vc_column-inner > .wpb_wrapper {
    padding: 1.4rem 1.2rem 1.6rem;
    -webkit-backdrop-filter: blur(14px) saturate(140%);
    backdrop-filter: blur(14px) saturate(140%);
  }
}

/* =============================================================
   v2.7.42 — Charter band: turning the scrim off
   The band's gradient lives on a pseudo-element, so no builder
   setting can disable it. Two opt-in classes on the ROW:

     syn-band--noscrim   remove the gradient entirely
     syn-glass           (on the COLUMN) — the glass pane replaces it,
                         and the gradient steps aside automatically so
                         the two never stack

   Note: with the gradient off, ivory copy on a bright photograph will
   not read. Use syn-glass, or switch the copy to dark via
   syn-band--dark-copy below.
   ============================================================= */
.syn-page .vc_row.syn-band.syn-band--noscrim > .wpb_column > .vc_column-inner::before,
.syn-page .vc_row.syn-band > .wpb_column.syn-glass > .vc_column-inner::before {
  display: none;
}

/* dark copy, for a pale image with no scrim behind it */
.syn-page .syn-band--dark-copy .syn-band__copy .syn-h2,
.syn-page .syn-band--dark-copy .syn-band__copy h2 { color: var(--syn-midnight); }
.syn-page .syn-band--dark-copy .syn-band__copy .syn-eyebrow { color: var(--syn-gold-dp); }
.syn-page .syn-band--dark-copy .syn-band__copy .syn-body,
.syn-page .syn-band--dark-copy .syn-band__copy p { color: #0B4A72; }
.syn-page .syn-band--dark-copy .syn-btn--ghost {
  color: var(--syn-midnight); border-color: rgba(2,30,56,.45);
}
.syn-page .syn-band--dark-copy .syn-btn--ghost:hover {
  background: var(--syn-midnight); color: var(--syn-ivory);
}

/* =============================================================
   v2.7.45 — BUILDER-NATIVE GENERAL ARRANGEMENT (.syn-gaplans)
   The GA switcher needed data-deck / data-variant attributes, which
   WPBakery cannot set — so the plans had to be Raw HTML with pasted
   URLs. This reads the same information from a CSS class instead, so
   each plan becomes an ordinary Single Image element picked from the
   Media Library.

   Markup:
     vc_row_inner.syn-gaplans
       vc_column_inner.syn-plan--{deck}--{variant}
         vc_single_image        ← builder-picked

   The deck tabs and variant chips stay as markup in a Text Block:
   they are <button> controls driving JS, not content.

   initGA() in syn.js v2.7.45 accepts both this and the older
   data-attribute markup, so pages already built keep working.
   ============================================================= */
.syn-page .vc_row_inner.syn-gaplans,
.syn-page .syn-gaplans {
  position: relative; margin-top: 1.4rem; background: #fff;
  border: 1px solid rgba(1,51,92,.12); aspect-ratio: 16/9;
  display: block; padding: clamp(1rem,2vw,2rem); overflow: hidden;
}
.syn-page .syn-gaplans > .wpb_column {
  position: absolute; inset: clamp(1rem,2vw,2rem);
  width: auto; float: none; margin: 0;
  display: grid; place-items: center;
  opacity: 0; pointer-events: none;
  transition: opacity .5s ease;
}
.syn-page .syn-gaplans > .wpb_column.is-active { opacity: 1; pointer-events: auto; }
.syn-page .syn-gaplans > .wpb_column > .vc_column-inner,
.syn-page .syn-gaplans > .wpb_column > .vc_column-inner > .wpb_wrapper {
  height: 100%; width: 100%; padding: 0;
  display: grid; place-items: center;
}
.syn-page .syn-gaplans .wpb_single_image,
.syn-page .syn-gaplans .wpb_single_image .vc_figure,
.syn-page .syn-gaplans .wpb_single_image .vc_single_image-wrapper {
  margin: 0; display: grid; place-items: center; width: 100%; height: 100%;
}
.syn-page .syn-gaplans .wpb_single_image img {
  max-width: min(760px, 100%); max-height: 100%;
  width: auto; height: auto; object-fit: contain;
}
.syn-page .syn-gaplans__empty {
  position: absolute; inset: 0; display: grid; place-items: center;
  font-family: var(--syn-mono); font-size: .68rem; letter-spacing: .18em;
  text-transform: uppercase; color: #567A99; pointer-events: none;
}
.syn-page .syn-gaplans.has-active .syn-gaplans__empty { display: none; }

/* =============================================================
   v2.7.47 — HEADER WORDMARK AS LIVE TEXT  (supersedes v2.7.46)
   The badge stays an image; "SYNERGY" and the tagline are real text —
   sharp at any density, no retina file, and able to recolour with the
   header's two states, which a flat PNG cannot.

   v2.7.46 failed because The7's .assistive-text carries
   `position: absolute !important`. Without !important the override was
   ignored, so both strings sat at the same origin, on top of each other
   and over the badge.

   Fixed two ways: the position reset now carries !important, and the
   branding element becomes a grid with an explicit cell for every
   child — so nothing can land on top of anything else.

   REQUIRES, in this order:
     1. Settings → General → Site Title = Synergy
                             Tagline    = Yacht Sales & Consulting
     2. Theme Options → Header → Branding → badge-only PNG
     3. Mobile header → both switch points → Desktop logo
   ============================================================= */
/* v2.7.63: `display` carries !important because The7's main.min.css declares
   `.masthead .branding { display: flex }` at IDENTICAL specificity (0,2,0).
   With equal specificity the winner is decided by source order alone, so the
   lockup only held while the child stylesheet happened to load last. Any
   plugin, host optimiser or theme update that reorders the enqueue flips it
   to flex, at which point the badge, wordmark and tagline lay out in DOM
   order and the leftover align-self values scatter them diagonally.
   Diagnosed 12 Aug 2026: Fast Velocity Minify merged 33 stylesheets into 2
   and placed the child block first — logged-out visitors got flex, logged-in
   admins bypassed the merge and got grid. FVM is now deactivated; this rule
   makes the outcome order-independent regardless. */
.masthead .branding,
#phantom .branding {
  display: grid !important;
  grid-template-columns: auto auto 1fr;
  grid-template-rows: auto auto;
  align-items: center;
  column-gap: 0;
}

/* badge spans both rows in column 1 */
.masthead .branding > a,
.masthead .branding > img,
#phantom .branding > a,
#phantom .branding > img {
  grid-column: 1; grid-row: 1 / 3;
  display: flex; align-items: center; text-decoration: none;
}
.masthead .branding img,
#phantom .branding img { max-height: 54px; width: auto; }

/* un-hide the strings — !important is required, The7 uses it */
.masthead .branding #site-title,
.masthead .branding #site-description,
#phantom .branding #site-title,
#phantom .branding #site-description {
  position: static !important;
  width: auto !important; height: auto !important;
  overflow: visible !important;
  clip: auto !important; clip-path: none !important;
  white-space: nowrap !important;
  margin: 0 !important; padding: 0;
}

/* wordmark — column 2, row 1 */
.masthead .branding #site-title,
#phantom .branding #site-title {
  grid-column: 2; grid-row: 1; align-self: end;
  font-family: var(--syn-ui, 'Inter Tight', system-ui, sans-serif);
  font-weight: 500; font-size: clamp(1rem, 1.4vw, 1.4rem);
  letter-spacing: .24em; text-transform: uppercase; line-height: 1.1;
  color: #F7F5F0;
  /* v2.7.50: 1.2rem of air between badge and rule, 1.7rem between rule
     and wordmark — the lockup read tight against the separator. */
  margin-left: 1.2rem !important;
  padding-left: 1.7rem !important;
  border-left: 1px solid rgba(247, 245, 240, .32);
}
/* tagline — column 2, row 2, sharing the same hairline */
.masthead .branding #site-description,
#phantom .branding #site-description {
  grid-column: 2; grid-row: 2; align-self: start;
  font-family: var(--syn-mono, 'IBM Plex Mono', ui-monospace, monospace);
  font-weight: 400; font-size: .58rem; letter-spacing: .18em;
  text-transform: uppercase; line-height: 1.4; color: #DCC49A;
  margin-left: 1.2rem !important;
  padding-left: 1.7rem !important; padding-top: .35rem;
  border-left: 1px solid rgba(247, 245, 240, .32);
}

/* anything else The7 prints in here keeps its own cell */
.masthead .branding > .mini-widgets,
#phantom .branding > .mini-widgets { grid-column: 3; grid-row: 1 / 3; }

/* v2.7.49: the wordmark stays ivory in both header states by request.
   The scrolled bar is ivory, so a shadow keeps it legible rather than
   recolouring it. */
body.syn-scrolled .masthead .branding #site-title,
body.syn-scrolled #phantom .branding #site-title,
body.syn-scrolled .masthead .branding #site-description,
body.syn-scrolled #phantom .branding #site-description {
  color: #F7F5F0;
  border-left-color: rgba(247, 245, 240, .32);
  text-shadow: 0 1px 6px rgba(2, 30, 56, .55);
}
body.syn-scrolled .masthead .branding #site-description,
body.syn-scrolled #phantom .branding #site-description { color: #DCC49A; }

/* phone and tablet: badge only — the wordmark crowds the menu icon */
@media (max-width: 991px) {
  /* v2.7.63: must match the !important above — without it the desktop grid
     rule now outranks this one and the mobile lockup breaks. */
  .masthead .branding,
  #phantom .branding { display: flex !important; align-items: center; }
  .masthead .branding #site-title,
  .masthead .branding #site-description,
  #phantom .branding #site-title,
  #phantom .branding #site-description {
    display: none !important;
    position: absolute !important; width: 1px !important; height: 1px !important;
    overflow: hidden !important; clip: rect(0 0 0 0) !important;
  }
  .masthead .branding img,
  #phantom .branding img { max-height: 40px; }
}

/* =============================================================
   v2.7.48 — LOGO SIZE, CATCH-ALL
   The mobile header renders the logo through a container none of the
   earlier selectors reach — a 340px badge was drawing at full size and
   spilling over the hero. Rather than keep guessing at The7's mobile
   markup, this caps any image inside any header wrapper.

   Images in a header are logos; icons are SVG or webfont, so the broad
   net is safe here in a way it would not be elsewhere.
   ============================================================= */
.masthead img,
#phantom img,
.dt-mobile-header img,
.mobile-header-bar img,
.masthead-mobile img,
.branding img,
header.header img,
.top-bar img {
  max-height: 54px !important;
  width: auto !important;
  height: auto !important;
}

@media (max-width: 991px) {
  .masthead img,
  #phantom img,
  .dt-mobile-header img,
  .mobile-header-bar img,
  .masthead-mobile img,
  .branding img,
  header.header img,
  .top-bar img {
    max-height: 40px !important;
  }
}

/* the footer brand lockup keeps its own size */
.footer img, .bottom-bar img { max-height: 46px !important; }

/* =============================================================
   v2.7.51 — SCROLL CUE (.syn-scroll-cue)
   A compass-needle indicator at the foot of every hero, telling the
   visitor the page continues below the fold. Now that heroes are a
   full 100svh there is no longer a sliver of the next section
   showing, so the affordance has to be explicit.

   syn.js injects the markup into every .syn-hero / .syn-model-hero,
   so NO shortcode needs editing — existing and future pages get it
   automatically.

   All class names are new, so nothing already published changes.
   The cue fades out on body.syn-scrolled, reusing the class the
   header state already toggles rather than adding a second listener.

   Stacking inside the hero: bg 0 · scrim ::after 1 · column 2 ·
   cue 3. The cue is pointer-events:none so it can never intercept a
   click meant for the copy beneath it.
   ============================================================= */
.syn-page .syn-scroll-cue {
  position: absolute;
  left: 50%; bottom: clamp(1.4rem, 3vh, 2.4rem);
  transform: translateX(-50%);
  z-index: 3;
  display: flex; flex-direction: column; align-items: center; gap: .7rem;
  pointer-events: none;
  opacity: 1;
  transition: opacity .5s ease, transform .5s ease;
}
.syn-page .syn-scroll-cue__label {
  margin: 0;
  font-family: var(--syn-mono);
  font-size: .58rem; letter-spacing: .24em; text-transform: uppercase;
  color: var(--syn-sand-lt);
  opacity: .8;
  text-shadow: 0 1px 12px rgba(2, 30, 56, .7);
}
.syn-page .syn-scroll-cue__ring {
  position: relative;
  width: 42px; height: 42px;
  border-radius: 50%;
  border: 1px solid rgba(194, 160, 92, .6);
  display: grid; place-items: center;
  animation: syn-cue-bob 2.6s ease-in-out infinite;
}
/* the needle: a chevron rotated 45deg, in Gold Sand (rules/dots role) */
.syn-page .syn-scroll-cue__ring::before {
  content: "";
  width: 9px; height: 9px;
  margin-top: -3px;
  border-right: 1.5px solid var(--syn-gold);
  border-bottom: 1.5px solid var(--syn-gold);
  transform: rotate(45deg);
}
@keyframes syn-cue-bob {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(7px); }
}

/* once the visitor scrolls, the cue has done its job */
body.syn-scrolled .syn-page .syn-scroll-cue,
body.syn-scrolled.syn-page .syn-scroll-cue {
  opacity: 0;
  transform: translateX(-50%) translateY(10px);
}

@media (prefers-reduced-motion: reduce) {
  .syn-page .syn-scroll-cue__ring { animation: none; }
}

/* Phones: the hero grows with its content (v2.7.38) and the column is
   back in normal flow, so an absolutely-positioned cue would sit over
   the stat rail. Hidden below 768px — on a touch device the scroll
   affordance is already understood. */
@media (max-width: 767px) {
  .syn-page .syn-scroll-cue { display: none; }
}

/* =============================================================
   v2.7.52 — DEVICE MATRIX
   One place that states, for every class of screen, how tall a hero
   is and how its furniture behaves. Written as a matrix rather than
   scattered patches so a future change is made once.

   The height contract, everywhere:
       min-height: 100svh   — a FLOOR, never a fixed height.
   The box always fills the screen, and always grows rather than
   clipping when the copy needs more room. `svh` (small viewport
   height) is measured with mobile browser chrome VISIBLE, so the
   hero never hides content behind an address bar that has not
   retracted yet. `dvh` is deliberately not used: it re-measures as
   the bar hides and shows, which visibly resizes the hero mid-scroll.

   Breakpoints, and why each exists:
     ≤ 380   small phones (SE, mini) — the tightest real layout
     ≤ 600   phones, portrait
     ≤ 767   phones + phablets — where the hero column returns to flow
     768–991 tablets portrait (iPad 10.2/Air) — desktop layout, softer type
     992–1199 tablets landscape + small laptops (MacBook Air 13 scaled)
     ≥ 1200  desktop
     ≥ 1600  large desktop / 27in — the rail stops growing, type does not
     landscape phones — height, not width, is the constraint
     hover: none — touch, regardless of size
     retina  — hairlines and image rendering only
   ============================================================= */

/* ---- ≤ 380px · small phones ------------------------------------ */
@media (max-width: 380px) {
  .syn-page { --syn-side: 16px; }
  .syn-page .syn-model-hero .syn-h1,
  .syn-page .syn-hero .syn-h1 { font-size: clamp(1.9rem, 9.5vw, 2.4rem); }
  .syn-page .syn-keystats > div {
    padding-right: 1rem; margin-right: 1rem;
    flex: 1 1 45%;                 /* two per row rather than four cramped */
  }
  .syn-page .syn-keystats__value { font-size: 1.15rem; }
  .syn-page .syn-title-row { gap: .9rem; }
  .syn-page .syn-price__value { font-size: 1.05rem; }
}

/* ---- ≤ 600px · phones, portrait -------------------------------- */
@media (max-width: 600px) {
  .syn-page .syn-keystats { gap: 0; }
  .syn-page .syn-keystats > div { flex: 1 1 45%; }
  .syn-page .syn-keystats > div:nth-child(2n) { border-right: 0; margin-right: 0; }
  .syn-page .syn-photostrip > .wpb_column { flex: 1 1 100%; height: 220px; }
  .syn-page .syn-specs-grid > .wpb_column > .vc_column-inner { padding: 0 0 1.6rem; }
}

/* ---- ≤ 767px · the hero's own breakpoint ----------------------- */
/* Height and flow are handled in the v2.7.33 / v2.7.38 / v2.7.52 blocks
   above. Only the cue and the parallax budget are settled here. */
@media (max-width: 767px) {
  /* the parallax layer overhangs 15%; on a hero that can now grow past
     100svh the overhang must still cover it, so the drift is dropped and
     the layer sits flush. syn.js keeps running — it simply has no travel
     to show, which is the correct outcome on a touch device. */
  .syn-page .vc_row.syn-hero > .syn-hero__bg,
  .syn-page .vc_row.syn-model-hero > .syn-hero__bg { top: 0; height: 100%; }
}

/* ---- 768–991px · tablets, portrait ----------------------------- */
@media (min-width: 768px) and (max-width: 991px) {
  .syn-page { --syn-side: 32px; }
  .syn-page .syn-model-hero .syn-h1,
  .syn-page .syn-hero .syn-h1 { font-size: clamp(2.6rem, 6.4vw, 4rem); }
  /* four stat cells across a 768px rail is 190px each — too tight for the
     serif values, so they wrap to a 2x2 with the dividers still reading */
  .syn-page .syn-keystats > div { flex: 1 1 42%; }
  .syn-page .syn-keystats > div:nth-child(2n) { border-right: 0; margin-right: 0; }
  .syn-page .syn-photostrip { height: clamp(300px, 40vh, 420px); }
  .syn-page .syn-specs-grid > .wpb_column,
  .syn-page .syn-options-row > .wpb_column { width: 100%; }
  .syn-page .syn-specs-grid > .wpb_column > .vc_column-inner { padding: 0 0 1.8rem; }
  .syn-page .syn-options-row > .wpb_column.syn-optioncard > .vc_column-inner { padding: 0 0 1rem; }
}

/* ---- 992–1199px · tablet landscape + small laptops ------------- */
@media (min-width: 992px) and (max-width: 1199px) {
  .syn-page { --syn-side: 40px; }
  .syn-page .syn-model-hero .syn-h1,
  .syn-page .syn-hero .syn-h1 { font-size: clamp(3rem, 5.6vw, 4.6rem); }
  .syn-page .syn-keystats__value { font-size: clamp(1.25rem, 2vw, 1.6rem); }
  .syn-page .syn-photostrip { height: clamp(340px, 46vh, 480px); }
}

/* ---- ≥ 1600px · large desktop ---------------------------------- */
/* The rail is capped at --syn-container, so beyond ~1600px the margins
   grow and nothing else does. Type is nudged up so the hero does not
   look under-scaled on a 27in display. */
@media (min-width: 1600px) {
  .syn-page .syn-model-hero .syn-h1,
  .syn-page .syn-hero .syn-h1 { font-size: clamp(4.6rem, 5vw, 7rem); }
  .syn-page .syn-keystats__value { font-size: clamp(1.8rem, 1.6vw, 2.3rem); }
  .syn-page .syn-photostrip { height: clamp(520px, 54vh, 660px); }
}

/* ---- Landscape phones ------------------------------------------ */
/* A phone on its side is ~380px tall. A full-height hero there leaves no
   room for anything, so the hero is allowed to be shorter than the fold
   and the furniture thins out. Height is the constraint, not width. */
@media (max-height: 500px) and (orientation: landscape) {
  .syn-page .vc_row.syn-hero,
  .syn-page .vc_row.syn-model-hero {
    min-height: 460px;
    padding-top: calc(var(--syn-header-h, 64px) + 1rem);
  }
  .syn-page .vc_row.syn-hero > .wpb_column,
  .syn-page .vc_row.syn-model-hero > .wpb_column { min-height: 0; }
  .syn-page .syn-model-hero .syn-h1,
  .syn-page .syn-hero .syn-h1 { font-size: clamp(1.8rem, 5.5vh, 2.6rem); }
  .syn-page .syn-keystats { margin-top: 1rem; }
  .syn-page .syn-keystats > div { padding-top: .7rem; }
  .syn-page .syn-keystats__value { font-size: 1.05rem; }
  .syn-page .syn-scroll-cue { display: none; }
}

/* ---- Touch devices, any size ----------------------------------- */
@media (hover: none) {
  /* hover-expand cannot be discovered without a pointer; syn.js supplies
     tap-to-expand, and the cursor hint would be a lie */
  .syn-page .syn-photostrip > .wpb_column { cursor: default; }
  /* backdrop-filter is expensive on mobile GPUs and stacks badly while
     scrolling; the glass pane keeps its tint, drops the blur */
  .syn-page .wpb_column.syn-glass > .vc_column-inner > .wpb_wrapper {
    -webkit-backdrop-filter: none; backdrop-filter: none;
    background: rgba(2, 30, 56, .5);
  }
}

/* ---- Retina and better (2x, 3x) -------------------------------- */
/* Only two things genuinely change on a high-density screen: a 1px
   hairline is drawn with 2–3 device pixels and reads heavier than
   intended, and downscaled photographs need the browser's better
   resampling path. Nothing about layout belongs here. */
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
  .syn-page .syn-keystats { border-top-width: .5px; }
  .syn-page .syn-keystats > div { border-right-width: .5px; }
  .syn-page .syn-specgroup__title,
  .syn-page table.syn-spec td,
  .syn-page table.syn-glance-table td,
  .syn-page .syn-ledger__row,
  .syn-page .syn-fleethead { border-bottom-width: .5px; }
  .syn-page .syn-glance > .vc_column-inner,
  .syn-page .syn-yardcard > .vc_column-inner > .wpb_wrapper,
  .syn-page .wpb_text_column.syn-partner { border-width: .5px; }
  .syn-page .syn-scroll-cue__ring { border-width: .5px; }
  /* photographs are served at 2x and scaled down; ask for the quality
     path rather than the fast one */
  .syn-page .syn-photostrip .wpb_single_image img,
  .syn-page .syn-fleetcard .wpb_single_image img,
  .syn-page .syn-overview-media .wpb_single_image img,
  .syn-page .vc_row.syn-hero > .syn-hero__bg,
  .syn-page .vc_row.syn-model-hero > .syn-hero__bg { image-rendering: auto; }
}

/* ---- Print ------------------------------------------------------ */
/* Spec sheets get printed by buyers. Backgrounds and furniture go;
   the particulars stay. */
@media print {
  .syn-page .vc_row.syn-hero,
  .syn-page .vc_row.syn-model-hero { min-height: 0; padding: 1rem 0; }
  .syn-page .syn-hero__bg,
  .syn-page .syn-scroll-cue,
  .syn-page .syn-photostrip,
  .syn-page .syn-decktabs,
  .syn-page .syn-variants { display: none !important; }
  .syn-page .vc_row.syn-hero::after,
  .syn-page .vc_row.syn-model-hero::after { display: none; }
  .syn-page .syn-section--dark,
  .syn-page .vc_row.syn-enquire { background: #fff !important; color: #000 !important; }
  .syn-page .syn-section--dark h2,
  .syn-page .syn-section--dark .syn-h2,
  .syn-page table.syn-spec td:last-child { color: #000 !important; }
  .syn-page table.syn-spec td { border-bottom: 1px solid #ccc; }
}

/* =============================================================
   v2.7.53 — SERVICE PAGES (.svc-*)
   Ported from the six-page service design. Every class name below
   is new, so nothing already published can change. The design's
   palette and type were already ours — Midnight, Ivory, Champagne
   Sand/Light, Gold Sand, Deep Water, Instrument Serif, Inter Tight,
   IBM Plex Mono — so no colour work was required; only the four
   mechanics the design system did not yet own are built here.

   REUSED, not rebuilt: the hero is syn-model-hero + syn-page-hero
   (scrim, parallax, 100svh, scroll cue all inherited); the ticker
   under the hero is syn-marquee; the numbered lists are syn-ledger;
   the closing block is syn-enquire + syn-glance.

   NEW here, with syn.js v2.7.53:
     .svc-wipe      scroll-linked gradient wipe over a statement line
     .svc-year      pinned horizontal "operating year" scroller
     .svc-duty      hover index with a cursor-following photo preview
     .svc-figs      count-up figures on a hairline rail
   ============================================================= */

/* ---- 1. Statement with a scroll-linked wipe --------------------- */
.syn-page .svc-wipe {
  margin: 0;
  font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(1.6rem, 3.2vw, 2.9rem); line-height: 1.3;
  /* v2.7.57: was max-width:26ch, which read as a narrow left column with
     dead space beside it. The statement now spans the content rail. */
  max-width: none; text-wrap: pretty;
  /* two-stop gradient clipped to the text; syn.js drives --svc-wipe
     from 0 to 100% as the line crosses the viewport */
  --svc-wipe: 0%;
  background: linear-gradient(90deg,
    var(--syn-ivory) 0%, var(--syn-ivory) var(--svc-wipe),
    rgba(247,245,240,.24) var(--svc-wipe), rgba(247,245,240,.24) 100%);
  -webkit-background-clip: text; background-clip: text;
  color: transparent;
}
.syn-page .svc-wipe em { font-style: italic; color: var(--syn-sand); }
/* no JS, or reduced motion: the line is simply ivory */
@media (prefers-reduced-motion: reduce) {
  .syn-page .svc-wipe { background: none; color: var(--syn-ivory); }
}

/* ---- 2. The operating year: pinned horizontal scroller ---------- */
/* v2.7.54 — THE PIN NEEDS RUNWAY.
   position:sticky only travels inside a parent taller than itself. The
   section was previously left at content height, so the panel had nowhere
   to stick and the cards simply sat in a row. Two things fix it:

     · the section gets a height — syn.js measures the track and sets it,
       so adding or removing a season needs no CSS change. The min-height
       below is the no-JS floor.
     · that height must REACH the sticky element. WPBakery nests four
       wrappers between the row and our markup, each defaulting to auto
       height, which swallows the runway. The chain below forces it
       through, and keeps overflow visible — a single overflow:hidden
       anywhere in the chain disables sticky entirely. */
.syn-page .vc_row.svc-year {
  position: relative; background: var(--syn-midnight);
  min-height: 300svh;                 /* floor; syn.js refines it */
  overflow: visible;
}
/* v2.7.59: full-bleed rows inherit the content-rail padding from the v2.4.6
   ONE RAIL rule. On this section that inset stopped the cards short of both
   edges, so the run began and ended with a visible margin instead of sliding
   off screen. The heading keeps its own rail inset in the shortcode. */
.syn-page .vc_row.svc-year,
.syn-page .vc_row.svc-year[data-vc-full-width] { padding-left: 0; padding-right: 0; }
.syn-page .vc_row.svc-year > .wpb_column,
.syn-page .vc_row.svc-year > .wpb_column > .vc_column-inner,
.syn-page .vc_row.svc-year > .wpb_column > .vc_column-inner > .wpb_wrapper,
.syn-page .vc_row.svc-year .wpb_text_column,
.syn-page .vc_row.svc-year .wpb_text_column > .wpb_wrapper {
  height: 100%; overflow: visible; padding: 0; margin: 0;
}
.syn-page .svc-year__pin {
  position: sticky; top: 0; height: 100svh;
  overflow: clip;          /* v2.7.61: clip, never hidden — see the rule of
                              thumb in the v2.7.60 block. hidden here would
                              disable any sticky nested inside the panel. */
  display: flex; flex-direction: column; justify-content: center;
}
/* v2.7.64: the heading rail lived in an inline style on the shortcode's
   .syn-sec-head, which no stylesheet could override and which the short-
   viewport block below has to be able to compact. Spacing belongs here. */
.syn-page .svc-year__pin .syn-sec-head {
  flex: none;
  padding: 0 clamp(1.25rem, 6vw, 6rem) clamp(1.2rem, 2.5vh, 2.2rem);
}
.syn-page .svc-year__track {
  display: flex; gap: clamp(1.2rem, 2.5vw, 2.4rem);
  /* v2.7.58: left inset only. Padding on the right created a gutter the last
     card could never cross, so the run ended with a visible stop instead of
     the cards sliding cleanly off the edge. */
  padding: 0;                       /* v2.7.59: edge to edge, both ends */
  will-change: transform;
}
.syn-page .svc-stage {
  flex: none; width: min(78vw, 420px);
  background: #01162A; border: 1px solid rgba(247,245,240,.14);
  display: flex; flex-direction: column;
}
/* v2.7.58: the panel is exactly one viewport tall with overflow:hidden, so a
   card taller than the fold gets its head and feet clipped — which is what
   pushed the heading off the top. The image is capped against viewport
   HEIGHT, so the whole card always fits whatever the window. */
.syn-page .svc-stage__img {
  position: relative; aspect-ratio: 4/3; overflow: hidden;
  max-height: 32svh; flex: none;
}
.syn-page .svc-stage__img img { width: 100%; height: 100%; object-fit: cover; }
.syn-page .svc-stage__season {
  position: absolute; top: 1rem; left: 1.1rem;
  font-family: var(--syn-mono); font-size: .6rem; letter-spacing: .22em;
  text-transform: uppercase; color: var(--syn-midnight);
  background: var(--syn-sand); padding: .4rem .8rem;
}
.syn-page .svc-stage__body { padding: clamp(1rem,2vh,1.4rem) 1.5rem clamp(1.1rem,2vh,1.6rem); }
.syn-page .svc-stage__title {
  margin: 0 0 .8rem; font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(1.4rem, 2.2vw, 1.9rem); color: var(--syn-ivory);
}
.syn-page .svc-stage__text { margin: 0; font-size: clamp(.86rem,1.6vh,.95rem); line-height: 1.6; color: rgba(247,245,240,.78); }
.syn-page .svc-stage__tags {
  display: flex; flex-wrap: wrap; gap: .5rem; margin-top: 1.2rem;
  padding-top: 1.1rem; border-top: 1px solid rgba(247,245,240,.12);
}
.syn-page .svc-stage__tags span {
  font-family: var(--syn-mono); font-size: .56rem; letter-spacing: .16em;
  text-transform: uppercase; color: var(--syn-sand-lt);
  border: 1px solid rgba(232,213,171,.35); padding: .3rem .65rem;
}
/* progress rail under the pinned panel */
.syn-page .svc-year__rail {
  margin: clamp(1.5rem, 3vh, 2.4rem) clamp(1.25rem, 6vw, 6rem) 0;
  height: 1px; background: rgba(247,245,240,.16); position: relative;
  /* v2.7.64: measured at 0px on a 462px viewport — as a flex item in a
     panel shorter than its content the rail was the first thing crushed.
     flex:none keeps the progress indicator present at every height. */
  flex: none;
}
.syn-page .svc-year__bar {
  position: absolute; left: 0; top: -1px; height: 3px; width: 0;
  background: var(--syn-sand); transition: width .1s linear;
}
/* Touch and narrow: native horizontal scroll instead of pinning.
   A pinned scroller hijacks the gesture on a phone, which reads as
   the page having frozen. */
/* v2.7.64: 900 -> 991 so this boundary matches the sticky-ancestor fix
   above, which starts at 992. At 901-991 the old pair left the pin sticky
   inside a still-clipping wrapper — the exact broken state. syn.js carries
   the same 991 in initServiceYear; the two must not drift. */
@media (max-width: 991px), (hover: none) {
  .syn-page .svc-year__pin { position: static; height: auto; padding: 2rem 0; }
  .syn-page .svc-year__track {
    overflow-x: auto; scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch; transform: none !important;
  }
  .syn-page .svc-stage { scroll-snap-align: center; width: 82vw; }
  .syn-page .svc-year__rail { display: none; }
}

/* v2.7.64 — SHORT VIEWPORTS.
   Measured on a 462px-tall window: heading 144 + card 421 + rail 0 = 565
   into a 462px panel. justify-content:center then spilled ~51px off each
   end, clipping the heading away entirely — which reads as the pin having
   failed when it is in fact locked (pinPos sticky, pinTop 0).

   The panel is one viewport by definition, so the content must fit the
   viewport. Below 760px tall everything tightens; the card body has a
   hard floor of roughly 210px, so the image gives up the height.
   Desktop only — below 992 the track scrolls natively and none of this
   applies. */
@media (min-width: 992px) and (max-height: 760px) {
  .syn-page .svc-year__pin .syn-sec-head { padding-bottom: .9rem; }
  .syn-page .svc-year__pin .syn-h2 { font-size: clamp(1.4rem, 2.4vw, 1.9rem); }
  .syn-page .svc-stage__img { max-height: 24svh; }
  .syn-page .svc-stage__body { padding: .9rem 1.2rem 1rem; }
  .syn-page .svc-stage__title { font-size: clamp(1.2rem, 1.9vw, 1.5rem); margin-bottom: .5rem; }
  .syn-page .svc-stage__text { font-size: .84rem; line-height: 1.5; }
  .syn-page .svc-stage__tags { margin-top: .8rem; padding-top: .7rem; }
  .syn-page .svc-year__rail { margin-top: 1rem; }
}
@media (min-width: 992px) and (max-height: 620px) {
  /* last resort: the heading alone survives with the card, no tags */
  .syn-page .svc-stage__img { max-height: 20svh; }
  .syn-page .svc-stage__tags { display: none; }
}

/* ---- 3. Duty index with cursor-following preview ---------------- */
.syn-page .svc-duty { border-top: 1px solid rgba(2,30,56,.14); margin-top: clamp(2rem,4vw,3rem); }
.syn-page .svc-duty__row {
  display: grid; grid-template-columns: 62px minmax(0,1fr) minmax(0,1.5fr);
  gap: 1rem 2.5rem; align-items: baseline;
  padding: 1.5rem 0; border-bottom: 1px solid rgba(2,30,56,.12);
  transition: background .3s ease, padding-left .3s ease;
}
/* v2.7.58 — the row is a grid, so EVERY child takes a cell in source order.
   wpautop wraps the hidden peek image in a <p>, and that paragraph claimed
   cell 1: the number slid to cell 2, the title to cell 3, and the body wrapped
   into the 62px column one word per line. Two defences, so a stray child can
   never displace the content again:
     · the three real children are pinned to their columns by name
     · the image and any paragraph carrying it are removed from layout */
.syn-page .svc-duty__row > .svc-duty__num   { grid-column: 1; }
.syn-page .svc-duty__row > .svc-duty__title { grid-column: 2; }
.syn-page .svc-duty__row > .svc-duty__body  { grid-column: 3; }
.syn-page .svc-duty__row > p:has(> .svc-duty__src),
.syn-page .svc-duty__row > p:empty { display: none !important; }
.syn-page .svc-duty__row:hover { background: rgba(2,30,56,.03); padding-left: .6rem; }
.syn-page .svc-duty__num {
  font-family: var(--syn-mono); font-size: .68rem; letter-spacing: .18em;
  color: var(--syn-gold-dp);
}
.syn-page .svc-duty__title {
  font-family: var(--syn-serif); font-size: clamp(1.15rem,1.8vw,1.55rem);
  color: var(--syn-midnight); line-height: 1.2;
}
.syn-page .svc-duty__body { font-size: 1rem; line-height: 1.7; color: #0B4A72; }
.syn-page .syn-section--dark .svc-duty { border-top-color: rgba(247,245,240,.18); }
.syn-page .syn-section--dark .svc-duty__row { border-bottom-color: rgba(247,245,240,.12); }
.syn-page .syn-section--dark .svc-duty__row:hover { background: rgba(247,245,240,.05); }
.syn-page .syn-section--dark .svc-duty__title { color: var(--syn-ivory); }
.syn-page .syn-section--dark .svc-duty__body { color: rgba(247,245,240,.78); }

/* v2.7.57: the peek image now travels in the markup as a real <img>
   inside each row, hidden here. WPBakery's editor strips data-* attributes
   from text blocks — the same fault that forced the GA switcher onto class
   names in v2.7.45 — so data-peek silently vanished and no row had a photo
   to show. An <img> survives the editor untouched. */
/* v2.7.59: hide the peek source however the editor wraps it, and match on
   the element rather than the class — a stripped class attribute would
   otherwise leave a full-size photograph sitting in the row. */
.syn-page .svc-duty__row .svc-duty__src,
.syn-page .svc-duty__row > img,
.syn-page .svc-duty__row > p > img,
.syn-page .svc-duty__row > figure { display: none !important; }

/* the preview panel that follows the pointer */
/* v2.7.69: a solid ground. The panel's only chrome was a 1px ivory border,
   and "What we handle" is an ivory section — so an empty or slow-loading
   panel was literally invisible against its own background, which is what
   made this read as "hover does nothing". Midnight also stops a white flash
   before the photo paints. */
.syn-page .svc-peek {
  position: fixed; top: 0; left: 0; z-index: 40;
  width: clamp(200px, 20vw, 300px); aspect-ratio: 4/3;
  background: var(--syn-midnight);
  overflow: hidden; pointer-events: none;
  opacity: 0; transform: translate3d(-50%, -50%, 0) scale(.94);
  transition: opacity .35s ease, transform .35s ease;
  border: 1px solid rgba(247,245,240,.3);
  box-shadow: 0 18px 50px rgba(2,30,56,.4);
}
/* v2.7.70 — WHY .is-on WAS LOSING.
   Measured: the panel carried .is-on, both rules were present in the loaded
   stylesheet, NEITHER used !important, and .svc-peek.is-on (0,3,0) is more
   specific than .svc-peek (0,2,0) — yet computed opacity stayed 0. The
   cascade cannot produce that. A CSS ANIMATION can: animated values sit
   ABOVE normal declarations, so an appearance animation holding opacity:0
   with fill-mode forwards/both beats any selector, at any specificity.

   That is the same The7 layer the v2.5.3 rule defeats — which is precisely
   why that rule pairs `animation: none !important` WITH `opacity: 1
   !important`. v2.7.69 applied the pair to the images and left the panel
   itself exposed. Both halves are needed here. */
.syn-page .svc-peek {
  animation: none !important;
}
.syn-page .svc-peek.is-on {
  opacity: 1 !important;
  visibility: visible !important;
  transform: translate3d(-50%, -50%, 0) scale(1);
}
.syn-page .svc-peek img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* touch has no pointer to follow — the panel never appears */
@media (hover: none), (prefers-reduced-motion: reduce) {
  .syn-page .svc-peek { display: none; }
}
@media (max-width: 767px) {
  .syn-page .svc-duty__row { grid-template-columns: 44px 1fr; }
  .syn-page .svc-duty__body { grid-column: 2 / -1; }
}

/* ---- 4. Count-up figures on a hairline rail --------------------- */
.syn-page .svc-figs {
  display: grid; grid-template-columns: repeat(4, 1fr);
  border-top: 1px solid rgba(247,245,240,.2);
  margin-top: clamp(2rem, 4vw, 3rem);
}
.syn-page .svc-figs > div {
  padding: 1.6rem clamp(1rem,2vw,1.8rem) 0;
  border-left: 1px solid rgba(247,245,240,.14);
}
.syn-page .svc-figs > div:first-child { border-left: 0; padding-left: 0; }
.syn-page .svc-figs__val {
  margin: 0; font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(2rem, 3.4vw, 3.1rem); line-height: 1; color: var(--syn-sand-lt);
}
.syn-page .svc-figs__label {
  margin: .7rem 0 0; font-family: var(--syn-mono); font-size: .6rem;
  letter-spacing: .2em; text-transform: uppercase; color: rgba(247,245,240,.6);
}
@media (max-width: 767px) {
  .syn-page .svc-figs { grid-template-columns: repeat(2, 1fr); }
  .syn-page .svc-figs > div:nth-child(odd) { border-left: 0; padding-left: 0; }
  .syn-page .svc-figs > div { padding-top: 1.2rem; }
}

/* ---- 5. Cross-links to the other five services ------------------ */
.syn-page .svc-cross { margin: 0; padding: 0; list-style: none; }
.syn-page .svc-cross li { border-top: 1px solid rgba(247,245,240,.16); }
.syn-page .svc-cross li:last-child { border-bottom: 1px solid rgba(247,245,240,.16); }
.syn-page a.svc-cross__link {
  display: flex; align-items: baseline; gap: 1.2rem;
  padding: 1rem 0; text-decoration: none;
  font-family: var(--syn-mono); font-size: .7rem; letter-spacing: .14em;
  text-transform: uppercase; color: rgba(247,245,240,.82);
  transition: color .25s ease, padding-left .25s ease;
}
.syn-page a.svc-cross__link:hover { color: var(--syn-sand-lt); padding-left: .5rem; }
.syn-page .svc-cross__num { color: var(--syn-gold); flex: none; }
.syn-page .svc-cross__link::after { content: "→"; margin-left: auto; color: var(--syn-gold); }

/* =============================================================
   v2.7.55 — STICKY ANCESTORS
   Diagnosed 11 Aug by walking the ancestor chain of a sticky panel:
   The7 wraps the whole page in `.closed-mobile-header`, which carries
   `overflow: hidden` so the slide-in mobile menu is clipped.

   That single declaration disables `position: sticky` for EVERY
   descendant — an element with overflow hidden becomes the scroll
   container, and sticky has nothing left to stick to. It is why the
   service page's year panel would not lock, and why the Home fleet
   register's sticky stage (v2.5.6) never held either.

   v2.7.62: DO NOT reapply this to .closed-mobile-header. clip removes
   fixed-position descendants, and The7's sticky header #phantom is one.
   The block below is kept only as the record of why.
   ============================================================= */
/* v2.7.62 — REVERTED. This block set .closed-mobile-header to overflow:clip
   so sticky would work inside it. It did — and it also destroyed the header.

   `overflow: clip` CLIPS FIXED-POSITION DESCENDANTS; `overflow: hidden` does
   not. That is the only behavioural difference between them, and it is the
   one that mattered here: The7's sticky header is #phantom, a fixed-position
   clone created inside .closed-mobile-header. Clipping the wrapper removed it
   from the page, leaving the raw .masthead (absolute, top:51px) exposed with
   its branding lockup unplaced.

   The rule is therefore gone, not adjusted. The lesson stands as its inverse:
   never apply overflow:clip to an ancestor of a fixed-position element.

   Sticky is still solved where it counts — v2.7.60 fixes the Home register at
   our own .syn-fleet-row / .syn-stage, which contain no fixed descendants. */

/* =============================================================
   v2.7.64 — STICKY ANCESTORS, SOLVED PROPERLY
   Confirmed live 12 Aug 2026 by walking the ancestor chain of
   .svc-year__pin in a private window. Two ancestors reported a
   non-visible overflow:

     DIV.closed-mobile-header   overflow: hidden      holdsFixed: true
     BODY.syn-page              overflow: hidden auto holdsFixed: true

   BODY is a false positive. Overflow set on <body> PROPAGATES to the
   viewport when <html> is overflow:visible, so body itself is treated
   as visible and never becomes a scroll container. Our
   `body.syn-page { overflow-x: hidden }` is therefore harmless to
   sticky and stays exactly as it is.

   .closed-mobile-header is the real blocker, and `visible` is the
   right tool where `clip` was the wrong one:

     overflow: hidden   scroll container  -> kills sticky
     overflow: clip     clips FIXED kids  -> killed #phantom (v2.7.62)
     overflow: visible  neither           -> sticky works, header safe

   Scoped two ways to keep the blast radius small:
     · body.syn-page only — The7's own templates keep stock behaviour
     · min-width: 992px  — the wrapper clips The7's off-canvas mobile
       menu, which only exists below the switch point. Above it the
       mobile header bar is display:none, so there is nothing to clip.
   Horizontal overflow stays contained regardless, because the body
   rule above propagates overflow-x:hidden to the viewport.

   Fixes BOTH .svc-year__pin (the operating year) and
   .svc-why__aside > .vc_column-inner (Why Synergy) — one cause, two
   symptoms, which is why neither ever held.
   ============================================================= */
/* v2.7.65: !important is required, and this is why.
   Measured live 12 Aug: the rule below loaded, matched, and sat inside a
   satisfied media query (vw 1444) — and the wrapper still computed
   overflow:hidden. A scan of every stylesheet found NO other rule whose
   selector contains "closed-mobile-header", so the winning declaration
   reaches this element through a different selector on the same div —
   an id (1,0,0) outranks this selector's (0,2,1) whatever the order.
   The console proof used setProperty(...,'important'); that is the only
   difference between the test that worked and the rule that did not. */
@media (min-width: 992px) {
  body.syn-page .closed-mobile-header { overflow: visible !important; }
}

/* =============================================================
   v2.7.57 — WHY SYNERGY: sticky aside + bordered cards
   The design holds the heading and its intro still on the left while
   the five reasons scroll past on the right, each in its own bordered
   card. The ledger pattern used previously was a full-width table —
   right content, wrong shape.

   Left column takes  svc-why__aside , right column  svc-why__list .
   Requires the row NOT to be equal-height: the aside must be shorter
   than the list for sticky to have anywhere to travel.
   ============================================================= */
/* v2.7.59 — the row owns its own layout.
   Sticky needs a parent taller than itself. A floated WPBakery column is only
   as tall as its content, and relying on the builder's Equal height setting
   proved unreliable — it depends on a checkbox that a regenerated shortcode
   or an editor round-trip can drop.

   So this row is declared flex here, using the same guard proved on the stat
   rail in v2.7.44: everything that is not a real column is removed, so the
   builder's helper elements can never become stray flex items. The column
   then stretches to the row, and the inner sticks inside it.

   The inner must be auto height — a 100%-tall inner fills the column and has
   nothing left to travel through. */
/* v2.7.67 — THE ROW IS A SCROLL CONTAINER.
   Measured live: DIV.vc_row.wpb_row.vc_row-fluid (this row) computed
   overflow:hidden at 1312px tall, the single blocker between the sticky
   aside and the root. An element with a non-visible overflow becomes the
   scroll container, and sticky inside it has nothing to stick to.

   .vc_row.svc-year has carried `overflow: visible` since v2.7.54 as part
   of its runway chain — which is exactly why the year pin holds and this
   one never did. Same declaration, same reason. !important because the
   competing rule reaches this element by another selector, as proved on
   .closed-mobile-header in v2.7.65. */
.syn-page .vc_row.svc-why {
  display: flex; flex-wrap: wrap; align-items: stretch;
  overflow: visible !important;
}
.syn-page .vc_row.svc-why::before,
.syn-page .vc_row.svc-why::after { display: none !important; }
.syn-page .vc_row.svc-why > *:not(.wpb_column) { display: none !important; }
.syn-page .vc_row.svc-why > .wpb_column { float: none; }

.syn-page .wpb_column.svc-why__aside > .vc_column-inner {
  position: sticky;
  /* v2.7.61: was header-height + 3rem, which held the aside a third of the
     way down the fold — it locked late and the section heading had already
     scrolled past. The Home register sticks at top:0 and reads correctly, so
     both now use the same offset. The header is absolutely positioned and
     overlays content, so a small inset is enough to clear it. */
  /* v2.7.68: clears the header. At 27px the aside locked correctly but the
     header sits over the first ~90-137px of the viewport, so the eyebrow —
     the topmost element in the aside — was covered every time.

     v2.7.61 cut this offset FROM header-height because the aside "locked a
     third of the way down the fold". That reading was taken while sticky was
     disabled outright by the ancestor overflow (fixed in v2.7.65/67), so the
     lateness was a symptom of the broken state, not of the offset.

     --syn-header-h is 90px, the scrolled bar height. ONE KNOB: raise the
     clamp for more air beneath the header, lower it for less. */
  top: calc(var(--syn-header-h, 90px) + clamp(.8rem, 2vh, 1.6rem));
  height: auto !important;
  align-self: flex-start;
  /* the aside must never exceed the fold, or it has no runway of its own —
     and the fold now excludes the header strip it is offset past */
  max-height: calc(100svh - var(--syn-header-h, 90px) - 2rem);
  overflow: clip;
}
.syn-page .svc-why__aside .syn-h2 { margin-top: 1.1rem; }
.syn-page .svc-why__aside .svc-why__intro {
  margin: 1.4rem 0 0; font-size: 1.02rem; line-height: 1.7;
  color: rgba(247, 245, 240, .78); max-width: 34ch;
}

/* v2.7.58: the cards read as a narrower measure in the design — capped
   rather than filling the whole 7/12 column.

   v2.7.66 — NARROWER MEASURE + NATIVE ELEMENTS.
   620px still filled most of a 7/12 column at desktop widths, so the cards
   read wide and thin. 500px forces the body copy to wrap sooner, which is
   what gives each card vertical weight, and the padding steps up with it.
   Adjust ONE number to retune: the max-width below. Lower = thicker.

   The five reasons are now five separate WPBakery text blocks rather than
   one block of markup, so an editor can open any single reason. That makes
   the builder's own .wpb_content_element bottom margin visible between
   them, hence the reset; and each card carries a full border, hence the
   -1px collapse so adjacent cards share one hairline instead of two. */
.syn-page .svc-why__list { display: flex; flex-direction: column; }
.syn-page .wpb_column.svc-why__list > .vc_column-inner > .wpb_wrapper {
  max-width: 500px; margin-left: auto;
  display: flex; flex-direction: column;
  gap: clamp(1rem, 1.6vw, 1.4rem);
}
/* v2.7.67: the design comp shows each reason as its own bordered box with
   clear air between them — NOT the collapsed shared hairline of v2.7.66.
   The builder's own bottom margin is still zeroed, and the gap is declared
   here so it is one value to tune rather than a margin per card. */
.syn-page .svc-why__list .wpb_content_element,
.syn-page .svc-why__list .wpb_text_column { margin-bottom: 0; }
.syn-page .svc-card {
  border: 1px solid rgba(247, 245, 240, .18);
  padding: clamp(1.7rem, 2.9vw, 2.5rem);
  transition: border-color .4s ease, background .4s ease;
}
/* a hovered card must paint above its neighbour, or the collapsed hairline
   hides the highlight on one edge */
.syn-page .svc-card { position: relative; }
.syn-page .svc-card:hover { z-index: 2; }
.syn-page .svc-card:hover {
  border-color: rgba(220, 196, 154, .55);
  background: rgba(247, 245, 240, .04);
}
.syn-page .svc-card__head {
  display: flex; align-items: baseline; gap: 1.4rem;
}
.syn-page .svc-card__num {
  font-family: var(--syn-mono); font-size: .66rem; letter-spacing: .18em;
  color: var(--syn-gold); flex: none;
}
.syn-page .svc-card__title {
  margin: 0; font-family: var(--syn-serif); font-weight: 400;
  font-size: clamp(1.25rem, 2vw, 1.65rem); line-height: 1.15; color: var(--syn-ivory);
}
.syn-page .svc-card__body {
  margin: .9rem 0 0 calc(.66rem + 1.4rem);
  font-size: .98rem; line-height: 1.7; color: rgba(247, 245, 240, .78);
}
@media (max-width: 991px) {
  /* sticky aside makes no sense once the columns stack */
  .syn-page .vc_row.svc-why { display: block; }
  .syn-page .wpb_column.svc-why__aside > .vc_column-inner { position: static; }
  .syn-page .svc-why__aside .svc-why__intro { max-width: none; margin-bottom: 2rem; }
  .syn-page .svc-card__body { margin-left: 0; }
}

/* =============================================================
   v2.7.60 — THE REGISTER STAGE FINALLY STICKS
   Measured on Home: row 1509px, column 1509px, inner 462px and
   position:sticky — every dimension correct, yet it never held.

   Two of OUR OWN rules were the cause. `overflow: hidden` appears on
   .wpb_column.syn-stage (v2.1.1, to clip the image inside the panel)
   and on .vc_row.syn-fleet-row. Either one makes its element a scroll
   container, and a scroll container disables position:sticky in every
   descendant — the same fault v2.7.55 fixed at theme level in
   .closed-mobile-header. The stage has therefore never stuck since it
   was written; it is not a regression.

   `overflow: clip` clips identically without creating a scroll
   container. The clipping the image needs is kept, and the panel can
   stick. This block sits last so it wins on source order, and is
   wrapped in @supports so nothing changes where clip is unsupported.

   Rule of thumb from three rounds of this: never put overflow:hidden
   on an ancestor of a sticky element. Reach for clip.
   ============================================================= */
@supports (overflow: clip) {
  .syn-page .vc_row.syn-fleet-row,
  .syn-page .wpb_column.syn-stage,
  .syn-page .wpb_column.syn-stage > .vc_column-inner {
    overflow: clip;
  }
  /* the sticky panel keeps its own clipping — it is the element the
     image is cropped to, and clipping itself does not break its stick */
  .syn-page .wpb_column.syn-stage > .vc_column-inner { overflow: clip; }
}

/* The panel is the height of the fold. On a short window (a docked
   devtools pane, a laptop at 462px) a 100svh panel plus the row's own
   padding can exceed the runway, and a sticky element with no runway
   simply scrolls. Capping it to the viewport keeps travel available at
   every height. */
.syn-page .wpb_column.syn-stage > .vc_column-inner {
  max-height: 100svh;
}