/*
  Aquamor Website Design System — site.css
  Version: 1.0 — Phase 1 Homepage Prototype

  Design principle: Precision-manufacturer web standard.
  Confident scale, generous whitespace, restrained color.
  Light theme only — single polished marketing site.
  Mobile-first. WCAG AA (≥4.5:1 contrast throughout).

  CONTRAST AUDIT (all pairs ≥4.5:1):
  - #1A1A1A on #FFFFFF = 16.0:1  OK
  - #1A1A1A on #F5F9FC = 14.7:1  OK
  - #1e3a5f on #FFFFFF = 10.3:1  OK
  - #1e3a5f on #E8F4F8 = 8.4:1   OK
  - #FFFFFF on #1e3a5f = 10.3:1  OK  (filled buttons/badges — navy bg)
  - #FFFFFF on #1A1A1A = 16.0:1  OK  (footer text on dark)
  - #333333 on #FFFFFF = 12.6:1  OK  (body text)
  - #5A6B7A on #FFFFFF = 5.1:1   OK  (header tagline — muted brand signature)
  - #4AADD4 on #FFFFFF = 2.55:1  NOT OK  — NEVER used for body text
  - #4AADD4 is DECORATIVE ONLY: borders, underlines, icons, wave accents
  NOTE: White text on #4AADD4 fill = 2.55:1 — NEVER used.
        All filled interactive elements use #1e3a5f (navy).
  Review Round 2 (2026-06-10): header tagline added (#5A6B7A, 5.1:1); footer
        icon logo (.site-footer__icon); header heights updated for tagline clearance.
*/

/* ------------------------------------------------------------
   1. CSS CUSTOM PROPERTIES (Design Tokens)
------------------------------------------------------------ */
:root {
  /* Light-mode lock — this site is light-only. Prevents OS dark-mode auto-inversion
     in Chrome/Safari (file:// and production). Both properties required: the CSS
     property prevents auto-darkening of rendered colors; the meta tag (in every
     <head>) signals the browser before paint. See also: meta[name=color-scheme]. */
  color-scheme: only light;

  /* Brand colors */
  --blue:        #4AADD4;   /* decorative only — wave, borders, icons */
  --navy:        #1e3a5f;   /* filled buttons, badge fills, headings */
  --dark:        #1A1A1A;   /* primary text, logo text */
  --light-blue:  #E8F4F8;   /* tint backgrounds, card backgrounds */
  --white:       #FFFFFF;

  /* Surface palette */
  --surface-0:   #FFFFFF;
  --surface-1:   #F5F9FC;   /* warm off-white — alternating sections */
  --surface-2:   #EBF4F9;   /* deeper tint — trust bar, callouts */
  --surface-dark: #1A1A1A;  /* footer */

  /* Text */
  --text-primary:   #1A1A1A;   /* 16:1 on white */
  --text-secondary: #3A4A5C;   /* 8.1:1 on white — body supporting */
  --text-muted:     #5A6B7A;   /* 5.1:1 on white — captions, meta */
  --text-white:     #FFFFFF;
  --text-on-navy:   #FFFFFF;   /* 10.3:1 on navy */
  --text-on-dark:   #F0F4F8;   /* 13.2:1 on #1A1A1A */

  /* Interactive */
  --btn-primary-bg:      #1e3a5f;
  --btn-primary-text:    #FFFFFF;
  --btn-primary-hover:   #162d4a;
  --btn-outline-border:  #1e3a5f;
  --btn-outline-text:    #1e3a5f;
  --btn-outline-hover-bg: #1e3a5f;
  --btn-outline-hover-text: #FFFFFF;

  /* Borders */
  --border-light: #DDE8EF;
  --border-mid:   #C5D8E4;

  /* Typography scale — premium B2B marketing */
  --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
  --font-serif: 'Georgia', 'Times New Roman', serif; /* reserved for pull-quotes */

  /* Type scale */
  --text-xs:   0.75rem;   /*  12px */
  --text-sm:   0.875rem;  /*  14px */
  --text-base: 1rem;      /*  16px — body minimum */
  --text-lg:   1.125rem;  /*  18px */
  --text-xl:   1.25rem;   /*  20px */
  --text-2xl:  1.5rem;    /*  24px */
  --text-3xl:  1.875rem;  /*  30px */
  --text-4xl:  2.25rem;   /*  36px */
  --text-5xl:  3rem;      /*  48px */
  --text-hero: 3.75rem;   /*  60px */
  --text-display: 4.5rem; /*  72px */

  /* Spacing scale */
  --space-1:  0.25rem;
  --space-2:  0.5rem;
  --space-3:  0.75rem;
  --space-4:  1rem;
  --space-5:  1.25rem;
  --space-6:  1.5rem;
  --space-8:  2rem;
  --space-10: 2.5rem;
  --space-12: 3rem;
  --space-16: 4rem;
  --space-20: 5rem;
  --space-24: 6rem;
  --space-32: 8rem;

  /* Layout */
  --container-max: 1200px;
  --container-wide: 1440px;
  --container-narrow: 740px;
  --gutter: 1.5rem;

  /* Radii */
  --radius-sm: 4px;
  --radius:    8px;
  --radius-lg: 12px;
  --radius-xl: 20px;

  /* Shadows */
  --shadow-sm:  0 1px 3px rgba(30, 58, 95, 0.08);
  --shadow-md:  0 4px 16px rgba(30, 58, 95, 0.12);
  --shadow-lg:  0 12px 40px rgba(30, 58, 95, 0.16);
  --shadow-card: 0 2px 12px rgba(30, 58, 95, 0.10);

  /* Transitions */
  --transition-fast: 150ms ease;
  --transition:      250ms ease;
  --transition-slow: 400ms ease;

  /* Header — 84px accommodates logo (36px) + tagline (12px) + padding */
  --header-height: 84px;
}


/* ------------------------------------------------------------
   2. RESET & BASE
------------------------------------------------------------ */
*, *::before, *::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
  font-size: 16px;
}

body {
  font-family: var(--font-sans);
  font-size: var(--text-base);
  line-height: 1.7;
  color: var(--text-primary);
  background: var(--surface-0);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

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

/* ------------------------------------------------------------
   Skip to main content link (WCAG 2.4.1 Bypass Blocks)
   Off-screen until focused; navy-on-white, high contrast.
------------------------------------------------------------ */
.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 1000;
  padding: 0.75rem 1.25rem;
  background: #ffffff;
  color: #1e3a5f;
  font-weight: 600;
  font-size: 1rem;
  border: 2px solid #1e3a5f;
  border-radius: 0 0 6px 0;
  box-shadow: 0 2px 8px rgba(0,0,0,0.25);
  text-decoration: none;
}
.skip-link:focus {
  left: 0;
  outline: 3px solid #4AADD4;
  outline-offset: 2px;
}

a {
  color: var(--navy);
  text-decoration: none;
  transition: color var(--transition-fast);
}

a:hover { color: var(--blue); }

ul, ol { list-style: none; }

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

/* Keyboard focus ring — WCAG 2.4.7 Focus Visible. Navy outline (#1e3a5f =
   10.3:1 on white) on keyboard nav only; :focus-visible keeps it off mouse clicks. */
a:focus-visible, button:focus-visible, input:focus-visible, textarea:focus-visible, select:focus-visible, [tabindex]:focus-visible {
  outline: 2px solid #1e3a5f;
  outline-offset: 3px;
  border-radius: 2px;
}


/* ------------------------------------------------------------
   3. TYPOGRAPHY SYSTEM
------------------------------------------------------------ */

/* Display — hero headline */
.type-display {
  font-size: var(--text-display);
  font-weight: 300;
  letter-spacing: -0.03em;
  line-height: 1.05;
  color: var(--text-primary);
}

/* Hero H1 */
.type-hero {
  font-size: var(--text-hero);
  font-weight: 300;
  letter-spacing: -0.025em;
  line-height: 1.1;
  color: var(--text-primary);
}

/* Section headline */
.type-h1 {
  font-size: var(--text-5xl);
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.15;
  color: var(--text-primary);
}

/* Card/subpage headline */
.type-h2 {
  font-size: var(--text-4xl);
  font-weight: 600;
  letter-spacing: -0.015em;
  line-height: 1.2;
  color: var(--text-primary);
}

.type-h3 {
  font-size: var(--text-3xl);
  font-weight: 600;
  letter-spacing: -0.01em;
  line-height: 1.25;
  color: var(--text-primary);
}

.type-h4 {
  font-size: var(--text-2xl);
  font-weight: 600;
  letter-spacing: -0.01em;
  line-height: 1.3;
  color: var(--text-primary);
}

.type-h5 {
  font-size: var(--text-xl);
  font-weight: 600;
  letter-spacing: 0;
  line-height: 1.4;
  color: var(--text-primary);
}

/* Label / eyebrow — above headings */
.type-label {
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--navy);
  /* Navy (#1e3a5f) for AA contrast on light backgrounds. Brand-blue #4AADD4 on
     white is only 2.55:1 and must stay decorative (borders, icons, waves). */
}

.type-label-navy {
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--navy);
}

/* Body large */
.type-lead {
  font-size: var(--text-xl);
  font-weight: 400;
  line-height: 1.65;
  color: var(--text-secondary);
}

/* Body */
.type-body {
  font-size: var(--text-base);
  font-weight: 400;
  line-height: 1.7;
  color: var(--text-secondary);
}

/* Caption */
.type-caption {
  font-size: var(--text-sm);
  color: var(--text-muted);
  line-height: 1.5;
}


/* ------------------------------------------------------------
   4. LAYOUT UTILITIES
------------------------------------------------------------ */
.container {
  max-width: var(--container-max);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.container--wide {
  max-width: var(--container-wide);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.container--narrow {
  max-width: var(--container-narrow);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

/* Section spacing */
.section {
  padding-block: var(--space-24);
}

.section--sm {
  padding-block: var(--space-16);
}

.section--lg {
  padding-block: var(--space-32);
}

/* Alternating section backgrounds */
.section--white  { background: var(--surface-0); }
.section--tint   { background: var(--surface-1); }
.section--blue   { background: var(--light-blue); }
.section--dark   { background: var(--surface-dark); }
.section--navy   { background: var(--navy); }

/* Grid */
.grid-2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-8);
}

.grid-3 {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-8);
}

.grid-4 {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--space-6);
}

/* Flex helpers */
.flex        { display: flex; }
.flex-center { display: flex; align-items: center; justify-content: center; }
.flex-between { display: flex; align-items: center; justify-content: space-between; }
.gap-2  { gap: var(--space-2); }
.gap-4  { gap: var(--space-4); }
.gap-6  { gap: var(--space-6); }
.gap-8  { gap: var(--space-8); }


/* ------------------------------------------------------------
   5. NAVIGATION
------------------------------------------------------------ */

/* Toll-free topbar — added 2026-08-24 (task 86). Sits above the sticky
   .site-header in normal document flow (NOT sticky, NOT fixed): it scrolls
   away with the page rather than taking permanent height out of the tuned
   sticky-header layout, so --header-height and everything keyed off it
   (dropdown offset, scroll-margin-top, the mobile nav-toggle / btn-cta
   overflow fix below) are untouched. Navy fill matches the brand's one
   filled-element color (white text on #1e3a5f = 10.3:1, see contrast audit
   at the top of this file) — reads as a distinct utility strip, not a
   second footer. Text-only, no icon: avoids introducing an unverified SVG
   icon path for a single short line of copy. */
