/* ==========================================================================
   Bloomsbury Publication — Layout System
   --------------------------------------------------------------------------
   Single source of truth for page geometry: container width, gutters,
   section rhythm and heading pattern.

   LOAD ORDER: this file is loaded LAST in <head> (after theme-uplift.css and
   after any per-page $extraCss) so it is the final authority on geometry.
   Page stylesheets keep owning colour/decoration; they must not set container
   widths or section margins any more.

   MIGRATION: pages are moved onto this system one at a time. A page is
   "migrated" once its sections use .bp-section + .bp-shell. Legacy selectors
   for pages not yet migrated are left untouched.
   Migrated: home, pricing, contact, about, get-started,
             author-questionnaire, sitemap, terms, privacy,
             and all 10 service pages.
   ========================================================================== */

:root {
  /* --- Horizontal rhythm ------------------------------------------------ */
  /* One gutter, one content measure. Nothing else may define these. */
  --bp-gutter: clamp(1.125rem, 4vw, 2.5rem);
  --bp-measure: 1200px;                    /* content column */
  --bp-measure-narrow: 780px;              /* long-form prose */
  --bp-measure-text: 62ch;                 /* single paragraph run */

  /* Total shell width = content + both gutters. Used by .bp-shell, the nav
     pill and the footer card so every left edge on the page lines up. */
  --bp-shell: calc(var(--bp-measure) + (var(--bp-gutter) * 2));
  --bp-shell-narrow: calc(var(--bp-measure-narrow) + (var(--bp-gutter) * 2));

  /* Heading + copy measures. Every section heading wraps at the same width,
     so no title runs the full 1200px while its neighbour wraps at 700. */
  --bp-measure-title: 44rem;   /* section h2 */
  --bp-measure-lead: 36rem;    /* section intro paragraph */

  /* Kicker / eyebrow. One token drives the hero badge and every section
     top-heading, so they are always the same size. */
  --bp-eyebrow-size: 0.875rem;      /* 14px */
  --bp-eyebrow-tracking: 0.08em;

  /* --- Vertical rhythm -------------------------------------------------- */
  --bp-section-y: clamp(3rem, 5.5vw, 5rem);      /* between sections */
  --bp-section-y-tight: clamp(2rem, 3.5vw, 3rem);
  --bp-stack-1: 0.5rem;   /* label -> heading */
  --bp-stack-2: 1rem;     /* heading -> lead */
  --bp-stack-3: 2rem;     /* head block -> body */
  --bp-stack-4: 3rem;     /* body -> section CTA */
  --bp-cta-gap: 2rem;     /* space above any section CTA */

  /* --- Chrome ----------------------------------------------------------- */
  --bp-nav-pill-h: 68px;
  --bp-nav-pad-y: 14px;
  /* Balanced on both axes; 12px + ~20px line box = 44px hit target. */
  --bp-nav-item-pad: 12px;
  /* Total space the sticky nav occupies. Hero pulls up by exactly this. */
  --bp-nav-offset: calc(var(--bp-nav-pill-h) + (var(--bp-nav-pad-y) * 2));
}

@media (max-width: 768px) {
  :root {
    --bp-nav-pill-h: 58px;
    --bp-nav-pad-y: 10px;
  }
}

/* ==========================================================================
   Primitives
   ========================================================================== */

/* Horizontal container. Every piece of page content sits in one of these. */
.bp-shell {
  width: 100%;
  max-width: var(--bp-shell);
  margin-inline: auto;
  padding-inline: var(--bp-gutter);
}

.bp-shell--narrow { max-width: var(--bp-shell-narrow); }
.bp-shell--flush  { padding-inline: 0; }

/* Vertical rhythm. Sections carry padding, never margin. */
.bp-section {
  padding-block: var(--bp-section-y);
}

.bp-section--tight { padding-block: var(--bp-section-y-tight); }

/* Smart spacing: two consecutive sections that sit on the same surface would
   otherwise stack padding-bottom + padding-top. Drop the lower one's top so
   the gap between any two sections is exactly one --bp-section-y.
   Sections with their own background use data-surface="tint" and keep both. */
.bp-section[data-surface="page"] + .bp-section[data-surface="page"] {
  padding-block-start: 0;
}

/* Last section before the footer should not double up with footer padding. */
.bp-section:last-of-type { padding-block-end: var(--bp-section-y); }

/* ==========================================================================
   Section heading pattern (kicker -> h2 -> lead)
   Replaces the old <h6> kicker so heading levels stay sequential.
   ========================================================================== */

.section-head {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0;
  text-align: center;
  margin-bottom: var(--bp-stack-3);
}

.section-head--start {
  align-items: flex-start;
  text-align: left;
}

.section-eyebrow,
.section-eyebrow.section-eyebrow {
  margin: 0 0 var(--bp-stack-1);
  color: var(--bp-accent);
  font-family: var(--bp-font-sans);
  font-size: var(--bp-eyebrow-size);
  font-weight: 600;
  letter-spacing: var(--bp-eyebrow-tracking);
  text-transform: uppercase;
  line-height: 1.4;
}

.section-title,
.section-title.section-title {
  max-width: var(--bp-measure-title);
  margin: 0;
  font-family: var(--bp-font-display);
  font-size: clamp(1.85rem, 3.4vw, 2.6rem);
  font-weight: 650;
  line-height: 1.18;
  letter-spacing: -0.02em;
  color: var(--bp-ink);
  text-wrap: balance;
}

/* Accent half of a two-tone heading: same face and weight as the heading,
   only the colour changes. It used to switch to a different family. */
.section-title .span-color {
  color: var(--bp-accent) !important;
  font-family: inherit !important;
  font-weight: inherit !important;
}

.section-lead,
.section-lead.section-lead {
  max-width: var(--bp-measure-lead);
  margin: var(--bp-stack-2) 0 0;
  font-size: 1.02rem;
  line-height: 1.7;
  color: var(--bp-ink-soft);
  text-wrap: pretty;
}

.section-lead + .section-lead { margin-top: 0.7rem; }

/* Card/tile heading — one size for every h3 that sits inside a section.
   Wrapped in :where() so it contributes ZERO specificity: it is a default,
   and any component class must be able to override it. */
.section-subtitle,
:where(.bp-section h3) {
  font-family: var(--bp-font-sans);
  font-size: clamp(1.1rem, 1.6vw, 1.28rem);
  font-weight: 600;
  line-height: 1.35;
  letter-spacing: -0.01em;
  color: var(--bp-ink);
}

/* Body copy inside sections.
   This was `.bp-section p, .bp-section li` — specificity (0,1,1), which beat
   every single-class component rule below it. It was silently forcing
   .section-eyebrow, .section-lead, .plan-card__col-title, .plan-card__tagline,
   .plan-card__saving, .bp-form__lead, .bp-form__hint, .bp-form__privacy and
   .plan-grid__footnote all to 0.98rem. :where() drops it to (0,0,0) so it is
   a true default. */
:where(.bp-section p, .bp-section li) {
  font-size: 0.98rem;
  line-height: 1.65;
}

/* --bp-cta-gap: the single space above any section CTA, site-wide. It was
   32 / 40 / 48px in three different places on one page. */
.section-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.75rem;
  margin-top: var(--bp-cta-gap);
}

/* ==========================================================================
   Accessibility helpers
   ========================================================================== */

.visually-hidden,
.visually-hidden.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.skip-link {
  position: absolute;
  top: 0;
  left: 50%;
  transform: translate(-50%, -120%);
  z-index: 2000;
  padding: 10px 18px;
  border-radius: 0 0 var(--bp-radius-sm) var(--bp-radius-sm);
  background: var(--bp-primary);
  color: #fff;
  font-family: var(--bp-font-sans);
  font-weight: 600;
  text-decoration: none;
  transition: transform 160ms var(--bp-ease);
}

.skip-link:focus-visible {
  transform: translate(-50%, 0);
  color: #fff;
}

/* Scroll-to-anchor must clear the sticky nav. */
:where(main) :target,
[id][data-scroll-target] {
  scroll-margin-top: calc(var(--bp-nav-offset) + 1rem);
}

/* ==========================================================================
   Chrome: nav pill + footer card share the shell width
   ========================================================================== */

nav {
  padding-block: var(--bp-nav-pad-y);
}

#nav-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  width: min(100% - (var(--bp-gutter) * 2), var(--bp-shell));
  height: var(--bp-nav-pill-h);
  padding-inline: var(--bp-nav-item-pad);
}

/* Even inset all round instead of 6px top/bottom vs 16px sides. */
.dropdown-content {
  padding: 6px;
  min-width: 232px;
}

.dropdown-content li a {
  display: block;
  padding: 9px 10px;
  border-radius: 6px;
  font-size: 0.92rem;
  line-height: 1.35;
}

/* hero-home.css previously set its own nav width/padding — keep it aligned. */
body:has(.hero--editorial) nav { padding-block: var(--bp-nav-pad-y); }
body:has(.hero--editorial) #nav-inner {
  width: min(100% - (var(--bp-gutter) * 2), var(--bp-shell));
}

/* --- Nav items ------------------------------------------------------------
   Links and the Services <button> are styled by ONE rule so they cannot
   drift apart. Padding is balanced on both axes (--bp-nav-item-pad), which
   also lands the hit area on the 44px minimum.
   -------------------------------------------------------------------------- */

/* Desktop only. Unscoped, this beat style.css's `@media(max-width:768px)
   { .auth-buttons,.nav-links{display:none} }` on file order and rendered the
   whole desktop menu inside the mobile pill. */
@media (min-width: 769px) {
  .nav-links {
    display: flex;
    align-items: center;
    gap: 2px;
    list-style: none;
    margin: 0;
    padding: 0;
  }
}

/* Belt and braces: hidden from this file too, so file order cannot undo it. */
@media (max-width: 768px) {
  .nav-links,
  .auth-buttons { display: none !important; }
}

.nav-links li {
  display: flex;
  align-items: center;
}

.nav-links li > a,
.nav-links li > .dropbtn {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  height: auto;
  margin: 0;
  padding: var(--bp-nav-item-pad);
  border: 0;
  border-radius: var(--bp-radius-sm);
  background: transparent;
  color: var(--bp-ink);
  font-family: var(--bp-font-sans);
  font-size: 0.95rem;
  font-weight: 500;
  line-height: 1.25;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition: background var(--bp-duration) var(--bp-ease), color var(--bp-duration) var(--bp-ease);
}

.nav-links li > a:hover,
.nav-links li > .dropbtn:hover,
.nav-links li > .dropbtn[aria-expanded="true"] {
  background: var(--bp-primary-soft);
  color: var(--bp-primary);
}

.nav-links li > .dropbtn[data-current="true"] { color: var(--bp-primary); }

.dropbtn__caret {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--bp-muted);
  transition: transform var(--bp-duration) var(--bp-ease),
              color var(--bp-duration) var(--bp-ease);
}

.dropbtn:hover .dropbtn__caret { color: var(--bp-primary); }

.dropdown:hover .dropbtn__caret,
.dropdown:focus-within .dropbtn__caret,
.dropbtn[aria-expanded="true"] .dropbtn__caret {
  transform: rotate(180deg);
  color: var(--bp-primary);
}

.mobile-dropdown__toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
}

.mobile-dropdown.active .dropbtn__caret { transform: rotate(180deg); }

/* Dropdown sits under the trigger, not under the padding box. */
.dropdown-content {
  top: calc(100% + 6px);
  left: 50%;
  translate: -50% 0;
}

/* Open on hover (pointer) and on click/focus (keyboard + touch). */
.dropdown:hover .dropdown-content,
.dropdown:focus-within .dropdown-content,
.dropdown .dropbtn[aria-expanded="true"] + .dropdown-content {
  display: block;
}

/* Current page marker in nav lists. */
.nav-links a[aria-current="page"],
.dropdown-content a[aria-current="page"] {
  color: var(--bp-primary);
  font-weight: 600;
}

.nav-logo { display: inline-flex; align-items: center; }
.nav-logo .logo { height: 48px; width: auto; }

/* theme-uplift's `.mobile-menu a` is (0,1,1) and outranks `.get-started`
   (0,1,0), which painted the menu CTA navy-on-navy. Declared outside any
   media query so it is correct at every width. */
.mobile-menu a.get-started {
  border: 1.5px solid var(--bp-primary);
  background: var(--bp-primary);
  color: #fff;
  font-weight: 600;
}

/* Hamburger is now a <button>. */
.hamburger {
  border: 0;
  background: transparent;
  padding: 8px;
  margin-right: -8px;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
}

.mobile-dropdown__toggle {
  width: 100%;
  border: 0;
  background: transparent;
  padding: 10px 0;
  color: var(--bp-ink);
  font-family: var(--bp-font-sans);
  font-weight: 600;
  font-size: 1rem;
  cursor: pointer;
}

@media (max-width: 768px) {
  /* Was a hardcoded top:50px that never matched the real nav height. */
  .mobile-menu {
    top: var(--bp-nav-offset);
    width: min(100% - (var(--bp-gutter) * 2), var(--bp-shell));
    padding: 1.25rem var(--bp-gutter) 1.5rem;
    gap: 0.25rem;
  }

  .mobile-menu a { padding: 12px 0; }
  .mobile-dropdown.active .mobile-dropdown-content { display: flex; }
  .mobile-dropdown-content a { padding: 10px 0; font-weight: 500; }
}

/* Footer geometry lives in the Footer section at the end of this file. */

/* Flash messages used to carry a hardcoded 960px inline container. */
.flash-messages {
  width: 100%;
  max-width: var(--bp-shell);
  margin: var(--bp-space-4) auto 0;
  padding-inline: var(--bp-gutter);
}

.flash {
  border-radius: var(--bp-radius-sm);
  padding: 0.75rem 1rem;
  margin-bottom: 0.5rem;
  font-size: 0.95rem;
}