.topbar {
  background: var(--navy);
}

.topbar__inner {
  max-width: var(--container-max);
  margin-inline: auto;
  padding: 0.5rem var(--gutter);
  display: flex;
  align-items: center;
  justify-content: center;
}

.topbar__phone {
  color: var(--text-on-navy);
  font-size: var(--text-sm);
  font-weight: 600;
  letter-spacing: 0.01em;
  text-decoration: none;
  white-space: nowrap;
}

.topbar__phone:hover,
.topbar__phone:focus-visible {
  color: var(--text-on-navy);
  text-decoration: underline;
}

.site-header {
  position: sticky;
  top: 0;
  z-index: 200;
  height: var(--header-height);
  background: var(--white);
  border-bottom: 1px solid var(--border-light);
  box-shadow: 0 1px 0 var(--border-light), 0 4px 24px rgba(30,58,95,0.06);
  display: flex;
  align-items: center;
}

.site-header__inner {
  width: 100%;
  max-width: var(--container-max);
  margin-inline: auto;
  padding-inline: var(--gutter);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-8);
}

/* Logo — flex-column so tagline sits directly below wordmark */
.site-logo {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  flex-shrink: 0;
  gap: 2px;
  text-decoration: none;
  /* Round-2 QC fix, 2026-09-01: pointer-events:none on .site-logo__tagline
     alone was NOT enough. This anchor is a column flexbox hugging its two
     children with no extra padding, so its own hit-box extends exactly as
     far down as the tagline row does -- at 360/390px with the mobile menu
     open, document.elementFromPoint() at the Solutions accordion trigger's
     centre still returned THIS anchor, not the trigger, because the parent
     box (not just the child span) covers that point. Disabling pointer
     events on the whole anchor and re-enabling them only on the image
     below makes every dead area in this box (the tagline row and any
     gap/padding) click-through, while the logo image stays the home link:
     a click event that hit-tests to a pointer-events:auto descendant still
     bubbles up through and triggers this <a>'s own navigation. */
  pointer-events: none;
}

.site-logo img {
  height: 36px;
  width: auto;
  display: block;
  pointer-events: auto;
}

/* Round-2 QC fix (continued), 2026-09-01, CORRECTED round-3 same day: the
   .site-logo pointer-events fix above stops the logo from blocking the
   mobile Solutions accordion trigger underneath, but elementFromPoint() at
   the trigger's centre still returned .site-header__inner, not the trigger
   -- the sticky header (z-index 200) sits geometrically above the fixed
   mobile-nav drawer (z-index 199) in the band where they overlap, and
   .site-header__inner itself, a plain flex container with no pointer-events
   override, still captures hit-testing across its own full box even where
   none of its visible children do. Disable pointer events on the container
   and re-enable them explicitly on its one remaining real control at this
   width, the hamburger toggle (.site-logo img already re-enabled above,
   unconditionally). The header's own "Request a Quote" CTA is already
   display:none at this width -- the mobile drawer carries its own
   full-width copy of it instead (.site-nav--mobile .btn-cta) -- so it
   needs no pointer-events override; a display:none element is never
   hit-testable regardless. Everything else in the header's dead space --
   gaps, padding, the row .site-nav occupies at wider widths but is
   display:none here -- becomes click-through to the drawer content
   beneath it.
   CORRECTED to <=960px (round-3, 2026-09-01): the round-2 fix scoped this to
   <=640px on the assumption that a drawer "can only sit under the header"
   at that width. False -- .nav-toggle switches to display:flex, and
   .site-nav--mobile becomes the only nav surface, at the SAME <=960px
   breakpoint that hides .site-nav (see RESPONSIVE BREAKPOINTS, tablet
   query). QC reproduced the header capturing drawer taps at 768px, a
   width this rule did not yet cover. 960px is not an arbitrary widening --
   it is the exact width where the hamburger/drawer pattern is live, so this
   rule now matches its own precondition instead of a narrower guess at it.
   Belt-and-suspenders alongside the JS fix in initMobileNav() (site.js),
   which now positions the drawer's top edge from the header's real
   getBoundingClientRect().bottom instead of the static --header-height
   token -- that JS fix removes the overlap outright at every width; this
   CSS rule stays as a safety net for the geometry it was originally
   written to cover. */
/* Round-2 QC FIX 4, 2026-09-01: scoped to .site-header__inner:has(.nav-toggle)
   instead of the bare .site-header__inner. The blanket selector above (now
   removed) killed every interactive element in the header on any page that
   reuses .site-header__inner but does NOT ship the mobile hamburger/drawer
   pattern -- feedback-board.html is exactly that case (a non-standard
   internal-tool header, 11 interactive elements, no .nav-toggle, no mobile
   drawer): its "Preview Hub" link went dead at <=960px with nothing able to
   re-enable it, because there is no .nav-toggle in that header for the second
   rule to target. :has(.nav-toggle) makes the whole pointer-events:none /
   pointer-events:auto pair conditional on the drawer pattern actually being
   present in this header instance, so a page without it keeps default
   pointer-events (auto) throughout and nothing regresses. Standard site pages
   (index.html, oem.html, etc.) all carry .nav-toggle in the header markup, so
   this is a no-op for them -- same behavior as before, just correctly scoped. */
@media (max-width: 960px) {
  .site-header__inner:has(.nav-toggle) {
    pointer-events: none;
  }

  .site-header__inner:has(.nav-toggle) .nav-toggle {
    pointer-events: auto;
  }
}

/* Brand tagline beneath wordmark — brand signature, not body copy.
   Color: #5A6B7A = 5.1:1 on #FFFFFF — passes WCAG AA (≥4.5:1).
   pointer-events: none (Mike-authorized, round-2 QC 2026-09-01): at 360px
   and 390px with the mobile menu open, this tagline overlapped the
   Solutions accordion trigger by 190x12px and absorbed the tap, so a real
   thumb tap on that strip did nothing. The tagline is decorative text with
   no interactive purpose at any width, so disabling pointer events on it
   lets clicks fall through to whatever sits beneath -- safe everywhere,
   not just mobile. */
.site-logo__tagline {
  font-size: 12px;
  line-height: 1;
  letter-spacing: 0.08em;
  font-weight: 400;
  color: #5A6B7A;
  white-space: nowrap;
  font-family: var(--font-sans);
  pointer-events: none;
}

/* Nav links */
.site-nav {
  display: flex;
  align-items: center;
  gap: 0;
}

.site-nav__list {
  display: flex;
  align-items: center;
  gap: var(--space-1);
}

.site-nav__item a {
  display: block;
  padding: var(--space-2) var(--space-3);
  font-size: var(--text-sm);
  font-weight: 500;
  color: var(--text-secondary);
  border-radius: var(--radius-sm);
  /* Transparent bottom border reserved at all times so toggling the active
     state (which colors it navy) never changes the element's box geometry. */
  border-bottom: 2px solid transparent;
  transition: color var(--transition-fast), background var(--transition-fast),
              border-color var(--transition-fast);
  white-space: nowrap;
}

.site-nav__item a:hover {
  color: var(--navy);
  background: var(--surface-1);
}

/* Active nav item — WIDTH-STABLE.
   Font-weight stays 500 (same as non-active) so the rendered text width never
   changes when an item becomes active; that was the cause of the layout shift
   where neighbors got shoved as you moved between pages. The active item is
   indicated by navy color + a navy underline (the always-present transparent
   border turns navy). Geometry is identical in both states. */
.site-nav__item--active a {
  color: var(--navy);
  font-weight: 500;
  border-bottom-color: var(--navy);
}

/* ------------------------------------------------------------
   SOLUTIONS DOOR + PRODUCTS DOOR — desktop dropdown (concept build)
   Click-to-landing-page + hover/tap dropdown. Not a mega-menu: one column,
   no sub-navigation. Solutions weighting is order + one accent ONLY — never
   card size, never grayscale/desaturation on the non-featured rows (see IA
   review round 1/round 2). The eyebrow line that used to sit above the
   Foodservice row was removed 2026-07-06 (Mike) — it made the four clean
   single-word rows read lopsided.

   Products door added 2026-08-21 (IA review fix A) so the dedicated
   /engineered-systems, /uf-systems, and /manifolds pages are reachable from
   primary nav — mirrors the Solutions door's markup and behavior exactly.
   The two doors share every rule below except position, hover/focus-within
   triggers, and the active-state color; those are combined selectors on one
   declaration block rather than duplicated blocks. The reusable dropdown
   parts (.site-nav__dropdown, .site-nav__dropdown-row, -label, .site-nav__caret)
   need no Products-specific rule at all — both doors render the same classes.
   ------------------------------------------------------------ */
.site-nav__item--solutions,
.site-nav__item--products {
  position: relative;
}

/* Specificity note: the base link rule ".site-nav__item a" (0,1,1) is MORE
   specific than a bare ".site-nav__solutions-trigger" (0,1,0) would be, so it
   would otherwise win the cascade and force display:block on this trigger —
   which lets the label text and the caret SVG wrap onto separate lines as two
   inline items in a block box. Qualifying the selector with the parent "a"
   type (".site-nav__item a.site-nav__solutions-trigger", specificity 0,1,2)
   guarantees this rule always wins, and white-space:nowrap is a hard backstop
   so the label + caret can never wrap even under future CSS edits. Same
   reasoning applies to the Products trigger, hence the combined selector. */
.site-nav__item a.site-nav__solutions-trigger,
.site-nav__item a.site-nav__products-trigger {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  white-space: nowrap;
}

.site-nav__caret {
  flex-shrink: 0;
  transition: transform var(--transition-fast);
}

.site-nav__item--solutions:hover .site-nav__caret,
.site-nav__item--solutions:focus-within .site-nav__caret,
.site-nav__item--products:hover .site-nav__caret,
.site-nav__item--products:focus-within .site-nav__caret {
  transform: rotate(180deg);
}

.site-nav__dropdown {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 280px;
  background: var(--white);
  border-radius: var(--radius);
  box-shadow: var(--shadow-lg);
  border: 1px solid var(--border, #E5E7EB);
  padding: var(--space-2);
  z-index: 210;
}

.site-nav__item--solutions:hover .site-nav__dropdown,
.site-nav__item--solutions:focus-within .site-nav__dropdown,
.site-nav__item--products:hover .site-nav__dropdown,
.site-nav__item--products:focus-within .site-nav__dropdown {
  display: block;
}

.site-nav__dropdown-row {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius-sm);
  border-left: 3px solid transparent;
  color: var(--text-primary);
  text-decoration: none;
}

.site-nav__dropdown-row:hover {
  background: var(--surface-1);
}

.site-nav__dropdown-row--featured {
  border-left-color: var(--blue);
  background: var(--surface-1);
}

/* .site-nav__dropdown-eyebrow removed 2026-07-06 — the eyebrow line made the
   four-row Solutions dropdown/mobile-menu read lopsided against the other
   three single-word rows (Mike). Class was scoped to the dropdown/mobile
   menu only; the solutions.html fan-out CARD eyebrow uses the separate
   .segment-card__eyebrow class below and is unaffected. The Products door
   (added 2026-08-21) never had an eyebrow — its three rows read identically
   with no featured row, so .site-nav__dropdown-row--featured above is not
   used on any Products row either. */