.flash-success { background: #e8f7f0; border: 1px solid var(--bp-success); color: #0f4d30; }
.flash-error   { background: #fdecea; border: 1px solid var(--bp-error);   color: #7a1a12; }
.flash-error ul { margin: 0; padding-left: 1.25rem; }

/* ==========================================================================
   Reveal-on-scroll
   Initial state lives in CSS (gated on .js) so nothing renders then flashes
   out. Animates transform/opacity only — never affects layout.
   ========================================================================== */

.js-reveal [data-reveal] {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 500ms var(--bp-ease), transform 500ms var(--bp-ease);
  transition-delay: var(--reveal-delay, 0ms);
  will-change: opacity, transform;
}

.js-reveal [data-reveal].is-revealed {
  opacity: 1;
  transform: none;
  will-change: auto;
}

@media (prefers-reduced-motion: reduce) {
  .js-reveal [data-reveal] {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ==========================================================================
   Testimonials — GLOBAL
   sliders.js measures step = card width + track gap. The cards used to carry
   `margin: 0 10px` on top of the gap, so every step drifted 20px and the
   "centred" card never landed centred. Gap is now the only spacing.
   ========================================================================== */

.carousel-track {
  --review-gap: 1.5rem;
  display: flex;
  gap: var(--review-gap);
  align-items: stretch;
  user-select: none;
}

.review-card {
  position: relative;
  margin: 0;
  flex: 0 0 calc(((100% - (var(--review-gap) * 2)) / 3) - 1px);
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: flex-start;
  gap: 1rem;
  padding: clamp(1.5rem, 2.4vw, 2rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-sm);
  overflow: hidden;
}

/* Gold rule down the leading edge ties the card to the brand accent. */
.review-card::before {
  content: "";
  position: absolute;
  inset: 0 auto 0 0;
  width: 3px;
  background: linear-gradient(180deg, var(--bp-accent), rgba(201, 162, 39, 0.15));
}

.review-quote {
  flex: 0 0 auto;
  color: var(--bp-accent);
  opacity: 0.32;
}

.review-card img { -webkit-user-drag: none; }

.review-text {
  flex: 1 1 auto;
  margin: 0;
  font-size: 0.97rem;
  line-height: 1.7;
  color: var(--bp-ink-soft);
  text-align: left;
}

/* Author block sits on its own footing, divided from the quote. */
/* <footer> inside <blockquote> is the HTML spec's own attribution pattern and
   maps to no landmark unless it is a direct child of <body> — so it is safe
   for SEO/a11y. It only needed the UA block spacing reset. */
.review-author {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  width: 100%;
  margin: auto 0 0;
  padding: 0.7rem 0 0;
  border-top: 1px solid var(--bp-border);
}

.review-author > div { display: grid; gap: 1px; min-width: 0; }

.review-author img {
  flex: 0 0 auto;
  width: 38px;
  height: 38px;
  border-radius: 50%;
  object-fit: cover;
  border: 2px solid var(--bp-bg-elevated);
  box-shadow: 0 0 0 1px var(--bp-border);
}

.author-name {
  font-family: var(--bp-font-sans);
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--bp-ink);
  line-height: 1.25;
}

.stars {
  color: var(--bp-accent);
  font-size: 0.68rem;
  letter-spacing: 0.1em;
  line-height: 1.3;
}

/* sliders.js centres the active card. With an EVEN number of cards across,
   centring one necessarily half-clips its neighbours — that is why the
   left-most review was cut off. Visible counts are odd only: 3, then 1. */
@media (max-width: 960px) {
  .carousel-track { --review-gap: 1rem; }
  .review-card { flex-basis: min(26rem, 82vw); }
}

@media (max-width: 640px) {
  .review-card { flex-basis: min(20rem, 84vw); }
}

/* ==========================================================================
   FAQ accordion — GLOBAL (opt-in via .faq-accordion)
   Pages still using the legacy .faq-container markup are unaffected.
   ========================================================================== */

.faq-accordion {
  width: 100%;
  max-width: var(--bp-measure-narrow);
  margin-inline: auto;
}

.faq-accordion .faq-item {
  border-bottom: 1px solid var(--bp-border);
  border-radius: 0;
  margin: 0;
  overflow: visible;
}

.faq-accordion .faq-item:hover { transform: none; }

.faq-accordion h3 { margin: 0; font: inherit; }

.faq-accordion .faq-question {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 1rem;
  width: 100%;
  padding: 1.15rem 0;
  border: 0;
  background: transparent;
  color: var(--bp-ink);
  font-family: var(--bp-font-sans);
  font-size: 1.02rem;
  font-weight: 600;
  line-height: 1.5;
  text-align: left;
  cursor: pointer;
}

/* The old caret was two rotated borders, so opening it moved the glyph off
   centre. Now a real chevron in a fixed box, rotated about its own middle. */
.faq-accordion .faq-question::after { content: none; }

.faq-question__caret {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: var(--bp-surface);
  /* --bp-accent on --bp-surface is only 2.14:1; accent-hover gives 3.07:1,
     clearing the 3:1 WCAG minimum for non-text UI. */
  color: var(--bp-accent-hover);
  transition: transform var(--bp-duration) var(--bp-ease),
              background var(--bp-duration) var(--bp-ease),
              color var(--bp-duration) var(--bp-ease);
}

.faq-accordion .faq-question[aria-expanded="true"] .faq-question__caret {
  transform: rotate(180deg);
  background: var(--bp-primary);
  color: #fff;
}

.faq-accordion .faq-question:hover .faq-question__caret {
  background: var(--bp-primary-soft);
}

.faq-accordion .faq-question[aria-expanded="true"]:hover .faq-question__caret {
  background: var(--bp-primary);
}

/* grid-rows animation: smooth open/close with no magic max-height. */
.faq-accordion .faq-answer {
  display: grid;
  grid-template-rows: 0fr;
  max-height: none;
  padding: 0;
  background: transparent;
  transition: grid-template-rows var(--bp-duration) var(--bp-ease);
}

.faq-accordion .faq-answer > * {
  overflow: hidden;
  min-height: 0;
  margin: 0;
  color: var(--bp-ink-soft);
  font-size: 0.98rem;
  line-height: 1.7;
}

.faq-accordion .faq-item.active .faq-answer { grid-template-rows: 1fr; }
.faq-accordion .faq-item.active .faq-answer > * { padding-bottom: 1.15rem; }

/* ==========================================================================
   HOME PAGE
   Scoped to .page-home so the 11 pages that share these class names keep
   their current layout until each one is migrated.
   ========================================================================== */

/* --- Hero ---------------------------------------------------------------- */

.page-home .hero.hero--editorial {
  /* Pull under the sticky nav using the real nav height, not a magic number. */
  margin-top: calc(var(--bp-nav-offset) * -1);
  padding-block: calc(var(--bp-nav-offset) + var(--bp-section-y-tight)) var(--bp-section-y);
  min-height: 0;
}

.page-home .hero-shell {
  width: 100%;
  max-width: var(--bp-shell);
  margin-inline: auto;
  padding-inline: var(--bp-gutter);
  gap: var(--bp-section-y-tight);
}

.page-home .hero-copy,
.page-home .hero-platforms { max-width: 900px; }

/* Same 14px token as every section eyebrow, so the badge and the section
   top-headings read as one type role. */
.page-home .hero-eyebrow {
  padding: 7px 16px;
  font-size: var(--bp-eyebrow-size);
  font-weight: 600;
  letter-spacing: var(--bp-eyebrow-tracking);
  line-height: 1.25;
}

/* The h1 gets its own (wider) measure: it carries hard line breaks and is the
   largest type on the page, so the 44rem section measure would break it up. */
.page-home .hero.hero--editorial h1 {
  max-width: 54rem;
  font-size: clamp(2.2rem, 4.4vw, 3.5rem);
  line-height: 1.14;
}

.page-home .hero-lead { max-width: var(--bp-measure-lead); }

/* --- Key figures --------------------------------------------------------- */

/* Pure grid container — no background, no padding. The boxes inside are
   already bordered cards; framing them again was a box inside a box. */
.page-home .counting-container {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(0.75rem, 1.6vw, 1.25rem);
  padding: 0;
  margin: 0;
  background: none;
  border-radius: 0;
  /* style.css sets align-items:center; on a grid that stops the cards
     stretching, leaving three different heights. */
  align-items: stretch;
  justify-content: stretch;
}

.page-home .counting-box {
  width: auto;
  min-width: 0;
  min-height: 0;
  height: auto;
  padding: clamp(1.25rem, 2vw, 1.75rem) 1rem;
  gap: 0.5rem;
  transform: none;
}

.page-home .counting-box:nth-child(2) { transform: none; }

.page-home .counting-image {
  width: 44px;
  height: 44px;
  margin-bottom: 0.5rem;
}

.page-home .counting-number {
  /* Reserve the line box and lock digit width so counting never reflows. */
  min-height: 2.1rem;
  margin: 0 0 0.25rem;
  font-family: var(--bp-font-display);
  font-size: clamp(1.35rem, 2.2vw, 1.75rem);
  font-weight: 650;
  color: var(--bp-ink);
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
  white-space: nowrap;
}

.page-home .counting-text {
  margin: 0;
  font-size: 0.95rem;
  line-height: 1.45;
  color: var(--bp-muted);
  text-wrap: balance;
}

@media (max-width: 720px) {
  .page-home .counting-container { grid-template-columns: 1fr; }
  .page-home .counting-box { max-width: none; }
}

/* --- Why choose us ------------------------------------------------------- */

/* Two different elements share this class. On the service pages it is an
   inner <div>, so the legacy style.css padding goes entirely. On home it is
   the <section> itself, which also carries .bp-section: strip only the inline
   axis (style.css sets `padding: 50px 8%`, and .bp-section's `padding-block`
   longhand cannot override a shorthand's inline half). Zeroing both axes here
   is what killed the gap below the CTA and above "Our tailored packages". */
.why-spines-section:not(.bp-section) { padding: 0; }
.why-spines-section.bp-section { padding-inline: 0; }

.why-spines-container {
  display: grid;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
  gap: clamp(1.5rem, 3vw, 2.75rem);
  align-items: center;
}

.why-spines-left { display: block; width: 100%; }

/* No aspect-ratio: it was hardcoded to 316/382 (the home page image) and
   forced onto every page. Three service pages use landscape images
   (429x379, 1792x1553), which `contain` then letterboxed. Every <img> now
   carries intrinsic width/height, so the browser derives the correct ratio
   per image and still reserves the right box. */
.why-spines-left img {
  display: block;
  width: 100%;
  max-width: 500px;
  height: auto;
  margin-inline: auto;
  border-radius: var(--bp-radius-lg);
}

.why-spines-right {
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
  min-width: 0;
}

.why-spines-box {
  align-items: flex-start;
  gap: 1rem;
  padding: clamp(1rem, 1.6vw, 1.25rem);
}

.why-spines-box img {
  flex: 0 0 auto;
  width: 40px;
  height: 40px;
  object-fit: contain;
}

.why-spines-box p {
  width: auto;
  margin: 0;
  font-size: 0.98rem;
  line-height: 1.65;
}

.why-spines-btn-wrap { margin: var(--bp-cta-gap) 0 0; margin-top: var(--bp-cta-gap); }

@media (max-width: 900px) {
  .why-spines-container { grid-template-columns: 1fr; }
  .why-spines-left { order: 2; }
  .why-spines-left img { max-width: 420px; }
}

/* --- Packages ------------------------------------------------------------ */


.did-you-know-inner-container {
  width: 100%;
  max-width: none;
  /* style.css sets align-items:center on this flex column, which makes every
     child shrink-to-fit — that is what collapsed the carousel. Children now
     stretch and centre their own contents. */
  align-items: stretch;
  padding: clamp(1.75rem, 3vw, 3rem) clamp(1.25rem, 2.5vw, 2.5rem);
  gap: 0;
}

.did-you-know-inner-container .section-head { margin-bottom: 0; }

/* --- How it works / step tabs -------------------------------------------- */

.page-home .steps {
  width: 100%;
  max-width: none;
  margin: 0;
  padding: clamp(1.25rem, 2.4vw, 2rem);
  border-radius: var(--bp-radius-lg);
  border: 1px solid var(--bp-border);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-sm);
}

.page-home .step-nav {
  display: flex;
  gap: 0.5rem;
  margin: 0;
  border-bottom: 1px solid var(--bp-border);
}

.page-home .step-nav button {
  flex: 1 1 12rem;
  min-width: 0;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.25rem;
  padding: 0.75rem 0.5rem 1rem;
  border: 0;
  background: transparent;
  color: var(--bp-muted);
  font-family: var(--bp-font-sans);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  text-align: left;
  cursor: pointer;
  position: relative;
  transition: color var(--bp-duration) var(--bp-ease);
}

.page-home .step-nav button small {
  font-size: 0.95rem;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  line-height: 1.35;
  color: inherit;
}

.page-home .step-nav button[aria-selected="true"] { color: var(--bp-primary); }
.page-home .step-nav button[aria-selected="true"] small { color: var(--bp-ink); font-weight: 600; }

.page-home .step-nav button[aria-selected="true"]::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: -1px;
  height: 2px;
  background: var(--bp-accent);
  border-radius: 2px;
}

.page-home .step-content {
  display: block;
  padding: var(--bp-stack-3) 0 0;
}

.page-home .step-panel {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(1.5rem, 3vw, 2.5rem);
  align-items: center;
}

.page-home .step-panel[hidden] { display: none; }
.page-home .step-panel:focus-visible { outline: 2px solid var(--bp-accent); outline-offset: 6px; }

.page-home .step-panel .text-block { min-width: 0; }

.page-home .step-panel .text-block h3 {
  margin: 0 0 1rem;
  font-family: var(--bp-font-display);
  font-size: clamp(1.35rem, 2.4vw, 1.85rem);
  font-weight: 650;
  line-height: 1.25;
  color: var(--bp-ink);
}

.page-home .step-panel .feature {
  align-items: flex-start;
  gap: 0.75rem;
  margin-bottom: 0.9rem;
  line-height: 1.6;
  font-size: 0.96rem;
}

.page-home .step-panel .feature img { width: 22px; height: 22px; margin-top: 0.15rem; }
.page-home .step-panel .btn { margin-top: 1.25rem; }

/* Fixed box for every step image so switching tabs never resizes the panel. */
/* Fixed box keeps the panel height stable across tab switches; `contain`
   means the four differently-proportioned photos are never cropped. */
.page-home .step-panel .image-block {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  aspect-ratio: 4 / 3;
  padding: clamp(0.75rem, 1.6vw, 1.25rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-md);
  background: var(--bp-surface);
  overflow: hidden;
}

.page-home .step-panel .image-block img.bg {
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
  border-radius: var(--bp-radius-sm) !important;
}

@media (max-width: 860px) {
  .page-home .step-panel { grid-template-columns: 1fr; }
  .page-home .step-panel .image-block { order: -1; aspect-ratio: 16 / 9; }
  .page-home .step-nav { overflow-x: auto; flex-wrap: nowrap; scrollbar-width: thin; }
  .page-home .step-nav button { flex: 0 0 13rem; }
}

/* --- Published work showcase --------------------------------------------- */

.page-home .home-bannrwrp { width: 100%; }

.page-home .home-bannrwrp .swiper {
  width: 100%;
  height: auto;
  padding: 0;
  /* Reserve the track height so Swiper init does not shift the page. */
  min-height: clamp(220px, 26vw, 330px);
}

.page-home .home-bannrwrp .swiper-slide {
  display: flex;
  justify-content: center;
  align-items: center;
  height: auto;
}

.page-home .home-bannrwrp .swiper-slide figure { margin: 0; width: 100%; }

.page-home .home-bannrwrp .swiper-slide img {
  width: 100%;
  height: auto;
  aspect-ratio: 680 / 519;
  object-fit: contain;
  filter: none;
  transform: scale(0.9);
  transition: transform 400ms var(--bp-ease);
}

.page-home .home-bannrwrp .swiper-slide-active img { transform: scale(1); }

/* --- Closing enquiry form ------------------------------------------------ */

.page-home #services-bottom-form-inner {
  width: 100%;
  max-width: none;
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
  gap: clamp(1.5rem, 3vw, 2.5rem);
  align-items: center;
}

.page-home #service-form-container {
  grid-column: 1;
  display: block;
  width: 100%;
  min-width: 0;
}

.page-home #service-form-container #support-form-container {
  width: 100%;
  max-width: none;
  margin: 0 !important;
}

.page-home #service-form-right-image-container {
  grid-column: 2;
  display: flex;
  justify-content: center;
  align-items: center;
  min-width: 0;
}

.page-home #service-form-right-image-container img {
  width: 100%;
  max-width: 460px;
  height: auto;
  aspect-ratio: 466 / 600;
  object-fit: contain;
  display: block;
}

@media (max-width: 860px) {
  .page-home #services-bottom-form-inner { grid-template-columns: 1fr; }
  .page-home #service-form-container { grid-column: 1; }
  .page-home #service-form-right-image-container { display: none; }
}

/* ==========================================================================
   Enquiry form — GLOBAL (.bp-form)
   Every field now has a visible <label>; the old markup was placeholder-only,
   so the field's purpose vanished the moment you started typing.
   ========================================================================== */

.bp-form {
  width: 100%;
  max-width: none;
  padding: clamp(1.5rem, 2.6vw, 2.25rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-md);
}

.bp-form__intro {
  display: block;
  margin-bottom: 1.5rem;
  padding-bottom: 1.25rem;
  border-bottom: 1px solid var(--bp-border);
  text-align: left;
}

.bp-form .bp-form__heading {
  margin: 0;
  font-family: var(--bp-font-display);
  font-size: clamp(1.3rem, 2.2vw, 1.7rem);
  font-weight: 650;
  line-height: 1.25;
  letter-spacing: -0.015em;
  color: var(--bp-ink);
  text-align: left;
  text-wrap: balance;
}

.bp-form__lead {
  margin: 0.6rem 0 0;
  font-size: 0.98rem;
  line-height: 1.6;
  color: var(--bp-ink-soft);
}

.bp-form__contact {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 1.5rem;
  list-style: none;
  margin: 1rem 0 0;
  padding: 0;
}

.bp-form__contact li {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.92rem;
  color: var(--bp-ink-soft);
}

.bp-form__contact svg { color: var(--bp-accent); flex: 0 0 auto; }

.bp-form__contact a {
  color: var(--bp-primary);
  font-weight: 600;
  text-decoration: none;
}

.bp-form__contact a:hover { text-decoration: underline; }

.bp-form__hours {
  color: var(--bp-muted);
  font-size: 0.85rem;
}

.bp-form__form {
  display: flex;
  flex-direction: column;
  gap: 1.15rem;
}

/* Pair short fields side by side so the form reads as 5 rows, not 7 boxes. */
.bp-form__row {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.15rem;
}

.bp-form .form-group {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  min-width: 0;
}

.bp-form .form-group > label {
  display: flex;
  align-items: baseline;
  gap: 0.5rem;
  font-family: var(--bp-font-sans);
  font-size: 0.87rem;
  font-weight: 600;
  line-height: 1.3;
  color: var(--bp-ink);
}

.bp-form__req { color: var(--bp-error); font-weight: 700; }

.bp-form__optional {
  margin-left: auto;
  color: var(--bp-muted);
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.02em;
}

.bp-form__hint {
  margin: 0;
  font-size: 0.8rem;
  line-height: 1.45;
  color: var(--bp-muted);
}

.bp-form input[type="text"],
.bp-form input[type="email"],
.bp-form input[type="tel"],
.bp-form select,
.bp-form textarea {
  width: 100%;
  min-height: 46px;
  padding: 11px 13px;
  border: 1px solid var(--bp-border-strong);
  border-radius: var(--bp-radius-sm);
  background: #fff;
  color: var(--bp-ink);
  font-family: var(--bp-font-sans);
  font-size: 0.97rem;
  line-height: 1.4;
}

.bp-form textarea { min-height: 110px; resize: vertical; }

.bp-form select {
  appearance: none;
  padding-right: 2.25rem;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='none' stroke='%236b7888' stroke-width='2' d='m1 1 5 5 5-5'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 13px center;
}

.bp-form ::placeholder { color: var(--bp-muted); opacity: 1; }

.bp-form .file-upload__ui {
  display: flex;
  align-items: center;
  gap: 12px;
  width: 100%;
  min-height: 46px;
  padding: 7px 7px 7px 12px;
  border: 1px dashed var(--bp-border-strong);
  border-radius: var(--bp-radius-sm);
  background: var(--bp-surface);
  box-sizing: border-box;
  cursor: pointer;
}

.bp-form .file-upload__btn {
  order: 2;
  margin-left: auto;
  background: var(--bp-primary);
  padding: 8px 14px;
  border-radius: 6px;
  color: #fff;
  font-size: 0.85rem;
  font-weight: 600;
  white-space: nowrap;
}

.bp-form .file-upload__name { order: 1; }

.bp-form .submit-btn {
  min-height: 50px;
  margin-top: 0.25rem;
  padding: 14px 22px;
  border: none;
  border-radius: var(--bp-radius-sm);
  background: var(--bp-primary);
  color: #fff;
  font-family: var(--bp-font-sans);
  font-size: 1rem;
  font-weight: 600;
  cursor: pointer;
}

.bp-form__privacy {
  margin: 0;
  font-size: 0.75rem;
  line-height: 1.5;
  color: var(--bp-muted);
  text-align: center;
}

.bp-form__privacy a { color: var(--bp-primary); font-weight: 600; }

/* intl-tel-input injects a wrapper around the phone input. */
.bp-form .iti { width: 100%; display: block; }
.bp-form .iti input[type="tel"] { padding-left: 4.25rem; }

@media (max-width: 620px) {
  .bp-form__row { grid-template-columns: 1fr; }
}

/* ==========================================================================
   Package price
   ========================================================================== */


/* ==========================================================================
   Interaction system — GLOBAL
   --------------------------------------------------------------------------
   Before this, hover was defined in 8 places with 8 different results:
     .btn/#New-btn/.submit-btn  darken + lift 1px + shadow-sm
     .hero-btn--primary         darken + lift 1px, no shadow
     .hero-btn--secondary       white fill + border change, no lift
     .get-started               full colour inversion, lift 1px
     #Extra-btn                 inverted the OTHER way (navy -> white)
     .arrow                     tint + border, no lift
     cards                      lift 3px + shadow-md
     .counting-box              two conflicting rules (border-strong vs primary)
     .faq-item                  scale(1.01)
     .social-icons a            accent fill + scale(1.1)

   There are now four families, and every interactive element belongs to one.
     1. solid   — filled CTA
     2. outline — bordered / ghost CTA
     3. icon    — square-ish icon control
     4. card    — surface that lifts
   ========================================================================== */

:root {
  --bp-lift: -2px;
  --bp-lift-card: -3px;
  --bp-hover-t: 180ms;
}

/* --- 1. Solid ------------------------------------------------------------ */

.btn,
#New-btn,
.submit-btn,
.bp-form .submit-btn,
.hero button,
.package-btn,
.hero-btn--primary,
.get-started,
.auth-buttons a.get-started {
  border-radius: var(--bp-radius-sm);
  background: var(--bp-primary);
  color: #fff;
  font-family: var(--bp-font-sans);
  font-weight: 600;
  text-decoration: none;
  box-shadow: none;
  cursor: pointer;
  transition: background var(--bp-hover-t) var(--bp-ease),
              box-shadow var(--bp-hover-t) var(--bp-ease),
              transform var(--bp-hover-t) var(--bp-ease);
}

.btn:hover,
#New-btn:hover,
.submit-btn:hover,
.bp-form .submit-btn:hover,
.hero button:hover,
.package-btn:hover,
.hero-btn--primary:hover,
.get-started:hover,
.auth-buttons a.get-started:hover {
  background: var(--bp-primary-hover);
  border-color: var(--bp-primary-hover);
  color: #fff;
  transform: translateY(var(--bp-lift));
  box-shadow: var(--bp-shadow-md);
}

/* --- 2. Outline ---------------------------------------------------------- */

.hero-btn--secondary {
  border: 1.5px solid var(--bp-primary);
  border-radius: var(--bp-radius-sm);
  background: transparent;
  color: var(--bp-primary);
  font-family: var(--bp-font-sans);
  font-weight: 600;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--bp-hover-t) var(--bp-ease),
              border-color var(--bp-hover-t) var(--bp-ease),
              color var(--bp-hover-t) var(--bp-ease),
              transform var(--bp-hover-t) var(--bp-ease);
}

/* Tint fill, not a full colour inversion — the label stays put and the
   control keeps reading as the same object. */
.hero-btn--secondary:hover {
  background: var(--bp-primary-soft);
  border-color: var(--bp-primary);
  color: var(--bp-primary);
  transform: translateY(var(--bp-lift));
}

/* --- 3. Icon controls ---------------------------------------------------- */

.testimonial-carousel .arrow:hover {
  background: var(--bp-primary);
  border-color: var(--bp-primary);
  color: #fff;
  transform: translateY(var(--bp-lift));
}

.testimonial-carousel .arrow,
.social-icons a {
  transition: background var(--bp-hover-t) var(--bp-ease),
              border-color var(--bp-hover-t) var(--bp-ease),
              color var(--bp-hover-t) var(--bp-ease),
              transform var(--bp-hover-t) var(--bp-ease);
}

.social-icons a:hover {
  background: var(--bp-primary);
  transform: translateY(var(--bp-lift));
}

/* --- 4. Cards ------------------------------------------------------------ */

.why-spines-box,
.review-card,
.counting-box,
.blog-card,
#contact-box,
#team-card,
#about-service-card-box,
.package-card,
.package-box,
.pricing-card {
  transition: transform var(--bp-hover-t) var(--bp-ease),
              box-shadow var(--bp-hover-t) var(--bp-ease),
              border-color var(--bp-hover-t) var(--bp-ease);
}

.why-spines-box:hover,
.review-card:hover,
.counting-box:hover,
.counting-box:nth-child(2):hover,
.blog-card:hover,
#contact-box:hover,
#team-card:hover,
#about-service-card-box:hover,
.package-card:hover,
.package-box:hover,
.pricing-card:hover {
  transform: translateY(var(--bp-lift-card));
  box-shadow: var(--bp-shadow-md);
  border-color: var(--bp-border-strong);
}

/* --- 5. Text links + tabs ------------------------------------------------ */

.footer-col ul li a,
.blog-content a,
.bp-form__privacy a,
.bp-form__contact a {
  transition: color var(--bp-hover-t) var(--bp-ease);
}