.site-nav__dropdown-label {
  font-size: var(--text-sm);
  font-weight: 500;
  color: var(--text-primary);
}

/* Solutions trigger reads "active" when any Solutions child page (oem,
   foodservice, retail, pro) is current; Products trigger reads "active" when
   any Products child page (/products, /engineered-systems, /uf-systems,
   /manifolds) is current — both stamped by build-includes.py. */
.site-nav__item--solutions.site-nav__item--active .site-nav__solutions-trigger,
.site-nav__item--products.site-nav__item--active .site-nav__products-trigger {
  color: var(--navy);
  font-weight: 500;
  border-bottom-color: var(--navy);
}

/* Mobile menu toggle */
.nav-toggle {
  display: none;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: var(--radius-sm);
  color: var(--text-primary);
  transition: background var(--transition-fast);
}

.nav-toggle:hover { background: var(--surface-1); }

.nav-toggle svg { width: 22px; height: 22px; }

/* Mobile nav drawer */
.site-nav--mobile {
  display: none;
  position: fixed;
  top: var(--header-height);
  left: 0;
  right: 0;
  bottom: 0;
  background: var(--white);
  z-index: 199;
  padding: var(--space-6) var(--gutter);
  overflow-y: auto;
  border-top: 3px solid var(--blue);
}

.site-nav--mobile.is-open {
  display: block;
}

.site-nav--mobile .site-nav__list {
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-1);
  width: 100%;
}

.site-nav--mobile .site-nav__item {
  width: 100%;
}

.site-nav--mobile .site-nav__item a {
  font-size: var(--text-lg);
  padding: var(--space-3) var(--space-4);
  width: 100%;
  border-radius: var(--radius);
  /* Drop the desktop underline in the stacked drawer; indicate active with a
     left accent instead. Reserved transparent border keeps geometry stable. */
  border-bottom: none;
  border-left: 3px solid transparent;
}

.site-nav--mobile .site-nav__item--active a {
  border-bottom-color: transparent;
  border-left-color: var(--navy);
  background: var(--surface-1);
}

.site-nav--mobile .btn-cta {
  width: 100%;
  text-align: center;
  margin-top: var(--space-6);
}

/* ------------------------------------------------------------
   SOLUTIONS DOOR + PRODUCTS DOOR — mobile accordion (concept build)
   Collapsed by default. Must not push Tools/Resources/Company off the
   first screen of the drawer at 375px viewport width (IA review condition).
   Products door added 2026-08-21 (IA review fix A) — mirrors the Solutions
   accordion exactly (combined selectors below, one declaration block each).
   ------------------------------------------------------------ */
.site-nav__item--solutions-mobile,
.site-nav__item--products-mobile {
  border-bottom: 1px solid var(--surface-1);
  margin-bottom: var(--space-2);
  padding-bottom: var(--space-2);
}

.site-nav__solutions-accordion-trigger,
.site-nav__products-accordion-trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  font-size: var(--text-lg);
  font-weight: 500;
  padding: var(--space-3) var(--space-4);
  background: none;
  border: none;
  border-left: 3px solid transparent;
  border-radius: var(--radius);
  color: var(--text-primary);
  cursor: pointer;
  text-align: left;
  font-family: inherit;
}

.site-nav__solutions-accordion-trigger[aria-expanded="true"] .site-nav__caret,
.site-nav__products-accordion-trigger[aria-expanded="true"] .site-nav__caret {
  transform: rotate(180deg);
}

.site-nav__solutions-view-all,
.site-nav__products-view-all {
  display: block;
  font-size: var(--text-sm);
  color: #1e3a5f;
  padding: 0 var(--space-4) var(--space-2);
  text-decoration: underline;
}

.site-nav__mobile-accordion-panel {
  display: none;
  flex-direction: column;
  gap: var(--space-1);
  padding: 0 var(--space-2) var(--space-2);
}

.site-nav__mobile-accordion-panel.is-open {
  display: flex;
}

.site-nav__mobile-solutions-row,
.site-nav__mobile-products-row {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius);
  border-left: 3px solid transparent;
  color: var(--text-primary);
  text-decoration: none;
  font-size: var(--text-base, 1rem);
}

.site-nav__mobile-solutions-row--featured {
  border-left-color: var(--blue);
  background: var(--surface-1);
}


/* ------------------------------------------------------------
   6. BUTTONS
------------------------------------------------------------ */

/* Primary — navy fill, white text. 10.3:1 contrast OK */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  padding: 0.75rem 1.625rem;
  font-size: var(--text-base);
  font-weight: 600;
  line-height: 1;
  border-radius: var(--radius-xl);
  transition: all var(--transition-fast);
  cursor: pointer;
  white-space: nowrap;
  text-decoration: none;
  border: 2px solid transparent;
}

.btn-primary {
  background: var(--btn-primary-bg);
  color: var(--btn-primary-text);
  border-color: var(--btn-primary-bg);
}

.btn-primary:hover {
  background: var(--btn-primary-hover);
  border-color: var(--btn-primary-hover);
  color: var(--white);
  transform: translateY(-1px);
  box-shadow: var(--shadow-md);
}

.btn-primary:active {
  transform: translateY(0);
  box-shadow: var(--shadow-sm);
}

/* CTA in header — slightly smaller */
.btn-cta {
  padding: 0.625rem 1.375rem;
  font-size: var(--text-sm);
  background: var(--navy);
  color: var(--white);
  border-color: var(--navy);
  border-radius: var(--radius-xl);
  font-weight: 600;
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  white-space: nowrap;
  transition: all var(--transition-fast);
}

.btn-cta:hover {
  background: var(--btn-primary-hover);
  border-color: var(--btn-primary-hover);
  color: var(--white);
}

/* Outline — navy border, navy text */
.btn-outline {
  background: transparent;
  color: var(--btn-outline-text);
  border-color: var(--btn-outline-border);
}

.btn-outline:hover {
  background: var(--btn-outline-hover-bg);
  color: var(--btn-outline-hover-text);
  transform: translateY(-1px);
  box-shadow: var(--shadow-sm);
}

/* Ghost — on dark/navy backgrounds */
.btn-ghost {
  background: transparent;
  color: var(--white);
  border-color: rgba(255,255,255,0.5);
}

.btn-ghost:hover {
  background: rgba(255,255,255,0.12);
  border-color: var(--white);
  color: var(--white);
}

/* On-navy hero CTA treatment (added 2026-07-06).
   .page-hero has a navy background, so the default .btn-primary (navy fill)
   renders navy-on-navy and reads as broken text with no visual weight. Give
   the hero primary a white pill with navy text — the strongest read on navy,
   matching the header CTA intent — so it clearly out-weighs the ghost/outline
   secondary. Also fixes the retail hero's .btn-outline, whose navy border+text
   is invisible on navy, by flipping it to a white outline. */
.page-hero .btn-primary {
  background: var(--white);
  color: var(--navy);
  border-color: var(--white);
}

.page-hero .btn-primary:hover {
  background: #eaf4f9;
  color: var(--navy);
  border-color: #eaf4f9;
  transform: translateY(-1px);
  box-shadow: var(--shadow-md);
}

.page-hero .btn-outline {
  color: var(--white);
  border-color: rgba(255,255,255,0.5);
}

.page-hero .btn-outline:hover {
  background: rgba(255,255,255,0.12);
  color: var(--white);
  border-color: var(--white);
}

/* Large variant */
.btn-lg {
  padding: 1rem 2rem;
  font-size: var(--text-lg);
  border-radius: 2rem;
}

/* Narrow-viewport guard: a long nowrap .btn-lg (e.g. capabilities/oem CTA)
   can poke a hairline past the viewport inside a heavily-padded container.
   Below 400px, trim the horizontal padding and allow the label to wrap so
   the button always fits within its column. */
@media (max-width: 400px) {
  .btn-lg {
    padding: 0.875rem 1.25rem;
    white-space: normal;
    max-width: 100%;
  }
}

/* Small variant */
.btn-sm {
  padding: 0.5rem 1rem;
  font-size: var(--text-sm);
  border-radius: var(--radius-xl);
}


/* ------------------------------------------------------------
   7. HERO SECTION
------------------------------------------------------------ */
.hero {
  background: var(--surface-0);
  padding-top: var(--space-24);
  padding-bottom: 0;
  overflow: hidden;
}

.hero__inner {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-16);
  align-items: center;
}

/* .hero__content is now split into --top (eyebrow/hook/H1) and --bottom
   (subhead/CTAs/links) as of the 2026-07-06 hero revision — see index.html
   inline hero <style> block for the grid placement that reassembles them.
   The trailing gap after the whole content stack belongs on --bottom only,
   not --top (which now sits directly above the visual, not the whole hero
   height). */
.hero__content--bottom {
  padding-bottom: var(--space-20);
}

.hero__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--navy);
  margin-bottom: var(--space-6);
  text-wrap: balance;
}

.hero__eyebrow::before {
  content: '';
  display: block;
  width: 24px;
  height: 2px;
  background: var(--blue);
}

/* Hook line (concept build) — sits between the eyebrow and the headline;
   locked-palette uptime hook, Variant B. Distinct element from both. */
.hero__hook {
  font-size: 1.125rem;
  font-weight: 500;
  color: var(--navy);
  margin: 0 0 var(--space-4) 0;
  line-height: 1.4;
}

.hero__headline {
  font-size: clamp(2.25rem, 4.5vw, var(--text-hero));
  font-weight: 300;
  letter-spacing: -0.025em;
  line-height: 1.1;
  color: var(--dark);
  margin-bottom: var(--space-6);
  text-wrap: balance;
}

.hero__headline strong {
  font-weight: 700;
  color: var(--navy);
}

.hero__subheadline {
  font-size: var(--text-xl);
  font-weight: 400;
  line-height: 1.65;
  color: var(--text-secondary);
  margin-bottom: var(--space-10);
  max-width: 520px;
  text-wrap: pretty;
}

.hero__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4);
  align-items: center;
}

/* Hero visual — product render placeholder */
.hero__visual {
  position: relative;
  padding-bottom: var(--space-20);
}

.hero__img-block {
  background: var(--surface-1);
  border-radius: var(--radius-lg);
  border: 2px dashed var(--border-mid);
  aspect-ratio: 4/3;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--space-3);
  color: var(--text-muted);
  font-size: var(--text-sm);
  text-align: center;
  padding: var(--space-8);
}

.hero__img-block-icon {
  width: 56px;
  height: 56px;
  color: var(--border-mid);
}

.hero__img-block-label {
  font-size: var(--text-base);
  font-weight: 600;
  color: var(--text-muted);
}

.hero__img-block-sub {
  font-size: var(--text-sm);
  color: var(--text-muted);
  opacity: 0.8;
}

/* Blue wave accent at hero bottom */
.hero__wave {
  display: block;
  width: 100%;
  margin-top: var(--space-8);
}


/* ------------------------------------------------------------
   8. TRUST BAR
------------------------------------------------------------ */
.trust-bar {
  background: var(--navy);
  padding-block: var(--space-5);
}

.trust-bar__list {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: var(--space-2);
}

.trust-badge {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-4);
  font-size: var(--text-sm);
  font-weight: 600;
  color: var(--white);
  letter-spacing: 0.02em;
  white-space: nowrap;
}