.footer-col ul li a:hover,
.blog-content a:hover,
.bp-form__privacy a:hover,
.bp-form__contact a:hover {
  color: var(--bp-primary);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.page-home .step-nav button:hover {
  color: var(--bp-primary);
  background: var(--bp-primary-soft);
  border-radius: var(--bp-radius-sm) var(--bp-radius-sm) 0 0;
}

.faq-accordion .faq-question:hover { color: var(--bp-primary); }
.faq-item:hover { transform: none; }

/* --- Shared rules -------------------------------------------------------- */

/* Press state: every family settles back to rest position on click. */
.btn:active,
#New-btn:active,
.submit-btn:active,
.hero button:active,
.hero-btn:active,
.get-started:active,
.testimonial-carousel .arrow:active,
.social-icons a:active {
  transform: translateY(0);
}

/* One focus ring for everything focusable. */
.btn:focus-visible,
#New-btn:focus-visible,
.submit-btn:focus-visible,
.hero-btn:focus-visible,
.get-started:focus-visible,
.arrow:focus-visible,
.social-icons a:focus-visible,
.faq-question:focus-visible,
.step-nav button:focus-visible,
.nav-links li > a:focus-visible,
.nav-links li > .dropbtn:focus-visible {
  outline: 2px solid var(--bp-accent);
  outline-offset: 3px;
}

/* Hover lift is a pointer affordance; touch and reduced-motion skip it. */
@media (hover: none) {
  .btn:hover, #New-btn:hover, .submit-btn:hover, .hero button:hover,
  .hero-btn:hover, .get-started:hover, .why-spines-box:hover,
  .review-card:hover, .counting-box:hover, .social-icons a:hover,
  .testimonial-carousel .arrow:hover {
    transform: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .btn:hover, #New-btn:hover, .submit-btn:hover, .hero button:hover,
  .hero-btn:hover, .get-started:hover, .why-spines-box:hover,
  .review-card:hover, .counting-box:hover, .social-icons a:hover,
  .testimonial-carousel .arrow:hover {
    transform: none;
  }
}

/* ==========================================================================
   Plan carousel — coverflow
   One full-width card in focus; the neighbours peek in from either side,
   blurred and scaled back. Positioning is done in JS (pixel-accurate
   centring); this file owns the look and the slide proportions.
   ========================================================================== */

.plan-carousel {
  --slide-w: 72%;          /* leaves ~14% of the viewport peeking each side */
  --slide-gap: 1.5rem;
  position: relative;
  /* width/align-self are explicit: a flex or grid parent must never be able
     to shrink-to-fit this, or the slide percentages collapse. */
  display: block;
  width: 100%;
  align-self: stretch;
  justify-self: stretch;
  margin-top: var(--bp-stack-3);
}

.plan-carousel__viewport {
  /* offsetParent for the slides, so offsetLeft is measured from here. */
  position: relative;
  width: 100%;
  /* Room for the side cards' shadow and scale-back without clipping. */
  overflow: hidden;
  padding-block: 1.25rem;
}

.plan-carousel__track {
  display: flex;
  align-items: stretch;
  column-gap: var(--slide-gap);
  will-change: transform;
}

.plan-carousel__slide {
  flex: 0 0 var(--slide-w);
  min-width: 0;
  display: flex;
  transition: filter 420ms var(--bp-ease),
              opacity 420ms var(--bp-ease),
              transform 420ms var(--bp-ease);
}

.plan-carousel__slide.is-side {
  filter: blur(3px);
  opacity: 0.45;
  transform: scale(0.92);
  cursor: pointer;
}

.plan-carousel__slide.is-side:hover {
  opacity: 0.62;
  filter: blur(2px);
}

.plan-carousel__slide.is-active {
  filter: none;
  opacity: 1;
  transform: none;
}

/* Controls */

.plan-carousel__nav {
  position: absolute;
  top: 50%;
  translate: 0 -50%;
  z-index: 3;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 46px;
  height: 46px;
  padding: 0;
  border: 1px solid var(--bp-border);
  border-radius: 50%;
  background: var(--bp-bg-elevated);
  color: var(--bp-primary);
  box-shadow: var(--bp-shadow-md);
  cursor: pointer;
  transition: background var(--bp-hover-t) var(--bp-ease),
              border-color var(--bp-hover-t) var(--bp-ease),
              color var(--bp-hover-t) var(--bp-ease),
              opacity var(--bp-hover-t) var(--bp-ease);
}

.plan-carousel__nav--prev { left: 0; }
.plan-carousel__nav--next { right: 0; }

.plan-carousel__nav:hover:not(:disabled) {
  background: var(--bp-primary);
  border-color: var(--bp-primary);
  color: #fff;
}

.plan-carousel__nav:disabled {
  opacity: 0.35;
  cursor: not-allowed;
}

.plan-carousel__nav:focus-visible {
  outline: 2px solid var(--bp-accent);
  outline-offset: 3px;
}

.plan-grid__footnote {
  margin: 1.5rem 0 0;
  font-size: 0.9rem;
  color: var(--bp-muted);
  text-align: center;
}

.plan-grid__footnote a {
  color: var(--bp-primary);
  font-weight: 600;
  text-underline-offset: 3px;
}

@media (prefers-reduced-motion: reduce) {
  .plan-carousel__slide { transition: none; }
}

/* ==========================================================================
   Plan card — horizontal, full-width layout
   Identity + price + CTA | what's included | optional add-ons
   ========================================================================== */

.plan-card {
  --plan-ink: var(--bp-ink);
  --plan-ink-soft: var(--bp-ink-soft);
  --plan-muted: var(--bp-muted);
  --plan-rule: var(--bp-border);

  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.15fr) minmax(0, 0.85fr);
  gap: clamp(1.5rem, 3vw, 2.75rem);
  align-items: start;
  width: 100%;
  padding: clamp(1.75rem, 3vw, 2.5rem);
  border: 1.5px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-sm);
  color: var(--plan-ink);
  text-align: left;
  overflow: hidden;
}

/* --- Column 1: identity -------------------------------------------------- */

.plan-card__identity {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  min-width: 0;
  height: 100%;
}

.plan-card .plan-card__name {
  margin: 0;
  font-family: var(--bp-font-sans);
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--bp-accent);
}

.plan-card__tagline {
  margin: 0.45rem 0 0;
  font-size: 0.9rem;
  line-height: 1.45;
  color: var(--plan-muted);
}

.plan-card__price {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 0.55rem;
  margin: 1.1rem 0 0;
  font-family: var(--bp-font-display);
  line-height: 1;
  color: var(--plan-ink);
  font-variant-numeric: tabular-nums;
}

.plan-card__amount {
  font-size: clamp(2.4rem, 4vw, 3.1rem);
  font-weight: 700;
  letter-spacing: -0.03em;
}

.plan-card__was {
  font-family: var(--bp-font-sans);
  font-size: 1.05rem;
  font-weight: 500;
  color: var(--plan-muted);
}

.plan-card__saving {
  margin: 0.75rem 0 auto;
  padding: 4px 11px;
  border-radius: var(--bp-radius-pill);
  background: var(--bp-accent-soft);
  color: #7a6410;
  font-size: 0.76rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

/* Same button as /pricing: full width, navy fill, inverts on hover. */
.plan-card__cta {
  display: block;
  width: 100%;
  margin-top: 1.5rem;
  padding: 0.85rem 1rem;
  border: 2px solid var(--bp-primary);
  border-radius: 10px;
  background: var(--bp-primary);
  color: #fff;
  font-family: var(--bp-font-sans);
  font-size: 0.98rem;
  font-weight: 700;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--bp-hover-t) var(--bp-ease),
              color var(--bp-hover-t) var(--bp-ease),
              transform var(--bp-hover-t) var(--bp-ease);
}

.plan-card__cta:hover {
  background: #fff;
  color: var(--bp-primary);
  transform: translateY(-1px);
}

.plan-card__cta:focus-visible {
  outline: 2px solid var(--bp-accent);
  outline-offset: 3px;
}

/* --- Columns 2 & 3 ------------------------------------------------------- */

.plan-card__col-title {
  margin: 0 0 0.75rem;
  padding-bottom: 0.55rem;
  border-bottom: 1px solid var(--plan-rule);
  font-family: var(--bp-font-sans);
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--plan-muted);
}

/* Tick treatment copied from /pricing: filled navy disc, white check. */
.plan-card__features {
  display: flex;
  flex-direction: column;
  gap: 0.7rem;
  list-style: none;
  margin: 0;
  padding: 0;
}

.plan-card__features li {
  position: relative;
  padding-left: 1.7rem;
  font-size: 0.92rem;
  line-height: 1.45;
  color: var(--plan-ink-soft);
}

.plan-card__features li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.15rem;
  width: 1.15rem;
  height: 1.15rem;
  border-radius: 50%;
  background: var(--bp-primary) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M3.5 8.5l3 3 6-6.5' stroke='%23fff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 0.7rem no-repeat;
}

.plan-card__addons {
  display: flex;
  flex-direction: column;
  gap: 0.45rem;
  list-style: none;
  margin: 0;
  padding: 0;
}

.plan-card__addons li {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 0.75rem;
  font-size: 0.88rem;
  line-height: 1.4;
  color: var(--plan-muted);
}

.plan-card__addons li span {
  font-weight: 700;
  color: var(--plan-ink);
  white-space: nowrap;
}

/* --- Responsive ---------------------------------------------------------- */

@media (max-width: 1024px) {
  .plan-carousel { --slide-w: 82%; }
  .plan-card { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .plan-card__identity { grid-column: 1 / -1; }
  .plan-card__identity .plan-card__cta { align-self: flex-start; }
}

@media (max-width: 700px) {
  .plan-carousel { --slide-w: 88%; --slide-gap: 1rem; }
  .plan-card { grid-template-columns: 1fr; gap: 1.5rem; }
  .plan-card__cta { width: 100%; }
  .plan-carousel__nav { width: 42px; height: 42px; }
  .plan-carousel__nav--prev { left: -0.25rem; }
  .plan-carousel__nav--next { right: -0.25rem; }
}

/* ==========================================================================
   Services mega menu
   Two columns of five with an icon and a one-line description — enough
   structure to scan ten services, without pretending to be a full mega nav.
   ========================================================================== */

.dropdown { position: relative; }

.mega {
  display: none;
  position: absolute;
  top: calc(100% + 10px);
  left: 50%;
  translate: -50% 0;
  z-index: 1200;
  width: min(38rem, calc(100vw - 2rem));
  padding: 0.85rem;
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background: rgba(255, 255, 255, 0.98);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  box-shadow: 0 22px 50px rgba(10, 42, 74, 0.16);
}

/* Invisible bridge so the pointer can cross the 10px gap without closing. */
.mega::before {
  content: "";
  position: absolute;
  top: -12px;
  left: 0;
  right: 0;
  height: 12px;
}

.dropdown:hover > .mega,
.dropdown:focus-within > .mega,
.dropdown .dropbtn[aria-expanded="true"] + .mega {
  display: block;
}

.mega__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 2px 6px;
  list-style: none;
  margin: 0;
  padding: 0;
}

.mega__grid > li { display: flex; }

/* Specificity note: style.css has `.nav-links li a { padding:10px 20px; }`
   (0,1,2) which was giving these link-buttons their own padding and hover
   fill. Two classes (0,2,0) beats it, so the item owns its own box. */
.mega .mega__item {
  display: grid;
  grid-template-columns: 38px minmax(0, 1fr);
  align-items: center;
  gap: 0.95rem;
  width: 100%;
  margin: 0;
  padding: 0.7rem 0.8rem;
  border-radius: var(--bp-radius-sm);
  background: transparent;
  font-weight: 500;
  text-decoration: none;
  transition: background var(--bp-hover-t) var(--bp-ease);
}

.mega__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 38px;
  border-radius: 9px;
  background: var(--bp-surface);
  border: 1px solid var(--bp-border);
  color: var(--bp-primary);
  transition: background var(--bp-hover-t) var(--bp-ease),
              border-color var(--bp-hover-t) var(--bp-ease),
              color var(--bp-hover-t) var(--bp-ease);
}

.mega__text { display: grid; gap: 1px; min-width: 0; }

.mega__label {
  font-family: var(--bp-font-sans);
  font-size: 0.9rem;
  font-weight: 600;
  line-height: 1.3;
  color: var(--bp-ink);
}

.mega__blurb {
  font-size: 0.78rem;
  line-height: 1.35;
  color: var(--bp-muted);
}

.mega .mega__item:hover,
.mega .mega__item:focus-visible {
  background: var(--bp-primary-soft);
}

.mega .mega__item:hover .mega__icon,
.mega .mega__item:focus-visible .mega__icon {
  background: var(--bp-primary);
  border-color: var(--bp-primary);
  color: #fff;
}

.mega .mega__item[aria-current="page"] { background: var(--bp-primary-soft); }
.mega__item[aria-current="page"] .mega__icon {
  background: var(--bp-accent-soft);
  border-color: var(--bp-accent);
  color: var(--bp-accent-hover);
}

.mega__foot {
  margin: 0.6rem 0 0;
  padding: 0.7rem 0.65rem 0.2rem;
  border-top: 1px solid var(--bp-border);
  font-size: 0.82rem;
  color: var(--bp-muted);
}

/* These were inheriting .nav-links li a's padding + hover fill, which made
   them read as buttons. The hover fill also survived a first fix because
   hero-home.css has `body:has(.hero--editorial) .nav-links li a:hover` at
   (0,3,3) — the .mega__link class takes these to (0,4,1) so they finally win. */
.mega .mega__foot a.mega__link {
  display: inline;
  margin: 0;
  padding: 0;
  border-radius: 0;
  background: none;
  color: var(--bp-primary);
  font-weight: 600;
  text-decoration: underline;
  text-decoration-color: rgba(10, 42, 74, 0.3);
  text-underline-offset: 3px;
}

.mega .mega__foot a.mega__link:hover,
.mega .mega__foot a.mega__link:focus-visible {
  background: none;
  background-color: transparent;
  color: var(--bp-primary-hover);
  text-decoration-color: currentColor;
}

@media (max-width: 1080px) {
  .mega { left: auto; right: 0; translate: none; }
}

@media (max-width: 860px) {
  .mega__grid { grid-template-columns: 1fr; }
  .mega__blurb { display: none; }
}

/* ==========================================================================
   Footer
   Detached card: rounded on all four corners with the page background
   showing beneath it, rather than a slab welded to the viewport edge.
   ========================================================================== */

footer {
  padding: var(--bp-section-y-tight) 0 clamp(1.25rem, 2.5vw, 2rem);
}

main:has(.bp-section) + footer { padding-top: 0; }

.footer-inner {
  /* style.css caps this at a bare 1200px, which is the *content* measure, not
     the shell. That clamped the card's outer edge to where page content ends,
     so the footer's own text landed a gutter inside every section above it.
     Matching the shell means card padding lines the text up with the page. */
  width: min(100% - (var(--bp-gutter) * 2), var(--bp-shell));
  max-width: var(--bp-shell);
  margin-inline: auto;
  padding: clamp(2rem, 3.4vw, 3rem) clamp(1.25rem, 2.5vw, 2.5rem) clamp(1.25rem, 2vw, 1.75rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background:
    radial-gradient(700px 240px at 0% 0%, rgba(10, 42, 74, 0.07), transparent 68%),
    radial-gradient(560px 220px at 100% 100%, rgba(201, 162, 39, 0.09), transparent 70%),
    linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(238, 241, 245, 0.98));
  box-shadow: var(--bp-shadow-sm);
}

.footer-top {
  display: grid;
  grid-template-columns: 1.5fr 1fr 1.2fr 1.3fr;
  gap: clamp(1.5rem, 3vw, 2.75rem);
  align-items: start;
}

.footer-col { min-width: 0; }

.footer-logo {
  width: 150px;
  height: auto;
  margin-bottom: 0.9rem;
}

.footer-col > p {
  margin: 0 0 0.5rem;
  font-size: 0.9rem;
  line-height: 1.6;
  color: var(--bp-ink-soft);
  max-width: 30ch;
}

.footer-col h4 {
  margin: 0 0 1rem;
  font-family: var(--bp-font-sans);
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: var(--bp-muted);
}

.footer-col ul {
  display: grid;
  gap: 0.1rem;
  list-style: none;
  margin: 0;
  padding: 0;
}

.footer-col ul li a {
  display: inline-block;
  padding: 5px 0;
  font-size: 0.9rem;
  line-height: 1.4;
  color: var(--bp-ink-soft);
  text-decoration: none;
  /* transform, not margin — the row never reflows on hover */
  transition: color var(--bp-hover-t) var(--bp-ease),
              transform var(--bp-hover-t) var(--bp-ease);
}

.footer-col ul li a:hover,
.footer-col ul li a:focus-visible {
  color: var(--bp-primary);
  transform: translateX(4px);
  text-decoration: none;
}

.footer-col ul li a[aria-current="page"] {
  color: var(--bp-primary);
  font-weight: 600;
}

/* Social */

.social-icons { display: flex; gap: 0.6rem; margin-top: 1rem; }

.social-icons a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 38px;
  border-radius: 50%;
  border: 1px solid var(--bp-border);
  background: var(--bp-bg-elevated);
}

.social-icons img {
  width: 17px;
  height: 17px;
  filter: none;
  opacity: 0.65;
  transition: opacity var(--bp-hover-t) var(--bp-ease), filter var(--bp-hover-t) var(--bp-ease);
}

.social-icons a:hover {
  background: var(--bp-primary);
  border-color: var(--bp-primary);
}

.social-icons a:hover img { filter: brightness(0) invert(1); opacity: 1; }

/* Trust row */

.footer-middle {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1rem clamp(1.5rem, 3vw, 2.5rem);
  margin-top: clamp(1.75rem, 3vw, 2.5rem);
  padding-top: clamp(1.25rem, 2.4vw, 1.75rem);
  border-top: 1px solid var(--bp-border);
}

.footer-middle .feature {
  display: flex;
  align-items: center;
  gap: 0.85rem;
}

.footer-middle .feature img { width: 32px; height: 32px; flex: 0 0 auto; }

.footer-middle .feature span {
  display: block;
  font-family: var(--bp-font-sans);
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--bp-ink);
}

.footer-middle .feature p {
  margin: 2px 0 0;
  font-size: 0.82rem;
  line-height: 1.4;
  color: var(--bp-muted);
}

/* Bottom bar */

.footer-bottom {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  margin-top: clamp(1.25rem, 2.4vw, 1.75rem);
  padding-top: clamp(1rem, 2vw, 1.25rem);
  border-top: 1px solid var(--bp-border);
}

.payment-icons {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.7rem;
  order: 2;
}

.payment-icons img {
  width: auto;
  height: 24px;
  opacity: 0.55;
  transition: opacity var(--bp-hover-t) var(--bp-ease);
}

.payment-icons img:hover { opacity: 1; }

.footer-bottom .copyright {
  order: 1;
  margin: 0;
  font-size: 0.85rem;
  color: var(--bp-muted);
}

@media (max-width: 980px) {
  .footer-top { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 620px) {
  .footer-top { grid-template-columns: 1fr; }
  .footer-middle { grid-template-columns: 1fr; }
  .footer-bottom { justify-content: flex-start; }
}

/* ==========================================================================
   MOBILE
   --------------------------------------------------------------------------
   Fixes the things that were actually broken on small screens rather than
   just nudging sizes:
     · form fields under 16px made iOS Safari zoom the page on focus
     · background-attachment: fixed repaints every scroll frame on iOS
     · clamp() minimums were desktop-tuned and never stepped down, so 30px
       headings were sitting in a ~339px column
     · nothing guarded against a stray decoration causing sideways scroll
   ========================================================================== */

/* `clip` rather than `hidden`: hidden would turn these into scroll containers
   and break position: sticky on the nav. */
html,
body {
  overflow-x: clip;
}

@media (max-width: 900px) {
  /* hero-home.css sets this with !important, so the override has to match.
     Fixed attachment is a known repaint/blank-paint bug on iOS Safari. */
  body:has(.hero--editorial) { background-attachment: scroll !important; }
  body { background-attachment: scroll; }
}

/* --- Tablet -------------------------------------------------------------- */

@media (max-width: 860px) {
  /* Tabs scroll horizontally; snapping makes that discoverable and stops
     a tab being left half off-screen. */
  .page-home .step-nav {
    scroll-snap-type: x proximity;
    scroll-padding-inline: 0.5rem;
    -webkit-overflow-scrolling: touch;
  }

  .page-home .step-nav button { scroll-snap-align: start; }
}

/* --- Phone --------------------------------------------------------------- */

@media (max-width: 640px) {

  /* Type scale steps down as one block, so the hierarchy is preserved. */
  .section-title { font-size: clamp(1.5rem, 6.4vw, 1.85rem); }
  .section-lead { font-size: 0.95rem; line-height: 1.6; }
  .section-eyebrow { font-size: 0.8rem; }
  .section-head { margin-bottom: 1.5rem; }

  .page-home .hero.hero--editorial h1 { font-size: clamp(1.75rem, 8vw, 2.2rem); }
  /* Let the headline reflow naturally instead of holding desktop line breaks. */
  .hero-h1-break { display: inline; }
  .hero-lead { font-size: 0.95rem; }

  /* 16px minimum, or iOS Safari zooms the viewport when a field is focused. */
  .bp-form input[type="text"],
  .bp-form input[type="email"],
  .bp-form input[type="tel"],
  .bp-form select,
  .bp-form textarea {
    font-size: 16px;
  }

  .bp-form { padding: 1.25rem 1.1rem; }
  .bp-form__intro { margin-bottom: 1.25rem; padding-bottom: 1rem; }
  .bp-form__contact { gap: 0.35rem 1rem; }
  .bp-form__form { gap: 0.9rem; }
  .bp-form__row { gap: 0.9rem; }

  /* Plan card */
  .plan-carousel { --slide-w: 86%; --slide-gap: 0.75rem; }
  .plan-card { padding: 1.35rem 1.15rem; gap: 1.25rem; }
  .plan-card__amount { font-size: 2rem; }
  .plan-card__was { font-size: 0.95rem; }
  .plan-card__tagline { font-size: 0.86rem; }
  .plan-card__features li { font-size: 0.88rem; padding-left: 1.55rem; }
  .plan-card__addons li { font-size: 0.83rem; }
  .plan-grid__footnote { font-size: 0.82rem; }

  /* Nav buttons move below the track so they stop covering the card. */
  .plan-carousel { padding-bottom: 3.5rem; }
  .plan-carousel__nav {
    top: auto;
    bottom: 0;
    translate: none;
    width: 44px;
    height: 44px;
  }
  .plan-carousel__nav--prev { left: calc(50% - 3.25rem); }
  .plan-carousel__nav--next { right: calc(50% - 3.25rem); }

  /* Packages card should not eat the width it is holding. */
  .did-you-know-inner-container { padding: 1.5rem 1rem; }

  /* Steps */
  .page-home .steps { padding: 1rem 0.85rem; }
  .page-home .step-panel .text-block h3 { font-size: 1.25rem; }
  .page-home .step-panel .feature { font-size: 0.9rem; }
  .page-home .step-nav button { flex: 0 0 11.5rem; font-size: 0.72rem; }
  .page-home .step-nav button small { font-size: 0.88rem; }

  /* Stats */
  .page-home .counting-number { font-size: 1.5rem; min-height: 1.9rem; }

  /* Reviews */
  .review-card { padding: 1.25rem 1.1rem; }
  .review-text { font-size: 0.92rem; }

  /* FAQ */
  .faq-accordion .faq-question { font-size: 0.95rem; padding: 1rem 0; }

  /* Footer */
  .footer-inner { padding: 1.5rem 1.15rem 1.15rem; }
  .footer-middle { margin-top: 1.5rem; padding-top: 1.25rem; }
}

/* --- Small phone --------------------------------------------------------- */

@media (max-width: 400px) {
  .plan-carousel { --slide-w: 90%; }
  .plan-card { padding: 1.15rem 1rem; }
  .plan-card__amount { font-size: 1.85rem; }
  .hero-platforms__logos { gap: 12px 16px; padding: 10px 12px; }
  .hero-platforms__logos img { height: 21px; }
  .page-home .counting-box { padding: 1.1rem 0.85rem; }
}

/* ==========================================================================
   Distribution partner marquee — full-bleed
   Lives outside .bp-shell so the strip runs edge to edge. Four identical
   sets are rendered and the track is translated by exactly -50%, so the
   halfway point is pixel-identical to the start and the loop is seamless
   at any viewport width.
   ========================================================================== */

.logo-marquee__label {
  margin: 0 0 1.25rem;
  text-align: center;
}

.logo-marquee {
  width: 100%;
  overflow: hidden;
  /* Fade the ends instead of hard-cutting logos at the screen edge. */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
}

.logo-marquee__track {
  display: flex;
  width: max-content;
  animation: bp-marquee 45s linear infinite;
}

.logo-marquee:hover .logo-marquee__track,
.logo-marquee:focus-within .logo-marquee__track {
  animation-play-state: paused;
}

.logo-marquee__set {
  display: flex;
  align-items: center;
  gap: clamp(2.5rem, 5vw, 4.5rem);
  /* Same value as the gap, so the seam between sets is evenly spaced. */
  padding-inline: clamp(1.25rem, 2.5vw, 2.25rem);
  margin: 0;
  list-style: none;
  flex: 0 0 auto;
}

.logo-marquee__set li { display: flex; align-items: center; }

.logo-marquee__set img {
  height: 34px;
  width: auto;
  max-width: 150px;
  object-fit: contain;
  filter: grayscale(1);
  opacity: 0.5;
  transition: filter var(--bp-hover-t) var(--bp-ease),
              opacity var(--bp-hover-t) var(--bp-ease);
}

.logo-marquee__set img:hover {
  filter: none;
  opacity: 1;
}

@keyframes bp-marquee {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(-50%, 0, 0); }
}

@media (prefers-reduced-motion: reduce) {
  .logo-marquee__track { animation: none; }
  /* Without motion the strip becomes a centred, wrapping row. */
  .logo-marquee { -webkit-mask-image: none; mask-image: none; }
  .logo-marquee__track { width: 100%; justify-content: center; flex-wrap: wrap; }
  .logo-marquee__set:not(:first-child) { display: none; }
  .logo-marquee__set { flex-wrap: wrap; justify-content: center; gap: 1.5rem 2.5rem; }
}

@media (max-width: 640px) {
  .logo-marquee__track { animation-duration: 30s; }
  .logo-marquee__set { gap: 2rem; padding-inline: 1rem; }
  .logo-marquee__set img { height: 26px; max-width: 110px; }
  .logo-marquee__label { margin-bottom: 1rem; }
}

/* ==========================================================================
   MOBILE — neutralising the legacy layer
   --------------------------------------------------------------------------
   style.css ships @media blocks at 992/768/600/500/480 that force
   text-align:center, flex-direction:column and justify-content:center onto
   the footer, mobile menu, service boxes and step panels. Those components
   were rebuilt, but these specific properties were never overridden, so the
   centring leaked straight through and only showed up on small screens.
   ========================================================================== */

/* --- Footer -------------------------------------------------------------- */

@media (max-width: 992px) {
  .footer-inner .footer-col,
  .footer-inner .footer-col:first-child {
    text-align: left;
    align-items: stretch;
    justify-content: flex-start;
    width: auto;
  }

  .footer-inner .footer-col > p { max-width: 42ch; }

  .footer-inner .social-icons { justify-content: flex-start; }

  .footer-inner .footer-middle {
    flex-direction: row;
    align-items: stretch;
  }

  .footer-inner .footer-bottom {
    flex-direction: row;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    text-align: left;
    gap: 1rem;
  }
}

@media (max-width: 620px) {
  /* Copy stays left-aligned; only the bottom bar stacks. */
  .footer-inner .footer-bottom {
    flex-direction: column;
    align-items: flex-start;
  }

  .footer-inner .footer-bottom .copyright { order: 2; }
  .footer-inner .payment-icons { order: 1; }
}

/* --- Mobile menu --------------------------------------------------------- */

@media (max-width: 768px) {
  .mobile-menu {
    align-items: stretch;
    text-align: left;
    padding: 1rem var(--bp-gutter) 1.25rem;
    gap: 0;
    border: 1px solid var(--bp-border);
    border-top: none;
    border-radius: 0 0 var(--bp-radius-lg) var(--bp-radius-lg);
  }

  .mobile-menu a,
  .mobile-menu .mobile-dropdown {
    width: 100%;
    text-align: left;
  }

  /* :not(.get-started) — this rule is (0,1,1) and was beating the solid
     button family (0,1,0), painting the CTA navy-on-navy. */
  .mobile-menu > a:not(.get-started) {
    padding: 0.85rem 0;
    border-bottom: 1px solid var(--bp-border);
    font-size: 1rem;
    font-weight: 600;
    color: var(--bp-ink);
  }

  .mobile-menu > a:not(.get-started)[aria-current="page"] { color: var(--bp-primary); }



  .mobile-dropdown {
    text-align: left;
    border-bottom: 1px solid var(--bp-border);
  }

  .mobile-dropdown__toggle {
    justify-content: space-between;
    width: 100%;
    padding: 0.85rem 0;
    text-align: left;
    font-size: 1rem;
  }

  .mobile-dropdown-content {
    gap: 0;
    margin: 0 0 0.5rem;
    padding-left: 0.85rem;
    border-left: 2px solid var(--bp-border);
  }

  .mobile-dropdown-content a {
    padding: 0.65rem 0;
    font-size: 0.94rem;
    font-weight: 500;
    color: var(--bp-ink-soft);
    text-align: left;
  }

  .mobile-dropdown-content a[aria-current="page"] {
    color: var(--bp-primary);
    font-weight: 600;
  }

  /* Full-width CTA — it was fit-content and centred. */
  .mobile-menu .get-started {
    width: 100%;
    margin-top: 1rem;
    padding: 0.85rem 1rem;
    text-align: center;
  }

  /* 48px logo inside a 58px pill left almost no breathing room. */
  .nav-logo .logo { height: 38px; }
}