/* Separator dots between badges */
.trust-badge + .trust-badge::before {
  content: '·';
  color: rgba(255,255,255,0.35);
  font-size: var(--text-xl);
  font-weight: 300;
  margin-right: var(--space-2);
}

.trust-badge__icon {
  width: 16px;
  height: 16px;
  color: var(--blue);
  flex-shrink: 0;
}


/* ------------------------------------------------------------
   9. SEGMENT CARDS
------------------------------------------------------------ */
.segment-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--space-6);
}

.segment-card {
  background: var(--surface-0);
  border: 1px solid var(--border-light);
  border-radius: var(--radius-lg);
  padding: var(--space-8);
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
  transition: box-shadow var(--transition), transform var(--transition);
  position: relative;
  overflow: hidden;
}

.segment-card::after {
  content: '';
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 3px;
  background: var(--blue);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--transition);
}

.segment-card:hover {
  box-shadow: var(--shadow-lg);
  transform: translateY(-4px);
}

.segment-card:hover::after {
  transform: scaleX(1);
}

/* Weighted featured card (Solutions fork) — order + one accent + one
   eyebrow ONLY. Never a size difference from the other three cards
   (IA review round 1/round 2 — hard rule, no exceptions). */
.segment-card--featured {
  border-left: 4px solid var(--blue);
}

.segment-card__eyebrow {
  display: block;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: #1e3a5f;
}

/* Spacer eyebrow on the non-featured cards: reserves the exact vertical space
   the featured card's eyebrow occupies (font line + flex gap) so all four
   card headlines align on a shared baseline. Invisible but space-occupying —
   the featured Foodservice eyebrow stays real and visible. (2026-07-06) */
.segment-card__eyebrow--spacer {
  visibility: hidden;
}

.segment-card__icon {
  width: 48px;
  height: 48px;
  background: var(--light-blue);
  border-radius: var(--radius);
  display: flex;
  align-items: center;
  justify-content: center;
}

.segment-card__icon svg {
  width: 24px;
  height: 24px;
  color: var(--navy);
}

.segment-card__label {
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--navy);
}

/* Round-2 QC FIX 2, 2026-09-01: text-wrap:balance RESTORED after a controlled
   same-session A/B measurement (Range-rect line arrays, 3 reps/arm, both arms
   toggled via CSSOM in one page load, widths 360/390/768/1024/1280/1440,
   document.fonts.ready awaited first). Three prior QC rounds gave three
   different verdicts on this exact selector; the font-loading hypothesis for
   that disagreement is FALSIFIED for this page -- document.fonts.size is 0
   here (the whole site uses only system font stacks, zero @font-face rules),
   so there is nothing to resolve after fallback. The actual driver is that
   this is a responsive 4-across grid and the four headlines' line-wrap
   behavior differs by breakpoint: at 360/390/768/1280/1440, "off" produces a
   real trailing single-word widow (location. / partner. / reach.) on at
   least one card, and text-wrap:balance fixes every one of them with ZERO
   regressions (it never produces a widow that "off" didn't already have).
   At 1024 specifically the grid narrows the cards enough that two headlines
   (the "partner." and "proof." cards) keep a one-word last line under BOTH
   modes -- balance does not fully solve that width, but it never makes it
   worse. text-wrap:pretty was also measured head-to-head against "off": a
   later independent re-measurement (round-2 QC gate, 2026-09-01) found pretty clears
   the widow at 360/390/768 on index.html and clears the card 3 widow at
   1280/1440, differing from "off" at five of the six widths tested -- not
   zero as first recorded here. That does not change the outcome: balance
   still weakly dominates pretty at every width in the same comparison, so
   pretty is still not the right mechanism here. Net effect across the
   tested range: balance strictly weakly-dominates both alternatives, so it
   stays on. Full line-array evidence for all three
   arms at all six widths is in the round-2 QC report. */
.segment-card__headline {
  font-size: var(--text-xl);
  font-weight: 600;
  color: var(--dark);
  line-height: 1.3;
  text-wrap: balance;
}

.segment-card__body {
  font-size: var(--text-base);
  color: var(--text-secondary);
  line-height: 1.65;
  flex: 1;
}

.segment-card__link {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--text-sm);
  font-weight: 600;
  color: var(--navy);
  transition: gap var(--transition-fast);
  /* Keep the "Explore <Market>" label on one line so it never wraps to a
     second line at intermediate widths (was observed at 1024). (2026-07-06) */
  white-space: nowrap;
  align-self: flex-start;
}

.segment-card__link:hover {
  color: var(--navy);
  gap: var(--space-3);
}

.segment-card__link svg {
  width: 16px;
  height: 16px;
  transition: transform var(--transition-fast);
}

.segment-card:hover .segment-card__link svg {
  transform: translateX(3px);
}


/* ------------------------------------------------------------
   10. CAPABILITY STRIP
------------------------------------------------------------ */
.capability-strip {
  background: var(--surface-1);
}

.capability-strip__header {
  text-align: center;
  max-width: 640px;
  margin-inline: auto;
  margin-bottom: var(--space-16);
}

.capability-steps {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0;
  position: relative;
}

/* Connector line between steps */
.capability-steps::before {
  content: '';
  position: absolute;
  top: 28px;
  left: calc(12.5% + 28px);
  right: calc(12.5% + 28px);
  height: 2px;
  background: linear-gradient(90deg, var(--blue) 0%, var(--navy) 100%);
  z-index: 0;
}

.capability-step {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  padding: 0 var(--space-4);
}

.capability-step__num {
  width: 56px;
  height: 56px;
  background: var(--navy);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: var(--text-lg);
  font-weight: 700;
  color: var(--white);
  margin-bottom: var(--space-5);
  flex-shrink: 0;
  border: 4px solid var(--surface-1);
  box-shadow: 0 0 0 2px var(--navy);
}

.capability-step__title {
  font-size: var(--text-base);
  font-weight: 700;
  color: var(--dark);
  margin-bottom: var(--space-2);
  line-height: 1.3;
}

.capability-step__desc {
  font-size: var(--text-sm);
  color: var(--text-muted);
  line-height: 1.6;
}

.capability-strip__footer {
  text-align: center;
  margin-top: var(--space-12);
  padding-top: var(--space-8);
  border-top: 1px solid var(--border-light);
}

.capability-strip__location {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--text-sm);
  font-weight: 600;
  color: var(--text-secondary);
}

.capability-strip__location svg {
  width: 16px;
  height: 16px;
  color: var(--blue);
}


/* ------------------------------------------------------------
   11. RED SYSTEM SECTION
------------------------------------------------------------ */
.red-section {
  background: var(--navy);
  position: relative;
  overflow: hidden;
}

/* Subtle diagonal texture on dark bg */
.red-section::before {
  content: '';
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse at 80% 50%, rgba(74, 173, 212, 0.08) 0%, transparent 60%);
  pointer-events: none;
}

.red-section__inner {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-20);
  align-items: center;
  position: relative;
  z-index: 1;
}

.red-section__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--white);
  margin-bottom: var(--space-5);
}

.red-section__eyebrow::before {
  content: '';
  display: block;
  width: 24px;
  height: 2px;
  background: var(--blue);
}

.red-section__headline {
  font-size: clamp(var(--text-3xl), 3.5vw, var(--text-5xl));
  font-weight: 300;
  letter-spacing: -0.02em;
  line-height: 1.1;
  color: var(--white);
  margin-bottom: var(--space-6);
}

.red-section__headline strong {
  font-weight: 700;
}

.red-section__body {
  font-size: var(--text-lg);
  color: rgba(255,255,255,0.8);
  line-height: 1.7;
  margin-bottom: var(--space-8);
}

.red-specs {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-4);
  margin-bottom: var(--space-8);
}

.red-spec {
  background: rgba(255,255,255,0.07);
  border: 1px solid rgba(74, 173, 212, 0.2);
  border-radius: var(--radius);
  padding: var(--space-4) var(--space-5);
}

.red-spec__value {
  font-size: var(--text-2xl);
  font-weight: 700;
  color: var(--white);
  line-height: 1;
  margin-bottom: var(--space-1);
}

.red-spec__label {
  font-size: var(--text-xs);
  color: rgba(255,255,255,0.65);
  letter-spacing: 0.05em;
  font-weight: 500;
}

.red-patent-note {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
  background: rgba(74, 173, 212, 0.1);
  border: 1px solid rgba(74, 173, 212, 0.25);
  border-radius: var(--radius);
  padding: var(--space-4) var(--space-5);
  font-size: var(--text-sm);
  color: rgba(255,255,255,0.85);
  line-height: 1.6;
}

.red-patent-note svg {
  width: 20px;
  height: 20px;
  flex-shrink: 0;
  margin-top: 1px;
  color: var(--blue);
}

/* RED visual placeholder */
.red-section__visual {
  position: relative;
}

.red-img-block {
  background: rgba(255,255,255,0.05);
  border: 2px dashed rgba(74, 173, 212, 0.3);
  border-radius: var(--radius-lg);
  aspect-ratio: 4/3;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--space-3);
  text-align: center;
  padding: var(--space-8);
}

.red-img-block-label {
  font-size: var(--text-base);
  font-weight: 600;
  color: rgba(255,255,255,0.6);
}

.red-img-block-sub {
  font-size: var(--text-sm);
  color: rgba(255,255,255,0.4);
}


/* ------------------------------------------------------------
   12. RETAILER PROOF SECTION
------------------------------------------------------------ */
.retailers-section {
  background: var(--surface-0);
}

.retailers-section__header {
  text-align: center;
  max-width: 560px;
  margin-inline: auto;
  margin-bottom: var(--space-12);
}

.retailer-chips {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-4);
}

.retailer-chip {
  /* Text-name placeholder — no actual logos until trademark clearance */
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: var(--space-4) var(--space-8);
  border: 1px solid var(--border-light);
  border-radius: var(--radius);
  font-size: var(--text-base);
  font-weight: 600;
  color: var(--text-muted);
  background: var(--surface-1);
  letter-spacing: 0.02em;
  transition: all var(--transition-fast);
  min-width: 180px;
  text-align: center;
}

.retailer-chip:hover {
  background: var(--surface-2);
  border-color: var(--border-mid);
  color: var(--text-secondary);
}

.retailers-section__disclaimer {
  text-align: center;
  font-size: var(--text-sm);
  color: var(--text-muted);
  margin-top: var(--space-8);
  font-style: italic;
}


/* ------------------------------------------------------------
   13. INSIGHTS / BLOG TEASER
------------------------------------------------------------ */
.insights-section {
  background: var(--surface-1);
}

.insights-section__header {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  margin-bottom: var(--space-10);
  gap: var(--space-4);
}

.insights-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-6);
}

.insight-card {
  background: var(--white);
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-card);
  display: flex;
  flex-direction: column;
  transition: box-shadow var(--transition), transform var(--transition);
}

.insight-card:hover {
  box-shadow: var(--shadow-lg);
  transform: translateY(-3px);
}

.insight-card__img {
  background: var(--light-blue);
  aspect-ratio: 16/9;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text-muted);
  font-size: var(--text-sm);
  font-weight: 500;
  border-bottom: 1px solid var(--border-light);
}

.insight-card__body {
  padding: var(--space-6);
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.insight-card__tag {
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--navy);
}

.insight-card__title {
  font-size: var(--text-lg);
  font-weight: 600;
  color: var(--dark);
  line-height: 1.35;
  flex: 1;
}