/* --- Service boxes ------------------------------------------------------- */

@media (max-width: 768px) {
  .page-home .why-spines-right {
    text-align: left;
    font-size: inherit;
  }

  .page-home .why-spines-box {
    flex-direction: row;
    align-items: flex-start;
    text-align: left;
  }

  .page-home .why-spines-box img { margin-bottom: 0; }
  .page-home .why-spines-box p { text-align: left; }
}

/* --- Step panels --------------------------------------------------------- */

@media (max-width: 768px) {
  .page-home .step-content { text-align: left; }
  .page-home .step-panel .text-block { text-align: left; }

  .page-home .step-panel .feature {
    justify-content: flex-start;
    text-align: left;
  }

  .page-home .step-panel .feature span { text-align: left; }
  .page-home .step-panel .btn { display: block; width: 100%; text-align: center; }
}

/* ==========================================================================
   PRICING PAGE
   The card design here is the reference the home plan card was built from,
   so this only migrates geometry and semantics — no visual redesign.
   ========================================================================== */

/* pricing.css hardcodes `margin-top:-96px` and `padding: calc(2.5rem + 96px)`,
   with a second pair at -80px under 560px. Neither matched the real nav
   height. Derive both from the same variable the nav itself uses. */
.page-pricing .pricing-page {
  margin-top: calc(var(--bp-nav-offset) * -1);
  padding: calc(var(--bp-nav-offset) + var(--bp-section-y-tight)) 0 0;
}

/* One container: .pricing-inner was min(1120px, 92%). Sections use .bp-shell. */
.page-pricing .pricing-inner {
  width: 100%;
  max-width: none;
  margin: 0;
}

.page-pricing .pricing-title {
  max-width: var(--bp-measure-title);
  margin-inline: auto;
}

.page-pricing .pricing-subtitle {
  max-width: var(--bp-measure-lead);
  margin-inline: auto;
}

.page-pricing .pricing-tabs-wrap,
.page-pricing .pricing-range-box {
  margin-top: var(--bp-stack-3);
}

.page-pricing .pricing-plans { margin-bottom: 0; }

/* --- FAQ ----------------------------------------------------------------- */
/* Uses the shared .faq-accordion component so it reads identically to home.
   Only the places where pricing.css is MORE specific need overriding —
   everything else already loses to layout-system on file order, and
   re-declaring it here would create a divergence rather than prevent one. */

.page-pricing .faq-accordion .faq-item {
  background: transparent;          /* pricing.css: rgba(255,255,255,.72) card */
  border: 0;
  border-bottom: 1px solid var(--bp-border);
  border-radius: 0;
  box-shadow: none;
  margin: 0;
}

.page-pricing .faq-accordion .faq-item:hover {
  border-color: var(--bp-border);
  box-shadow: none;
}

/* pricing.css injects content:"+" through `.pricing-page .faq-question::after`. */
.page-pricing .faq-accordion .faq-question::after { content: none; }

/* pricing.css sets `.pricing-page .faq-answer { color: var(--pr-muted) }` at
   (0,2,0). The paragraph inside already wins, so this is invisible — but it
   leaves the wrapper resolving differently from home, so align it. */
.page-pricing .faq-accordion .faq-answer { color: var(--bp-ink-soft); }

/* --- Reveal animation ---------------------------------------------------- */
/* pricing.css animates .pricing-plan by :nth-child. The plan list is now one
   loop over modes x plans, so nth-child would stagger the hidden set too. */
@media (prefers-reduced-motion: no-preference) {
  .page-pricing .pricing-plan[data-mode="children"] { animation: none; }
}

@media (max-width: 560px) {
  /* Supersedes pricing.css's second hardcoded -80px pull-up. */
  .page-pricing .pricing-page {
    margin-top: calc(var(--bp-nav-offset) * -1);
    padding-top: calc(var(--bp-nav-offset) + var(--bp-section-y-tight));
  }
}

/* ==========================================================================
   CONTACT PAGE
   contact.css styled the three cards through `#contact-box` — an id that
   appeared three times in the markup. They are a `.contact-card` class now,
   so those id rules no longer match anything.
   ========================================================================== */

/* --- Direct contact details --------------------------------------------- */

.contact-quick {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(0.75rem, 1.6vw, 1.25rem);
  list-style: none;
  margin: var(--bp-stack-3) 0 0;
  padding: 0;
}

.contact-quick li {
  display: flex;
  align-items: flex-start;
  gap: 0.85rem;
  padding: clamp(1rem, 1.8vw, 1.25rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-md);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-sm);
}

.contact-quick__icon {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  height: 38px;
  border-radius: 10px;
  background: var(--bp-surface);
  border: 1px solid var(--bp-border);
  color: var(--bp-primary);
}

.contact-quick__text { display: grid; gap: 2px; min-width: 0; }

.contact-quick__label {
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: var(--bp-muted);
}

.contact-quick a,
.contact-quick address {
  font-family: var(--bp-font-sans);
  font-size: 0.98rem;
  font-weight: 600;
  font-style: normal;
  line-height: 1.4;
  color: var(--bp-primary);
  text-decoration: none;
  overflow-wrap: anywhere;
}

.contact-quick address { color: var(--bp-ink); font-weight: 500; }

.contact-quick a:hover {
  text-decoration: underline;
  text-underline-offset: 3px;
}

.contact-quick__note {
  font-size: 0.8rem;
  line-height: 1.4;
  color: var(--bp-muted);
}

/* --- The three routes ---------------------------------------------------- */

.contact-cards {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(1rem, 2vw, 1.5rem);
  align-items: stretch;
}

.contact-card {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.75rem;
  /* was a fixed height:300px (220px under 600px), which clipped the longest
     card's copy */
  height: auto;
  width: auto;
  padding: clamp(1.35rem, 2.2vw, 1.75rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-sm);
  text-align: left;
  transition: transform var(--bp-hover-t) var(--bp-ease),
              box-shadow var(--bp-hover-t) var(--bp-ease),
              border-color var(--bp-hover-t) var(--bp-ease);
}

.contact-card:hover {
  transform: translateY(var(--bp-lift-card));
  box-shadow: var(--bp-shadow-md);
  border-color: var(--bp-border-strong);
}

.contact-card img { width: 48px; height: 48px; object-fit: contain; }

/* Card title was a <span>, so the page had no headings for its three routes. */
.contact-card h3 {
  margin: 0;
  font-family: var(--bp-font-sans);
  font-size: 1.15rem;
  font-weight: 600;
  line-height: 1.3;
  color: var(--bp-ink);
  text-align: left;
}

.contact-card p {
  margin: 0;
  font-size: 0.95rem;
  line-height: 1.65;
  color: var(--bp-ink-soft);
  text-align: left;
}

/* --- The form sits in the narrow shell ----------------------------------- */

.page-contact #support-form-container {
  width: 100%;
  max-width: none;
  margin: 0 !important;
}

@media (max-width: 900px) {
  .contact-quick { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .contact-cards { grid-template-columns: 1fr; }
}

@media (max-width: 620px) {
  .contact-quick { grid-template-columns: 1fr; }
}

/* ==========================================================================
   ABOUT PAGE
   about.css styled these rows through #about-main-container / #about-left /
   #about-right — three ids that each appeared three times in the markup.
   They are classes now, so those id rules no longer match anything.
   ========================================================================== */

.about-row {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
  gap: clamp(1.75rem, 4vw, 3.5rem);
  align-items: center;
}

/* Reverse by placing the media first, so the DOM keeps reading
   heading-then-image for screen readers and for source order. */
.about-row--reverse .about-row__media { order: -1; }

.about-row__copy {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  min-width: 0;
  text-align: left;
}

.about-row__copy .section-head {
  align-items: flex-start;
  text-align: left;
  margin-bottom: var(--bp-stack-2);
}

.about-row__copy .section-title { text-align: left; }

/* Direct children only: as a descendant selector this was (0,1,1) and beat
   .section-eyebrow (0,1,0), rendering the kicker as grey body text. */
.about-row__copy > p {
  margin: 0 0 0.9rem;
  max-width: var(--bp-measure-text);
  font-size: 1rem;
  line-height: 1.7;
  color: var(--bp-ink-soft);
  text-align: left;
}

.about-row__copy > p:last-child { margin-bottom: 0; }

.about-row__media {
  display: flex;
  justify-content: center;
  align-items: center;
  min-width: 0;
}

.about-row__media img {
  width: 100%;
  max-width: 440px;
  height: auto;
  aspect-ratio: 1 / 1;
  object-fit: cover;
  border-radius: var(--bp-radius-lg);
  display: block;
}

@media (max-width: 860px) {
  .about-row { grid-template-columns: 1fr; gap: 1.75rem; }
  /* Image above the copy on every row, so the rhythm stays predictable
     instead of alternating awkwardly in a single column. */
  .about-row__media,
  .about-row--reverse .about-row__media { order: -1; }
  .about-row__media img { max-width: 380px; }
}

@media (max-width: 640px) {
  .about-row__copy p { font-size: 0.95rem; }
  .about-row__media img { max-width: 320px; }
}

/* ==========================================================================
   LEGAL / DIRECTORY / FORM PAGES
   privacy, terms, sitemap, get-started, author-questionnaire
   ========================================================================== */

/* --- Long-form legal prose ----------------------------------------------- */
/* privacy.blade and terms.blade each carried an identical 821-character
   inline <style> block setting max-width:1400px and list-style:none. Both
   are gone: prose sits in the narrow shell and lists keep their markers. */

.legal-prose {
  color: var(--bp-ink-soft);
  font-size: 1rem;
  line-height: 1.75;
}

.legal-prose > *:first-child { margin-top: 0; }

.legal-prose h2 {
  margin: 2.5rem 0 0.75rem;
  font-family: var(--bp-font-display);
  font-size: clamp(1.3rem, 2.4vw, 1.6rem);
  font-weight: 650;
  line-height: 1.25;
  letter-spacing: -0.015em;
  color: var(--bp-ink);
}

.legal-prose h3 {
  margin: 1.75rem 0 0.5rem;
  font-family: var(--bp-font-sans);
  font-size: 1.05rem;
  font-weight: 600;
  line-height: 1.35;
  color: var(--bp-ink);
}

.legal-prose p { margin: 0 0 1rem; }

/* Bullets were suppressed with list-style:none, which flattened every
   legal list into an unpunctuated run of lines. */
.legal-prose ul,
.legal-prose ol {
  margin: 0 0 1.25rem;
  padding-left: 1.35rem;
}

.legal-prose ul { list-style: disc; }
.legal-prose ol { list-style: decimal; }

.legal-prose li {
  margin-bottom: 0.5rem;
  list-style: inherit;
  line-height: 1.7;
}

.legal-prose a {
  color: var(--bp-primary);
  font-weight: 600;
  text-underline-offset: 3px;
}

.legal-prose strong { color: var(--bp-ink); font-weight: 600; }

/* --- Sitemap ------------------------------------------------------------- */

.sitemap-groups {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(1.75rem, 4vw, 3rem);
}

/* style.css styles the bare `nav` element as the site header — sticky,
   100px tall, flex, centred, z-index 1000. Any other <nav> on the site
   inherits all of it, so an in-page navigation block has to reset it.
   nav.sitemap-group (0,1,1) outranks those bare `nav` rules (0,0,1). */
nav.sitemap-group {
  display: block;
  position: static;
  top: auto;
  z-index: auto;
  width: auto;
  height: auto;
  min-height: 0;
  padding: 0;
  margin: 0;
  background: none;
  justify-content: initial;
  align-items: initial;
}

.sitemap-group h2 {
  margin: 0 0 1rem;
  padding-bottom: 0.6rem;
  border-bottom: 1px solid var(--bp-border);
  font-family: var(--bp-font-sans);
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: var(--bp-muted);
}

.sitemap-group ul {
  display: grid;
  gap: 0.1rem;
  list-style: none;
  margin: 0;
  padding: 0;
}

.sitemap-group li a {
  display: inline-block;
  padding: 7px 0;
  font-size: 0.98rem;
  color: var(--bp-ink-soft);
  text-decoration: none;
  transition: color var(--bp-hover-t) var(--bp-ease),
              transform var(--bp-hover-t) var(--bp-ease);
}

.sitemap-group li a:hover,
.sitemap-group li a:focus-visible {
  color: var(--bp-primary);
  transform: translateX(4px);
}

.sitemap-group li a[aria-current="page"] {
  color: var(--bp-primary);
  font-weight: 600;
}

@media (max-width: 780px) {
  .sitemap-groups { grid-template-columns: 1fr; }
}

@media (max-width: 640px) {
  .legal-prose { font-size: 0.95rem; }
  .legal-prose h2 { margin-top: 2rem; }
}

/* ==========================================================================
   AUTHOR QUESTIONNAIRE
   --------------------------------------------------------------------------
   This page had NO styles of its own — nothing in the project matched
   .author-questionnaire-*. Inputs picked up a border from theme-uplift's
   generic input selector but no padding or height, the two-column
   form/preview layout was a plain stacked block, and because the JS only
   toggles an `active` class with no CSS behind it, all SEVEN steps rendered
   on top of each other at once.
   ========================================================================== */

.author-questionnaire-form-wrapper {
  display: grid;
  grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr);
  gap: clamp(1.5rem, 3vw, 2.5rem);
  align-items: start;
  width: 100%;
}

.author-questionnaire-form-left { min-width: 0; }

.author-questionnaire-form-card {
  padding: clamp(1.5rem, 3vw, 2.5rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-md);
}

#author-questionnaire-form-heading {
  margin: 0;
  font-family: var(--bp-font-display);
  font-size: clamp(1.4rem, 2.6vw, 1.9rem);
  font-weight: 650;
  line-height: 1.2;
  letter-spacing: -0.02em;
  color: var(--bp-ink);
  text-transform: none;
}

.author-sub {
  margin: 0.6rem 0 0;
  padding-bottom: 1.5rem;
  border-bottom: 1px solid var(--bp-border);
  font-size: 0.95rem;
  line-height: 1.6;
  color: var(--bp-ink-soft);
}