.insight-card__meta {
  font-size: var(--text-sm);
  color: var(--text-muted);
  margin-top: auto;
}


/* ------------------------------------------------------------
   14. PRE-FOOTER CTA BAND
------------------------------------------------------------ */
.cta-band {
  background: var(--light-blue);
  border-top: 3px solid var(--blue);
}

.cta-band__header {
  text-align: center;
  max-width: 600px;
  margin-inline: auto;
  margin-bottom: var(--space-12);
}

.cta-band__headline {
  font-size: clamp(var(--text-2xl), 3vw, var(--text-4xl));
  font-weight: 600;
  letter-spacing: -0.015em;
  color: var(--navy);
  margin-bottom: var(--space-4);
}

.cta-band__sub {
  font-size: var(--text-lg);
  color: var(--text-secondary);
  line-height: 1.65;
}

.cta-routes {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-6);
}

.cta-route {
  background: var(--white);
  border-radius: var(--radius-lg);
  padding: var(--space-8);
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
  box-shadow: var(--shadow-card);
  text-align: center;
  transition: box-shadow var(--transition), transform var(--transition);
}

.cta-route:hover {
  box-shadow: var(--shadow-md);
  transform: translateY(-2px);
}

.cta-route__label {
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--navy);
}

.cta-route__title {
  font-size: var(--text-xl);
  font-weight: 600;
  color: var(--dark);
  line-height: 1.3;
}

.cta-route__body {
  font-size: var(--text-base);
  color: var(--text-secondary);
  line-height: 1.65;
  flex: 1;
}


/* ------------------------------------------------------------
   14B. FOODSERVICE CALLOUT MODULE — reusable off-homepage belief-ladder
        entry. Ships on all specs/*.html pages and all post-*.html
        (Insights) pages. Navy fill because it carries white text
        (never white text on brand-blue #4AADD4 — HTML-04). Compact,
        one module per page, light-mode only. Copy drawn from the
        foodservice.html / tools.html locked language.
------------------------------------------------------------ */
.fs-callout {
  background: var(--navy);
  border-radius: var(--radius-lg);
  padding: var(--space-6) var(--space-8);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-6);
  flex-wrap: wrap;
}

.fs-callout__text {
  flex: 1 1 320px;
  min-width: 0;
}

.fs-callout__eyebrow {
  display: block;
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--blue-light, #9FD3EA);
  margin-bottom: 0.35rem;
}

.fs-callout__headline {
  font-size: var(--text-lg);
  font-weight: 600;
  color: var(--white);
  line-height: 1.4;
  margin: 0;
}

.fs-callout__actions {
  display: flex;
  gap: var(--space-3);
  flex-wrap: wrap;
  flex-shrink: 1;
  min-width: 0;
  max-width: 100%;
}

.fs-callout__actions .btn-outline {
  background: transparent;
  border-color: rgba(255,255,255,0.55);
  color: var(--white);
}

.fs-callout__actions .btn-outline:hover {
  background: rgba(255,255,255,0.1);
  border-color: var(--white);
}

@media (max-width: 640px) {
  .fs-callout {
    flex-direction: column;
    align-items: flex-start;
    justify-content: flex-start;
    text-align: left;
    gap: var(--space-4);
  }
  .fs-callout__text {
    flex: 0 0 auto;
  }
  .fs-callout__actions {
    width: 100%;
  }
  .fs-callout__actions .btn {
    width: 100%;
    justify-content: center;
  }
}


/* ------------------------------------------------------------
   15. FOOTER
------------------------------------------------------------ */
.site-footer {
  background: var(--dark);
  color: var(--text-on-dark);
  padding-top: var(--space-20);
  padding-bottom: var(--space-12);
}

.site-footer__grid {
  display: grid;
  grid-template-columns: 2fr 1fr 1fr 1fr;
  gap: var(--space-12);
  margin-bottom: var(--space-16);
}

.site-footer__brand {
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
}

/* Icon logo sits above the wordmark, left-aligned with it */
.site-footer__icon {
  display: block;
  margin-bottom: var(--space-2);
}

.site-footer__icon img {
  height: 48px;
  width: auto;
  display: block;
}

.site-footer__logo img {
  height: 32px;
  width: auto;
}

.site-footer__tagline {
  font-size: var(--text-base);
  color: rgba(255,255,255,0.7);
  line-height: 1.6;
  font-style: italic;
  font-weight: 300;
  letter-spacing: 0.02em;
}

.site-footer__address {
  font-size: var(--text-sm);
  color: rgba(255,255,255,0.7);
  line-height: 1.7;
}

.site-footer__address strong {
  color: rgba(255,255,255,0.8);
  font-weight: 600;
}

/* Phone/fax links — override the global navy anchor color, which is
   near-invisible on the dark footer. F0F4F8 = 13.2:1 on #1A1A1A. */
.site-footer__address a {
  color: #F0F4F8;
  text-decoration: underline;
  text-decoration-color: rgba(255,255,255,0.35);
  text-underline-offset: 2px;
}

.site-footer__address a:hover {
  color: var(--blue);
}

/* Direct/international line — keep the number and its parenthetical
   together as one unit so it never wraps mid-phrase on narrow screens. */
.site-footer__phone-line2 {
  display: inline-block;
  white-space: nowrap;
}

.site-footer__col-label {
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: #A8B6C5; /* WCAG AA fix — 8.42:1 on #1A1A1A (F-02) */
  margin-bottom: var(--space-4);
}

.site-footer__col ul {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.site-footer__col a {
  font-size: var(--text-sm);
  color: rgba(255,255,255,0.7);
  transition: color var(--transition-fast);
  text-wrap: balance;
}

.site-footer__col a:hover {
  color: var(--blue);
}

/* Footer bottom bar */
.site-footer__bottom {
  border-top: 1px solid rgba(255,255,255,0.1);
  padding-top: var(--space-8);
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--space-4);
}

/* Round-2 QC fix, 2026-09-01: the 96px .site-footer__bottom clearance
   margin below was UNCONDITIONAL, reserving dead space on every phone and
   tablet (360-1279px) where the fixed .back-to-top button it exists to
   clear does not even render (see the HTML-13 suppression rule above,
   "@media (max-width: 1279px) { .back-to-top { display: none !important } }").
   Scoped here to the same min-width:1280px floor where the button actually
   exists, so the margin only reserves space where there is something to
   clear. Below 1280px that space is now occupied by the new
   .site-footer__back-to-top inline link instead -- see its own rule. */
@media (min-width: 1280px) {
  .site-footer__bottom {
    /* HTML-13 fix, 2026-09-01: the fixed .back-to-top button occupies the
       bottom-right 48px-by-48px, offset 24px from the viewport edges -- a
       72px-tall reserved strip along the bottom of the viewport. At maximum
       scroll on every page (this footer is the shared include, so this is
       every page, not just index.html), that strip lands on the document's
       own bottom edge, where the Terms & Conditions legal link sits by
       default. Confirmed on index.html at 1280px: a 12px overlap between
       that link and the button. This margin reserves clearance below the
       legal row so the button footprint can never land on real content,
       rather than trying to reposition or resize the button itself. */
    margin-bottom: 96px;
  }
}

/* Round-2 QC fix, 2026-09-01: below 1280px the fixed .back-to-top button
   is suppressed entirely (HTML-13 -- collides with page content at those
   widths), leaving Android/mobile visitors with no way back to the top of
   pages that run to 19,385px except manual scrolling. Plain inline TEXT
   link, no icon/arrow glyph (U-01 forbids arrows). Hidden by default;
   shown only in the same below-1280px range where the floating button is
   absent, so the two controls never both appear at once. */
.site-footer__back-to-top {
  display: none;
}

@media (max-width: 1279px) {
  .site-footer__back-to-top {
    display: block;
    width: 100%;
    text-align: center;
    padding-top: var(--space-6);
    margin-top: var(--space-2);
  }
}

.site-footer__back-to-top a {
  font-size: var(--text-sm);
  color: #B8C2CC; /* WCAG AA -- 9.64:1 on #1A1A1A, matches .site-footer__legal a (F-03) */
  text-decoration: underline;
  text-underline-offset: 2px;
  transition: color var(--transition-fast);
}

.site-footer__back-to-top a:hover,
.site-footer__back-to-top a:focus-visible {
  color: rgba(255,255,255,0.75);
}

.site-footer__copyright {
  font-size: var(--text-sm);
  color: #B8C2CC; /* WCAG AA fix — 9.64:1 on #1A1A1A (F-03) */
}

.site-footer__legal {
  display: flex;
  gap: var(--space-6);
}

.site-footer__legal a {
  font-size: var(--text-sm);
  color: #B8C2CC; /* WCAG AA fix — 9.64:1 on #1A1A1A (F-03) */
  transition: color var(--transition-fast);
}

.site-footer__legal a:hover {
  color: rgba(255,255,255,0.75);
}


/* ------------------------------------------------------------
   16. WAVE DECORATIONS (SVG inline, #4AADD4 color)
------------------------------------------------------------ */
.section-wave {
  display: block;
  width: 100%;
  overflow: hidden;
  line-height: 0;
  margin-bottom: -1px; /* prevents subpixel gap */
}

.section-wave svg {
  display: block;
  width: 100%;
}


/* ------------------------------------------------------------
   17. SCROLL REVEAL (JS-driven, minimal)

   FAILS OPEN (2026-08-26). Every rule that HIDES a .reveal element is
   gated behind .js-reveal on <html>. That class is set by a tiny inline
   script in each page's <head>, NOT by site.js, and a watchdog in that
   same snippet strips it again if site.js never reports in. So:

     - JS disabled: class never set, content renders visible.
     - site.js 404s or throws: watchdog strips class, content visible.
     - normal: class set, site.js sets data-reveal-ready, watchdog
       stands down, reveal animates as designed.

   The class is set in <head> rather than by site.js (which loads at the
   end of <body>) so the page never paints content visible and then snaps
   it to opacity 0. Do not move it into site.js.

   Anything that UNHIDES stays ungated, so it still wins when the class
   is absent. Keep it that way when editing.
------------------------------------------------------------ */
.js-reveal .reveal {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 0.55s ease, transform 0.55s ease;
}

.js-reveal .reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* Stagger delays for grid children */
.js-reveal .reveal-group > *:nth-child(1) { transition-delay: 0ms; }
.js-reveal .reveal-group > *:nth-child(2) { transition-delay: 80ms; }
.js-reveal .reveal-group > *:nth-child(3) { transition-delay: 160ms; }
.js-reveal .reveal-group > *:nth-child(4) { transition-delay: 240ms; }

/* Reduce motion — disable reveals for users who prefer it.
   Selector is .js-reveal-scoped so it still outranks the hiding rule
   above; without that scope it would be one class less specific and lose. */
@media (prefers-reduced-motion: reduce) {
  .js-reveal .reveal,
  .js-reveal .reveal-group > * {
    opacity: 1;
    transform: none;
    transition: none;
  }
}


/* ------------------------------------------------------------
   18. SECTION HEADERS (shared pattern)
------------------------------------------------------------ */
.section-header {
  text-align: center;
  max-width: 680px;
  margin-inline: auto;
  margin-bottom: var(--space-16);
}

.section-header__eyebrow {
  display: inline-block;
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--navy);
  margin-bottom: var(--space-4);
}

.section-header__headline {
  font-size: clamp(var(--text-3xl), 3.5vw, var(--text-5xl));
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.15;
  color: var(--dark);
  margin-bottom: var(--space-4);
  text-wrap: balance;
}

.section-header__sub {
  font-size: var(--text-lg);
  color: var(--text-secondary);
  line-height: 1.65;
}


/* ------------------------------------------------------------
   19. DIVIDER
------------------------------------------------------------ */
.divider {
  border: none;
  border-top: 1px solid var(--border-light);
  margin-block: var(--space-8);
}

.divider--blue {
  border-top-color: var(--blue);
  border-top-width: 2px;
}


/* ------------------------------------------------------------
   20. RESPONSIVE BREAKPOINTS
------------------------------------------------------------ */

/* Tablet — ≤960px */
@media (max-width: 960px) {
  :root {
    --gutter: 1.25rem;
    --header-height: 76px;
  }

  .hero__inner {
    grid-template-columns: 1fr;
    gap: var(--space-12);
  }

  .hero__content--top,
  .hero__content--bottom { padding-bottom: 0; }
  .hero__visual  { padding-bottom: 0; }

  .hero__subheadline { max-width: 100%; }

  .grid-2,
  .grid-3,
  .grid-4 { grid-template-columns: 1fr 1fr; }

  .segment-grid { grid-template-columns: 1fr 1fr; }

  .capability-steps { grid-template-columns: 1fr 1fr; }
  .capability-steps::before { display: none; }

  .red-section__inner { grid-template-columns: 1fr; gap: var(--space-12); }

  .cta-routes { grid-template-columns: 1fr 1fr; }

  .site-footer__grid { grid-template-columns: 1fr 1fr; gap: var(--space-8); }

  .insights-grid { grid-template-columns: 1fr 1fr; }

  .site-nav { display: none; }
  .nav-toggle { display: flex; }
  /* QA Fix: hide header CTA once hamburger takes over — mobile slide-down
     nav carries its own full-width CTA, so the header CTA is redundant and
     was pushing body scrollWidth past the viewport (clipping hero text). */
  .site-header .btn-cta { display: none; }
}

/* Mobile — ≤640px */
@media (max-width: 640px) {
  :root {
    --gutter: 1rem;
    --header-height: 68px;
  }

  /* Keep tagline present at mobile — slightly reduced letter-spacing to avoid overflow */
  .site-logo__tagline {
    font-size: 12px;
    letter-spacing: 0.05em;
  }

  .hero {
    padding-top: var(--space-16);
  }

  .hero__headline {
    font-size: clamp(1.875rem, 8vw, 2.5rem);
  }

  .hero__actions { flex-direction: column; align-items: flex-start; }
  .hero__actions .btn { width: 100%; justify-content: center; }

  .section { padding-block: var(--space-16); }
  .section--lg { padding-block: var(--space-20); }

  .grid-2,
  .grid-3,
  .grid-4,
  .segment-grid,
  .capability-steps,
  .cta-routes,
  .insights-grid { grid-template-columns: 1fr; }

  .red-specs { grid-template-columns: 1fr 1fr; }

  .site-footer__grid { grid-template-columns: 1fr; gap: var(--space-8); }

  .site-footer__bottom {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--space-3);
  }

  .trust-bar__list { gap: var(--space-1); justify-content: center; }

  .retailer-chip { min-width: 140px; }

  .insights-section__header { flex-direction: column; align-items: flex-start; }
}

/* Print */
@media print {
  .topbar { display: none; }
  .site-header { position: static; box-shadow: none; }
  .site-nav { display: none; }
  .nav-toggle { display: none; }
  .btn { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  /* Fix 1: Scroll-reveal elements must be visible in print — JS observer never fires */
  .reveal,
  .reveal-group > * {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
  /* QC round-1 FIX 2 (HTML-07): the floating .back-to-top button is scroll-
     triggered (.is-visible toggled by a scroll listener) and shows up in a
     printed/saved PDF whenever the page was scrolled before Save as PDF ran —
     which any page that calls scrollIntoView() after a user action (e.g.
     peak-flow.html's Calculate button) does every time. Fixed at the shared
     level because every page carrying this widget has the same exposure. */
  .back-to-top { display: none !important; }
}


/* ------------------------------------------------------------
   PHASE 3A ADDITIONS — Sub-page components
   Added 2026-06-10
   All new contrast pairs documented below:
   - #FFFFFF on #1e3a5f (navy) = 10.3:1 OK  (page hero bg)
   - #1A1A1A on #FFFFFF = 16.0:1 OK  (body)
   - #1e3a5f on #F5F9FC = 9.7:1 OK  (proof tiles)
   - #1e3a5f on #E8F4F8 = 8.4:1 OK  (callout boxes)
   - rgba(255,255,255,0.9) on #1e3a5f = 9.3:1 OK  (hero sub on navy)
   - #3A4A5C on #FFFFFF = 8.1:1 OK  (body secondary)
   - #3A4A5C on #F5F9FC = 7.6:1 OK  (tint sections)
   - #5A6B7A on #FFFFFF = 5.1:1 OK  (muted text, min acceptable)
   NOTE: #4AADD4 (#blue) still DECORATIVE ONLY — never body text fill
------------------------------------------------------------ */

/* ------------------------------------------------------------
   20B. SOLUTIONS BREADCRUMB — light strip above .page-hero on the four
        Solutions child pages (foodservice, oem, retail, pro). Mirrors the
        .spec-breadcrumb pattern used on specs/*.html for visual consistency.
        Light background, sits in normal document flow directly inside
        <main>, before the navy .page-hero section begins.
------------------------------------------------------------ */
.solutions-breadcrumb-bar {
  background: #FFFFFF;
  border-bottom: 1px solid var(--border-mid);
}

.solutions-breadcrumb {
  max-width: var(--container-max);
  margin-inline: auto;
  padding: 0.75rem var(--gutter);
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.875rem;
  color: var(--text-muted);
}

.solutions-breadcrumb a {
  color: var(--navy);
  text-decoration: none;
  font-weight: 500;
}

.solutions-breadcrumb a:hover { text-decoration: underline; }

.solutions-breadcrumb__sep {
  /* Was --border-mid (1.47 against white). Decorative, but still text. */
  color: var(--text-muted);
}

@media print {
  .solutions-breadcrumb-bar { display: none !important; }
}

/* ------------------------------------------------------------
   21. PAGE HERO — used on all segment/feature subpages
       Navy background, full-bleed, with wave bottom transition
------------------------------------------------------------ */
.page-hero {
  background: var(--navy);
  padding-top: calc(var(--space-20) + var(--space-4));
  padding-bottom: 0;
  position: relative;
  overflow: hidden;
}

/* Subtle radial glow on dark hero — same treatment as red-section on homepage */
.page-hero::before {
  content: '';
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse at 70% 40%, rgba(74,173,212,0.07) 0%, transparent 65%);
  pointer-events: none;
}

.page-hero__inner {
  position: relative;
  z-index: 1;
  max-width: var(--container-max);
  margin-inline: auto;
  padding-inline: var(--gutter);
  padding-bottom: var(--space-20);
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-16);
  align-items: center;
}

.page-hero--full .page-hero__inner {
  grid-template-columns: 1fr;
  max-width: 800px;
  text-align: left;
}

/* Narrow heroes (no side visual): single column so the headline block
   does not get split across the 1fr 1fr grid. Added 2026-06-18. */
.page-hero__inner--narrow {
  grid-template-columns: 1fr;
  max-width: 860px;
  text-align: left;
}

.page-hero__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--white);
  margin-bottom: var(--space-5);
}

.page-hero__eyebrow::before {
  content: '';
  display: block;
  width: 24px;
  height: 2px;
  background: var(--blue);
}

.page-hero__headline {
  font-size: clamp(var(--text-3xl), 4vw, var(--text-hero));
  font-weight: 300;
  letter-spacing: -0.025em;
  line-height: 1.1;
  color: var(--white);
  margin-bottom: var(--space-6);
  overflow-wrap: break-word;
  word-break: break-word;
}

.page-hero__headline strong {
  font-weight: 700;
}

.page-hero__sub {
  font-size: var(--text-xl);
  font-weight: 400;
  line-height: 1.65;
  color: rgba(255,255,255,0.85);
  margin-bottom: var(--space-10);
  max-width: 560px;
  overflow-wrap: break-word;
  word-break: break-word;
}

.page-hero--full .page-hero__sub {
  max-width: 680px;
}

/* Links inside the navy hero must never inherit the default navy link colour --
   navy on navy renders as invisible text. Caught on warranty-returns.html,
   where "Terms and Conditions" was a 1.0 contrast ratio. (Mike, 2026-08-17) */
.page-hero a,
.page-hero__sub a,
.page-hero__title a {
  color: #ffffff;
  text-decoration: underline;
  text-underline-offset: 2px;
}

.page-hero a:hover,
.page-hero__sub a:hover {
  color: var(--blue-light, #9FD3EA);
}

.page-hero__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4);
  align-items: center;
}

/* Product/Render placeholder on hero */
.page-hero__visual {
  position: relative;
  /* Top-align the hero image to the text column. The hero grid is
     align-items:center, which vertically centered a shorter landscape image
     (foodservice) in a taller column and stranded whitespace above and below
     it. Aligning to the top removes that strand; portrait heroes that already
     fill the column (oem, uf-systems) are unaffected. (2026-07-06) */
  align-self: start;
}

.page-hero__img-block {
  background: rgba(255,255,255,0.06);
  border: 2px dashed rgba(74,173,212,0.35);
  border-radius: var(--radius-lg);
  aspect-ratio: 4/3;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--space-3);
  text-align: center;
  padding: var(--space-8);
}

.page-hero__img-block-label {
  font-size: var(--text-base);
  font-weight: 600;
  color: rgba(255,255,255,0.6);
}

.page-hero__img-block-sub {
  font-size: var(--text-sm);
  color: rgba(255,255,255,0.4);
}

/* Wave bottom of page hero — transitions to white or surface-1 */
.page-hero__wave {
  display: block;
  width: 100%;
  overflow: hidden;
  line-height: 0;
  margin-bottom: -1px;
}

.page-hero__wave svg {
  display: block;
  width: 100%;
}


/* ------------------------------------------------------------
   22. PAGE CONTENT SECTIONS — shared prose layout
------------------------------------------------------------ */
.page-section {
  padding-block: var(--space-20);
}

.page-section--tint {
  background: var(--surface-1);
}

.page-section--white {
  background: var(--surface-0);
}

.page-section--blue {
  background: var(--light-blue);
  border-top: 3px solid var(--blue);
}

.page-section--navy {
  background: var(--navy);
  color: var(--white);
  position: relative;
  overflow: hidden;
}

.page-section--navy::before {
  content: '';
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse at 80% 50%, rgba(74,173,212,0.08) 0%, transparent 60%);
  pointer-events: none;
}

.page-content {
  max-width: var(--container-max);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.page-content--narrow {
  max-width: 800px;
  margin-inline: auto;
  padding-inline: var(--gutter);
}

/* Two-column split: 55/45 */
.page-split {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-16);
  align-items: start;
}

.page-split--wide {
  display: grid;
  grid-template-columns: 3fr 2fr;
  gap: var(--space-16);
  align-items: start;
}