/* --- Steps --------------------------------------------------------------- */
/* The JS toggles .active and nothing else. Without this every step was
   visible simultaneously. */

.author-questionnaire-form-step { display: none; }
.author-questionnaire-form-step.active { display: block; padding-top: 1.5rem; }

/* --- Rows and fields ----------------------------------------------------- */

.author-questionnaire-form-row { margin-bottom: 1.15rem; }
.author-questionnaire-form-row:last-child { margin-bottom: 0; }

.author-questionnaire-form-row > label {
  display: block;
  margin-bottom: 0.4rem;
  font-family: var(--bp-font-sans);
  font-size: 0.87rem;
  font-weight: 600;
  line-height: 1.35;
  color: var(--bp-ink);
}

.author-questionnaire-form-card input[type="text"],
.author-questionnaire-form-card input[type="email"],
.author-questionnaire-form-card input[type="tel"],
.author-questionnaire-form-card input[type="date"],
.author-questionnaire-form-card textarea,
.author-questionnaire-form-card select {
  width: 100%;
  min-height: 46px;
  padding: 11px 13px;
  border: 1px solid var(--bp-border-strong);
  border-radius: var(--bp-radius-sm);
  background: #fff;
  color: var(--bp-ink);
  font-family: var(--bp-font-sans);
  font-size: 0.97rem;
  line-height: 1.4;
}

.author-questionnaire-form-card textarea {
  min-height: 104px;
  resize: vertical;
}

.author-questionnaire-form-card input:focus,
.author-questionnaire-form-card textarea:focus,
.author-questionnaire-form-card select:focus {
  border-color: var(--bp-accent);
  box-shadow: 0 0 0 3px var(--bp-primary-soft);
  outline: none;
}

.author-questionnaire-form-card input[type="file"] {
  width: 100%;
  padding: 10px 12px;
  border: 1px dashed var(--bp-border-strong);
  border-radius: var(--bp-radius-sm);
  background: var(--bp-surface);
  font-size: 0.9rem;
  cursor: pointer;
}

.author-questionnaire-form-note {
  margin-top: 0.35rem;
  font-size: 0.8rem;
  line-height: 1.45;
  color: var(--bp-muted);
}

.author-questionnaire-form-grouplabel {
  display: block;
  margin: 0 0 0.55rem;
  font-family: var(--bp-font-sans);
  font-size: 0.87rem;
  font-weight: 600;
  line-height: 1.35;
  color: var(--bp-ink);
}

h2.author-questionnaire-form-grouplabel { font-size: 1.05rem; margin-bottom: 0.7rem; }

.author-questionnaire-form-guidelines {
  padding: 1rem 1.1rem;
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-md);
  background: var(--bp-surface);
  white-space: pre-line;
  font-size: 0.86rem;
  line-height: 1.65;
  color: var(--bp-ink-soft);
}

/* --- Checkboxes ---------------------------------------------------------- */

.author-questionnaire-form-checkboxes {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr));
  gap: 0.5rem;
}

.author-questionnaire-form-checkboxes label {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-sm);
  background: var(--bp-bg-elevated);
  font-size: 0.9rem;
  line-height: 1.35;
  color: var(--bp-ink-soft);
  cursor: pointer;
  transition: border-color var(--bp-hover-t) var(--bp-ease),
              background var(--bp-hover-t) var(--bp-ease);
}

.author-questionnaire-form-checkboxes label:hover {
  border-color: var(--bp-border-strong);
  background: var(--bp-surface);
}

.author-questionnaire-form-checkboxes input[type="checkbox"] {
  flex: 0 0 auto;
  width: 17px;
  height: 17px;
  margin: 0;
  accent-color: var(--bp-primary);
  cursor: pointer;
}

.author-questionnaire-form-checkboxes label:has(input:checked) {
  border-color: var(--bp-primary);
  background: var(--bp-primary-soft);
  color: var(--bp-ink);
  font-weight: 500;
}

/* --- Step navigation ----------------------------------------------------- */

.author-questionnaire-form-nav {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  margin-top: 1.75rem;
  padding-top: 1.5rem;
  border-top: 1px solid var(--bp-border);
}

.author-questionnaire-form-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 46px;
  padding: 12px 22px;
  border-radius: var(--bp-radius-sm);
  font-family: var(--bp-font-sans);
  font-size: 0.95rem;
  font-weight: 600;
  cursor: pointer;
  transition: background var(--bp-hover-t) var(--bp-ease),
              border-color var(--bp-hover-t) var(--bp-ease),
              color var(--bp-hover-t) var(--bp-ease),
              transform var(--bp-hover-t) var(--bp-ease);
}

.author-questionnaire-form-btn.primary {
  border: 1.5px solid var(--bp-primary);
  background: var(--bp-primary);
  color: #fff;
}

.author-questionnaire-form-btn.primary:hover {
  background: var(--bp-primary-hover);
  border-color: var(--bp-primary-hover);
  transform: translateY(var(--bp-lift));
}

.author-questionnaire-form-btn.ghost {
  border: 1.5px solid var(--bp-primary);
  background: transparent;
  color: var(--bp-primary);
}

.author-questionnaire-form-btn.ghost:hover {
  background: var(--bp-primary-soft);
  transform: translateY(var(--bp-lift));
}

.author-questionnaire-form-btn:focus-visible {
  outline: 2px solid var(--bp-accent);
  outline-offset: 3px;
}

/* --- Live preview panel -------------------------------------------------- */

.author-questionnaire-form-right { min-width: 0; }

.author-questionnaire-form-preview-card {
  position: sticky;
  top: calc(var(--bp-nav-offset) + 1rem);
  /* Sticky needs a bound or a tall preview would pin past the viewport and
     the bottom of it could never be reached. Let it scroll away instead. */
  max-height: none;
}

.author-questionnaire-form-preview-page {
  position: relative;
  /* No max-height: the preview grows with its content and the page scrolls. */
  overflow: hidden;
  padding: clamp(1.25rem, 2.4vw, 1.85rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-md);
}

.author-questionnaire-form-watermark {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  pointer-events: none;
  font-family: var(--bp-font-display);
  font-size: clamp(1.5rem, 3vw, 2.25rem);
  font-weight: 650;
  color: rgba(10, 42, 74, 0.045);
  rotate: -22deg;
  white-space: nowrap;
  user-select: none;
}

.author-questionnaire-form-logo {
  position: relative;
  display: block;
  width: 118px;
  height: auto;
  margin: 0 auto 1rem;
}

.author-questionnaire-form-preview-content { position: relative; }

.author-questionnaire-form-preview-title {
  font-family: var(--bp-font-display);
  font-size: 1.15rem;
  font-weight: 650;
  color: var(--bp-ink);
}

.author-questionnaire-form-preview-sub {
  margin-top: 0.15rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--bp-border);
  font-size: 0.8rem;
  color: var(--bp-muted);
}

/* Sections rendered by the preview script */
.aqf-preview-section { margin-top: 1.1rem; }

.aqf-preview-label {
  font-size: 0.68rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--bp-muted);
}

.aqf-preview-value {
  margin-top: 0.2rem;
  font-size: 0.92rem;
  line-height: 1.55;
  color: var(--bp-ink-soft);
  white-space: pre-line;
  overflow-wrap: anywhere;
}

.aqf-preview-categories {
  display: flex;
  flex-wrap: wrap;
  gap: 0.35rem;
  margin-top: 0.35rem;
}

.aqf-preview-cat {
  padding: 3px 9px;
  border-radius: var(--bp-radius-pill);
  background: var(--bp-accent-soft);
  color: #7a6410;
  font-size: 0.76rem;
  font-weight: 600;
}

/* --- Responsive ---------------------------------------------------------- */

@media (max-width: 1024px) {
  .author-questionnaire-form-wrapper { grid-template-columns: 1fr; }
  .author-questionnaire-form-preview-card { position: static; }
}

@media (max-width: 640px) {
  .author-questionnaire-form-card { padding: 1.25rem 1.1rem; }
  .author-questionnaire-form-checkboxes { grid-template-columns: 1fr 1fr; }
  .author-questionnaire-form-nav { flex-wrap: wrap; }
  .author-questionnaire-form-btn { flex: 1 1 auto; }

  /* 16px or iOS Safari zooms the viewport on focus. */
  .author-questionnaire-form-card input[type="text"],
  .author-questionnaire-form-card input[type="email"],
  .author-questionnaire-form-card input[type="tel"],
  .author-questionnaire-form-card input[type="date"],
  .author-questionnaire-form-card textarea,
  .author-questionnaire-form-card select { font-size: 16px; }
}

@media (max-width: 420px) {
  .author-questionnaire-form-checkboxes { grid-template-columns: 1fr; }
}

/* ==========================================================================
   SERVICE PAGES  (10)
   Every block now sits in .bp-section > .bp-shell, so the legacy widths and
   margins on the inner containers have to stand down. Ids that appeared
   multiple times per page are classes now, so the #id rules in
   book-cover-design.css no longer match and are replaced here.
   ========================================================================== */

/* Hero: pull under the sticky nav using the real nav height, not the
   hardcoded -100px / padding-top:100px in book-cover-design.css. */
#service-header-main-container {
  display: flex;
  justify-content: center;
  align-items: center;
  position: relative;
  z-index: 1;
  overflow: hidden;
  width: 100%;
  /* Was collapsing to content height — a banner with a background image
     needs a floor, the same way the home hero has one. */
  min-height: clamp(24rem, 46vh, 34rem);
  margin-top: calc(var(--bp-nav-offset) * -1);
  padding: calc(var(--bp-nav-offset) + var(--bp-section-y-tight)) 0 var(--bp-section-y-tight);
}

/* These two lived only in book-cover-design.css, which only ONE of the ten
   pages loads. Without them the hero image rendered as a normal inline
   image and there was no dark scrim, so the white headline sat on nothing.
   They belong to the component, so they live here. */
.service-header-bg {
  position: absolute;
  inset: 0;
  z-index: -1;
  width: 100%;
  height: 100%;
  max-width: none;
  object-fit: cover;
}

#service-header-main-container::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background: linear-gradient(180deg, rgba(16, 30, 34, 0.72), rgba(16, 30, 34, 0.78));
}

#service-header-inner-container {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  /* 0 — book-cover-design.css sets gap:20px, which added to the CTA's own
     margin-top and produced 68px before the button. */
  gap: 0;
  width: 100%;
  max-width: var(--bp-shell);
  height: auto;
  margin-inline: auto;
  padding-inline: var(--bp-gutter);
  text-align: center;
}

/* On the dark banner the shared ink tokens would disappear. */
#service-header-inner-container .section-head {
  align-items: center;
  text-align: center;
  max-width: none;
  width: 100%;
}

/* Badge gets home's pill treatment, inverted for the dark banner. */
#service-header-inner-container .section-eyebrow {
  display: inline-flex;
  align-items: center;
  align-self: center;
  margin-bottom: var(--bp-stack-2);
  padding: 7px 16px;
  border: 1px solid rgba(255, 255, 255, 0.35);
  border-radius: var(--bp-radius-pill);
  background: rgba(255, 255, 255, 0.12);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
  color: #fff;
  font-size: var(--bp-eyebrow-size);
  font-weight: 600;
  letter-spacing: var(--bp-eyebrow-tracking);
  line-height: 1.25;
}

/* Same scale and measure as the home hero. The longest service headline is
   76 characters, which lands inside three lines at this width. */
#service-header-inner-container .section-title {
  max-width: 54rem;
  font-size: clamp(2.2rem, 4.4vw, 3.5rem);
  line-height: 1.14;
  color: #fff;
  text-wrap: balance;
}

#service-header-inner-container .section-lead,
#service-header-inner-container p {
  max-width: 46rem;
  font-size: clamp(1rem, 1.35vw, 1.125rem);
  line-height: 1.65;
  color: rgba(255, 255, 255, 0.88);
}

#service-header-inner-container .section-actions { margin-top: var(--bp-cta-gap); }

/* Inner blocks: the shell owns width now.
   .faq-accordion is deliberately NOT in this list — it keeps its own
   --bp-measure-narrow cap. It was included here once and, being unscoped,
   stripped the cap from every page on the site. */
.about-services-text-container,
.timeline-section,
.why-spines-section,
#about-service-card-container,
#why-services-section,
#services-bottom-form-inner,
.carousel-container {
  width: 100%;
  max-width: none;
  /* `margin`, not margin-inline: style.css sets `.carousel-container
     { margin: 50px auto }`, which the section padding then doubles. */
  margin: 0;
}

.about-services-text-container {
  display: flex;
  flex-direction: column;
  align-items: center;
  /* margins carry the rhythm here; a gap would double it */
  gap: 0;
  margin-block: 0;
  text-align: center;
}

.timeline-section,
.why-spines-section { gap: 0; }

/* The section CTA is a direct child of the shell on some pages, so centre
   it there too rather than relying on the text container. */
.bp-shell > .service-cta,
.about-services-text-container > .service-cta,
.timeline-section > .service-cta,
.why-spines-section > .service-cta {
  margin-inline: auto;
  margin-top: var(--bp-cta-gap);
}

.about-services-text-container h2 { max-width: var(--bp-measure-title); }

/* The eyebrow is also a <p>; leave it on the shared .section-eyebrow
   geometry so it resolves identically to home's. */
.about-services-text-container p:not(.section-eyebrow) {
  max-width: var(--bp-measure-lead);
  margin-inline: auto;
}

.timeline-section { position: relative; }

.timeline-section:not(.bp-section) { padding: 0; margin: 0; }
.why-spines-section:not(.bp-section) { padding: 0; }

/* #service-card and #about-service-card-box were repeated ids; the rules
   that styled them are re-expressed as classes here. */
.service-card {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: flex-start;
  gap: 0.6rem;
  width: auto;
  height: auto;
  min-height: 0;
  padding: clamp(1.25rem, 2vw, 1.65rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-sm);
  text-align: left;
}

.service-card img { width: 44px; height: 44px; object-fit: contain; }
.service-card h3 { margin: 0; font-size: 1.1rem; font-weight: 600; color: var(--bp-ink); }
.service-card p  { margin: 0; font-size: 0.94rem; line-height: 1.6; color: var(--bp-ink-soft); }