/* Grid items default to min-width:auto, which refuses to shrink below the
   widest piece of intrinsic content (e.g. a wide table). That blows the
   column out past its track and forces page-level horizontal scroll on
   mobile, where .page-split/.page-split--wide collapse to a single 1fr
   column. min-width:0 lets each item shrink to its track so any internal
   overflow (like a horizontally-scrollable table) is contained, not leaked
   to the page. */
.page-split > *,
.page-split--wide > * {
  min-width: 0;
}


/* ------------------------------------------------------------
   23. PAIN / CAPABILITY LIST — icon bullet lists
------------------------------------------------------------ */
.feature-list {
  list-style: none;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
  margin-top: var(--space-6);
}

.feature-list li {
  display: flex;
  gap: var(--space-4);
  align-items: flex-start;
  font-size: var(--text-base);
  line-height: 1.7;
  color: var(--text-secondary);
}

.feature-list li::before {
  content: '';
  display: block;
  width: 20px;
  height: 20px;
  min-width: 20px;
  background: var(--light-blue);
  border-radius: 50%;
  border: 2px solid var(--navy);
  margin-top: 3px;
  flex-shrink: 0;
}

/* Pain variant — navy dash-accent dot, matching the capability checkmark
   treatment below. Previously an empty red-ringed circle (#FEE2E2 fill /
   #DC2626 border), which read as an unchecked radio button rather than a
   list bullet and used an alarm color outside the brand palette (both
   problems flagged in review 2026-07-14). The dash
   icon fills the ring so it no longer looks like an empty selectable
   control, and the navy/light-blue treatment keeps it on-brand. */
.feature-list--pain li::before {
  background: var(--light-blue);
  border-color: var(--navy);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='%231e3a5f'%3E%3Crect x='4' y='9' width='12' height='2' rx='1'/%3E%3C/svg%3E");
  background-size: 12px;
  background-repeat: no-repeat;
  background-position: center;
}

/* Capability variant — blue/navy check dot */
.feature-list--capability li::before {
  background: var(--light-blue);
  border-color: var(--navy);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='%231e3a5f'%3E%3Cpath fill-rule='evenodd' d='M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z' clip-rule='evenodd'/%3E%3C/svg%3E");
  background-size: 12px;
  background-repeat: no-repeat;
  background-position: center;
}

.feature-list li strong {
  color: var(--dark);
  font-weight: 600;
}


/* ------------------------------------------------------------
   24. PROOF TILES GRID — stat/credential cards
------------------------------------------------------------ */
.proof-tiles {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--space-5);
  margin-top: var(--space-8);
}

.proof-tile {
  background: var(--surface-0);
  border: 1px solid var(--border-light);
  border-top: 3px solid var(--navy);
  border-radius: var(--radius);
  padding: var(--space-6);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  box-shadow: var(--shadow-sm);
  transition: box-shadow var(--transition), transform var(--transition);
}

.proof-tile:hover {
  box-shadow: var(--shadow-md);
  transform: translateY(-2px);
}

.proof-tile__value {
  font-size: var(--text-3xl);
  font-weight: 700;
  color: var(--navy);
  line-height: 1.1;
  letter-spacing: -0.02em;
}

.proof-tile__label {
  font-size: var(--text-sm);
  color: var(--text-secondary);
  line-height: 1.55;
}

/* On tint background */
.section--tint .proof-tile,
.page-section--tint .proof-tile {
  background: var(--surface-0);
}


/* ------------------------------------------------------------
   25. SECTION EYEBROW + BODY HEADLINE PATTERN
------------------------------------------------------------ */
.content-eyebrow {
  display: inline-block;
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--navy);
  margin-bottom: var(--space-3);
}

.content-h2 {
  font-size: clamp(var(--text-2xl), 3vw, var(--text-4xl));
  font-weight: 600;
  letter-spacing: -0.015em;
  line-height: 1.2;
  color: var(--dark);
  margin-bottom: var(--space-5);
}

.content-h3 {
  font-size: clamp(var(--text-xl), 2.5vw, var(--text-3xl));
  font-weight: 600;
  letter-spacing: -0.01em;
  line-height: 1.25;
  color: var(--dark);
  margin-bottom: var(--space-4);
}

.content-h4 {
  font-size: var(--text-lg);
  font-weight: 700;
  color: var(--dark);
  margin-bottom: var(--space-3);
  margin-top: var(--space-8);
}

.content-body {
  font-size: var(--text-base);
  line-height: 1.75;
  color: var(--text-secondary);
}

.content-body + .content-body {
  margin-top: var(--space-4);
}

/* On navy bg — invert text */
.page-section--navy .content-eyebrow { color: var(--white); }
.page-section--navy .content-h2 { color: var(--white); }
.page-section--navy .content-h3 { color: var(--white); }
.page-section--navy .content-h4 { color: rgba(255,255,255,0.9); }
.page-section--navy .content-body { color: rgba(255,255,255,0.8); }


/* ------------------------------------------------------------
   26. INLINE IMAGE PLACEHOLDER — light bg, render-pending
------------------------------------------------------------ */
.render-placeholder {
  background: var(--surface-1);
  border: 2px dashed var(--border-mid);
  border-radius: var(--radius-lg);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--space-3);
  text-align: center;
  padding: var(--space-10) var(--space-8);
  color: var(--text-muted);
}

.render-placeholder__label {
  font-size: var(--text-base);
  font-weight: 600;
  color: var(--text-muted);
}

.render-placeholder__sub {
  font-size: var(--text-sm);
  color: var(--text-muted);
  opacity: 0.75;
  max-width: 220px;
}

.render-placeholder__tag {
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--navy);
  background: var(--light-blue);
  border-radius: var(--radius-xl);
  padding: var(--space-1) var(--space-3);
}


/* ------------------------------------------------------------
   26b. HERO ROTATOR — crossfading lifestyle photos
------------------------------------------------------------ */
.hero-rotator {
  position: relative;
  width: 100%;
  max-width: 600px;
  margin-inline: auto;
  aspect-ratio: 3 / 2;
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-lg);
  background: var(--surface-1);
}

.hero-rotator__img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: opacity 1s ease-in-out;
}

.hero-rotator__img.is-active {
  opacity: 1;
}

/* Per-frame provenance label (2026-08-17, imagery panel decision D1).
   Tied to its frame via the adjacent-sibling selector, so each <span> MUST
   stay immediately after the <img> it describes. Navy fill with white text per
   HTML-04 (brand blue is an accent and cannot carry white text).

   TIMING IS A CORRECTNESS CONSTRAINT, NOT POLISH. Every caption is absolutely
   positioned at the same bottom-left spot, so any interval where two of them
   are simultaneously non-transparent renders two different provenance strings
   stacked on top of each other, which is an HTML-13 overlap defect AND is
   actively misleading about which image is the illustration. Giving the
   captions the image's own `opacity 1s` crossfade did exactly that: measured
   at 484ms into a normal auto-advance, the outgoing caption sat at 0.557 and
   the incoming at 0.443, both plainly legible, on every 5s cycle.

   So the captions do NOT crossfade with the image. They hand off:
     outgoing  fades 1 -> 0 over 350ms, starting immediately
     incoming  waits 950ms, then fades 0 -> 1 over 350ms
   That leaves a 600ms dead zone where neither is visible and no instant where
   both are, and the new caption lands just as the 1s image crossfade settles.
   If you change either duration or the delay, re-verify by SAMPLING COMPUTED
   OPACITY of both captions across the whole transition. Checking which <img>
   holds .is-active does not test this: the class is always exclusive, and it
   was the wrong instrument that let this defect through the first review. */
.hero-rotator__cap {
  position: absolute;
  left: var(--space-3);
  bottom: var(--space-3);
  z-index: 1;
  max-width: calc(100% - (var(--space-3) * 2));
  padding: 0.35rem 0.7rem;
  border-radius: var(--radius-sm);
  background: rgba(30, 58, 95, 0.9);   /* navy #1e3a5f */
  color: var(--white);
  font-size: var(--text-sm);
  font-weight: 600;
  line-height: 1.35;
  text-wrap: balance;
  opacity: 0;
  transition: opacity 350ms ease-in-out;   /* fade OUT: immediate */
  pointer-events: none;
}

.hero-rotator__img.is-active + .hero-rotator__cap {
  opacity: 1;
  transition: opacity 350ms ease-in-out 950ms;   /* fade IN: after the image settles */
}

@media (prefers-reduced-motion: reduce) {
  .hero-rotator__img,
  .hero-rotator__cap {
    transition: none;
  }
}


/* ------------------------------------------------------------
   27. RETAILER WALL — on retail page (text chips, clearance pending)
------------------------------------------------------------ */
.retailer-wall {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4);
  margin-top: var(--space-6);
  margin-bottom: var(--space-5);
}

/* Reuse .retailer-chip from homepage — no new class needed */


/* ------------------------------------------------------------
   28. SPEC TABLE — RED System & certifications
------------------------------------------------------------ */
.spec-table-wrap {
  overflow-x: auto;
  border-radius: var(--radius);
  border: 1px solid var(--border-light);
  box-shadow: var(--shadow-sm);
  margin-top: var(--space-6);
}

.spec-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--text-sm);
  background: var(--surface-0);
}

.spec-table thead tr {
  background: var(--navy);
}

.spec-table thead th {
  padding: var(--space-4) var(--space-5);
  text-align: left;
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--white);
  white-space: nowrap;
}

.spec-table tbody tr {
  border-bottom: 1px solid var(--border-light);
  transition: background var(--transition-fast);
}

.spec-table tbody tr:last-child {
  border-bottom: none;
}

.spec-table tbody tr:hover {
  background: var(--surface-1);
}

.spec-table tbody td {
  padding: var(--space-4) var(--space-5);
  color: var(--text-secondary);
  line-height: 1.55;
  vertical-align: top;
}

.spec-table tbody td:first-child {
  font-weight: 600;
  color: var(--dark);
  white-space: nowrap;
}

/* Certification badge pill inside table */
.cert-badge {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  padding: 2px 10px;
  font-size: var(--text-xs);
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  background: var(--navy);
  color: var(--white);
  border-radius: var(--radius-xl);
  margin: 2px 2px;
}


/* ------------------------------------------------------------
   29. RED SYSTEM PAGE — flagship feature tiles
       Navy treatment (carries from homepage red-section,
       extended for full-page use)
------------------------------------------------------------ */
.red-page-specs {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--space-4);
  margin: var(--space-10) 0;
}

.red-page-spec {
  background: rgba(255,255,255,0.07);
  border: 1px solid rgba(74,173,212,0.22);
  border-top: 3px solid var(--blue);
  border-radius: var(--radius);
  padding: var(--space-6);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  transition: background var(--transition-fast);
}

.red-page-spec:hover {
  background: rgba(255,255,255,0.1);
}

.red-page-spec__value {
  font-size: var(--text-3xl);
  font-weight: 700;
  color: var(--white);
  line-height: 1.1;
  letter-spacing: -0.02em;
}

.red-page-spec__label {
  font-size: var(--text-sm);
  color: rgba(255,255,255,0.7);
  line-height: 1.5;
  font-weight: 500;
}

/* Patent note on RED page — navy context */
.red-patent-note--page {
  display: flex;
  align-items: flex-start;
  gap: var(--space-4);
  background: rgba(74,173,212,0.1);
  border: 1px solid rgba(74,173,212,0.3);
  border-left: 4px solid var(--blue);
  border-radius: var(--radius);
  padding: var(--space-6) var(--space-6);
  margin-top: var(--space-8);
}