.about-service-card-box {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.6rem;
  width: auto;
  max-width: none;
  height: auto;
  min-height: 0;
  padding: clamp(1.25rem, 2vw, 1.65rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-sm);
  text-align: left;
}

.about-service-card-box h3 { margin: 0; font-size: 1.1rem; font-weight: 600; color: var(--bp-ink); }
.about-service-card-box p  { margin: 0; font-size: 0.94rem; line-height: 1.6; color: var(--bp-ink-soft); }

#about-service-card-container,
#service-grid,
.service-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  gap: clamp(1rem, 2vw, 1.5rem);
  align-items: stretch;
  width: 100%;
  max-width: none;
  margin: var(--bp-stack-3) 0 0;
}

.timeline {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  gap: clamp(1.25rem, 2.4vw, 2rem);
  align-items: stretch;
  margin-top: var(--bp-stack-3);
}

.timeline-step {
  height: auto;
  min-height: 0;
  width: auto;
  padding: clamp(1.35rem, 2.2vw, 1.85rem) clamp(1.25rem, 2vw, 1.6rem) 2.25rem;
  text-align: left;
}

/* book-cover-design.css loads after theme-uplift and repaints this gold,
   putting white text on #c9a227 at 2.42:1. Navy restores 12.6:1. */
.timeline-step .step-number {
  background: var(--bp-primary);
  color: #fff;
  font-variant-numeric: tabular-nums;
}

.timeline-step img,
.timeline-step .step-img { width: 52px; height: 52px; object-fit: contain; }
.timeline-step h3 { margin: 0.6rem 0 0.4rem; font-size: 1.08rem; }
.timeline-step p  { margin: 0 !important; font-size: 0.93rem; line-height: 1.6; }

/* #Extra-btn was a repeated id; it is .service-cta now and joins the solid
   button family. */
.service-cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 46px;
  padding: 12px 22px;
  border: 1.5px solid var(--bp-primary);
  border-radius: var(--bp-radius-sm);
  background: var(--bp-primary);
  color: #fff;
  font-family: var(--bp-font-sans);
  font-size: 0.95rem;
  font-weight: 600;
  text-decoration: none;
  transition: background var(--bp-hover-t) var(--bp-ease),
              border-color var(--bp-hover-t) var(--bp-ease),
              transform var(--bp-hover-t) var(--bp-ease);
}

.service-cta:hover {
  background: var(--bp-primary-hover);
  border-color: var(--bp-primary-hover);
  color: #fff;
  transform: translateY(var(--bp-lift));
}

.service-cta:focus-visible { outline: 2px solid var(--bp-accent); outline-offset: 3px; }

/* Same solid button as the rest of the site. It previously inverted to
   white-on-navy, which made it the only button anywhere that did. */
#service-header-inner-container .service-cta {
  border: 1.5px solid var(--bp-primary);
  background: var(--bp-primary);
  color: #fff;
  width: auto;
}

#service-header-inner-container .service-cta:hover {
  background: var(--bp-primary-hover);
  border-color: var(--bp-primary-hover);
  color: #fff;
  transform: translateY(var(--bp-lift));
}

/* Book showcase and reviews are merged with their headings now. */
.home-bannrwrp { width: 100%; }
.home-bannrwrp .swiper { width: 100%; padding: 0; min-height: clamp(220px, 26vw, 330px); }
.home-bannrwrp .swiper-slide { display: flex; justify-content: center; align-items: center; height: auto; }
.home-bannrwrp .swiper-slide figure { margin: 0; width: 100%; }

.home-bannrwrp .swiper-slide img {
  width: 100%;
  height: auto;
  aspect-ratio: 680 / 519;
  object-fit: contain;
  filter: none;
  transform: scale(0.9);
  transition: transform 400ms var(--bp-ease);
}

.home-bannrwrp .swiper-slide-active img { transform: scale(1); }

@media (max-width: 860px) {
  #service-header-inner-container p { max-width: none; }
  .timeline-step { padding-bottom: 2rem; }
}

/* ==========================================================================
   SERVICE PAGES — card sections retheme
   "Genres we cover" and "How it works" were the two blocks still carrying
   their own look. Both now use the home page card language: white surface,
   1px border, radius-lg, shadow-sm, icon in a tinted tile, hover lift.
   ========================================================================== */

/* --- Genre / capability grid --------------------------------------------- */

/* Three across at most — auto-fit was packing 4+ on wide screens. */
#service-grid,
.service-grid,
#about-service-card-container {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(1rem, 2vw, 1.5rem);
  align-items: stretch;
  width: 100%;
  max-width: none;
  margin: var(--bp-stack-3) 0 0;
}

@media (max-width: 1000px) {
  #service-grid,
  .service-grid,
  #about-service-card-container { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.service-card,
.about-service-card-box {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.75rem;
  width: auto;
  max-width: none;
  height: auto;
  min-height: 0;
  padding: clamp(1.4rem, 2.2vw, 1.85rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-sm);
  text-align: left;
  transition: transform var(--bp-hover-t) var(--bp-ease),
              box-shadow var(--bp-hover-t) var(--bp-ease),
              border-color var(--bp-hover-t) var(--bp-ease);
}

.service-card:hover,
.about-service-card-box:hover {
  transform: translateY(var(--bp-lift-card));
  box-shadow: var(--bp-shadow-md);
  border-color: var(--bp-border-strong);
}

/* Icon sits in a tinted tile, the same treatment as the mega-menu icons. */
.service-card > img,
.about-service-card-box > img {
  width: 46px;
  height: 46px;
  padding: 9px;
  border: 1px solid var(--bp-border);
  border-radius: 11px;
  background: var(--bp-surface);
  object-fit: contain;
}

.service-card h3,
.about-service-card-box h3 {
  margin: 0;
  font-family: var(--bp-font-sans);
  font-size: 1.12rem;
  font-weight: 600;
  line-height: 1.3;
  letter-spacing: -0.01em;
  color: var(--bp-ink);
  text-align: left;
}

.service-card p,
.about-service-card-box p {
  margin: 0;
  font-size: 0.94rem;
  line-height: 1.65;
  color: var(--bp-ink-soft);
  text-align: left;
}

/* --- Process timeline ----------------------------------------------------
   Two per row, with the step count set large and dimmed in the bottom-right
   of each card as a watermark. The count stays a real element (with a
   visually-hidden "Step " prefix) so it is still read in order; it is just
   presented as background.

   Scoped to `.timeline >` because the genre cards also carry
   .timeline-step and have no step number.
   -------------------------------------------------------------------------- */

.timeline {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(1.25rem, 2.4vw, 1.75rem);
  align-items: stretch;
  list-style: none;
  margin: var(--bp-stack-3) 0 0;
  padding: 0;
}

.timeline > .timeline-step {
  position: relative;
  overflow: hidden;                /* clips the watermark to the card */
  isolation: isolate;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 0.65rem;
  width: auto;
  height: auto;
  min-height: 0;
  margin: 0;
  padding: clamp(1.5rem, 2.4vw, 2rem) clamp(1.35rem, 2.2vw, 1.85rem);
  border: 1px solid var(--bp-border);
  border-radius: var(--bp-radius-lg);
  background: var(--bp-bg-elevated);
  box-shadow: var(--bp-shadow-sm);
  text-align: left;
  list-style: none;
  transition: transform var(--bp-hover-t) var(--bp-ease),
              box-shadow var(--bp-hover-t) var(--bp-ease),
              border-color var(--bp-hover-t) var(--bp-ease);
}

.timeline > .timeline-step:hover {
  transform: translateY(var(--bp-lift-card));
  box-shadow: var(--bp-shadow-md);
  border-color: var(--bp-border-strong);
}

/* The dimmed count. Sits behind the copy, bleeding slightly off the
   bottom-right corner. */
.timeline > .timeline-step .step-number {
  position: absolute;
  z-index: -1;
  right: clamp(0.5rem, 1.4vw, 1rem);
  bottom: clamp(-0.75rem, -1vw, -0.35rem);
  top: auto;
  left: auto;
  transform: none;
  translate: none;
  display: block;
  width: auto;
  height: auto;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  box-shadow: none;
  color: var(--bp-primary);
  opacity: 0.07;
  font-family: var(--bp-font-display);
  font-size: clamp(4rem, 8vw, 6.5rem);
  font-weight: 700;
  line-height: 0.85;
  letter-spacing: -0.04em;
  font-variant-numeric: tabular-nums;
  pointer-events: none;
  user-select: none;
}

.timeline > .timeline-step > img,
.timeline > .timeline-step .step-img {
  width: 44px;
  height: 44px;
  padding: 9px;
  border: 1px solid var(--bp-border);
  border-radius: 11px;
  background: var(--bp-surface);
  object-fit: contain;
  transition: none;
}

.timeline > .timeline-step h3 {
  margin: 0;
  font-family: var(--bp-font-sans);
  font-size: 1.12rem;
  font-weight: 600;
  line-height: 1.3;
  color: var(--bp-ink);
  text-align: left;
}

.timeline > .timeline-step p {
  margin: 0 !important;
  font-size: 0.94rem;
  line-height: 1.65;
  color: var(--bp-ink-soft);
  text-align: left;
}

/* An odd last step spans both columns rather than leaving a gap
   (four pages have five steps). */
.timeline > .timeline-step:last-child:nth-child(odd) { grid-column: 1 / -1; }

@media (max-width: 700px) {
  .timeline { grid-template-columns: 1fr; }
  .timeline > .timeline-step:last-child:nth-child(odd) { grid-column: auto; }
  .timeline > .timeline-step .step-number { font-size: clamp(3.25rem, 14vw, 4.5rem); }
}

@media (hover: none) {
  .service-card:hover,
  .about-service-card-box:hover,
  .timeline-step:hover { transform: none; }
}

@media (max-width: 640px) {
  #service-grid, .service-grid, #about-service-card-container,
  .timeline { grid-template-columns: 1fr; }
}

/* ==========================================================================
   SERVICE PAGES — legacy overrides
   Everything below exists because book-cover-design.css / style.css win the
   cascade on these selectors. Each one was found by resolving the rendered
   page against the home page, not by guessing.
   ========================================================================== */

/* The hero eyebrow and leads are <p>, and book-cover-design.css sets
   `#service-header-inner-container p { width: 50% }` — which is why the
   badge pill was half the container wide instead of hugging its text. */
#service-header-inner-container p,
#service-header-inner-container .section-lead {
  width: auto;
}

#service-header-inner-container .section-eyebrow {
  width: auto;
  max-width: none;
  align-self: center;
}

/* `.timeline-section p { margin: 0 0 20px !important }` and
   `.timeline-section h2 { margin-bottom: 15px }` were overriding the
   section-head rhythm. */
.timeline-section .section-title,
.about-services-text-container .section-title {
  margin-bottom: 0;
}

.timeline-section .section-head,
.about-services-text-container .section-head {
  margin-bottom: var(--bp-stack-3);
}

/* style.css: `.why-spines-btn-wrap { margin-top: 40px }` — use the section
   action rhythm and centring instead. */
.why-spines-btn-wrap {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.75rem;
  margin: var(--bp-cta-gap) 0 0;
  margin-top: var(--bp-cta-gap);
}

/* Closing form: book-cover-design.css lays this out as a 50/45 flex pair
   with a 30px bottom margin. Home uses a grid inside the section. */
#services-bottom-form-section {
  display: block;
  width: 100%;
  margin: 0;
  padding: 0;
}

#services-bottom-form-inner {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
  gap: clamp(1.5rem, 3vw, 2.5rem);
  align-items: center;
  width: 100%;
  max-width: none;
  margin: 0;
}

#service-form-container {
  display: block;
  width: 100%;
  min-width: 0;
  height: auto;
}

#service-form-right-image-container {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  min-width: 0;
  height: auto;
}

#service-form-right-image-container img {
  width: 100%;
  max-width: 460px;
  height: auto;
  padding: 0;
}

#services-bottom-form-inner #support-form-container {
  width: 100%;
  max-width: none;
  margin: 0 !important;
}

@media (max-width: 860px) {
  #services-bottom-form-inner { grid-template-columns: 1fr; }
  #service-form-right-image-container { display: none; }
}

/* ==========================================================================
   ONE CTA
   Auditing a single service page turned up FOUR different button treatments:
     .service-cta in the banner   radius 20px, padding 10px 20px, font large
     .service-cta elsewhere       radius 8px,  padding 12px 22px, 0.95rem
     #New-btn                     inline-block, no border, width fit-content
     .submit-btn                  padding 14px 22px, min-height 50px, no border
   They came from #service-header-inner-container a, #New-btn and .submit-btn
   in the legacy sheets. This is the single definition; the selectors below
   are specific enough to beat each of those.
   ========================================================================== */

.btn,
#New-btn,
.submit-btn,
.bp-form .submit-btn,
.service-cta,
.hero-btn--primary,
.plan-card__cta,
#service-header-inner-container .service-cta,
#service-header-inner-container a.service-cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: auto;
  min-height: 46px;
  padding: 12px 22px;
  border: 1.5px solid var(--bp-primary);
  border-radius: var(--bp-radius-sm);
  background: var(--bp-primary);
  color: #fff;
  font-family: var(--bp-font-sans);
  font-size: 0.95rem;
  font-weight: 600;
  line-height: 1.2;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--bp-hover-t) var(--bp-ease),
              border-color var(--bp-hover-t) var(--bp-ease),
              color var(--bp-hover-t) var(--bp-ease),
              transform var(--bp-hover-t) var(--bp-ease),
              box-shadow var(--bp-hover-t) var(--bp-ease);
}

.btn:hover,
#New-btn:hover,
.submit-btn:hover,
.bp-form .submit-btn:hover,
.service-cta:hover,
.hero-btn--primary:hover,
#service-header-inner-container .service-cta:hover {
  background: var(--bp-primary-hover);
  border-color: var(--bp-primary-hover);
  color: #fff;
  transform: translateY(var(--bp-lift));
  box-shadow: var(--bp-shadow-md);
}

/* Full-width only where the form layout calls for it. */
.bp-form .submit-btn { width: 100%; }

/* The form uses a flex gap for rhythm, so the button must not add a margin. */
.bp-form .submit-btn { margin-top: 0; }