.red-patent-note--page svg {
  width: 24px;
  height: 24px;
  flex-shrink: 0;
  color: var(--blue);
  margin-top: 2px;
}

.red-patent-note--page p {
  font-size: var(--text-base);
  color: rgba(255,255,255,0.88);
  line-height: 1.7;
  margin: 0;
}

.red-patent-note--page strong {
  color: var(--white);
}

/* Render slot inside navy section */
.render-placeholder--dark {
  background: rgba(255,255,255,0.05);
  border-color: rgba(74,173,212,0.3);
  color: rgba(255,255,255,0.5);
}

.render-placeholder--dark .render-placeholder__label {
  color: rgba(255,255,255,0.6);
}

.render-placeholder--dark .render-placeholder__sub {
  color: rgba(255,255,255,0.4);
}

.render-placeholder--dark .render-placeholder__tag {
  background: rgba(74,173,212,0.15);
  color: var(--blue);
}


/* ------------------------------------------------------------
   30. INLINE CALLOUT BOX
------------------------------------------------------------ */
.callout-box {
  background: var(--light-blue);
  border: 1px solid var(--border-mid);
  border-left: 4px solid var(--navy);
  border-radius: var(--radius);
  padding: var(--space-6);
  margin-top: var(--space-8);
}

.callout-box p {
  font-size: var(--text-base);
  color: var(--text-secondary);
  line-height: 1.7;
  margin: 0;
}

.callout-box strong {
  color: var(--dark);
}


/* ------------------------------------------------------------
   31. SUBPAGE — Responsive adjustments
------------------------------------------------------------ */

@media (max-width: 960px) {
  .page-hero__inner {
    grid-template-columns: 1fr;
    gap: var(--space-10);
    padding-bottom: var(--space-16);
  }

  .page-split,
  .page-split--wide {
    grid-template-columns: 1fr;
    gap: var(--space-10);
  }

  .proof-tiles { grid-template-columns: 1fr 1fr; }

  .red-page-specs { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 640px) {
  .page-hero {
    padding-top: var(--space-16);
  }

  .page-hero__headline {
    font-size: clamp(var(--text-2xl), 7vw, var(--text-3xl));
  }

  .page-hero__sub {
    font-size: var(--text-base);
  }

  .page-hero__actions {
    flex-direction: column;
    align-items: flex-start;
  }

  .page-hero__actions .btn {
    width: 100%;
    justify-content: center;
  }

  .proof-tiles { grid-template-columns: 1fr 1fr; }
  .red-page-specs { grid-template-columns: 1fr 1fr; }

  .page-section { padding-block: var(--space-16); }

  .spec-table { font-size: var(--text-xs); }
}

/* ------------------------------------------------------------
   FIX 3 — Deprecated alias: .page-hero__headline
   page-hero__title (site-pages.css) is now canonical for ALL
   subpages. .page-hero__headline kept here for backward compat;
   any remaining references should migrate to __title.
------------------------------------------------------------ */
/* No separate rule needed — __headline is defined above and
   remains functional. New pages and updated pages use __title
   (defined in site-pages.css). See style-guide.html Section Hero. */

/* ------------------------------------------------------------
   FIX 12 — Anchor scroll offset: sticky header clearance
   Applies to every element with an id="" attribute so jump-nav
   links, tab anchors, and contact route anchors all clear the
   fixed header. Value matches --header-height (80px) + 20px
   breathing room.
------------------------------------------------------------ */
[id] {
  scroll-margin-top: 100px;
}

/* Footer social links — added 2026-06-19 (ported from live site) */
.site-footer__social{display:flex;gap:.6rem;margin-top:1.1rem;}
.site-footer__social-link{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:36px;height:36px;border-radius:50%;background:rgba(255,255,255,.08);color:#fff;transition:background .2s ease,color .2s ease;}
.site-footer__social-link svg{width:18px;height:18px;display:block;flex:0 0 auto;fill:currentColor;}
.site-footer__social-link:hover,.site-footer__social-link:focus-visible{background:#1e3a5f;color:#fff;}


/* ------------------------------------------------------------
   BACK-TO-TOP BUTTON  (injected by site.js initBackToTop)
   Fixed bottom-right circular control. Navy fill, white inline
   SVG arrow — navy #1e3a5f gives white-on-fill contrast well
   above AA (brand-blue #4AADD4 would fail it). Hidden by default;
   .is-visible fades it in. z-index sits above page content but
   below the mobile-nav drawer/overlay (z-index 199).
------------------------------------------------------------ */
.back-to-top {
  position: fixed;
  bottom: 1.5rem;
  right: 8px; /* HTML-13, 2026-09-01: was 1.5rem (24px) -- see the
                 min-width:1280px block below for why this moved */
  width: 48px;
  height: 48px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: var(--navy);
  color: #fff;
  border: none;
  cursor: pointer;
  box-shadow: var(--shadow-lg);
  z-index: 150;
  opacity: 0;
  visibility: hidden;
  transform: translateY(12px);
  transition: opacity var(--transition), transform var(--transition),
              visibility var(--transition), background var(--transition-fast);
}

.back-to-top svg {
  width: 22px;
  height: 22px;
  display: block;
}

.back-to-top:hover,
.back-to-top:focus-visible {
  background: #16314f; /* slightly deeper navy on hover */
}

.back-to-top.is-visible {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  .back-to-top {
    transition: opacity var(--transition-fast), visibility var(--transition-fast);
    transform: none;
  }
  .back-to-top.is-visible {
    transform: none;
  }
}

/* HTML-13 fix, 2026-09-01: suppress the fixed bottom-right .back-to-top
   button below 1280px. What started as a mobile-only fix widened after
   testing more scroll positions, per the same rule this fix exists to
   satisfy -- see the finding below.

   MOBILE (confirmed on index.html at 390px): the "What is at stake" H2
   legitimately overlaps the button around scrollY 2920-3040. A centered
   heading on any page can wrap its last line into the same corner at some
   scroll position -- content this widget cannot predict or reserve space
   for site-wide.

   TABLET AND SMALL DESKTOP (confirmed on index.html at 1280px, five real
   collisions at five different scroll positions, all against the standard
   .container's right edge -- a disclaimer paragraph, a "View All Articles"
   link, a blog-tile anchor, and two footer nav rows): this is not a 1280px
   coincidence, it is this site's own geometry. .container is max-width:
   1200px with a 24px inline gutter (--gutter, 20px/16px at the 960px/640px
   breakpoints); it only picks up a centering side-margin once the viewport
   exceeds 1200px, and that margin only clears a 48px button once the
   viewport reaches roughly 1264px (using this button's own reduced 8px
   right offset -- with the old 24px offset the threshold was ~1296px).
   Below 1200px the gutter alone (16-24px) is smaller than the button
   (48px) regardless of offset, so no repositioning clears it -- the
   button is structurally wider than the space the layout leaves for it.
   1280px, this file's own standard rendered-QC width, sits only 16px past
   that threshold, which is why it kept failing rendered checks that
   stopped at one scroll position.

   Reserving a permanent site-wide gutter to fit the button would cost
   every paragraph and card on the site real reading-column width for an
   intermittently visible convenience, on every viewport from tablet up to
   just past this breakpoint. Suppressing the button below 1280px is the
   proportionate fix: nothing renders in the zone that would collide, so
   nothing can collide with it, and it costs nothing outside the corner
   itself. A phone or tablet user still reaches the top with a couple of
   swipes. Desktop from 1280px up keeps the button, now positioned with a
   real, verified clearance margin instead of an assumed one. */
@media (max-width: 1279px) {
  .back-to-top {
    display: none !important;
  }
}


/* Shown only when JavaScript is off. The lead forms post through a JS
   handler; without it the browser would do a plain GET back to the same
   page and the message would be silently lost, with the sender believing
   they had contacted us. Added 2026-08-27. */
.form-noscript-warning {
  margin: 0 0 var(--space-4);
  padding: 0.875rem 1rem;
  border-left: 4px solid #8A5200;
  background: #FBF2E3;
  color: #3D2A00;
  font-size: 0.9375rem;
  line-height: 1.6;
  border-radius: 0 4px 4px 0;
}
.form-noscript-warning a { color: #1e3a5f; font-weight: 600; }


/* ------------------------------------------------------------
   MOBILE TOUCH TARGETS AND LABEL LEGIBILITY (2026-08-27)

   Measured at 375x812: 40 interactive elements rendered under 44px tall,
   and 26 elements rendered at 12px. Apple's HIG and Google's Material both
   put the comfortable minimum at 44-48px; WCAG 2.5.8 sets a 24px floor,
   which the site already cleared, so this is a comfort fix rather than a
   conformance one.

   Deliberately NOT touched: inline links inside running prose (23 of the 40).
   WCAG 2.5.8 exempts a link whose target is inline in a sentence, and
   padding them out would break the line box of the paragraph around them.
------------------------------------------------------------ */
@media (max-width: 768px) {
  /* Buttons: the small variants were rendering at 34px. */
  .btn {
    min-height: 44px;
  }

  /* "Explore Foodservice" style card links: 24px tall with zero padding.
     Vertical padding only, so the text position inside the card is
     unchanged and only the hit area grows. */
  .segment-card__link,
  .industry-strip__link {
    min-height: 44px;
    padding-block: 0.625rem;
  }

  /* Footer social icons and the nav toggle were 36px and 40px. */
  .site-footer__social-link,
  .nav-toggle {
    min-width: 44px;
    min-height: 44px;
  }

  /* Footer legal links (Privacy Policy, Terms) render as blocks at 24px. */
  .site-footer__legal a {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
  }

  /* NOT bumped: .site-logo__tagline stays at 12px. Its own mobile rule
     above sets 12px with reduced letter-spacing specifically to stop the
     header lockup overflowing; it is a brand mark, not body copy. */

  /* The toll-free number in the top bar is a primary conversion target on a
     phone and was a 24px tap area. */
  .topbar__phone {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
  }

  /* Uppercase letter-spaced labels were 12px. 13px is the compromise:
     legible on a phone without forcing these short labels to wrap, which
     14px does on the narrower ones. Body copy is unaffected. */
  .hero__eyebrow,
  .section-header__eyebrow,
  .segment-card__eyebrow,
  .segment-card__label,
  .insight-card__tag,
  .cta-route__label,
  .site-footer__col-label {
    font-size: 13px;
  }
}


/* ------------------------------------------------------------
   RELATED SPECS (2026-08-27)
   Sibling cross-links. Added because spec pages had one inbound
   internal link each, from a single catalog table row.
------------------------------------------------------------ */
.spec-related {
  margin: 2rem 0 0;
  padding-top: 1.5rem;
  border-top: 1px solid var(--border-light, #E5E7EB);
}
.spec-related__label {
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-muted, #6B7280);
  margin-bottom: 0.75rem;
}
.spec-related__list {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  list-style: none;
  margin: 0;
  padding: 0;
}
.spec-related__list a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0.375rem 0.875rem;
  border: 1px solid var(--border-light, #E5E7EB);
  border-radius: 2rem;
  font-size: 0.875rem;
  color: #1e3a5f;
  text-decoration: none;
  background: #fff;
}
.spec-related__list a:hover,
.spec-related__list a:focus-visible {
  border-color: #1e3a5f;
  background: #F5F8FA;
}
