/* ===========================================================================
   NEW LIGHT DIGITAL — Homepage v1.50 (polished design)
   Editorial · restrained · red as accent · brand-faithful
   Type pair: Fraunces (EN/RO display) + Playfair Display (RU display, Cyrillic) + Poppins (UI/body)
   =========================================================================== */

/* ---------- DESIGN TOKENS ----------
   Two-layer architecture:
   1. BRAND tokens (--brand-*) are IMMUTABLE — they're the New Light Digital
      paint colors, fixed by the brand guide. These never change between
      light and dark mode.
   2. SEMANTIC tokens (--color-*) are theme-dependent — they reference brand
      tokens for their values, and those references flip in dark mode.

   When writing component CSS, use SEMANTIC tokens for anything that should
   adapt to the active theme (page bg, body text, card surfaces, borders).
   Use BRAND tokens directly when a value should stay fixed regardless of
   theme (e.g., the testimonial card is intentionally dark in both modes;
   the brand red is always red).

   The legacy tokens (--ink, --white, etc.) are kept as aliases of the
   brand tokens so existing CSS that uses them still works as fixed
   colors. New rules should prefer the new --brand-* / --color-* names. */
:root {
  /* CSS-level color-scheme declaration. Tells the browser the page is
     designed for both light and dark modes — pairs with the meta tag in
     <head>. This stops Samsung Internet's automatic force-dark inversion
     and lets browsers render form controls / scrollbars to match. */
  color-scheme: light dark;

  /* ===== Brand colors (immutable, per brand guide) ===== */
  --brand-ink:        #0F1A1D;   /* Eerie Black — primary dark */
  --brand-ink-soft:   #1A2429;   /* slightly lifted dark */
  --brand-paper:      #FFFFFF;   /* pure white */
  --brand-off-white:  #FAFAFB;   /* almost-white */
  --brand-red:        #FF213D;   /* Awesome Red */
  --brand-red-dark:   #C40023;
  --brand-red-pale:   #FFF5F6;
  --brand-red-glow:   rgba(255, 33, 61, 0.08);
  --brand-gray-line:  #E8EAED;
  --brand-gray-soft:  #F4F5F7;
  --brand-gray-mid:   #9CA3AF;
  --brand-gray-deep:  #4A5560;

  /* ===== Legacy aliases (immutable, point to brand tokens) =====
     Existing CSS still uses these names — keep them stable.
     For NEW theme-adaptive styling, use --color-* instead. */
  --ink:        var(--brand-ink);
  --ink-soft:   var(--brand-ink-soft);
  --white:      var(--brand-paper);
  --off-white:  var(--brand-off-white);
  --red:        var(--brand-red);
  --red-dark:   var(--brand-red-dark);
  --red-pale:   var(--brand-red-pale);
  --red-glow:   var(--brand-red-glow);
  --gray-line:  var(--brand-gray-line);
  --gray-soft:  var(--brand-gray-soft);
  --gray-mid:   var(--brand-gray-mid);
  --gray-deep:  var(--brand-gray-deep);

  /* ===== Semantic tokens (theme-adaptive) =====
     These define ROLES, not specific colors. In light mode they map to
     brand colors that read on light. In dark mode (below) the same roles
     map to brand colors that read on dark.

     Sections that should "stay the same in both modes" (testimonial cards,
     How We Engage, footer, pre-footer CTA) use --brand-ink directly and
     skip the semantic layer — they're intentionally dark always. */
  --color-bg:           var(--brand-paper);      /* page background */
  --color-bg-alt:       var(--brand-off-white);  /* subtly tinted sections */
  --color-bg-soft:      var(--brand-gray-soft);  /* slightly contrasted bands */
  --color-surface:      var(--brand-paper);      /* cards, panels */
  --color-surface-alt:  var(--brand-off-white);  /* slightly recessed surface */
  --color-text:         var(--brand-ink);        /* primary text */
  --color-text-soft:    var(--brand-gray-deep);  /* secondary body text */
  /* v1.76 — was var(--brand-gray-mid) #9CA3AF. Bumped to a darker mid-gray
     so eyebrows, meta text, and any legitimate "mute" use reads properly.
     Daniel: "that gray has snuck up on me out of nowhere. It is very hard
     to read, especially in some of these gray sections." Body paragraphs
     that used to use this token have been switched to --color-text-soft
     in the same release. */
  --color-text-mute:    #6B7280;                 /* eyebrows, captions */
  --color-border:       var(--brand-gray-line);  /* dividers, card edges */
  --color-border-strong: var(--brand-ink);       /* emphatic borders */
  --color-header-bg:           rgba(255, 255, 255, 0.85);  /* frosted glass header */
  --color-header-bg-scrolled:  rgba(255, 255, 255, 0.95);

  /* Type */
  --font-display: 'Fraunces', 'Times New Roman', serif;
  --font-body:    'Poppins', 'Inter', -apple-system, sans-serif;
  /* v1.73 — pushed Fraunces SOFT axis to 100 (was: 50 on italic only,
     default on upright). SOFT 100 rounds the corners on every glyph,
     giving the typeface a warmer, more humanist personality without
     changing fonts. Distinguishes the site from default-AI-Fraunces
     templates while keeping the font Daniel chose. The axis is
     supported via the Fraunces variable font; no extra file size. */
  --font-display-opsz:   "opsz" 144, "SOFT" 100;
  --font-display-italic: "opsz" 144, "SOFT" 100;

  /* Shadows — themed via separate dark-mode override below */
  --shadow-soft:  0  2px 12px rgba(15, 26, 29, 0.04);
  --shadow-card:  0  6px 24px rgba(15, 26, 29, 0.06);
  --shadow-lift:  0 14px 40px rgba(15, 26, 29, 0.10);

  /* Layout */
  /* Fluid XL: the content frame grows from 1280 up to a 1920 cap on large
     screens (iMac 24"/27"/5K). clamp's 1280 FLOOR keeps every viewport ≤~1542px
     at exactly 1280 — so all standard laptops/desktops render identically to the
     locked baseline; only big displays (~1600px+) fill more of the screen. Body
     text never runs long because prose is capped independently (.lead = 56ch,
     hero leads = 540px), so only the layout/cards widen, not the reading line. */
  --container:    clamp(1280px, 83vw, 1920px);
  --gutter:       24px;

  /* Motion */
  --ease:     cubic-bezier(0.2, 0.7, 0.2, 1);
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --t-fast:   180ms;
  --t-med:    280ms;
  --t-slow:   480ms;
}

/* ============================================================
 * v2.17 — Punctuation shades for both themes
 * Locked-dark sections (branding module, result band, quote,
 * pre-footer CTA, footer) need to read as "deeper" than the
 * page in BOTH themes:
 *
 *   Light theme: punctuation = brand-ink (dark on light = high
 *                contrast, makes the section pop against white)
 *   Dark theme:  punctuation = #050c0e (darker than the page bg
 *                #0F1A1D = subtle but visible elevation downward)
 *
 * This gives dark mode the visual rhythm it was missing in v2.16
 * (where everything resolved to the same dark = uniform).
 * ============================================================ */
:root {
  --punctuation-bg: var(--brand-ink);
  --punctuation-text: #ffffff;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --punctuation-bg: #050c0e;
    --punctuation-text: #ffffff;
  }
}
:root[data-theme="dark"] {
  --punctuation-bg: #050c0e;
  --punctuation-text: #ffffff;
}

/* ============================================================
 * v2.18 — Subtle alternation for modules 2-10
 * Daniel pointed out that modules 2-10 reading all the same
 * (all white in light, all same dark in dark) felt flat. Add
 * a subtle two-shade alternation so adjacent modules read as
 * slightly different surfaces — visible rhythm without the
 * heavy 3-tier cadence from v2.13 that was rejected.
 *
 * Tier A and Tier B are CLOSE shades — the difference is felt
 * more than seen on first glance, but reads clearly when you
 * scroll past a transition.
 *
 *   Light theme: tier-a = #ffffff, tier-b = #faf8f4 (warm off-white)
 *   Dark  theme: tier-a = brand-ink (#0F1A1D), tier-b = #1a2329 (lifted)
 *
 * Applied via nth-child on direct children of the work-single
 * article. Module 1 (branding) is at odd position; its
 * locked-dark rule (.work-hero/.work-nav + .work-module)
 * sits LATER in source order and overrides for that one slot.
 * ============================================================ */
:root {
  --module-bg-a: #ffffff;
  --module-bg-b: #faf8f4;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --module-bg-a: var(--brand-ink);
    --module-bg-b: #1a2329;
  }
}
:root[data-theme="dark"] {
  --module-bg-a: var(--brand-ink);
  --module-bg-b: #1a2329;
}

article.work-single > .work-module:nth-child(odd) {
  background: var(--module-bg-a);
}
article.work-single > .work-module:nth-child(even) {
  background: var(--module-bg-b);
}



@media (min-width: 1024px) {
  :root { --gutter: 56px; }
}
/* Fluid XL: a little more edge padding once the frame widens on big screens. */
@media (min-width: 1600px) {
  :root { --gutter: 72px; }
}

/* ============================================================================
   DARK MODE
   ============================================================================
   Activates when (a) the OS prefers dark mode, OR (b) the page is manually
   toggled via [data-theme="dark"]. Manual [data-theme="light"] forces light
   regardless of OS preference.

   Only the SEMANTIC tokens flip. Brand tokens (--brand-*) stay fixed —
   they're the brand identity. Elements that use --brand-ink directly as
   background (testimonial cards, footer, How We Engage) stay dark in
   both modes, which is correct.

   Legacy aliases (--ink, --white, etc.) also stay fixed. They are used
   throughout the existing CSS for intentionally-dark or intentionally-
   light surfaces. We DO NOT flip them. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --color-bg:           var(--brand-ink);
    --color-bg-alt:       #14201F;
    --color-bg-soft:      var(--brand-ink-soft);
    --color-surface:      var(--brand-ink-soft);
    --color-surface-alt:  #14201F;
    --color-text:         var(--brand-paper);
    --color-text-soft:    rgba(255, 255, 255, 0.72);
    --color-text-mute:    rgba(255, 255, 255, 0.62); /* v1.76 — was 0.5; too dim. */
    --color-border:       rgba(255, 255, 255, 0.1);
    --color-border-strong: rgba(255, 255, 255, 0.3);
    --color-header-bg:           rgba(15, 26, 29, 0.85);
    --color-header-bg-scrolled:  rgba(15, 26, 29, 0.95);

    --shadow-soft: 0  2px 12px rgba(0, 0, 0, 0.35);
    --shadow-card: 0  6px 24px rgba(0, 0, 0, 0.45);
    --shadow-lift: 0 14px 40px rgba(0, 0, 0, 0.55);
  }
}
/* Manual dark mode override — toggleable via data-theme="dark". */
:root[data-theme="dark"] {
  --color-bg:           var(--brand-ink);
  --color-bg-alt:       #14201F;
  --color-bg-soft:      var(--brand-ink-soft);
  --color-surface:      var(--brand-ink-soft);
  --color-surface-alt:  #14201F;
  --color-text:         var(--brand-paper);
  --color-text-soft:    rgba(255, 255, 255, 0.72);
  --color-text-mute:    rgba(255, 255, 255, 0.62); /* v1.76 — was 0.5; too dim. */
  --color-border:       rgba(255, 255, 255, 0.1);
  --color-border-strong: rgba(255, 255, 255, 0.3);
  --color-header-bg:           rgba(15, 26, 29, 0.85);
  --color-header-bg-scrolled:  rgba(15, 26, 29, 0.95);

  --shadow-soft: 0  2px 12px rgba(0, 0, 0, 0.35);
  --shadow-card: 0  6px 24px rgba(0, 0, 0, 0.45);
  --shadow-lift: 0 14px 40px rgba(0, 0, 0, 0.55);
}

/* ---------- RESET ---------- */
*, *::before, *::after { box-sizing: border-box; }
html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  /* Reserve space for the scrollbar at all times. When the mobile menu opens
     we set body { overflow: hidden } which would otherwise remove the
     scrollbar from layout and shift all fixed-positioned children (notably
     the burger button) by ~15px horizontally. With stable gutter the layout
     width never changes. */
  scrollbar-gutter: stable;
  /* Belt-and-braces with body's overflow-x. Some third-party widgets
     (Cloudflare Turnstile's 300px iframe being the current culprit) can
     escape a body-only clip when the body isn't the scrolling element on
     mobile. `overflow-x: clip` on html locks horizontal scrolling at the
     root without establishing a scrolling context (so position:sticky on
     .site-header still works). No `hidden` fallback intentionally: putting
     `overflow-x: hidden` on html stacks scroll containers with body and
     can break sticky positioning + iOS Safari scrolling. Browsers without
     `clip` support (<1% of traffic, pre-2021) fall through to body's own
     `overflow-x: hidden` which is sufficient. */
  overflow-x: clip;
}
body {
  margin: 0;
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.6;
  color: var(--color-text);
  background: var(--color-bg);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  /* Defensive: prevent any rogue element (overflowing SVG, off-canvas decoration,
     a third-party widget) from causing the page to scroll horizontally on
     mobile. `clip` doesn't establish a scroll container, so position:sticky on
     .site-header still works. Falls back to `hidden` in older browsers. */
  overflow-x: hidden;
  overflow-x: clip;
}
img, svg, video { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
button { font-family: inherit; cursor: pointer; border: 0; background: transparent; }
ul, ol { list-style: none; padding: 0; margin: 0; }

/* ---------- TYPOGRAPHY ---------- */
h1, h2, h3, h4 { margin: 0; color: var(--color-text); }

.h-hero {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(40px, 6.5vw, 80px);
  line-height: 1;
  letter-spacing: -0.035em;
}
.h-hero em {
  font-style: italic;
  font-variation-settings: var(--font-display-italic);
  color: var(--red);
  font-weight: 500;
}

.h-section {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(32px, 4vw, 52px);
  line-height: 1.05;
  letter-spacing: -0.025em;
}
.h-section em {
  font-style: italic;
  font-variation-settings: var(--font-display-italic);
  color: var(--red);
  font-weight: 500;
}

/* ---------- LANGUAGE-SPECIFIC FONT OVERRIDE ---------- */
/* Russian doesn't get Cyrillic support from Fraunces. Swap the display
   font for any element under html[lang^="ru"]. Playfair Display has full
   Cyrillic. We null the variation-settings since Playfair has no opsz axis. */
html[lang^="ru"] {
  --font-display: 'Playfair Display', 'Times New Roman', serif;
  --font-display-opsz: normal;
  --font-display-italic: normal;
}

.lead {
  font-size: clamp(16px, 1.3vw, 19px);
  line-height: 1.6;
  color: var(--color-text-soft);
  max-width: 56ch;
}

.eyebrow {
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--red);
  display: inline-flex;
  align-items: center;
  gap: 10px;
}
.eyebrow::before {
  content: "";
  width: 28px;
  height: 1px;
  background: var(--red);
}
.eyebrow--plain::before { display: none; }
/* v1.91 — LOCKED RULE: the eyebrow dash line belongs ONLY on left-aligned
   headers. On any centered section header, drop the dash automatically so
   we never have to remember the --plain modifier per page. (Daniel: "if it
   is centered, we should not use the line in front of the heading. If it is
   left-justified, yes use the line.") */
.section__header--center .eyebrow::before { display: none; }

.container {
  width: 100%;
  max-width: var(--container);
  margin: 0 auto;
  padding: 0 var(--gutter);
}

/* ---------- BUTTONS ---------- */
.btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  height: 54px;
  padding: 0 28px;
  font-size: 15px;
  font-weight: 500;
  line-height: 1;
  border-radius: 6px;
  border: 1.5px solid transparent;
  letter-spacing: -0.005em;
  transition: background-color var(--t-med) var(--ease),
              border-color var(--t-med) var(--ease),
              color var(--t-med) var(--ease),
              transform 140ms ease,
              box-shadow var(--t-med) var(--ease),
              height var(--t-med) var(--ease),
              padding var(--t-med) var(--ease),
              font-size var(--t-med) var(--ease);
  white-space: nowrap;
  overflow: hidden;
}
/* Phones: tighten side padding so long labels (e.g. RU "Запланировать
   консультацию") fit with breathing room instead of cramming the arrow
   against the edge / clipping. */
@media (max-width: 480px) {
  .btn { padding: 0 18px; gap: 8px; }
}
/* v1.93 — Hero CTAs stack full-width on phones so their edges line up with
   the full-width stat/review cards and the rest of the page (a short label
   like "Получить предложение" otherwise leaves the button narrow with dead
   space on the right, out of line with the card below it). The homepage hero
   already reads full-width thanks to its long RU labels; this makes the
   service / about heroes match. */
@media (max-width: 600px) {
  .hero__ctas,
  .about-hero__ctas,
  .service-hero__ctas {
    flex-direction: column;
    align-items: stretch;
  }
  .hero__ctas > .btn,
  .about-hero__ctas > .btn,
  .service-hero__ctas > .btn {
    width: 100%;
  }
}
.btn--primary {
  background: var(--ink);
  color: var(--white);
  border-color: var(--ink);
}
.btn--primary:hover, .btn--primary:focus-visible {
  background: var(--red);
  border-color: var(--red);
  box-shadow: 0 12px 30px rgba(255, 33, 61, 0.28);
}
.btn--primary:active { transform: translateY(1px); }
/* Dark mode: the page background is also Eerie Black (--ink), so an ink-on-ink
   button is invisible. Invert to a light-paper button with ink text — same
   contrast, opposite polarity. The dark-on-dark sections that DO keep the dark
   button (testimonial cards, How We Engage, Pre-footer CTA, footer) re-anchor
   it back with the `.is-on-dark` modifier OR explicit overrides at their own
   selectors (e.g. `.prefooter__cta .btn--primary` below).

   The override matches both `@media (prefers-color-scheme: dark)` (system pref)
   and `:root[data-theme="dark"]` (manual toggle), with `:root[data-theme="light"]`
   forcing light regardless. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .btn--primary {
    background: var(--brand-paper);
    color: var(--brand-ink);
    border-color: var(--brand-paper);
  }
  :root:not([data-theme="light"]) .btn--primary:hover,
  :root:not([data-theme="light"]) .btn--primary:focus-visible {
    background: var(--red);
    color: var(--brand-paper);
    border-color: var(--red);
  }
  /* v1.66 — definitive hero button treatment in dark theme.
     Replicates EXACTLY what the prefooter "Still thinking about it?"
     section does for its own two buttons (.prefooter__cta .btn--primary
     and .prefooter__cta .btn--ghost-light, both defined further down in
     this stylesheet).

     Hero .btn--primary  ↔  prefooter .btn--primary
       (red bg → surface bg on hover, with light glow)
     Hero .btn--outline  ↔  prefooter .btn--ghost-light
       (transparent + faint border → sharp border on hover, no fill change)

     v1.62/63/64/65 all got this wrong by missing the two-button mapping.
     Daniel has been asking for this exact behavior since v1.62. This is
     the actual correct implementation. */
  :root:not([data-theme="light"]) .hero .btn--primary,
  :root:not([data-theme="light"]) .about-hero .btn--primary {
    background: var(--red);
    color: var(--brand-paper);
    border-color: var(--red);
  }
  :root:not([data-theme="light"]) .hero .btn--primary:hover,
  :root:not([data-theme="light"]) .hero .btn--primary:focus-visible,
  :root:not([data-theme="light"]) .about-hero .btn--primary:hover,
  :root:not([data-theme="light"]) .about-hero .btn--primary:focus-visible {
    background: var(--color-surface);
    color: var(--color-text);
    border-color: var(--white);
    box-shadow: 0 12px 30px rgba(255, 255, 255, 0.12);
  }
  :root:not([data-theme="light"]) .hero .btn--outline,
  :root:not([data-theme="light"]) .about-hero .btn--outline {
    background: transparent;
    color: rgba(255, 255, 255, 0.85);
    border-color: rgba(255, 255, 255, 0.2);
  }
  :root:not([data-theme="light"]) .hero .btn--outline:hover,
  :root:not([data-theme="light"]) .hero .btn--outline:focus-visible,
  :root:not([data-theme="light"]) .about-hero .btn--outline:hover,
  :root:not([data-theme="light"]) .about-hero .btn--outline:focus-visible {
    background: transparent;
    color: var(--white);
    border-color: var(--white);
    box-shadow: none;
  }
}
:root[data-theme="dark"] .btn--primary {
  background: var(--brand-paper);
  color: var(--brand-ink);
  border-color: var(--brand-paper);
}
:root[data-theme="dark"] .btn--primary:hover,
:root[data-theme="dark"] .btn--primary:focus-visible {
  background: var(--red);
  color: var(--brand-paper);
  border-color: var(--red);
}
/* v1.66 — manual dark theme: same prefooter mirror for both hero buttons. */
:root[data-theme="dark"] .hero .btn--primary,
:root[data-theme="dark"] .about-hero .btn--primary {
  background: var(--red);
  color: var(--brand-paper);
  border-color: var(--red);
}
:root[data-theme="dark"] .hero .btn--primary:hover,
:root[data-theme="dark"] .hero .btn--primary:focus-visible,
:root[data-theme="dark"] .about-hero .btn--primary:hover,
:root[data-theme="dark"] .about-hero .btn--primary:focus-visible {
  background: var(--color-surface);
  color: var(--color-text);
  border-color: var(--white);
  box-shadow: 0 12px 30px rgba(255, 255, 255, 0.12);
}
:root[data-theme="dark"] .hero .btn--outline,
:root[data-theme="dark"] .about-hero .btn--outline {
  background: transparent;
  color: rgba(255, 255, 255, 0.85);
  border-color: rgba(255, 255, 255, 0.2);
}
:root[data-theme="dark"] .hero .btn--outline:hover,
:root[data-theme="dark"] .hero .btn--outline:focus-visible,
:root[data-theme="dark"] .about-hero .btn--outline:hover,
:root[data-theme="dark"] .about-hero .btn--outline:focus-visible {
  background: transparent;
  color: var(--white);
  border-color: var(--white);
  box-shadow: none;
}
.btn--outline {
  background: transparent;
  color: var(--color-text);
  border-color: var(--color-text);
}
.btn--outline:hover, .btn--outline:focus-visible {
  background: var(--ink);
  color: var(--white);
  border-color: var(--ink);
}
.btn__arrow {
  display: inline-block;
  transition: transform var(--t-med) var(--ease);
}
.btn:hover .btn__arrow { transform: translateX(4px); }

.link-red {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 15px;
  font-weight: 500;
  color: var(--red);
  position: relative;
}
.link-red::after {
  content: "";
  width: 0;
  height: 1.5px;
  background: currentColor;
  transition: width var(--t-med) var(--ease);
  position: absolute;
  bottom: -3px;
  left: 0;
}
.link-red:hover { color: var(--red-dark); }
.link-red:hover::after { width: 20px; }
.link-red__arrow {
  display: inline-block;
  transition: transform var(--t-med) var(--ease);
}
.link-red:hover .link-red__arrow { transform: translateX(4px); }

:focus-visible {
  outline: 2px solid var(--red);
  outline-offset: 3px;
  border-radius: 4px;
}
.btn:focus-visible { outline-offset: 4px; }

/* ---------- HEADER ---------- */
.site-header {
  position: sticky;
  top: 0;
  /* v2.25 — z-index bumped from 50 -> 60 so the site header stacks above
   * the .work-nav sticky portfolio nav (also z-index 50). Same z-index +
   * later DOM order made .work-nav overlay the header near the page
   * bottom; bumping the header guarantees it always sits on top. */
  z-index: 60;
  background: var(--color-header-bg);
  backdrop-filter: saturate(180%) blur(12px);
  -webkit-backdrop-filter: saturate(180%) blur(12px);
  border-bottom: 1px solid transparent;
  /* v1.64 — flicker fix.
     The header had intermittent flicker during scroll. Root cause: the
     combination of `backdrop-filter` (GPU-expensive, re-rasterizes per
     frame) + `transition: height` on the inner row + `position: sticky`
     could leave the browser mid-compositing-layer when class toggle
     happens between requestAnimationFrame ticks.

     Three coordinated fixes:
       1. `isolation: isolate` + `will-change: background-color` here
          forces the header into its own stacking context and signals
          to the compositor that backdrop-filter rasterization should
          be cached. Eliminates the per-frame re-rasterization that
          caused the "every once in a while" flash.
       2. The `transition: height` was moved off .site-header__inner
          (see below) so the layout reflow on scroll-shrink is
          INSTANT — no in-flight animation to be interrupted.
       3. The hysteresis dead zone in nav.js was already 100/60 from
          v1.61; widened to 120/40 to make it harder to bounce around
          the threshold during fast scrolling. */
  isolation: isolate;
  will-change: background-color;
  transition: background-color var(--t-med) var(--ease),
              border-color var(--t-med) var(--ease),
              box-shadow var(--t-med) var(--ease);
}
/* v1.63 — admin bar (WP logged-in users) sits at top:0 fixed and was
   covering our sticky header. Push the header below the admin bar. WP
   sets html.admin-bar-32 / 46 via inline style; the easier read is
   `body.admin-bar` + the standard WP breakpoints (admin bar is 32px on
   desktop, 46px on mobile under 783px). */
body.admin-bar .site-header { top: 32px; }
@media screen and (max-width: 782px) {
  body.admin-bar .site-header { top: 46px; }
}
/* v2.26 — admin-bar-only flicker fix. When logged in, WP's admin bar adds a
   second fixed compositing layer at top:0. During scroll it and our sticky,
   backdrop-filtered header race for repaints, so the header occasionally
   flashes (logged-out users never see it — no admin bar). Promoting the
   header to its own GPU layer ONLY when the admin bar is present gives the
   compositor a stable, pre-rasterized surface so the two layers stop
   fighting. Scoped to .admin-bar so logged-out rendering is untouched. */
body.admin-bar .site-header {
  transform: translateZ(0);
  -webkit-transform: translateZ(0);
  will-change: transform, background-color;
  backface-visibility: hidden;
}
/* v2.27 — the element that actually flashes white on scroll is WP's own
   #wpadminbar (it shares/repaints a layer with our backdrop-filtered sticky
   header). Promote the admin bar itself to a stable GPU layer so it stops
   re-rasterizing mid-scroll. Logged-in only (#wpadminbar never exists for
   visitors), so zero effect on the public site or PageSpeed. */
#wpadminbar {
  transform: translateZ(0);
  -webkit-transform: translateZ(0);
  will-change: transform;
  backface-visibility: hidden;
}
/* After 80px scroll, the header tightens: less vertical space, smaller logo,
   denser feel — keeps focus on content as user moves down the page. */
.site-header.is-scrolled {
  background: var(--color-header-bg-scrolled);
  border-bottom-color: var(--color-border);
  box-shadow: var(--shadow-soft);
}
.site-header__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 84px;
  gap: 40px;
  /* v1.64: NO height transition. The height change on scroll-shrink is
     instant. Animating height (84→64) caused the inner row to be
     mid-reflow when the class toggle happened twice in a row near the
     threshold, leaving the header visibly stuttering. Snap the height
     instantly and let the OTHER properties (bg, border, shadow) carry
     the visual transition. */
}
.site-header.is-scrolled .site-header__inner {
  height: 64px;
}
/* v1.67/68 — at the 960-1199px range (iPad Mini landscape ~1133px, small
   laptops, Surface Pro 7 landscape) the full desktop nav fits but barely.
   Reduce the inter-section gap and the nav item gap so brand + nav + lang
   + CTA don't feel cramped or overlap. At ≥1200px the original generous
   spacing returns.
   v1.68 — extended upper bound from 1099 to 1199 per Daniel: iPad Mini
   landscape at 1133px wasn't getting the tightening because it was just
   above the old 1099 ceiling. */
@media (min-width: 960px) and (max-width: 1199px) {
  /* v1.69 — header layout regrouping for the 960-1199 range.
     justify-content: space-between distributes free space equally between
     all 4 children (brand, nav, lang, CTA). With unequal item widths the
     result LOOKS unbalanced — the brand sits isolated from the rest.

     Fix: push the lang-switcher to the right with margin-left: auto. This
     keeps brand + nav clustered on the left and lang + CTA clustered on
     the right. Reads as two visual groups instead of four equally-spaced
     islands. */
  .site-header__inner {
    justify-content: flex-start;
    gap: 22px;
  }
  .site-header__inner .lang-switch {
    margin-left: auto;
  }
  .site-nav__list { gap: 22px; }
  .header-cta { padding: 0 18px; height: 44px; font-size: 14px; }
  .lang-switch { gap: 6px; }
}
.brand {
  display: inline-flex;
  align-items: center;
  text-decoration: none;
  flex-shrink: 0; /* never let the header logo get squished to make room for the nav */
}
.brand__logo {
  height: 40px;
  width: auto;
  display: block;
  transition: height var(--t-med) var(--ease);
}
/* Theme-aware logo swap: light mode shows red logo, dark mode shows color logo.
   By default the dark logo is hidden; dark mode reveals it and hides the light one. */
.brand__logo--dark { display: none; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .brand__logo--light { display: none; }
  :root:not([data-theme="light"]) .brand__logo--dark  { display: block; }
}
:root[data-theme="dark"] .brand__logo--light { display: none; }
:root[data-theme="dark"] .brand__logo--dark  { display: block; }
.brand--header .brand__logo { height: 38px; }
.site-header.is-scrolled .brand--header .brand__logo { height: 30px; }
.brand--footer .brand__logo { height: 44px; }
@media (max-width: 540px) {
  .brand--header .brand__logo { height: 32px; }
  .site-header.is-scrolled .brand--header .brand__logo { height: 26px; }
}

.site-nav { display: none; }
.site-nav__list { display: flex; gap: 36px; list-style: none; padding: 0; margin: 0; }
/* Style both the explicit .site-nav__link class (used in static markup) AND
   the implicit <a> child of <li> (used when wp_nav_menu() renders the
   menu in WordPress). This way the same CSS works in mockup and production. */
.site-nav__link,
.site-nav__list > li > a {
  font-size: 15px;
  font-weight: 500;
  color: var(--color-text);
  position: relative;
  padding: 6px 0;
  transition: color var(--t-med) var(--ease);
  display: inline-block;
  text-decoration: none;
  /* v1.70 — keep multi-word labels ("Our Work") on a single line. At
     iPad Mini landscape (1133px) the nav row is just tight enough that
     the space inside "Our Work" became a soft wrap point. */
  white-space: nowrap;
}
.site-nav__link::after,
.site-nav__list > li > a::after {
  content: "";
  position: absolute;
  bottom: 0;
  left: 50%;
  width: 0;
  height: 2px;
  background: var(--red);
  transition: width var(--t-med) var(--ease);
  transform: translateX(-50%);
}
.site-nav__link:hover::after,
.site-nav__link--active::after,
.site-nav__list > li > a:hover::after,
/* WP uses .current-menu-item on the active page's <li>. */
.site-nav__list > li.current-menu-item > a::after,
.site-nav__list > li.current_page_item > a::after { width: 24px; }
.site-nav__link:hover,
.site-nav__list > li > a:hover { color: var(--red); }

/* ---- Submenu dropdowns ----
   WP menus may include nested <ul class="sub-menu">. The mockup design
   doesn't visualize these, but if an editor builds parent/child menu items
   in WP Admin we render them as a hover dropdown panel rather than letting
   them expand the top-level row inline. Hidden by default, shown on hover/
   focus-within of the parent <li>. Keyboard-accessible via :focus-within. */
.site-nav__list .sub-menu {
  position: absolute;
  top: 100%;
  left: -16px;
  min-width: 240px;
  padding: 12px 0;
  margin: 0;
  list-style: none;
  /* Solid background — translucent header-bg leaked underlying content through
     the dropdown, making text unreadable. Use the surface token instead. */
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 12px;
  box-shadow: 0 14px 40px rgba(15, 26, 29, 0.12);
  opacity: 0;
  visibility: hidden;
  transform: translateY(8px);
  transition: opacity var(--t-med) var(--ease), transform var(--t-med) var(--ease), visibility 0s linear var(--t-med);
  z-index: 100;
}
.site-nav__list > li { position: relative; }
.site-nav__list > li:hover > .sub-menu,
.site-nav__list > li:focus-within > .sub-menu {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
  transition: opacity var(--t-med) var(--ease), transform var(--t-med) var(--ease), visibility 0s;
}
.site-nav__list .sub-menu li { list-style: none; }
.site-nav__list .sub-menu a {
  display: block;
  padding: 8px 18px;
  font-size: 14px;
  font-weight: 500;
  color: var(--color-text);
  text-decoration: none;
  white-space: nowrap;
  transition: color var(--t-med) var(--ease), background var(--t-med) var(--ease);
}
.site-nav__list .sub-menu a:hover { color: var(--red); background: rgba(255, 33, 61, 0.04); }
/* The parent <li>'s <a> may have a caret indicator span — keep neat. */
.site-nav__list > li.menu-item-has-children > a .arrow {
  display: inline-block;
  margin-left: 6px;
  width: 0; height: 0;
  border-left: 4px solid transparent;
  border-right: 4px solid transparent;
  border-top: 4px solid currentColor;
  vertical-align: middle;
  transition: transform var(--t-med) var(--ease);
}
.site-nav__list > li.menu-item-has-children:hover > a .arrow { transform: rotate(180deg); }

.header-cta { display: none; }
@media (min-width: 960px) {
  .site-nav { display: block; }
  .header-cta { display: inline-flex; white-space: nowrap; flex-shrink: 0; }
}
/* When the header collapses on scroll, the CTA button shrinks too so it
   stays proportional to the slimmer header — height matches the nav rhythm,
   padding tightens, font holds. Otherwise the button looks left behind. */
.site-header.is-scrolled .header-cta {
  height: 42px;
  padding: 0 18px;
  font-size: 14px;
  border-width: 1.25px;
}

/* Language switcher — EN · RO · RU.
   Sits in the nav (desktop) between the menu and the CTA. The current
   language is bold and slightly larger; others are muted. Each is a link
   pointing to its language version. In WordPress this gets generated by
   WPML's language switcher widget — we'll match the markup classes when
   we integrate. Hidden on mobile (<960px); the burger menu will include
   its own copy. */
.lang-switch {
  display: none;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}
@media (min-width: 960px) {
  .lang-switch { display: inline-flex; }
}
.lang-switch__item {
  color: var(--color-text-mute);
  padding: 4px 2px;
  transition: color var(--t-med) var(--ease);
  position: relative;
}
.lang-switch__item:hover {
  color: var(--red);
}
.lang-switch__item.is-active {
  color: var(--color-text);
  font-weight: 700;
}
.lang-switch__item.is-active::after {
  content: "";
  position: absolute;
  bottom: -2px;
  left: 2px;
  right: 2px;
  height: 1.5px;
  background: var(--red);
}
.lang-switch__divider {
  color: var(--color-border);
  font-weight: 700;
}
/* When the header is scrolled (compact), the language switcher tightens to
   match the smaller nav rhythm. */
.site-header.is-scrolled .lang-switch {
  font-size: 11px;
}

/* Footer variant: always visible (footer never collapses to burger),
   white-on-dark for the dark footer surface, has a "Language" label,
   slightly larger gap so it breathes within the brand column. */
.lang-switch--footer {
  display: inline-flex;
  margin-top: 20px;
  gap: 10px;
  font-size: 11px;
}
.lang-switch--footer .lang-switch__label {
  color: rgba(255, 255, 255, 0.4);
  margin-right: 4px;
  letter-spacing: 0.12em;
}
.lang-switch--footer .lang-switch__item {
  color: rgba(255, 255, 255, 0.55);
}
.lang-switch--footer .lang-switch__item:hover {
  color: var(--red);
}
.lang-switch--footer .lang-switch__item.is-active {
  color: var(--white);
}
.lang-switch--footer .lang-switch__divider {
  color: rgba(255, 255, 255, 0.2);
}

/* ---------- Theme switch (Auto / Light / Dark) ----------
   Sits below the language switcher in the footer brand column. Mirrors
   the lang-switch--footer treatment: same label color, same row layout,
   uppercase letter-spacing. The button group itself is a 3-segment pill
   with a subtle bordered background so the active state reads. */
.theme-switch {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  margin-top: 12px;
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}
.theme-switch__label {
  color: rgba(255, 255, 255, 0.4);
}
.theme-switch__group {
  display: inline-flex;
  border: 1px solid rgba(255, 255, 255, 0.15);
  border-radius: 999px;
  padding: 2px;
  background: rgba(255, 255, 255, 0.04);
}
.theme-switch__item {
  appearance: none;
  background: transparent;
  border: 0;
  padding: 6px 12px;
  font: inherit;
  letter-spacing: inherit;
  text-transform: inherit;
  color: rgba(255, 255, 255, 0.55);
  border-radius: 999px;
  cursor: pointer;
  transition: color var(--t-med) var(--ease), background var(--t-med) var(--ease);
}
.theme-switch__item:hover { color: var(--white); }
.theme-switch__item[aria-pressed="true"] {
  color: var(--brand-ink);
  background: var(--white);
}
.theme-switch__item:focus-visible {
  outline: 2px solid var(--red);
  outline-offset: 2px;
}

.mobile-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border: 1px solid var(--color-border);
  border-radius: 8px;
  background: transparent;
  cursor: pointer;
  padding: 0;
  /* Sits above the menu panel so it stays tappable when the panel is open. */
  position: relative;
  z-index: 110;
  transition: border-color var(--t-med) var(--ease), background var(--t-med) var(--ease);
}
.mobile-toggle:hover { border-color: var(--color-text); }
@media (min-width: 960px) { .mobile-toggle { display: none; } }
.mobile-toggle__bars {
  width: 18px;
  height: 12px;
  position: relative;
}
.mobile-toggle__bars span,
.mobile-toggle__bars::before,
.mobile-toggle__bars::after {
  content: "";
  position: absolute;
  left: 0;
  width: 100%;
  height: 1.5px;
  /* Theme-aware so the burger is visible on both light and dark backgrounds. */
  background: var(--color-text);
  transition: transform var(--t-med) var(--ease), opacity var(--t-med) var(--ease), top var(--t-med) var(--ease), bottom var(--t-med) var(--ease);
}
.mobile-toggle__bars::before { top: 0; }
.mobile-toggle__bars span { top: 50%; transform: translateY(-50%); display: block; }
.mobile-toggle__bars::after { bottom: 0; }
/* Burger → X transform when the menu is open. The middle bar fades; top and
   bottom bars rotate into a cross. */
.mobile-toggle.is-active .mobile-toggle__bars::before {
  top: 50%;
  transform: translateY(-50%) rotate(45deg);
}
.mobile-toggle.is-active .mobile-toggle__bars::after {
  bottom: 50%;
  transform: translateY(50%) rotate(-45deg);
}
.mobile-toggle.is-active .mobile-toggle__bars span {
  opacity: 0;
  transform: translateY(-50%) scaleX(0);
}

/* Mobile menu panel — fullscreen overlay sliding in from the right.
   Hidden entirely on desktop (and on mobile until JS opens it).
   Surface uses the same tokens as the header so dark mode picks it up. */
.mobile-menu {
  position: fixed;
  inset: 0;
  z-index: 200;
  background: var(--color-surface);
  display: flex;
  flex-direction: column;
  /* Hidden by default via opacity + visibility (not display) so the close
     transition has something to animate. Visibility is delayed until the
     opacity fade completes, so the menu doesn't catch clicks while invisible. */
  opacity: 0;
  visibility: hidden;
  transform: translateX(6%);
  pointer-events: none;
  transition: opacity var(--t-med) var(--ease),
              transform var(--t-med) var(--ease),
              visibility 0s linear var(--t-med);
}
.mobile-menu.is-open {
  opacity: 1;
  visibility: visible;
  transform: translateX(0);
  pointer-events: auto;
  transition: opacity var(--t-med) var(--ease),
              transform var(--t-med) var(--ease),
              visibility 0s linear 0s;
}
.mobile-menu__inner {
  /* Account for the fixed header (84px when menu open) — start the content
     just below it. Bottom uses env(safe-area-inset-bottom) so content
     clears the iOS home bar without manual fudging. */
  padding: 92px 24px max(24px, env(safe-area-inset-bottom));
  flex: 1 1 auto;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  display: flex;
  flex-direction: column;
  gap: 16px;
}

/* Mobile nav list — large tappable typography. */
.mobile-menu__list {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
}
.mobile-menu__list li { list-style: none; }
.mobile-menu__list > li {
  border-bottom: 1px solid var(--color-border);
}
.mobile-menu__list > li > a {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 14px 0;
  font-size: 20px;
  font-weight: 500;
  color: var(--color-text);
  text-decoration: none;
  font-family: var(--font-body);
  letter-spacing: -0.01em;
  transition: color var(--t-fast) var(--ease);
}
.mobile-menu__list > li > a:hover,
.mobile-menu__list > li.current-menu-item > a,
.mobile-menu__list > li.current_page_item > a {
  color: var(--red);
}

/* Submenus are NOT shown in the burger menu. The full service list lives on
   the Services page itself, which the user reaches by tapping "Services" in
   this menu. Keeps the burger short and scroll-free on small viewports. */
.mobile-menu__list .sub-menu {
  display: none;
}

/* CTA, language switcher and contact stack at the bottom of the panel. */
.mobile-menu__cta-row { margin-top: 8px; }
.mobile-menu__cta {
  width: 100%;
  justify-content: center;
}
/* Lang switcher inside the mobile menu — always visible (overriding the
   default `display: none` that hides the header variant on mobile), uses
   theme tokens so it reads correctly on both light and dark surfaces. */
.mobile-menu .lang-switch {
  display: inline-flex;
  margin: 0;
  font-size: 13px;
}
.mobile-menu .lang-switch__item { color: var(--color-text-soft); }
.mobile-menu .lang-switch__item:hover { color: var(--red); }
.mobile-menu .lang-switch__item.is-active { color: var(--color-text); }
.mobile-menu__contact {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
  padding-top: 16px;
  margin-top: 4px;
  border-top: 1px solid var(--color-border);
}
.mobile-menu__contact-item {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 12px 14px;
  text-decoration: none;
  color: var(--color-text);
  background: var(--color-bg-alt);
  border: 1px solid var(--color-border);
  border-radius: 10px;
  transition: border-color var(--t-fast) var(--ease), background var(--t-fast) var(--ease);
}
.mobile-menu__contact-item:hover {
  border-color: var(--red);
  background: var(--color-surface);
}
/* Email row, when present, spans the full width below the two phone cards. */
.mobile-menu__contact-item[href^="mailto:"] { grid-column: 1 / -1; }
.mobile-menu__contact-label {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--color-text-mute);
}
.mobile-menu__contact-value {
  font-size: 15px;
  font-weight: 600;
  letter-spacing: -0.01em;
}
.mobile-menu__contact-item:hover .mobile-menu__contact-value { color: var(--red); }

/* Body scroll lock while the menu is open. */
body.is-menu-open { overflow: hidden; touch-action: none; }
/* When the menu is open we want the burger button (a child of the header)
   to float above the menu panel so it remains tappable as the X close
   button. Bump the header above the panel and hide everything inside the
   header EXCEPT the burger toggle so the panel reads cleanly behind it.
   Also switch the header from sticky to fixed: body has overflow:hidden
   while the menu is open, which breaks sticky positioning (no scroll
   container). The panel scrolls internally; the header must stay pinned
   to the viewport so the burger/X is always reachable. */
body.is-menu-open .site-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 210;
  background: transparent;
  border-bottom-color: transparent;
  box-shadow: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}
/* v1.68 — when WP admin bar is visible (logged-in users on the frontend),
   the header pre-menu-open is offset by the admin bar height (top: 32px /
   46px). On menu open we were resetting top: 0 above, which made the
   burger/X jump up by 32-46px vertically. Re-apply the admin-bar offset
   here so the burger/X positions stay identical between burger and X
   states. Matches the offsets used in the un-opened header above. */
body.is-menu-open.admin-bar .site-header { top: 32px; }
@media screen and (max-width: 782px) {
  body.is-menu-open.admin-bar .site-header { top: 46px; }
}
/* Force the header back to its un-scrolled dimensions when the menu opens
   so the burger doesn't jump position based on the user's scroll depth
   when they tapped. Without this override, opening the menu while scrolled
   keeps the smaller .is-scrolled height (64px), while opening at the top
   uses 84px — a ~10px vertical jump as the X moves between states. */
/* v1.69 — bump selector specificity. The previous rule
   (`body.is-menu-open .site-header__inner`, specificity 0,2,1) was being
   beaten by `.site-header.is-scrolled .site-header__inner` (0,3,0). When
   a user scrolled the page then opened the menu, the inner stayed at 64px
   instead of forcing back to 84px, so the burger sat at the scrolled-
   position and the X appeared at a slightly different vertical position.
   Adding `.site-header` to the chain raises this to (0,3,1) which wins. */
body.is-menu-open .site-header .site-header__inner { height: 84px; }
body.is-menu-open .site-header .brand--header .brand__logo { height: 38px; }
body.is-menu-open .site-header .brand--header,
body.is-menu-open .site-header .site-nav,
body.is-menu-open .site-header .lang-switch,
body.is-menu-open .site-header .header-cta {
  opacity: 0;
  pointer-events: none;
}
@media (min-width: 960px) {
  /* Hard hide on desktop — keep the markup for accessibility but never paint. */
  .mobile-menu { display: none !important; }
  body.is-menu-open { overflow: auto; touch-action: auto; }
  /* Reset overrides at desktop so anything stuck from a previous resize works. */
  body.is-menu-open .site-header {
    position: sticky;
    z-index: 50;
    background: var(--color-header-bg);
  }
  body.is-menu-open .site-header .brand--header,
  body.is-menu-open .site-header .site-nav,
  body.is-menu-open .site-header .lang-switch,
  body.is-menu-open .site-header .header-cta {
    opacity: 1;
    pointer-events: auto;
  }
}

/* ---------- HERO ---------- */
.hero {
  position: relative;
  /* v1.60: cut top padding ~50% per Daniel — hero was floating too far
     below the sticky header. Bottom padding kept generous so the hero
     visual still breathes into the next section. */
  padding: clamp(28px, 4vw, 56px) 0 clamp(64px, 8vw, 120px);
  overflow: hidden;
}
.hero::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, transparent 0%, var(--color-bg-alt) 100%);
  z-index: -1;
}
.hero__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(40px, 5vw, 80px);
  align-items: center;
}
@media (min-width: 960px) {
  .hero__inner { grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr); }
}
.hero__copy {
  position: relative;
  animation: fadeUp 0.9s var(--ease-out) both;
}
.hero__eyebrow { margin-bottom: 28px; }
.hero__title { margin-bottom: 32px; }
.hero__lead { margin-bottom: 40px; max-width: 540px; }
.hero__ctas {
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
  margin-bottom: 36px;
}
.hero__clutch {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 10px 16px;
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 100px;
  font-size: 13px;
  color: var(--color-text-soft);
  margin-bottom: 14px;
  transition: border-color var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease);
}
.hero__clutch:hover {
  border-color: var(--color-text);
  box-shadow: var(--shadow-soft);
}
.hero__clutch strong { color: var(--color-text); font-weight: 600; }
.stars {
  display: inline-flex;
  gap: 1px;
  color: #FFAA00;
  font-size: 13px;
  letter-spacing: 1px;
}
.hero__clutch-divider {
  width: 1px;
  height: 14px;
  background: var(--color-border);
}
.hero__location {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  color: var(--color-text-soft);
}
.hero__location svg { width: 14px; height: 14px; color: var(--red); }

.hero__visual {
  position: relative;
  min-height: 420px;
  animation: fadeUp 1.1s var(--ease-out) 0.15s both;
}
.hero__composition {
  position: relative;
  background: var(--ink);
  color: var(--white);
  border-radius: 24px;
  padding: clamp(40px, 4vw, 56px);
  height: 100%;
  min-height: 480px;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
.hero__composition::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(255,255,255,0.025) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,0.025) 1px, transparent 1px);
  background-size: 40px 40px;
  pointer-events: none;
}
.hero__composition-top {
  position: relative;
  z-index: 1;
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.5);
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.hero__composition-top-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--red);
  animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50%      { opacity: 0.5; transform: scale(0.85); }
}
.hero__equation {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.hero__eq-row {
  display: flex;
  align-items: baseline;
  gap: 18px;
}
.hero__eq-op {
  font-family: var(--font-display);
  font-variation-settings: "opsz" 144, "wght" 700;
  font-style: italic;
  color: var(--red);
  font-weight: 700;
  font-size: clamp(34px, 3.5vw, 50px);
  opacity: 0.9;
}
.hero__eq-word {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  letter-spacing: -0.04em;
  line-height: 0.95;
  color: var(--white);
}
.eq-website {
  font-size: clamp(36px, 4.5vw, 56px);
  font-weight: 400;
  font-style: italic;
  color: rgba(255, 255, 255, 0.7);
}
.eq-marketing {
  font-size: clamp(48px, 6vw, 76px);
  color: rgba(255, 255, 255, 0.85);
}
.eq-growth {
  font-size: clamp(64px, 9vw, 120px);
  font-weight: 600;
  position: relative;
  display: inline-block;
}
.eq-growth::after {
  content: "";
  position: absolute;
  bottom: 4px;
  left: 0;
  width: 100%;
  height: 6px;
  background: var(--red);
  transform: scaleX(0);
  transform-origin: left;
  animation: underline 1.4s var(--ease-out) 1.2s forwards;
  border-radius: 4px;
}
/* On mobile, the smaller font size makes the underline appear visually
   closer to the text — nudge it down 1px so it has the same breathing
   room as desktop. */
@media (max-width: 719px) {
  .eq-growth::after { bottom: 3px; }
}
@keyframes underline { to { transform: scaleX(1); } }
.hero__composition-bottom {
  position: relative;
  z-index: 1;
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.4);
}
.hero__composition-stat {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-style: italic;
  font-weight: 400;
  font-size: 22px;
  letter-spacing: -0.02em;
  text-transform: none;
  color: var(--white);
  display: block;
  margin-top: 4px;
}
@keyframes fadeUp {
  from { opacity: 0; transform: translateY(20px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ====================================================================
   HOMEPAGE HERO — NARROW-PHONE FIT (v1.92)
   --------------------------------------------------------------------
   Long RU/RO words overflow the hero on narrow phones (<~360px): the
   eyebrow ("АГЕНТСТВО ЦИФРОВОГО МАРКЕТИНГА") runs off the right edge
   (creating page-wide horizontal scroll), and the growth-formula word
   "маркетинг" clips inside the black card. The base clamp() floors
   (eq-marketing 48px, eq-growth 64px) are too tall for a ~262px card
   on a 375px screen — and zero margin below that. Scale the equation
   down and let the eyebrow wrap so the LOCKED design simply *fits*
   320–600px. Desktop/tablet (>600px) is unchanged: each clamp cap
   matches the size the base rule already produces at 600px.
   ==================================================================== */
@media (max-width: 600px) {
  .hero__composition { padding: clamp(24px, 6vw, 36px); }
  .hero__eq-row { gap: 12px; min-width: 0; }
  .hero__eq-op { font-size: clamp(24px, 7vw, 34px); }
  .hero__eq-word { overflow-wrap: anywhere; min-width: 0; }
  .eq-website { font-size: clamp(26px, 8vw, 36px); }
  .eq-marketing { font-size: clamp(32px, 10vw, 48px); }
  .eq-growth { font-size: clamp(40px, 14vw, 64px); }
  /* Let a too-long eyebrow wrap instead of overflowing the viewport. */
  .eyebrow { max-width: 100%; }
  .eyebrow::before { flex-shrink: 0; }
}

/* ---------- CREDENTIALS ---------- */
.creds {
  padding: clamp(40px, 5vw, 64px) 0;
  background: var(--color-surface);
  border-top: 1px solid var(--color-border);
  border-bottom: 1px solid var(--color-border);
}
.creds__label {
  text-align: center;
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--color-text-mute);
  margin-bottom: 32px;
}
.creds__row {
  /* v1.71 — switched from CSS grid to flexbox so orphan last rows
     center automatically. Used on homepage credentials (9 logos) and
     about partner logos (8 logos via about-recognition__partners-row).
     At narrow breakpoints the last row has fewer items than the rest;
     justify-content: center distributes free space symmetrically. */
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 32px 24px;
  max-width: 1200px;
  margin: 0 auto;
}
.creds__row > .cred-logo {
  /* Default: 3 per row below 800px. */
  flex: 0 0 calc(33.333% - 16px);
  max-width: calc(33.333% - 16px);
  min-width: 0;
}
@media (min-width: 640px) {
  /* same 3-per-row, no breakpoint change but matching old behavior */
  .creds__row > .cred-logo {
    flex: 0 0 calc(33.333% - 16px);
    max-width: calc(33.333% - 16px);
  }
}
@media (min-width: 800px) {
  .creds__row { gap: 28px 20px; }
  /* 5 per row */
  .creds__row > .cred-logo {
    flex: 0 0 calc(20% - 16px);
    max-width: calc(20% - 16px);
  }
}
@media (min-width: 1100px) {
  .creds__row { gap: 32px 16px; }
  /* Homepage: 9 per row (9 logos divide cleanly). */
  .creds__row > .cred-logo {
    flex: 0 0 calc(11.111% - 14.222px);
    max-width: calc(11.111% - 14.222px);
  }
}
.cred-logo {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 72px;
  font-weight: 600;
  font-size: 13px;
  color: var(--color-text-soft);
  text-align: center;
  opacity: 0.8;
  transition: opacity var(--t-med) var(--ease), color var(--t-med) var(--ease), transform var(--t-med) var(--ease), filter var(--t-med) var(--ease);
  white-space: nowrap;
  line-height: 1.2;
}
.cred-logo:hover {
  opacity: 1;
  color: var(--color-text);
  transform: translateY(-2px);
}
/* When a logo is rendered as an <img> rather than text, constrain the image
   to the fixed row height and let aspect ratio decide its width. Slight
   desaturation gives the row a unified visual weight without flattening
   brand colors entirely. */
.cred-logo--image img {
  display: block;
  height: 64px;
  width: auto;
  max-width: 100%;
  object-fit: contain;
  filter: grayscale(10%);
  transition: filter var(--t-med) var(--ease);
}
.cred-logo--image:hover img {
  filter: grayscale(0%);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .cred-logo--image {
    /* Subtle off-white plate behind each logo so partner badges with white
       internal backgrounds (Zoho, Kommo, Google's framed mark) don't read as
       floating white islands on the dark surface. Padding and corners make
       it look like a deliberate card, not an artifact. */
    background: rgba(255, 255, 255, 0.92);
    border-radius: 10px;
    padding: 6px 12px;
  }
  :root:not([data-theme="light"]) .cred-logo--image img {
    /* No brightness boost needed once the plate is in place. Keep slight
       desaturation for visual unity. */
    filter: grayscale(10%);
  }
  :root:not([data-theme="light"]) .cred-logo--image:hover img {
    filter: grayscale(0%);
  }
  :root:not([data-theme="light"]) .cred-logo--image:hover {
    background: rgba(255, 255, 255, 1);
  }
}
/* Same treatment for the manual dark-mode toggle (in case a future preview
   tool sets [data-theme="dark"] explicitly). */
:root[data-theme="dark"] .cred-logo--image {
  background: rgba(255, 255, 255, 0.92);
  border-radius: 10px;
  padding: 6px 12px;
}
:root[data-theme="dark"] .cred-logo--image:hover {
  background: rgba(255, 255, 255, 1);
}
.creds__note {
  text-align: center;
  margin-top: 28px;
  font-size: 13px;
  color: var(--color-text-mute);
}
.creds__note a {
  color: var(--red);
  font-weight: 500;
  border-bottom: 1px solid transparent;
  transition: border-color var(--t-med) var(--ease);
}
.creds__note a:hover { border-bottom-color: currentColor; }

/* ---------- SECTION DEFAULTS ---------- */
.section {
  padding: clamp(80px, 9vw, 144px) 0;
  position: relative;
}
.section--alt { background: var(--color-bg-alt); }
.section__header {
  display: flex;
  flex-direction: column;
  gap: 16px;
  max-width: 760px;
  margin-bottom: clamp(48px, 6vw, 80px);
}
.section__header--row {
  flex-direction: row;
  align-items: flex-end;
  justify-content: space-between;
  max-width: none;
  flex-wrap: wrap;
  gap: 24px;
}
.section__header--center {
  align-items: center;
  text-align: center;
  margin-left: auto;
  margin-right: auto;
}

/* ---------- SECTION 3: WHAT WE DO ---------- */
.what { background: var(--color-bg); }
.what__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 24px;
  position: relative;
}
@media (min-width: 720px) {
  .what__grid { grid-template-columns: 1fr 1fr; gap: 32px; }
  .what__grid::after {
    content: "+";
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 64px;
    height: 64px;
    background: var(--ink);
    color: var(--red);
    font-family: var(--font-display);
    font-variation-settings: "opsz" 144, "wght" 700;
    font-style: italic;
    font-size: 40px;
    font-weight: 700;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 1;
    box-shadow: 0 8px 24px rgba(15, 26, 29, 0.3);
  }
}
.what__card {
  position: relative;
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 20px;
  padding: clamp(32px, 4vw, 48px);
  transition: border-color var(--t-med) var(--ease),
              transform var(--t-med) var(--ease),
              box-shadow var(--t-med) var(--ease);
  display: flex;
  flex-direction: column;
  gap: 28px;
  overflow: hidden;
}
.what__card::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 4px;
  background: var(--red);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--t-slow) var(--ease);
}
.what__card:hover {
  border-color: var(--color-text);
  transform: translateY(-4px);
  box-shadow: var(--shadow-card);
}
.what__card:hover::before { transform: scaleX(1); }
/* The whole Build / Market card is now a single link (see what-we-do.php) so the
   entire card goes to the same place the red CTA used to. Strip the default
   anchor look, and drive the inner red "link" (now a span) from the card's hover
   so its colour + underline + arrow still animate when you hover anywhere. */
.what__card { text-decoration: none; color: inherit; }
.what__card:hover .link-red { color: var(--red-dark); }
.what__card:hover .link-red::after { width: 20px; }
.what__card:hover .link-red__arrow { transform: translateX(4px); }
.what__card-tag {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--red);
  margin-bottom: 4px;
}
.what__card-tag::before {
  content: "";
  width: 20px;
  height: 1.5px;
  background: var(--red);
}
.what__card h3 {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-size: clamp(26px, 2.5vw, 36px);
  font-weight: 500;
  line-height: 1.1;
  letter-spacing: -0.025em;
  color: var(--color-text);
}
.what__list { display: grid; gap: 14px; }
.what__list li {
  font-size: 16px;
  color: var(--color-text);
  padding-left: 28px;
  position: relative;
  line-height: 1.5;
}
.what__list li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 9px;
  width: 16px;
  height: 1.5px;
  background: var(--red);
}
.what__card-cta { margin-top: auto; }
.what__pitch {
  margin-top: clamp(40px, 5vw, 64px);
  text-align: center;
  max-width: 680px;
  margin-left: auto;
  margin-right: auto;
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-size: clamp(18px, 1.8vw, 24px);
  line-height: 1.4;
  color: var(--color-text-soft);
  font-weight: 400;
  letter-spacing: -0.015em;
}
.what__pitch strong { color: var(--color-text); font-weight: 600; }
.what__pitch em { font-style: italic; color: var(--red); font-weight: 500; }

/* ---------- SECTION 4: RESULTS ---------- */
.results {
  background: var(--color-bg-alt);
  position: relative;
  overflow: hidden;
}
.results::before {
  content: "";
  position: absolute;
  top: -50%;
  left: -10%;
  width: 60%;
  height: 100%;
  background: radial-gradient(ellipse, rgba(255, 33, 61, 0.04) 0%, transparent 60%);
  pointer-events: none;
}
.results__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 20px;
  position: relative;
}
@media (min-width: 640px) { .results__grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1024px) { .results__grid { grid-template-columns: repeat(3, 1fr); gap: 24px; } }
.result-card {
  position: relative;
  background: var(--color-surface);
  border-radius: 20px;
  padding: clamp(32px, 3.5vw, 44px);
  transition: transform var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease);
  overflow: hidden;
  border: 1px solid transparent;
}
.result-card::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(135deg, var(--red-glow) 0%, transparent 50%);
  opacity: 0;
  transition: opacity var(--t-med) var(--ease);
  pointer-events: none;
}
.result-card:hover {
  transform: translateY(-6px);
  box-shadow: var(--shadow-lift);
}
.result-card:hover::before { opacity: 1; }
.result-card__rank {
  position: absolute;
  top: 24px;
  right: 24px;
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-style: italic;
  font-weight: 400;
  font-size: 16px;
  color: var(--color-text-mute);
}
.result-card__number {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-size: clamp(56px, 6vw, 88px);
  font-weight: 500;
  line-height: 0.95;
  letter-spacing: -0.045em;
  color: var(--color-text);
  margin-bottom: 6px;
}
.result-card__number sup {
  font-size: 0.45em;
  color: var(--red);
  margin-left: 4px;
  vertical-align: super;
  letter-spacing: 0;
  font-weight: 500;
}
.result-card__unit {
  font-size: 15px;
  font-weight: 500;
  color: var(--color-text-soft);
  line-height: 1.4;
  margin-bottom: 24px;
}

.result-card__client-name {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-style: italic;
  font-size: 18px;
  font-weight: 500;
  color: var(--color-text);
  margin-top: 8px;
}
.result-card__meta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: 6px;
  padding-top: 16px;
  border-top: 1px solid var(--color-border);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--color-text-mute);
}
.result-card__industry { color: var(--color-text-soft); }
.result-card__country {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.flag { font-size: 14px; letter-spacing: 0; }
.results__footer {
  margin-top: clamp(40px, 5vw, 64px);
  text-align: center;
}
.results__footer-text {
  font-size: 14px;
  color: var(--color-text-soft);
  margin-bottom: 16px;
}

/* ---------- SECTION 5: SELECTED WORK ---------- */
.work { background: var(--color-bg); }
/* In dark mode, sections in the dark band need distinct shades so they
   don't visually blend. Page rhythm in dark mode:
     Hero / Credentials / What We Do  → --brand-ink (darkest, #0F1A1D)
     Results                           → --color-bg-alt (#14201F, slight lift)
     Selected Work (this section)      → --brand-ink-soft (#1A2429, more lift)
     How We Engage                     → --brand-ink (back to darkest)
   This 3-tier rhythm keeps adjacent sections from running together. Light
   mode is untouched (.work stays on paper white, contrasting cleanly with
   the always-dark .how). */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .work { background: var(--brand-ink-soft); }
}
:root[data-theme="dark"] .work { background: var(--brand-ink-soft); }
.work__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 28px;
}
/* v1.77 — lowered 2-col breakpoint from 720 to 580 per Daniel. iPhone SE
   landscape (667px) was getting cards full-width 1-col, each ~696px tall.
   At 580+ they go 2-col which keeps the orphan-centering rule intact.
   The 3-col breakpoint at 1100+ is unchanged. */
@media (min-width: 580px) { .work__grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1100px) { .work__grid { grid-template-columns: repeat(3, 1fr); } }
/* v1.71/77 — center the orphan 3rd card in the 2-col band (580-1099px).
   3 work cards = 2 in row 1, 1 in row 2; the orphan needs to be
   centered, not left-aligned. Same pattern used for about quotes. */
@media (min-width: 580px) and (max-width: 1099px) {
  .work__grid > .work-card:last-child:nth-child(odd) {
    grid-column: 1 / -1;
    justify-self: center;
    width: 100%;
    max-width: calc(50% - 14px);
  }
}
.work-card {
  display: block;
  background: var(--color-surface);
  border-radius: 20px;
  overflow: hidden;
  border: 1px solid var(--color-border);
  transition: transform var(--t-med) var(--ease),
              box-shadow var(--t-med) var(--ease),
              border-color var(--t-med) var(--ease);
  position: relative;
}
.work-card:hover {
  transform: translateY(-6px);
  box-shadow: var(--shadow-lift);
  border-color: var(--color-text);
}
.work-card__visual {
  aspect-ratio: 16 / 11;
  width: 100%;
  position: relative;
  overflow: hidden;
  background-color: #0F1A1D;
  background-size: cover;
  background-position: center;
}
/* Two card states:
   1. With photo (e.g., --moldasig) → just the photo, no decorative overlay
   2. Without photo (e.g., --montaco, --2fl) → brand-aligned gradient as placeholder
   In the WP theme, ACF will detect whether the work post has a featured image
   and apply either the photo URL or the gradient class accordingly. */
.work-visual--montaco {
  background-image:
    radial-gradient(circle at 20% 30%, rgba(255, 33, 61, 0.45), transparent 45%),
    linear-gradient(135deg, #1A2429 0%, #0F1A1D 100%);
}
.work-visual--montaco::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    repeating-linear-gradient(45deg, transparent 0, transparent 30px, rgba(255,255,255,0.025) 30px, rgba(255,255,255,0.025) 31px);
}
.work-visual--moldasig {
  /* Real photo only — no overlay, no gradient. The image speaks for itself. */
  background-image: url('https://newlightdigital.nldsite.com/wp-content/uploads/2025/03/moldasig-custom-insurance-website-sm.jpg');
}
.work-visual--2fl {
  background-image:
    radial-gradient(circle at 65% 70%, rgba(202, 202, 202, 0.18), transparent 50%),
    linear-gradient(135deg, #2A2F35 0%, #0F1A1D 100%);
}
.work-visual--2fl::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    repeating-linear-gradient(0deg, transparent 0, transparent 40px, rgba(255,255,255,0.03) 40px, rgba(255,255,255,0.03) 41px),
    repeating-linear-gradient(90deg, transparent 0, transparent 40px, rgba(255,255,255,0.03) 40px, rgba(255,255,255,0.03) 41px);
}

/* The "frame + label" overlay (the inset border with the project name +
   diagonal arrow) only renders on gradient/placeholder cards. Cards that
   have real photos show the image clean. */
.work-card__visual:not(.has-image) .work-card__visual-overlay {
  display: flex;
}
.work-card__visual.has-image .work-card__visual-overlay {
  display: none;
}
.work-card__visual-overlay {
  position: absolute;
  inset: 28px;
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: 10px;
  display: flex;
  align-items: flex-end;
  padding: 24px;
  color: rgba(255, 255, 255, 0.5);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  font-weight: 500;
}
.work-card__visual-overlay svg {
  position: absolute;
  top: 24px;
  right: 24px;
  width: 22px;
  height: 22px;
  opacity: 0.4;
  transition: opacity var(--t-med) var(--ease), transform var(--t-med) var(--ease);
}
.work-card:hover .work-card__visual-overlay svg {
  opacity: 1;
  transform: translate(2px, -2px);
}
.work-card__body { padding: 28px; }
.work-card__tags {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 18px;
}
.work-tag {
  display: inline-flex;
  align-items: center;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  padding: 5px 10px;
  border-radius: 100px;
  background: var(--color-bg-soft);
  color: var(--color-text-soft);
}
.work-tag--full-stack {
  background: var(--ink);
  color: var(--red);
}
.work-card__industry {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--red);
  margin-bottom: 8px;
}
.work-card__title {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: 26px;
  line-height: 1.15;
  letter-spacing: -0.02em;
  color: var(--color-text);
  margin-bottom: 10px;
}
.work-card__stack {
  font-size: 14px;
  color: var(--color-text-soft);
  margin-bottom: 18px;
  line-height: 1.5;
}
.work-card__result {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding-top: 14px;
  border-top: 1px solid var(--color-border);
  width: 100%;
}
.work-card__result-arrow {
  color: var(--red);
  font-weight: 600;
}
.work-card__result-text {
  font-size: 14px;
  font-weight: 500;
  color: var(--color-text);
}

/* ============================================================
 * PORTFOLIO ARCHIVE — /portfolio/ (archive-portfolio.php)
 * CSS-only service filter: radio inputs are siblings of .work__grid,
 * so a checked radio drives which cards show via the ~ combinator.
 * No JavaScript (per the theme's no-new-JS rule).
 * ============================================================ */
.site-main--portfolio .section__header { margin-bottom: clamp(20px, 2.6vw, 30px); }

/* The radios themselves are visually hidden but focusable. */
.portfolio-filter__radio {
  position: absolute;
  width: 1px; height: 1px;
  opacity: 0;
  pointer-events: none;
}
/* Pill row. The radios + pills + grid all live in .portfolio-filter so the
   :checked ~ .work__grid combinator can reach the cards. */
.portfolio-filter {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-bottom: clamp(32px, 4.5vw, 48px);
}
.portfolio-filter__pill {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 9px 16px;
  border-radius: 999px;
  border: 1px solid var(--color-border);
  background: var(--color-surface);
  color: var(--color-text);
  font-size: 13px;
  font-weight: 500;
  line-height: 1;
  cursor: pointer;
  transition: border-color var(--t-fast) var(--ease),
              background var(--t-fast) var(--ease),
              color var(--t-fast) var(--ease);
}
.portfolio-filter__pill:hover { border-color: var(--color-text); }
.portfolio-filter__count {
  font-size: 11px;
  font-weight: 600;
  color: var(--color-text-mute);
}
/* Checked state: the pill that follows the checked radio. */
.portfolio-filter__radio:checked + .portfolio-filter__pill {
  background: var(--red);
  border-color: var(--red);
  color: #fff;
}
.portfolio-filter__radio:checked + .portfolio-filter__pill .portfolio-filter__count {
  color: rgba(255,255,255,0.8);
}
/* Keyboard focus ring on the pill when its radio is focused. */
.portfolio-filter__radio:focus-visible + .portfolio-filter__pill {
  outline: 2px solid var(--red);
  outline-offset: 2px;
}
/* The grid is the flex last-child of .portfolio-filter (needed so the
   :checked ~ combinator can reach the cards). The filter's own margin-bottom
   therefore can't space the pills↔grid gap — only the flex `gap` does — so we
   set the pills↔grid spacing explicitly on the grid's top margin. */
.portfolio-archive__grid { width: 100%; margin-top: clamp(28px, 3.5vw, 40px); }
/* Equal-height cards with the result line pinned to the bottom, so results
   align across a row regardless of description length. Scoped to the archive
   so the homepage Selected Work cards are untouched. */
.portfolio-archive__grid .work-card { display: flex; flex-direction: column; }
.portfolio-archive__grid .work-card__body { display: flex; flex-direction: column; flex: 1 1 auto; }
.portfolio-archive__grid .work-card__result { margin-top: auto; }
/* Same equal-height + bottom-pinned result on the shared Selected Work grid
   (homepage + service-detail pages), so result lines align across a row
   regardless of description length. */
.work__grid .work-card { display: flex; flex-direction: column; }
.work__grid .work-card__body { display: flex; flex-direction: column; flex: 1 1 auto; }
.work__grid .work-card__result { margin-top: auto; }
/* Services summary line — only surfaces on the compact mobile card. */
.work-card__services { display: none; }

/* Industry case studies: 4+ projects turn the grid into a horizontal
   scroll-snap slider showing EVERY project in the sector. Self-contained so it
   never inherits the /portfolio/ mobile compact-card rules. No JS: native
   scroll + snap, keyboard-focusable via tabindex on the container. */
.industry-cases--slider {
  display: flex;
  gap: 20px;
  overflow-x: auto;
  /* proximity (not mandatory): lets the user scroll freely and rest wherever
     they like — mandatory yanked the slider back to the nearest card on any
     small scroll, which felt broken. */
  scroll-snap-type: x proximity;
  -webkit-overflow-scrolling: touch;
  margin-top: clamp(28px, 3.5vw, 40px);
  padding-bottom: 14px;
  scrollbar-width: thin;
  cursor: grab;
}
/* Click-and-drag (desktop): industry-slider.js toggles .is-dragging. Free the
   snap during the drag so it tracks the cursor, then it re-snaps on release. */
.industry-cases--slider.is-dragging {
  cursor: grabbing;
  scroll-snap-type: none;
  user-select: none;
}
.industry-cases--slider img { -webkit-user-drag: none; user-select: none; }
.industry-cases--slider .work-card {
  flex: 0 0 auto;
  width: clamp(258px, 80vw, 340px);
  scroll-snap-align: start;
  display: flex;
  flex-direction: column;
}
.industry-cases--slider .work-card__body { display: flex; flex-direction: column; flex: 1 1 auto; }
.industry-cases--slider .work-card__result { margin-top: auto; }
.industry-cases--slider:focus-visible { outline: 2px solid var(--brand-red, #FF213D); outline-offset: 4px; }
@media (min-width: 580px) { .industry-cases--slider .work-card { width: 320px; } }
@media (min-width: 1100px) { .industry-cases--slider .work-card { width: 348px; } }
/* Hover fix for slider cards. The slider is an overflow-x:auto container, which
   per spec also makes overflow-y compute to auto (it clips vertically). The base
   .work-card:hover lift — transform: translateY(-6px) — therefore breaks here in
   two ways: (1) the lifted card's TOP edge is clipped by the container, so the
   card's top line vanishes on hover; (2) hovering the bottom edge moves the card
   up out from under the pointer → un-hover → it drops back → re-hover → FLICKER.
   Inside the slider we keep the shadow + border highlight but drop the vertical
   move, which removes both problems. (Grid work-cards elsewhere keep the lift.)
   The small padding-top gives the hover shadow room so it isn't clipped at top. */
.industry-cases--slider { padding-top: 8px; }
.industry-cases--slider .work-card:hover { transform: none; }

/* MOBILE: compact horizontal project cards on the /portfolio/ archive ONLY
   (mirrors the blog mobile cards). Homepage Selected Work + service-page work
   cards keep the full design. */
@media (max-width: 599px) {
  .portfolio-archive__grid { grid-template-columns: 1fr; gap: 12px; }
  /* Neutralize the 2-col orphan-centering (it would shrink the last card). */
  .portfolio-archive__grid > .work-card:last-child:nth-child(odd) {
    grid-column: auto;
    justify-self: stretch;
    width: auto;
    max-width: none;
  }
  .portfolio-archive__grid .work-card {
    flex-direction: row;
    align-items: stretch;
  }
  .portfolio-archive__grid .work-card__visual {
    flex: 0 0 112px;
    width: 112px;
    aspect-ratio: 1 / 1;
  }
  /* The hover/title overlay on the thumb isn't useful at this size; the body
     already shows the title. */
  .portfolio-archive__grid .work-card__visual-overlay { display: none; }
  .portfolio-archive__grid .work-card__body {
    padding: 12px 14px;
    justify-content: center;
  }
  .portfolio-archive__grid .work-card__industry {
    font-size: 10px;
    margin-bottom: 4px;
  }
  .portfolio-archive__grid .work-card__title {
    font-size: 15px;
    line-height: 1.3;
  }
  /* Drop the full summary + result line; show the tiny services summary. */
  .portfolio-archive__grid .work-card__stack,
  .portfolio-archive__grid .work-card__result { display: none; }
  .portfolio-archive__grid .work-card__services {
    display: block;
    margin-top: 5px;
    font-size: 11px;
    font-weight: 500;
    color: var(--color-text-mute);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
}

/* --- Filter combinator rules (one hide/show pair per service term) --- */
#pf-branding-identity:checked ~ .work__grid .work-card { display: none; }
#pf-branding-identity:checked ~ .work__grid .work-card[data-services~="branding-identity"] { display: flex; }
#pf-web-app-development:checked ~ .work__grid .work-card { display: none; }
#pf-web-app-development:checked ~ .work__grid .work-card[data-services~="web-app-development"] { display: flex; }
#pf-ai-integrations-automation:checked ~ .work__grid .work-card { display: none; }
#pf-ai-integrations-automation:checked ~ .work__grid .work-card[data-services~="ai-integrations-automation"] { display: flex; }
#pf-ecommerce-integrations:checked ~ .work__grid .work-card { display: none; }
#pf-ecommerce-integrations:checked ~ .work__grid .work-card[data-services~="ecommerce-integrations"] { display: flex; }
#pf-design-conversion:checked ~ .work__grid .work-card { display: none; }
#pf-design-conversion:checked ~ .work__grid .work-card[data-services~="design-conversion"] { display: flex; }
#pf-crm-implementation:checked ~ .work__grid .work-card { display: none; }
#pf-crm-implementation:checked ~ .work__grid .work-card[data-services~="crm-implementation"] { display: flex; }
#pf-seo:checked ~ .work__grid .work-card { display: none; }
#pf-seo:checked ~ .work__grid .work-card[data-services~="seo"] { display: flex; }
#pf-google-meta-ads:checked ~ .work__grid .work-card { display: none; }
#pf-google-meta-ads:checked ~ .work__grid .work-card[data-services~="google-meta-ads"] { display: flex; }
#pf-content-social-media:checked ~ .work__grid .work-card { display: none; }
#pf-content-social-media:checked ~ .work__grid .work-card[data-services~="content-social-media"] { display: flex; }
#pf-conversion-rate-optimization:checked ~ .work__grid .work-card { display: none; }
#pf-conversion-rate-optimization:checked ~ .work__grid .work-card[data-services~="conversion-rate-optimization"] { display: flex; }
#pf-marketing-automation:checked ~ .work__grid .work-card { display: none; }
#pf-marketing-automation:checked ~ .work__grid .work-card[data-services~="marketing-automation"] { display: flex; }
#pf-reputation-local-seo:checked ~ .work__grid .work-card { display: none; }
#pf-reputation-local-seo:checked ~ .work__grid .work-card[data-services~="reputation-local-seo"] { display: flex; }

.work__cta-row {
  margin-top: clamp(40px, 5vw, 64px);
  display: flex;
  justify-content: center;
}

/* ---------- SECTION 6: HOW WE WORK (dark) ---------- */
.how {
  background: var(--ink);
  color: var(--white);
  position: relative;
  overflow: hidden;
}
.how::before {
  content: "";
  position: absolute;
  top: 0;
  right: -20%;
  width: 60%;
  height: 100%;
  background: radial-gradient(ellipse, rgba(255, 33, 61, 0.08) 0%, transparent 60%);
  pointer-events: none;
}
.how .h-section { color: var(--white); }
.how__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 20px;
}
/* v1.77 — Daniel: iPhone SE landscape (667px) needs how-we-engage cards
   2-per-line. Was 1-col below 800px. New 2-col band: 580-799px with
   orphan-centering for the 3rd card (3 cards in 2-col = 2/1 layout).
   3-col stays at ≥800px. */
@media (min-width: 580px) and (max-width: 799px) {
  .how__grid { grid-template-columns: 1fr 1fr; gap: 20px; }
  .how__grid > .how-card:last-child:nth-child(odd) {
    grid-column: 1 / -1;
    justify-self: center;
    width: 100%;
    max-width: calc(50% - 10px);
  }
}
@media (min-width: 800px) { .how__grid { grid-template-columns: repeat(3, 1fr); gap: 24px; } }
.how-card {
  background: rgba(255, 255, 255, 0.03);
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: 20px;
  padding: clamp(32px, 3.5vw, 44px);
  transition: background var(--t-med) var(--ease),
              border-color var(--t-med) var(--ease),
              transform var(--t-med) var(--ease);
  position: relative;
  overflow: hidden;
}
.how-card::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(135deg, rgba(255, 33, 61, 0.06) 0%, transparent 50%);
  opacity: 0;
  transition: opacity var(--t-med) var(--ease);
  pointer-events: none;
}
.how-card:hover {
  background: rgba(255, 255, 255, 0.05);
  border-color: rgba(255, 33, 61, 0.3);
  transform: translateY(-4px);
}
.how-card:hover::after { opacity: 1; }
.how-card__number {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-style: italic;
  font-weight: 400;
  font-size: 56px;
  line-height: 1;
  color: var(--red);
  letter-spacing: -0.04em;
  margin-bottom: 24px;
}
.how-card h3 {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: 26px;
  line-height: 1.2;
  letter-spacing: -0.02em;
  color: var(--white);
  margin-bottom: 14px;
}
.how-card p {
  font-size: 15px;
  line-height: 1.65;
  color: rgba(255, 255, 255, 0.65);
}
/* Featured quote inside the dark "How we engage" section.
   Same visual vocabulary as the Get Started testimonial card (dark surface,
   red corner triangle, "Verified on Clutch" badge, italic Fraunces quote
   with inline red quotation marks). Adapted to sit inside an already-dark
   section: lighter card surface, narrower max-width, centered. */
.how__quote {
  position: relative;
  margin: clamp(56px, 7vw, 88px) auto 0;
  max-width: 720px;
  padding: 36px 32px 28px;
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: 20px;
  overflow: hidden;
  text-align: left;
}
/* Subtler than the Get Started card: keeps the dark surface + badge + italic
   quote, but drops the red corner triangle so the two cards don't repeat
   identically. Only a soft red glow at top-right echoes the brand color. */
.how__quote::before {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  width: 200px;
  height: 200px;
  background: radial-gradient(circle at top right, rgba(255, 33, 61, 0.18), transparent 70%);
  pointer-events: none;
}
.how__quote-badge {
  position: relative;
  z-index: 1;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 5px 12px 5px 8px;
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid rgba(255, 255, 255, 0.12);
  border-radius: 100px;
  font-family: var(--font-body);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.85);
  margin-bottom: 20px;
}
.how__quote-badge svg {
  width: 12px;
  height: 12px;
  color: var(--red);
  flex-shrink: 0;
}
.how__quote-text {
  position: relative;
  z-index: 1;
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-style: italic;
  font-weight: 500;
  font-size: clamp(20px, 2vw, 26px);
  line-height: 1.35;
  letter-spacing: -0.02em;
  color: var(--white);
  margin: 0 0 24px;
}
.how__quote-text::before {
  content: "\201C";
  display: inline;
  color: var(--red);
  font-size: 1.2em;
  line-height: 0;
  margin-right: 4px;
  vertical-align: -0.1em;
}
.how__quote-text::after {
  content: "\201D";
  display: inline;
  color: var(--red);
  font-size: 1.2em;
  line-height: 0;
  margin-left: 2px;
  vertical-align: -0.1em;
}
.how__quote-foot {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  gap: 14px;
  padding-top: 18px;
  border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.how__quote-stars {
  display: inline-flex;
  align-items: center;
  gap: 1px;
  color: #FFAA00;
  font-size: 13px;
  letter-spacing: 1px;
  flex-shrink: 0;
}
.how__quote-attribution {
  display: flex;
  flex-direction: column;
  gap: 2px;
  font-family: var(--font-body);
}
.how__quote-name {
  font-size: 14px;
  font-weight: 600;
  color: var(--white);
  letter-spacing: -0.005em;
}
.how__quote-meta {
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.5);
}

/* ---------- SECTION 7: INSIGHTS ---------- */
.insights { background: var(--color-bg); }
/* In dark mode .how (above .insights) uses --brand-ink — if .insights also
   rendered at --brand-ink the two would blend. Lift .insights to
   --brand-ink-soft for visible separation. Light mode untouched. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .insights { background: var(--brand-ink-soft); }
}
:root[data-theme="dark"] .insights { background: var(--brand-ink-soft); }
.insights__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 20px;
}
@media (min-width: 640px) { .insights__grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1024px) { .insights__grid { grid-template-columns: repeat(4, 1fr); } }
.insight-card {
  /* Flex column so the body absorbs any height beyond the image — the grid
     row makes all cards equal height; the image is fixed aspect-ratio; the
     body picks up the leftover and lets its own flex layout distribute that
     between title / excerpt / read link. */
  display: flex;
  flex-direction: column;
  position: relative;
  background: var(--color-surface);
  border-radius: 16px;
  overflow: hidden;
  border: 1px solid var(--color-border);
  transition: transform var(--t-med) var(--ease),
              box-shadow var(--t-med) var(--ease),
              border-color var(--t-med) var(--ease);
}
/* "New" badge — auto-shown on posts published within the recency window. */
.insight-card__badge {
  position: absolute;
  top: 12px;
  left: 12px;
  z-index: 2;
  background: var(--red);
  color: var(--brand-paper);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 5px 11px;
  border-radius: 999px;
  line-height: 1;
}
.insight-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-card);
  border-color: var(--color-text);
}
.insight-card__img {
  aspect-ratio: 16 / 10;
  width: 100%;
  position: relative;
  overflow: hidden;
  background: var(--color-bg-alt);
}
.insight-card__img-icon {
  display: none; /* hidden when real photos render — fallback gradient cards show icon */
}
/* Real featured image rendered inside the card. object-fit: cover keeps the
   16:10 frame full while preserving aspect ratio of the source. */
.insight-card__photo {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center;
}
/* Gradient fallback variants (used only when a post has no featured image). */
.insight-img--1 { background: linear-gradient(135deg, #f8b500 0%, #d63d3d 100%); }
.insight-img--2 { background: linear-gradient(135deg, #3b82f6 0%, #1e3a8a 100%); }
.insight-img--3 { background: linear-gradient(135deg, #10b981 0%, #064e3b 100%); }
.insight-img--4 { background: linear-gradient(135deg, #a78bfa 0%, #4c1d95 100%); }
.insight-img--1 .insight-card__img-icon,
.insight-img--2 .insight-card__img-icon,
.insight-img--3 .insight-card__img-icon,
.insight-img--4 .insight-card__img-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  position: absolute;
  inset: 0;
  color: rgba(255,255,255,0.92);
  font-weight: 700;
  font-size: 32px;
  letter-spacing: 0.06em;
}
.insight-card__body {
  /* Flex column with a fixed min-height so all cards equalize regardless of
     how many lines the title takes. Title takes its natural 1-3 lines, excerpt
     absorbs whatever vertical space is left, read link pins to the bottom.
     With 200px min-height (152px content area after padding) you get roughly:
       1-line meta + 1-line title → ~3 lines of excerpt
       1-line meta + 2-line title → ~2 lines of excerpt
       1-line meta + 3-line title → 0-1 lines of excerpt (often 0)
       2-line meta + 3-line title → 0 lines of excerpt
     If a longer title or excerpt would overflow this height, the card auto-
     grows past 200px and the row equalizes via the parent grid. */
  padding: 24px;
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 200px;
}
.insight-card__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 6px 16px;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--red);
  margin-bottom: 12px;
  line-height: 1.4;
  flex: 0 0 auto;
}
.insight-card__meta-category { flex: 1 1 auto; min-width: 0; }
.insight-card__meta-date { color: var(--color-text-mute); white-space: nowrap; flex: 0 0 auto; }
.insight-card__title {
  font-size: 16px;
  font-weight: 500;
  color: var(--color-text);
  line-height: 1.4;
  margin-bottom: 10px;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  letter-spacing: -0.01em;
  flex: 0 0 auto;
}
/* Excerpt absorbs whatever vertical room is left between title and read link.
   The line-clamp value is high (10) so it doesn't artificially cap line count
   — actual visible lines are governed by available height + overflow:hidden.
   A fade-to-transparent mask at the bottom gives soft truncation when the
   excerpt is cut mid-line. */
.insight-card__excerpt {
  font-size: 13px;
  font-weight: 400;
  color: var(--color-text-soft);
  line-height: 1.5;
  margin: 0 0 12px;
  flex: 1 1 0;
  min-height: 0;
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 10;
  -webkit-box-orient: vertical;
  /* Soft fade at the bottom edge so cut-off text doesn't end abruptly. */
  -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 14px), transparent 100%);
          mask-image: linear-gradient(to bottom, #000 calc(100% - 14px), transparent 100%);
}
.insight-card__read {
  font-size: 13px;
  font-weight: 500;
  color: var(--red);
  flex: 0 0 auto;
}

/* ---------- SECTION 8: CONTACT ---------- */
.contact {
  background: var(--color-bg-alt);
  position: relative;
  overflow: hidden;
}
.contact::before {
  content: "";
  position: absolute;
  bottom: -20%;
  left: -10%;
  width: 50%;
  height: 80%;
  background: radial-gradient(ellipse, rgba(255, 33, 61, 0.04) 0%, transparent 60%);
  pointer-events: none;
}
.contact__inner {
  display: grid;
  /* minmax(0, 1fr) — without the explicit min of 0, grid tracks default to
     min-content as their floor, which lets wide children (e.g. a 300px
     Turnstile iframe inside a deep flex column) push the track wider than
     the container. */
  grid-template-columns: minmax(0, 1fr);
  gap: 56px;
  position: relative;
}
@media (min-width: 960px) {
  .contact__inner { grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); gap: 80px; }
}
.contact__left .h-section { margin-bottom: 24px; }
.contact__left .lead { margin-bottom: 36px; }
.trust-list {
  display: grid;
  gap: 14px;
  margin-bottom: 40px;
}
.trust-list li {
  display: flex;
  align-items: center;
  gap: 14px;
  font-size: 15px;
  color: var(--color-text);
  font-weight: 500;
}
.trust-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  background: var(--red);
  color: var(--white);
  border-radius: 50%;
  flex-shrink: 0;
  font-size: 13px;
  font-weight: 700;
}
/* Get Started quote card — designed to look like a pulled-out Clutch
   testimonial. Dark surface, large italic quote, red verified badge,
   diagonal red corner accent. Differs from the lighter "how we work"
   quote so the two don't compete visually. */
.contact__quote {
  position: relative;
  padding: 36px 32px 28px;
  background: var(--ink);
  border: 1px solid rgba(255, 255, 255, 0.06);
  border-radius: 20px;
  overflow: hidden;
  color: var(--white);
  box-shadow: var(--shadow-lift);
}
/* Clutch rating badge — fallback social proof when a project has no review.
 * Mirrors the quote card so the CTA layout stays consistent either way. */
.contact__clutch {
  position: relative;
  margin-top: 28px;
  padding: 36px 32px 28px;
  background: var(--ink);
  border: 1px solid rgba(255, 255, 255, 0.06);
  border-radius: 20px;
  color: var(--white);
  box-shadow: var(--shadow-lift);
}
.contact__clutch-row { display: flex; align-items: center; gap: 12px; margin-top: 14px; }
.contact__clutch-rating { font-size: 30px; font-weight: 700; line-height: 1; }
.contact__clutch-meta { margin: 12px 0 0; font-size: 14px; color: rgba(255,255,255,0.7); }
.contact__clutch-meta a { color: rgba(255,255,255,0.9); text-decoration: none; }
.contact__clutch-meta a:hover,
.contact__clutch-meta a:focus-visible { text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1px; }
.contact__quote::before {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  width: 140px;
  height: 140px;
  background: radial-gradient(circle at top right, rgba(255, 33, 61, 0.4), transparent 65%);
  pointer-events: none;
}
.contact__quote::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  width: 0;
  height: 0;
  border-top: 56px solid var(--red);
  border-left: 56px solid transparent;
  border-bottom-left-radius: 4px;
}
.contact__quote-badge {
  position: relative;
  z-index: 1;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 5px 12px 5px 8px;
  background: rgba(255, 255, 255, 0.06);
  border: 1px solid rgba(255, 255, 255, 0.12);
  border-radius: 100px;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.85);
  margin-bottom: 24px;
}
.contact__quote-badge svg {
  width: 12px;
  height: 12px;
  color: var(--red);
  flex-shrink: 0;
}
.contact__quote-text {
  position: relative;
  z-index: 1;
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-style: italic;
  font-weight: 500;
  font-size: clamp(20px, 2vw, 26px);
  line-height: 1.35;
  letter-spacing: -0.02em;
  color: var(--white);
  margin: 0 0 28px;
}
.contact__quote-text::before {
  content: "\201C";
  display: inline;
  color: var(--red);
  font-size: 1.2em;
  line-height: 0;
  margin-right: 4px;
  vertical-align: -0.1em;
}
.contact__quote-text::after {
  content: "\201D";
  display: inline;
  color: var(--red);
  font-size: 1.2em;
  line-height: 0;
  margin-left: 2px;
  vertical-align: -0.1em;
}
.contact__quote-foot {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  gap: 14px;
  padding-top: 20px;
  border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.contact__quote-stars {
  display: inline-flex;
  align-items: center;
  gap: 1px;
  color: #FFAA00;
  font-size: 14px;
  letter-spacing: 1px;
  flex-shrink: 0;
}
.contact__quote-attribution {
  display: flex;
  flex-direction: column;
  gap: 2px;
  font-family: var(--font-body);
}
.contact__quote-name {
  font-size: 14px;
  font-weight: 600;
  color: var(--white);
  letter-spacing: -0.005em;
}
.contact__quote-meta {
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.5);
}
/* Let long RU/RO client names + meta wrap instead of clipping at the card's
   rounded (overflow:hidden) edge — e.g. "Elit Agrotehnologii", the single
   long word "ФИНАНСОВЫЕ". min-width:0 lets the flex column shrink so the
   text can break. */
.contact__quote-attribution { min-width: 0; }
.contact__quote-name,
.contact__quote-meta { overflow-wrap: anywhere; }

/* v1.93 — Review card full-width on mobile.
   .contact__quote is a <blockquote>, so it inherits the user-agent default
   40px inline margin. On the single-column contact layout that insets the
   card 40px on each side — visibly narrower than the page and out of line
   with the gutter and with the heading/lead/trust-list above it. Zero the
   inline margin below the 2-col breakpoint so the review card spans the full
   content width on phones/tablets, edges flush with the rest of the page.
   (The About-page variant already resets margin:0; desktop 2-col keeps its
   inset.) Applies everywhere the card is used — portfolio, industry,
   service, homepage. */
@media (max-width: 959px) {
  .contact__quote { margin-inline: 0; }
}

.form {
  background: var(--color-surface);
  border-radius: 24px;
  padding: clamp(32px, 4vw, 48px);
  border: 1px solid var(--color-border);
  position: relative;
}
.form__title {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: 24px;
  letter-spacing: -0.02em;
  margin-bottom: 28px;
  color: var(--color-text);
}
.form__row {
  display: grid;
  grid-template-columns: 1fr;
  gap: 20px;
  margin-bottom: 20px;
}
@media (min-width: 580px) { .form__row { grid-template-columns: 1fr 1fr; } }
.field {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.field label {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.05em;
  color: var(--color-text-soft);
  text-transform: uppercase;
}
.field label .req { color: var(--red); }
.field input,
.field textarea {
  font-family: inherit;
  font-size: 15px;
  color: var(--color-text);
  padding: 14px 16px;
  border: 1.5px solid var(--color-border);
  border-radius: 10px;
  background: var(--color-surface);
  transition: border-color var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease);
  width: 100%;
}
.field input:hover, .field textarea:hover { border-color: var(--color-text-mute); }
.field input:focus, .field textarea:focus {
  outline: none;
  border-color: var(--color-text);
  box-shadow: 0 0 0 3px rgba(15, 26, 29, 0.06);
}
.field textarea { min-height: 120px; resize: vertical; }
.form__submit-row {
  margin-top: 32px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 16px;
}
.form__submit-note {
  font-size: 12px;
  color: var(--color-text-mute);
  max-width: 280px;
}
.form__placeholder {
  font-size: 14px;
  color: var(--color-text-soft);
  line-height: 1.6;
}
.form__placeholder a { color: var(--red); text-decoration: underline; }

/* ---- Contact Form 7 integration ----
   CF7 wraps every form in `<div class="wpcf7"><form class="wpcf7-form">`
   regardless of what markup the editor pastes into the form template.
   These rules style CF7's auto-generated markup AND any raw input/textarea
   inside our `.form` container so editors can configure forms in WP Admin
   without learning our class names — defaults still look right.

   Layout strategy: the `.wpcf7-form` itself is a flex column. CF7 auto-
   injects several elements that the editor can't position from the form
   template — hidden fields fieldset, Turnstile widget, response output.
   We use `order` to position them where the design needs them: Turnstile
   right above the submit row, response output below the submit row,
   hidden fields out of the visual flow. */
.form .wpcf7 { width: 100%; }
.form .wpcf7-form {
  display: flex;
  flex-direction: column;
  gap: 0;
  /* Flex children default to min-width: auto which can prevent shrinking
     below their content's intrinsic size — bad on narrow phones where the
     Turnstile widget's 300px iframe would push the form wider than the
     viewport. Allowing min-width: 0 lets all children honor max-width: 100%. */
  min-width: 0;
}
.form .wpcf7-form > * { min-width: 0; max-width: 100%; }
/* The Turnstile widget renders a 300px iframe by default. On phones <= 360px
   that overflows the card. Force the wrapper (and its iframe) to fit. */
.form .wpcf7-form > .wpcf7-turnstile,
.form .wpcf7-form > .cf-turnstile { max-width: 100%; }
.form .wpcf7-form > .wpcf7-turnstile iframe,
.form .wpcf7-form > .cf-turnstile iframe { max-width: 100% !important; }
.form .wpcf7-form > .hidden-fields-container,
.form .wpcf7-form > fieldset.hidden-fields-container {
  order: -10;
  border: 0;
  padding: 0;
  margin: 0;
}
.form .wpcf7-form > .wpcf7-turnstile,
.form .wpcf7-form > .cf-turnstile {
  order: 90;             /* sits right above the submit row (order 100) */
  /* Horizontally centered; equal breathing room above and below so it sits
     visually between the acceptance row and the submit row. */
  margin: 20px auto;
  display: flex;
  justify-content: center;
}
.form .wpcf7-form > .form__submit-row,
.form .wpcf7-form > p:has(input[type="submit"]),
.form .wpcf7-form > p:has(button[type="submit"]) {
  order: 100;
}
.form .wpcf7-form > .wpcf7-response-output {
  order: 200;
}
/* CF7 wraps every form-tag with <br> on both sides by default; we don't
   want those breaking our label/input rhythm — labels and inputs are
   already block-level inside .field. */
.form .wpcf7-form br { display: none; }
.form .wpcf7-form p { margin: 0 0 20px 0; }
/* The .wpcf7-form-control-wrap is the <span> CF7 puts around every input.
   It needs to be block-level so inputs flow correctly under labels. The
   empty <div> CF7 puts inside it (validation tip slot) becomes a block too. */
.form .wpcf7-form-control-wrap { display: block; width: 100%; position: relative; }

.form .wpcf7-form input[type="text"],
.form .wpcf7-form input[type="email"],
.form .wpcf7-form input[type="tel"],
.form .wpcf7-form input[type="url"],
.form .wpcf7-form input[type="number"],
.form .wpcf7-form select,
.form .wpcf7-form textarea {
  font-family: inherit;
  font-size: 15px;
  color: var(--color-text);
  padding: 14px 16px;
  border: 1.5px solid var(--color-border);
  border-radius: 10px;
  background: var(--color-surface);
  transition: border-color var(--t-med) var(--ease), box-shadow var(--t-med) var(--ease);
  width: 100%;
  display: block;
}
.form .wpcf7-form input:hover,
.form .wpcf7-form textarea:hover,
.form .wpcf7-form select:hover { border-color: var(--color-text-mute); }
.form .wpcf7-form input:focus,
.form .wpcf7-form textarea:focus,
.form .wpcf7-form select:focus {
  outline: none;
  border-color: var(--color-text);
  box-shadow: 0 0 0 3px rgba(15, 26, 29, 0.06);
}
.form .wpcf7-form textarea { min-height: 120px; resize: vertical; }

/* Placeholder text — slightly more visible on the dark form card while staying
   subordinate to the user's typed text. */
.form .wpcf7-form input::placeholder,
.form .wpcf7-form textarea::placeholder { color: var(--color-text-mute); opacity: 1; }

/* CF7 input validation state — red border on invalid fields.
   Also handle the [acceptance] checkbox: when unchecked-but-required and the
   user submits, CF7 adds .wpcf7-not-valid to the input. We push that visually
   onto the styled checkbox (which is the input itself with appearance:none). */
.form .wpcf7-form input.wpcf7-not-valid,
.form .wpcf7-form textarea.wpcf7-not-valid,
.form .wpcf7-form select.wpcf7-not-valid { border-color: var(--red); }
.form .wpcf7-form input[type="checkbox"].wpcf7-not-valid,
.form .wpcf7-acceptance.wpcf7-not-valid input[type="checkbox"] {
  border-color: var(--red);
  box-shadow: 0 0 0 3px rgba(255, 33, 61, 0.15);
}
.form .wpcf7-acceptance.wpcf7-not-valid .wpcf7-list-item-label { color: var(--red); }

/* ---- Acceptance checkbox (privacy/terms agreement) ----
   CF7's [acceptance] tag wraps its checkbox in <span class="wpcf7-list-item">
   with a nested <label> containing the input + the label text in a
   <span class="wpcf7-list-item-label">. We style it inline + clickable. */
.form .wpcf7-form > .wpcf7-acceptance-wrapper,
.form .wpcf7-form > p:has(.wpcf7-acceptance) {
  order: 85;                /* above Turnstile (90), below the textarea */
  margin: 0 0 16px 0;
}
.form .wpcf7-acceptance .wpcf7-list-item { display: flex; align-items: flex-start; gap: 10px; margin: 0; }
.form .wpcf7-acceptance .wpcf7-list-item label { display: flex; align-items: flex-start; gap: 10px; cursor: pointer; }
.form .wpcf7-acceptance input[type="checkbox"] {
  appearance: none;
  -webkit-appearance: none;
  width: 18px;
  height: 18px;
  min-width: 18px;
  margin: 2px 0 0 0;
  border: 1.5px solid var(--color-border);
  border-radius: 4px;
  background: var(--color-surface);
  cursor: pointer;
  transition: border-color var(--t-med) var(--ease), background var(--t-med) var(--ease);
  position: relative;
}
.form .wpcf7-acceptance input[type="checkbox"]:hover { border-color: var(--color-text); }
.form .wpcf7-acceptance input[type="checkbox"]:checked {
  background: var(--brand-ink);
  border-color: var(--brand-ink);
}
.form .wpcf7-acceptance input[type="checkbox"]:checked::after {
  content: "";
  position: absolute;
  top: 1px;
  left: 5px;
  width: 5px;
  height: 10px;
  border: solid var(--brand-paper);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
.form .wpcf7-acceptance .wpcf7-list-item-label,
.form .wpcf7-acceptance label > span:not(.wpcf7-list-item-label) {
  font-size: 13px;
  line-height: 1.5;
  color: var(--color-text-soft);
}
/* Any link inside the acceptance area gets the underlined-link treatment so
   the user can clearly see they're clickable. The selector is intentionally
   broad — CF7's markup nests the label content variably depending on version
   and whether the [acceptance] tag wraps content or stands alone. */
.form .wpcf7-acceptance a,
.form .wpcf7-acceptance label a,
.form .wpcf7-acceptance .wpcf7-list-item-label a {
  color: var(--color-text);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  font-weight: 500;
  transition: color var(--t-med) var(--ease);
}
.form .wpcf7-acceptance a:hover,
.form .wpcf7-acceptance label a:hover,
.form .wpcf7-acceptance .wpcf7-list-item-label a:hover { color: var(--red); }

/* ---- Submit button + loading state ----
   The button text gets swapped by JS (assets/js/cf7-submit-state.js) — when
   the form is submitting, the button's value is replaced with "Sending..."
   and the wrapping `.wpcf7` gets `.is-submitting` for disabled styling. */
.form .wpcf7-form input[type="submit"],
.form .wpcf7-form button[type="submit"] {
  /* Match .btn .btn--primary so CF7 submit looks like the design's CTA.
     v1.63: border-radius matches .btn (6px) for shape consistency across
     all CTAs in the design. Was 999px (pill) which was the only round
     button on the entire site. */
  background: var(--brand-ink);
  color: var(--brand-paper);
  border: 1.5px solid var(--brand-ink);
  border-radius: 6px;
  padding: 14px 28px;
  font-family: inherit;
  font-size: 15px;
  font-weight: 500;
  cursor: pointer;
  transition: background var(--t-med) var(--ease), color var(--t-med) var(--ease), opacity var(--t-med) var(--ease);
  display: inline-flex;
  align-items: center;
  gap: 10px;
}
.form .wpcf7-form input[type="submit"]:hover:not(:disabled),
.form .wpcf7-form button[type="submit"]:hover:not(:disabled) { background: var(--red); border-color: var(--red); }
.form .wpcf7-form input[type="submit"]:disabled,
.form .wpcf7-form button[type="submit"]:disabled,
.form .wpcf7.is-submitting input[type="submit"],
.form .wpcf7.is-submitting button[type="submit"] {
  cursor: wait;
  opacity: 0.85;
  background: var(--brand-ink);
  border-color: var(--brand-ink);
  pointer-events: none;
}
/* Inline spinner appended by the JS as an adjacent <span class="nld-spinner">. */
.form .nld-spinner {
  display: inline-block;
  width: 14px;
  height: 14px;
  margin-left: 10px;
  border: 2px solid rgba(255, 255, 255, 0.35);
  border-top-color: var(--brand-paper);
  border-radius: 50%;
  vertical-align: -3px;
  animation: nld-spin 0.7s linear infinite;
}
@keyframes nld-spin { to { transform: rotate(360deg); } }
/* Hide CF7's own spinner — we render our own. */
.form .wpcf7-spinner { display: none; }

/* CF7 status / validation messages */
.form .wpcf7-not-valid-tip {
  font-size: 12px;
  color: var(--red);
  margin-top: 6px;
  display: block;
  /* CF7 sometimes positions the tip absolutely inside the wrap — force
     normal flow so it sits under the input instead of overlapping it. */
  position: static !important;
}
.form .wpcf7-response-output {
  margin: 16px 0 0 0 !important;
  padding: 12px 16px !important;
  border: 1.5px solid var(--color-border) !important;
  border-radius: 8px !important;
  font-size: 14px;
}
.form .wpcf7 form.invalid .wpcf7-response-output,
.form .wpcf7 form.unaccepted .wpcf7-response-output { border-color: var(--red) !important; color: var(--red); }
.form .wpcf7 form.sent .wpcf7-response-output { border-color: #2a8a3e !important; color: #2a8a3e; }

/* ---- Compact mobile form ----
   Below 580px the form is single-column. We tighten card padding, label/input
   gap, row gap, textarea height, and font sizes so the form takes less of the
   viewport on small phones. Stays readable — just less whitespace. */
@media (max-width: 580px) {
  .form { padding: 20px; border-radius: 18px; }
  .form__title { font-size: 20px; margin-bottom: 18px; }
  .form__row { gap: 12px; margin-bottom: 12px; }
  .field { gap: 4px; }
  .field label { font-size: 11px; }
  .field input,
  .field textarea,
  .form .wpcf7-form input,
  .form .wpcf7-form textarea { padding: 11px 14px; font-size: 14px; border-radius: 8px; }
  .field textarea,
  .form .wpcf7-form textarea { min-height: 90px; }
  .form__submit-row { margin-top: 18px; gap: 10px; flex-direction: column; align-items: stretch; }
  .form__submit-note { font-size: 11px; max-width: none; text-align: center; }
  .form .wpcf7-form input[type="submit"],
  .form .wpcf7-form button[type="submit"] { padding: 12px 22px; font-size: 14px; width: 100%; }
  .form .wpcf7-form > .wpcf7-turnstile,
  .form .wpcf7-form > .cf-turnstile { margin: 12px auto; }
  .form .wpcf7-acceptance .wpcf7-list-item-label { font-size: 12px; }
}

/* ---------- PRE-FOOTER CTA STRIP ---------- */
.prefooter {
  position: relative;
  background: var(--punctuation-bg);
  color: var(--white);
  padding: clamp(56px, 7vw, 96px) 0;
  overflow: hidden;
  border-bottom: 1px solid rgba(255, 255, 255, 0.08);
}
.prefooter::before {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 80%;
  height: 200%;
  background: radial-gradient(ellipse, rgba(255, 33, 61, 0.18) 0%, transparent 55%);
  pointer-events: none;
}
.prefooter__inner {
  position: relative;
  z-index: 1;
  display: grid;
  grid-template-columns: 1fr;
  gap: 32px;
  align-items: center;
}
@media (min-width: 880px) {
  .prefooter__inner { grid-template-columns: minmax(0, 1.4fr) auto; gap: 56px; }
}
.prefooter__heading {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(28px, 4.5vw, 56px);
  line-height: 1.05;
  letter-spacing: -0.025em;
  color: var(--white);
  margin: 0;
}
.prefooter__heading em {
  font-style: italic;
  font-variation-settings: var(--font-display-italic);
  color: var(--red);
  font-weight: 500;
}
.prefooter__sub {
  font-size: 16px;
  line-height: 1.55;
  color: rgba(255, 255, 255, 0.7);
  margin: 12px 0 0;
  max-width: 56ch;
}
.prefooter__cta {
  /* v1.67 — stack the CTAs vertically by default. Side-by-side only
     when there's enough room (≥1100px). Was: flex-wrap row at all sizes,
     which produced cramped side-by-side at Surface Pro 7 portrait (912px)
     and Galaxy Fold 5 landscape (~882px). Buttons stretch to fill the
     column for visual weight balance. */
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 12px;
}
@media (min-width: 1100px) {
  .prefooter__cta {
    flex-direction: row;
    align-items: center;
    flex-wrap: wrap;
  }
}
.prefooter__cta .btn--primary {
  background: var(--red);
  border-color: var(--red);
}
.prefooter__cta .btn--primary:hover {
  background: var(--color-surface);
  color: var(--color-text);
  border-color: var(--white);
  box-shadow: 0 12px 30px rgba(255, 255, 255, 0.12);
}
.prefooter__cta .btn--ghost-light {
  background: transparent;
  color: rgba(255, 255, 255, 0.85);
  border-color: rgba(255, 255, 255, 0.2);
}
.prefooter__cta .btn--ghost-light:hover {
  color: var(--white);
  border-color: var(--white);
}

/* ---------- FOOTER ---------- */
.site-footer {
  background: var(--ink);
  color: rgba(255, 255, 255, 0.65);
  padding: 88px 0 32px;
  font-size: 14px;
  position: relative;
  overflow: hidden;
}
/* Stylized world map watermark — continents as low-opacity light shapes
   on the dark surface, with a pulsing red pin on Chișinău. Communicates
   "Moldova-based, serving the world" without words. */
/* World map watermark — absolute behind the footer columns.
   Sized and positioned so that Moldova (path id="md" at 55.7% across the
   map viewBox) lands in the gap BETWEEN the Services column and the
   Industries column of the footer grid. The map covers the full footer
   width at low opacity; the pin and label sit in the column-gap negative
   space where no text lives. */
/* World map watermark — edge-to-edge of the viewport, cropped top/bottom
   via preserveAspectRatio="xMidYMid slice" on the <svg>. The pin is embedded
   INSIDE the svg at viewBox coords (467.5, 403) so it crops naturally with
   the map. Moldova lands at 55.7% across the viewport. */
.site-footer__world {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 50%;
  /* Map is wider than the viewport (100vw + 200px). After shifting left
     ~100px to center Moldova in the column gap, the right edge still
     extends ~100px past the viewport — no empty space on the right edge
     of the screen, even on wide viewports. */
  transform: translateX(calc(-50% - 100px));
  width: calc(100vw + 200px);
  color: var(--white);
  pointer-events: none;
  z-index: 0;
  overflow: hidden;
}
.site-footer__world svg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
}
.site-footer__world .nld-map-paths {
  opacity: 0.08;
}
.site-footer__world .nld-map-pin-pulse {
  fill: var(--red);
  opacity: 0.45;
  /* Scale from the circle's own center (its cx/cy = Moldova location).
     Using fill-box + center keeps the pulse anchored on Moldova
     instead of drifting across the map. */
  transform-box: fill-box;
  transform-origin: center;
  animation: pin-pulse-svg 2.4s ease-out infinite;
}
@keyframes pin-pulse-svg {
  0%   { transform: scale(0.7); opacity: 0.55; }
  100% { transform: scale(3.5); opacity: 0; }
}
.site-footer__world .nld-map-pin-glow {
  fill: var(--red);
  opacity: 0.35;
  filter: blur(6px);
}
.site-footer__world .nld-map-pin-dot {
  fill: var(--red);
}
.site-footer__world .nld-map-pin-ring {
  fill: none;
  stroke: var(--red);
  stroke-width: 1.5;
  opacity: 0.5;
}
.site-footer__world .nld-map-pin-label {
  font-family: var(--font-body), -apple-system, sans-serif;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  fill: var(--white);
  text-anchor: middle;
  paint-order: stroke;
  stroke: var(--ink);
  stroke-width: 3;
  stroke-linejoin: round;
}
.site-footer__world .nld-map-pin-label.country {
  fill: rgba(255, 255, 255, 0.55);
  font-weight: 500;
}
.site-footer__pin {
  display: none;
}

/* Tablet portrait, lower tier (720-799px) — Galaxy S8+ horizontal (740px)
   sits here. The user confirmed this width is PERFECT at -30px; don't
   change. Other devices here: small foldable phones in landscape. */
@media (min-width: 720px) and (max-width: 799px) {
  .site-footer__world {
    transform: translateX(calc(-50% - 30px));
    width: calc(100vw + 200px);
  }
}

/* Tablet portrait, upper tier (800-1099px) — iPad Air vertical (820),
   iPhone 12 Pro horizontal (844), iPhone XR horizontal (896), Surface
   Pro 7 vertical (912), Galaxy A51/71 horizontal (914), Pixel 7 horizontal
   (915), S20 Ultra horizontal (915), iPhone 14 Pro Max horizontal (932),
   iPad Mini horizontal (1024), iPad Pro vertical (1024), Nest Hub (1024).
   The user asked these to shift 15px further left. Was -30px → now -45px. */
@media (min-width: 800px) and (max-width: 1099px) {
  .site-footer__world {
    transform: translateX(calc(-50% - 45px));
    width: calc(100vw + 200px);
  }
}

/* Medium-wide widths (1100-1399px): iPad Air horizontal (1180px),
   Surface Pro 7 horizontal (1368px). Need less leftward shift than the
   1400+ desktop range. -60px shift. */
@media (min-width: 1100px) and (max-width: 1399px) {
  .site-footer__world {
    transform: translateX(calc(-50% - 60px));
    width: calc(100vw + 200px);
  }
}

/* Ultra-wide foldables continuous (≥1600px): Asus Zenbook Fold vertical
   continuous (~1707), Galaxy Z Fold 5 horizontal continuous (~2076).
   User asked these to shift 15px further left. Standard desktop uses
   -100px; ultra-wide uses -115px. NOTE: 16" MBP (~1728) also falls in
   this range — earlier user confirmed -100px was "perfect" there, but
   most recent instruction overrides. If 16" MBP looks too-far-left
   now, tell me and we'll split the breakpoint further. */
@media (min-width: 1600px) {
  .site-footer__world {
    transform: translateX(calc(-50% - 115px));
    width: calc(100vw + 200px);
  }
}

/* Footer-map fine-tuning (Daniel): tablet sizes (≤1099px) nudge the map ~15px
   LEFT; desktop sizes (≥1100px) nudge it ~10px RIGHT. Scoped to .site-footer so
   the about-page geo map (.about-geo__map .site-footer__world), which reuses the
   same component, is NOT affected. Each override lives in its matching
   breakpoint so it only overrides that tier's shared rule.
   Tablet  720–799 : -30 → -45  (15px left)
   Tablet  800–1099: -45 → -60  (15px left)
   Desktop 1100–1399: -60 → -50 (10px right)
   Desktop 1400–1599: -100 → -90 (10px right; this tier has no shared media rule)
   Desktop ≥1600   : -115 → -105 (10px right) */
@media (min-width: 720px) and (max-width: 799px) {
  .site-footer .site-footer__world { transform: translateX(calc(-50% - 45px)); }
}
@media (min-width: 800px) and (max-width: 1099px) {
  .site-footer .site-footer__world { transform: translateX(calc(-50% - 60px)); }
}
@media (min-width: 1100px) and (max-width: 1399px) {
  .site-footer .site-footer__world { transform: translateX(calc(-50% - 50px)); }
}
@media (min-width: 1400px) and (max-width: 1599px) {
  .site-footer .site-footer__world { transform: translateX(calc(-50% - 90px)); }
}
@media (min-width: 1600px) {
  .site-footer .site-footer__world { transform: translateX(calc(-50% - 105px)); }
}

/* Mobile: don't hide the map. The four-column footer collapses to one
   stacked column at this breakpoint, so there's no column gap to position
   the watermark behind. Instead, the map becomes a dedicated short banner
   that appears AT THE BOTTOM of the footer (just above the copyright line),
   pulled out of the absolute-positioned watermark flow and rendered inline
   inside .site-footer__bottom. We do this in pure CSS by re-anchoring the
   element with a sibling-relative position. */
@media (max-width: 719px) {
  /* On mobile, the map flows in normal layout as a banner between the
     link columns and the copyright row. No more absolute positioning;
     the footer is just three stacked blocks: links → map → copyright. */
  .site-footer__world {
    position: relative;
    top: auto;
    bottom: auto;
    left: auto;
    width: 100%;
    height: 234px;
    transform: none;
    margin-top: 40px;
    border-top: 1px solid rgba(255, 255, 255, 0.08);
    border-bottom: 1px solid rgba(255, 255, 255, 0.08);
    overflow: hidden;
  }
  /* Map zoom on mobile is handled via JS that swaps the SVG's viewBox
     attribute to a Moldova-focused rect (see the IIFE at bottom of doc).
     This avoids all the CSS-transform-scale math that doesn't work
     consistently across viewport aspect ratios. Below the breakpoint,
     the SVG element itself fills the band, and the SVG's own viewBox
     controls what's visible — Moldova centered, every time. */
  .site-footer__world svg {
    transform: none;
  }
  /* Map paths slightly more visible on mobile since they're zoomed */
  .site-footer__world .nld-map-paths {
    opacity: 0.16;
  }
  /* Label on mobile: bigger, more visible since it's the focal element */
  .site-footer__world .nld-map-pin-label.city {
    font-size: 6px;
  }
  .site-footer__world .nld-map-pin-label.country {
    font-size: 5px;
  }
  /* Copyright row sits naturally AFTER the map in DOM and visual flow.
     Reset its base margin-top (which is 64px on desktop for spacing
     from the link columns) so the copyright sits flush against the
     map's bottom border on mobile. Also remove the redundant top border
     since the map's border-bottom already provides the separator line. */
  /* .site-footer .site-footer__bottom for higher specificity than the
     base .site-footer__bottom rule that follows later in source order.
     Mobile copyright row sits flush against the map's border-bottom
     above it AND flush to the screen edge below it. */
  .site-footer .site-footer__bottom {
    position: relative;
    z-index: 3;
    margin-top: 0;
    padding-top: 12px;
    padding-bottom: 0;
    border-top: none;
  }
  /* On mobile, the subfooter children stack. DOM order is:
       1. copyright (span)
       2. legal links (nav)
       3. theme switch (div)
     Daniel's spec wants the visual mobile order to be:
       legal links → theme → copyright (last)
     Use `order` on each child to rearrange. */
  .site-footer .site-footer__bottom > .site-footer__copyright {
    order: 3;
    justify-self: center;
    text-align: center;
  }
  .site-footer .site-footer__bottom > .site-footer__legal {
    order: 1;
    justify-self: center;
  }
  .site-footer .site-footer__bottom > .theme-switch {
    order: 2;
    justify-self: center;
  }
  /* Kill the footer's outer padding-bottom on mobile, but keep 16px so
     the copyright text isn't flush against the very edge of the screen. */
  .site-footer {
    padding-bottom: 16px;
  }
}

.site-footer__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 40px;
  position: relative;
  z-index: 2;
}
/* Phone landscape / small tablet (480–719px): brand full-width on row 1,
   menu columns wrap into a 2-up grid so the lists don't waste vertical
   space stacked one-per-row. Layout:
     Row 1 (col 1): Services       Row 1 (col 2): Industries
     Row 2 (col 1): Company         (col 2 empty — Industries' list takes
                                     the vertical space alongside).
   DOM order is brand → services → industries → company; we use explicit
   grid placement on the menu columns so Company falls under Services. */
@media (min-width: 480px) and (max-width: 1099px) {
  .site-footer__grid {
    grid-template-columns: 1fr 1fr;
    gap: 32px 32px;
  }
  .site-footer__brand { grid-column: 1 / -1; }
  /* The four child columns of .site-footer__grid in DOM order are:
       1 = brand     (spans full width, placed above)
       2 = services
       3 = industries
       4 = company
     Force services → (1,1), industries → (1,2), company → (2,1). */
  .site-footer__grid > div:nth-of-type(2) { grid-column: 1; grid-row: 2; }
  .site-footer__grid > div:nth-of-type(3) { grid-column: 2; grid-row: 2; }
  .site-footer__grid > div:nth-of-type(4) { grid-column: 1; grid-row: 3; }
}
/* Surface Duo & narrow phones (<600px): one clean single column with Company
   directly under Services. `order` reorders the stack without disturbing the
   nth-of-type grid placement used at wider breakpoints. DOM order is
   brand → services → industries → company; we lift company above industries. */
@media (max-width: 599px) {
  .site-footer__grid { grid-template-columns: 1fr; }
  .site-footer__brand { grid-column: 1; }
  .site-footer__grid > div:nth-of-type(2),
  .site-footer__grid > div:nth-of-type(3),
  .site-footer__grid > div:nth-of-type(4) { grid-column: 1; grid-row: auto; }
  .site-footer__grid > div:nth-of-type(2) { order: 1; } /* Services */
  .site-footer__grid > div:nth-of-type(4) { order: 2; } /* Company → right under Services */
  .site-footer__grid > div:nth-of-type(3) { order: 3; } /* Industries (longest list) last */
}
/* ≥1100px the world map is a full watermark behind the columns. Reserve an EMPTY
   central LANE (grid track 3) so the Chișinău pin + label always sit clearly
   BETWEEN the menu columns and never land on menu text — at every size, because
   the grid is proportional. Layout: brand | services | [pin lane] | industries |
   company.
   NOTE: this 5-track watermark layout is DESKTOP-ONLY (≥1100). On tablet portrait
   (iPad mini 768, iPad Air 820) the tracks get too narrow — the pin lane collapses
   and the menu columns overlap the Chișinău label, and the Sectors column wraps and
   runs long. Tablet uses the 2-up grid + Moldova map banner instead (block below). */
@media (min-width: 1100px) {
  .site-footer__grid {
    grid-template-columns: 1.4fr 1fr 0.5fr 1fr 1fr;
    gap: 56px;
  }
  .site-footer__grid > :nth-child(1) { grid-column: 1; } /* brand    */
  .site-footer__grid > :nth-child(2) { grid-column: 2; } /* services */
  .site-footer__grid > :nth-child(3) { grid-column: 4; } /* industries */
  .site-footer__grid > :nth-child(4) { grid-column: 5; } /* company  */
}

/* Tablet (720–1099px): NOT enough room for the watermark + 5 tracks. Instead of a
   bottom banner, the map sits in the EMPTY top-right cell next to the brand (Daniel's
   requested spot), and the columns use the roomier 2-up grid. Two moves:
     1. Brand stops spanning full width → frees col2/row1 for the map.
     2. Sectors spans rows 2–3 so Company sits directly UNDER Services (col1), instead
        of being pushed below the long Sectors list.
   The map itself is pulled out of the watermark flow and absolutely parked in that
   top-right space (Moldova-focused — world-map.js zooms it at <1100). Its height is
   capped BELOW the brand-column height at every tablet width so it never bleeds down
   into the Sectors list beneath it.
   NOTE (Daniel): top/height are visual estimates — I can't render iPad widths locally.
   Nudge `height` if you want the map taller/shorter on the real iPad. */
@media (min-width: 720px) and (max-width: 1099px) {
  .site-footer .container { position: relative; }

  .site-footer__brand { grid-column: 1; }

  .site-footer__grid > div:nth-of-type(3) { grid-row: 2 / span 2; align-self: start; }

  .site-footer .site-footer__world {
    position: absolute;
    top: 0;
    left: 50%;
    right: var(--gutter);
    bottom: auto;
    width: auto;
    /* Shorter than the brand column at every tablet width so a clear gap always
       sits between the map and the Domenii/Sectors column below it (was 440px,
       which could meet the brand height and leave only the 32px row-gap). */
    height: 340px;
    transform: none;
    margin: 0;
    border: 1px solid rgba(255, 255, 255, 0.10);
    border-radius: 12px;
    overflow: hidden;
    z-index: 1;
  }
  .site-footer .site-footer__world svg { transform: none; }
  .site-footer__world .nld-map-paths { opacity: 0.16; }
  .site-footer__world .nld-map-pin-label.city { font-size: 6px; }
  .site-footer__world .nld-map-pin-label.country { font-size: 5px; }
}
.site-footer h4 {
  font-size: 12px;
  color: var(--white);
  font-weight: 600;
  margin: 0 0 18px 0;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}
.site-footer ul { display: grid; gap: 10px; }
.site-footer a { transition: color var(--t-med) var(--ease); }
.site-footer a:hover { color: var(--red); }
.site-footer__brand .brand { margin-bottom: 20px; }
.site-footer__location {
  font-size: 13px;
  line-height: 1.6;
  margin-bottom: 20px;
  color: rgba(255, 255, 255, 0.5);
}
.site-footer__location strong {
  color: var(--white);
  font-weight: 600;
}
.site-footer__phones {
  display: grid;
  gap: 6px;
  font-size: 13px;
  margin-bottom: 24px;
}
.site-footer__phones span {
  color: rgba(255, 255, 255, 0.4);
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}
/* Mobile (≤720px): phones go side-by-side as two columns. Each column has
   its label on top of the number. The DOM order is span/a/span/a so we use
   explicit grid placement to keep label+number paired in their column. */
@media (max-width: 719px) {
  .site-footer__phones {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-template-rows: auto auto;
    gap: 4px 24px;
    margin-bottom: 24px;
  }
  /* First label → top-left, first number → bottom-left,
     second label → top-right, second number → bottom-right. */
  .site-footer__phones > :nth-child(1) { grid-column: 1; grid-row: 1; margin-top: 0 !important; }
  .site-footer__phones > :nth-child(2) { grid-column: 1; grid-row: 2; }
  .site-footer__phones > :nth-child(3) { grid-column: 2; grid-row: 1; margin-top: 0 !important; }
  .site-footer__phones > :nth-child(4) { grid-column: 2; grid-row: 2; }
}

/* Mobile-only language switcher row. Hidden on desktop (the in-brand
   instance handles desktop). On mobile, the in-brand instance is hidden
   and this one shows, positioned between the menu columns and the map. */
.site-footer__lang--mobile {
  display: none;
  padding: 18px 0 6px;
  /* v2.24 — centered horizontally on mobile, sits between world map and
     the subfooter row per Daniel's spec */
  text-align: center;
}
.site-footer__lang--mobile .lang-switch--footer {
  margin-top: 0;
  justify-content: center;
}
@media (max-width: 719px) {
  .site-footer__lang--mobile { display: block; }
  .site-footer__brand .lang-switch--footer { display: none; }
}
.site-footer__socials {
  display: flex;
  gap: 10px;
}
.site-footer__social {
  width: 36px;
  height: 36px;
  border: 1px solid rgba(255, 255, 255, 0.15);
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: rgba(255, 255, 255, 0.7);
  transition: all var(--t-med) var(--ease);
}
.site-footer__social svg {
  width: 15px;
  height: 15px;
  fill: currentColor;
}
/* Higher specificity than .site-footer a:hover so the icon stays white
   (not red) when the circle is red on hover.
   Note: previously had `transform: translateY(-2px)` on hover, which
   caused a flicker when hovering the icon's bottom edge — the icon would
   move up out from under the cursor, then snap back. Removed it; the
   color flip is sufficient feedback. */
.site-footer a.site-footer__social:hover {
  background: var(--red);
  color: var(--white);
  border-color: var(--red);
}
/* Subfooter row.
   Desktop: 3 columns — copyright (left), legal links (centered), theme switch (right).
   Mobile: stacks. Order is set further down by `order:` on each child. */
.site-footer__bottom {
  margin-top: 64px;
  padding-top: 24px;
  display: grid;
  grid-template-columns: 1fr;
  align-items: center;
  gap: 12px;
  font-size: 12px;
  color: rgba(255, 255, 255, 0.4);
  position: relative;
  z-index: 2;
}
/* v2.11 — Desktop: four columns on one line.
   copyright (1fr) | legal (auto, centered) | theme-switch (auto) | back-to-top (auto). */
@media (min-width: 720px) {
  .site-footer__bottom {
    grid-template-columns: minmax(0, 1fr) auto auto auto;
    gap: 18px;
  }
  .site-footer__legal      { justify-self: center; }
  .site-footer__bottom .theme-switch { justify-self: end; }
  .site-footer__top        { justify-self: end; }
}
/* v2.24 — Mobile subfooter (replaces v2.22 layout).
   Row 1: legal nav (privacy / sitemap / terms), centered
   Row 2: back-to-top arrow + theme switch CENTERED as a pair (using a
          1fr auto auto 1fr grid so the two auto cols hug the middle)
   Row 3: copyright — LAST line on the website, centered
   DOM order (copyright / top / legal / theme-switch) is unchanged; CSS
   re-anchors visual order via grid-row + grid-column. */
@media (max-width: 719px) {
  .site-footer__bottom {
    grid-template-columns: 1fr auto auto 1fr;
    gap: 14px 12px;
    text-align: center;
  }
  .site-footer__bottom > .site-footer__legal      { grid-column: 1 / -1; grid-row: 1; justify-self: center; }
  .site-footer__bottom > .site-footer__top        { grid-column: 2; grid-row: 2; justify-self: end; }
  .site-footer .site-footer__bottom .theme-switch { grid-column: 3; grid-row: 2; justify-self: start; }
  .site-footer__bottom > .site-footer__copyright  { grid-column: 1 / -1; grid-row: 3; justify-self: center; }
}
.site-footer__bottom a:hover { color: var(--red); }

/* Privacy / Sitemap / Terms — kept together as one inline group that never
   wraps internally. */
.site-footer__legal {
  display: inline-flex;
  flex-wrap: nowrap;
  align-items: center;
  white-space: nowrap;
}
.site-footer__legal li {
  list-style: none;
  display: inline-flex;
  align-items: center;
  margin: 0;
  padding: 0;
  white-space: nowrap;
}
.site-footer__legal li + li::before {
  content: "·";
  margin: 0 8px;
  color: rgba(255, 255, 255, 0.3);
}
.site-footer__legal li a {
  color: rgba(255, 255, 255, 0.6);
  text-decoration: none;
}
.site-footer__legal li a:hover { color: var(--red); }

/* Below 380px (small phones / split-screen views) the three legal labels
   plus separators no longer fit on one line at the default 12px. Drop
   font-size so it still fits without wrapping. */
@media (max-width: 379px) {
  .site-footer__legal { font-size: 11px; letter-spacing: 0; }
  .site-footer__legal li + li::before { margin: 0 6px; }
}

/* Theme switch in the subfooter: shrink it so it matches the privacy-link
   typography rhythm. */
.site-footer__bottom .theme-switch {
  margin-top: 0;
  font-size: 10px;
  gap: 8px;
}
.site-footer__bottom .theme-switch__label { color: rgba(255, 255, 255, 0.4); }
.site-footer__bottom .theme-switch__item { padding: 4px 10px; }

/* Hide WPML language switcher if it's been added to the sub-footer menu —
   the brand-column switcher is the canonical one. */
.site-footer__bottom .wpml-ls-menu-item { display: none !important; }
.site-footer__bottom .wpml-ls-menu-item + li::before { content: none; }

/* ---------- STICKY MOBILE CTA ---------- */
.sticky-cta {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  background: var(--ink);
  color: var(--white);
  padding: 14px 20px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  z-index: 40;
  transform: translateY(100%);
  transition: transform 0.5s var(--ease-out);
  border-top: 1px solid rgba(255, 33, 61, 0.3);
  box-shadow: 0 -10px 30px rgba(0, 0, 0, 0.3);
}
.sticky-cta.is-visible { transform: translateY(0); }
.sticky-cta__text { font-size: 14px; font-weight: 500; }
.sticky-cta__btn {
  background: var(--red);
  color: var(--white);
  height: 40px;
  padding: 0 18px;
  border-radius: 6px;
  font-weight: 500;
  font-size: 13px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.sticky-cta__close {
  color: rgba(255, 255, 255, 0.5);
  font-size: 20px;
  padding: 4px 8px;
  line-height: 1;
}
@media (min-width: 960px) { .sticky-cta { display: none; } }

/* ---------- COUNT-UP RESULT NUMBERS ---------- */
/* Numbers start at 0 and animate to their final value via a JS swap.
   tabular-nums keeps every digit the same width so the figure doesn't jiggle
   as it counts. Applies in all themes. */
.result-card__number {
  font-variant-numeric: tabular-nums;
}
.result-card__number.is-counting {
  color: var(--red);
}

/* ============================================================================
   SURFACE DUO / FOLDABLE DUAL-SCREEN OPTIMIZATION
   ============================================================================
   Foldables like Surface Duo span content across two screens with a physical
   seam/hinge between them. The browser reports a continuous viewport width
   but the user's eye sees a break in the middle. Goal: don't let critical
   content (CTAs, faces, key headings, the map pin) land on the seam.

   We use the standardized CSS env() variables for viewport segments where
   supported, with fallbacks for older Duo browsers that only know the
   experimental "screen-spanning" media feature.

   Two spanning modes:
     - horizontal-viewport-segments: 2 → side-by-side screens, vertical seam
     - vertical-viewport-segments: 2   → stacked screens, horizontal seam
*/

/* --- HORIZONTAL DUAL-SCREEN (Duo unfolded landscape, ~1114x720) --- */
@media (horizontal-viewport-segments: 2) {

  /* Layout strategy: collapse multi-column grids to 2 columns so the gutter
     between columns aligns with the seam. The seam at Duo dual is in the
     center, and a 2-column layout naturally has its gap there. */

  /* Hero: keep two columns but align the column gap with the seam.
     The seam center is at env(viewport-segment-right 0 0), which is the
     right edge of the LEFT screen. We position the gap to match. */
  .hero__inner {
    grid-template-columns: 1fr 1fr;
    column-gap: env(viewport-segment-left 1 0, 56px) - env(viewport-segment-right 0 0, 0px);
  }

  /* Service cards section ("What we do") — the centered "+" badge between
     the two cards lands exactly on the seam. Hide it on Duo dual. */
  .what__grid::after {
    display: none;
  }

  /* Results grid (3 cols on desktop): collapse to 2 columns so the column
     gap aligns with the seam instead of a card straddling it. */
  .results__grid {
    grid-template-columns: 1fr 1fr;
  }

  /* Selected Work (3 cards): collapse to 2 cards visible per row.
     The middle card was crossing the seam; now we have 2 + 1 wrap. */
  .work__grid {
    grid-template-columns: 1fr 1fr;
  }

  /* How We Work (3 cards): same treatment as Results. */
  .how__grid {
    grid-template-columns: 1fr 1fr;
  }

  /* Insights (4 cards): collapse to 2 columns so the gap between cols
     2-3 falls on the seam. */
  .insights__grid {
    grid-template-columns: 1fr 1fr;
  }

  /* Contact section: the form on the right and copy/quote on the left
     already naturally split. We adjust the ratio so the column boundary
     sits ON the seam, giving each screen one element cleanly. */
  .contact__inner {
    grid-template-columns: 1fr 1fr;
  }

  /* Footer 4-col grid: drop to 2 cols so the brand block sits on the left
     screen and the link columns stack on the right. */
  .site-footer__grid {
    grid-template-columns: 1fr 1fr;
    gap: 40px;
  }

  /* World map pin: at viewport width 1114, the desktop -100px shift would
     put Moldova at vw*0.557 - 100 = 521px, very close to the seam (~558px).
     Pull it further left so the pin sits clearly inside the LEFT screen
     rather than on the hinge. */
  .site-footer__world {
    transform: translateX(calc(-50% - 180px));
  }

  /* Pre-footer CTA: already has text-left, buttons-right structure.
     Tighten the column ratio so the split matches the seam. */
  .prefooter__inner {
    grid-template-columns: 1fr auto;
  }
}

/* --- VERTICAL DUAL-SCREEN (Duo unfolded portrait, ~720x1114) --- */
@media (vertical-viewport-segments: 2) {
  /* Horizontal seam runs through the page at roughly the middle vertically.
     Sections naturally stack with their own padding, so most content is
     fine — but we make sure critical headings + CTAs don't land on the
     seam. The header is sticky at the top of the upper screen; the sticky
     mobile CTA would land at the bottom of the lower screen — both safe.

     Main concern: the hero's title + composition might split awkwardly
     across the seam. We add a touch more padding to the hero so the
     "growth" word in the composition isn't bisected. */
  .hero {
    padding-block: clamp(40px, 6vw, 80px);
  }
}

/* --- FALLBACK for older Duo browsers (only support screen-spanning) --- */
@media (screen-spanning: single-fold-vertical) {
  /* Same rules as horizontal-viewport-segments: 2 — Duo with the fold
     running vertically (i.e., side-by-side screens). */
  .what__grid::after { display: none; }
  .results__grid,
  .work__grid,
  .how__grid,
  .insights__grid,
  .contact__inner,
  .site-footer__grid {
    grid-template-columns: 1fr 1fr;
  }
  .site-footer__world {
    transform: translateX(calc(-50% - 180px));
  }
}

/* ----------------------------------------------------------------
   Utility: optional line break only at medium-up viewports.
   Use as <br class="br--md-up"> inside a headline to force a
   break on desktop/tablet while letting the text wrap naturally
   on phones (where forced breaks often produce orphan words).
   v1.67 — introduced for the About hero title which had a weird
   forced break on iPhone Pro Max portrait.
   ---------------------------------------------------------------- */
.br--md-up { display: none; }
@media (min-width: 600px) {
  .br--md-up { display: inline; }
}

/* ----------------------------------------------------------------
   WordPress accessibility utilities.
   Standard WP convention — these classes are used by core, themes,
   and many plugins. The .screen-reader-text class visually hides
   content while keeping it readable by screen readers; .skip-link
   gives keyboard users a way to jump past the nav.
   ---------------------------------------------------------------- */
.screen-reader-text {
  border: 0;
  clip: rect(1px, 1px, 1px, 1px);
  -webkit-clip-path: inset(50%);
  clip-path: inset(50%);
  height: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute !important;
  width: 1px;
  word-wrap: normal !important;
}
.screen-reader-text:focus {
  background-color: var(--color-bg);
  clip: auto !important;
  -webkit-clip-path: none;
  clip-path: none;
  color: var(--color-text);
  display: block;
  font-size: 14px;
  font-weight: 600;
  height: auto;
  left: 5px;
  line-height: normal;
  padding: 12px 16px;
  text-decoration: none;
  top: 5px;
  width: auto;
  z-index: 999;
}
.skip-link {
  position: absolute;
  top: -100px;
  left: 0;
  z-index: 100000;
}
.skip-link:focus {
  top: 0;
}

/* The count-up animation targets a <span class="num"> inside result cards.
   No special styling needed — it inherits everything from .result-card__number.
   Declaring the class explicitly here just to satisfy linters / make the
   targeting visible in the stylesheet. */
.result-card__number .num { color: inherit; font: inherit; }

/* ============================================================
   v1.62 — ABOUT PAGE (Round 5)
   ============================================================ */

/* About-scoped tinted background.
   `--brand-off-white` (#FAFAFB) is too close to pure white for the
   page-level rhythm to read as alternating. Override it inside the
   About container so the tinted sections look meaningfully different
   from the paper sections — without affecting other pages that use
   --color-bg-alt for different purposes.
   In dark mode the inherited value is already correct (#14201F), so
   we only override for light. */
.site-main--about {
  --color-bg-alt: #F2F4F7;
}
/* Auto dark — match the site's standard pattern. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .site-main--about {
    --color-bg-alt: #14201F;
  }
}
/* Manual dark override. */
:root[data-theme="dark"] .site-main--about {
  --color-bg-alt: #14201F;
}

/* Section order (page-about.php):
     1. .about-hero          – homepage-style composition card hero
     2. .about-team-band     – asymmetric 3-photo editorial composition
     3. .about-quotes        – uses .contact__quote pattern from homepage
     4. .about-story         – narrative + timeline
     5. .about-why           – numbers cards
     6. .about-founder       – Daniel profile
     7. .about-institutional – EBRD / World Bank project cards
     8. .about-recognition   – partner logos + 14 Clutch badges
     9. .about-geo           – world map (dark band)

   Section background rhythm (v1.62 item 7 fix):
   We alternate light tones so the page doesn't read as
   "white-after-white-after-white" in light mode. Uses --color-bg
   (paper) and --color-bg-alt (off-white) as the two light tones,
   plus --ink for the geography dark band.

     Hero            : --color-bg     (paper)
     Team band       : --color-bg-alt (off-white tint)
     Quotes          : --color-bg     (paper)
     Story           : --color-bg-alt (off-white tint)
     Why us          : --color-bg     (paper)
     Founder         : --color-bg-alt (off-white tint)
     Institutional   : --color-bg     (paper)
     Recognition     : --color-bg-alt (off-white tint)
     Geography       : --ink          (dark, unchanged)

   ============================================================ */

/* ---------- ABOUT HERO (v1.62 — homepage-style composition card) ---------- */
.about-hero {
  position: relative;
  /* Top padding cut ~50% per Daniel v1.60. Bottom padding kept generous. */
  padding: clamp(28px, 4vw, 56px) 0 clamp(64px, 8vw, 120px);
  background: var(--color-bg);
  overflow: hidden;
}
.about-hero::before {
  /* Subtle red glow lower-left, mirrors homepage hero treatment */
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, transparent 0%, var(--color-bg-alt) 100%);
  z-index: -1;
}
.about-hero__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(40px, 5vw, 80px);
  align-items: center;
}
@media (min-width: 960px) {
  .about-hero__inner { grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr); }
}
.about-hero__copy { animation: fadeUp 1.1s var(--ease-out) 0.05s both; }
.about-hero__eyebrow { margin-bottom: 28px; }
.about-hero__title  { margin: 0 0 32px; }
.about-hero__lead   { margin: 0 0 40px; max-width: 540px; }
.about-hero__ctas {
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
  margin-bottom: 32px;
}
.about-hero__clutch { margin-bottom: 20px; }
.about-hero__visual { animation: fadeUp 1.1s var(--ease-out) 0.15s both; }

/* ---------- ABOUT CARD (homepage-style composition) ---------- */
.about-card {
  position: relative;
  background: var(--ink);
  color: var(--white);
  border-radius: 24px;
  padding: clamp(36px, 4vw, 56px);
  min-height: 480px;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
.about-card::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(rgba(255,255,255,0.025) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,0.025) 1px, transparent 1px);
  background-size: 40px 40px;
  pointer-events: none;
}
.about-card__top {
  position: relative;
  z-index: 1;
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.5);
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.about-card__top-dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--red);
  animation: pulse 2s ease-in-out infinite;
}
.about-card__stats {
  position: relative;
  z-index: 1;
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: clamp(24px, 3vw, 40px) clamp(20px, 2.5vw, 40px);
  margin: clamp(24px, 3vw, 40px) 0;
}
.about-card__stat {
  border-top: 1px solid rgba(255, 255, 255, 0.12);
  padding-top: 14px;
  min-width: 0; /* let grid cells shrink so long words (e.g. RU) don't overflow the card */
}
.about-card__stat-value {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(26px, 3.4vw, 42px);
  line-height: 1.05;
  letter-spacing: -0.025em;
  color: var(--white);
  margin-bottom: 8px;
  overflow-wrap: break-word; /* last-resort safety so nothing bleeds out of the card */
}
/* Long single-word values (e.g. RU "Интегрировано", "E-commerce") can't fit the
   big display size in a half-width stat cell at any 2-col width — render just
   those at a smaller size so they sit on one clean line. Numbers and short or
   multi-word values keep the full size. Flagged in PHP via nld_about_stat_value_class(). */
.about-card__stat-value--long { font-size: clamp(17px, 1.9vw, 25px); line-height: 1.15; }
.about-card__stat-label {
  font-family: var(--font-body);
  font-size: 11.5px;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.55);
  line-height: 1.3;
}
.about-card__bottom {
  position: relative;
  z-index: 1;
  display: flex;
  justify-content: space-between;
  align-items: center;
  /* Wrap to two lines on narrow phones instead of clipping the second label
     (e.g. RU "NLD основана в 2019") against the card's overflow:hidden. */
  flex-wrap: wrap;
  gap: 6px 16px;
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.4);
  border-top: 1px solid rgba(255, 255, 255, 0.12);
  padding-top: 18px;
}
.about-card__bottom span { display: inline-flex; align-items: center; gap: 6px; }
.about-card__bottom svg  { width: 12px; height: 12px; color: var(--red); }
/* v1.93 — Phones: shrink the stat-card values so long RU/RO words
   ("Сценарии", "Интегрировано", "Система") sit on one clean line instead of
   breaking mid-word in the ~110px half-cell, and tighten the card padding for
   a little more room. (Daniel: "the text must be smaller, otherwise it starts
   to overlap or be too close.") Caps are matched to the base sizes at 600px,
   so desktop/tablet (>600px) render identically. */
@media (max-width: 600px) {
  .about-card { padding: clamp(24px, 6vw, 36px); }
  .about-card__stat-value { font-size: clamp(20px, 5.6vw, 26px); }
  .about-card__stat-value--long { font-size: clamp(12px, 3.7vw, 17px); }
}

/* ---------- TEAM BAND (v1.62 — asymmetric 3-photo composition) ----------
   12-column grid. One large photo on the left spanning 7 cols and the
   full height; two narrower photos stacked on the right spanning 5 cols
   and half-height each. Reads more like a magazine spread than a clip-art
   grid. On mobile, the lead photo takes full width and the two right-side
   photos sit side-by-side below. */
.about-team-band {
  padding: clamp(64px, 8vw, 112px) 0;
  background: var(--color-bg-alt);
}
.about-team-band__header {
  max-width: 720px;
  margin-bottom: clamp(40px, 5vw, 64px);
}
.about-team-band__header .eyebrow { margin-bottom: 18px; }
.about-team-band__header .h-section { margin: 0 0 24px; }
.about-team-band__lead { margin: 0; max-width: 60ch; }
/* v1.63 — single stacked layout at all widths, matching the mobile
   composition Daniel preferred. Lead photo on top spanning full width
   with a wide aspect ratio (crops into legs intentionally — Daniel:
   "you can cut into the legs on the desktop version on the large image
   if you need to"). Two square photos below side-by-side. */
.about-team-band__composition {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(14px, 1.5vw, 20px);
}
.about-team-band__photo--lead {
  grid-column: 1 / -1;
  aspect-ratio: 16 / 7;
}
.about-team-band__photo--top-right,
.about-team-band__photo--bottom-right {
  aspect-ratio: 1 / 1;
}
@media (max-width: 540px) {
  /* On the narrowest mobile, slightly taller lead crop reads better. */
  .about-team-band__photo--lead { aspect-ratio: 16 / 10; }
}
.about-team-band__photo {
  position: relative;
  margin: 0;
  border-radius: 18px;
  overflow: hidden;
  background: var(--color-surface);
}
.about-team-band__photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform 0.6s var(--ease-out);
}
/* v1.64 — the lead photo uses an extra-wide aspect ratio (16:7) on desktop
   to give visual impact, which means tall photos get cropped top+bottom.
   Anchor the crop to the TOP edge so heads stay visible; the crop will eat
   into legs/floor instead. Per Daniel: "focus on the top side of the image". */
.about-team-band__photo--lead img {
  object-position: center top;
}
.about-team-band__photo:hover img {
  transform: scale(1.02);
}

/* ---------- CLIENT QUOTES (v1.62 — uses .contact__quote pattern) ----------
   The actual card visual is .contact__quote (defined elsewhere in this
   stylesheet, shared with the homepage Get Started section). The selectors
   below only handle the layout of the section header, the 3-up grid, and
   the spacing around the cards. */
.about-quotes {
  padding: clamp(64px, 8vw, 112px) 0;
  background: var(--color-bg);
}
.about-quotes__header {
  max-width: 760px;
  margin: 0 auto clamp(48px, 6vw, 72px);
}
.about-quotes__header .eyebrow { margin-bottom: 18px; }
.about-quotes__header .h-section { margin: 0 0 20px; }
.about-quotes__lead {
  margin: 0 auto;
  max-width: 56ch;
  text-align: center;
}
.about-quotes__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(20px, 2.5vw, 28px);
  align-items: stretch;
}
/* v1.68 — in the 2-col band, give the orphan 3rd card extra row-gap
   breathing room. Daniel: "too close to the other two at the top".
   Splits gap into row-gap and column-gap explicitly. */
@media (min-width: 480px) and (max-width: 879px) {
  .about-quotes__grid {
    row-gap: clamp(28px, 4vw, 40px);
    column-gap: clamp(16px, 2vw, 24px);
  }
}
/* v1.68 — review-card grid breakpoints rewritten again.
   Daniel needs:
     - Surface Pro 7 portrait (912px) and iPad Mini landscape (1133px)
       to show 3 per line → so 3-col kicks in at ≥880px.
     - Surface Duo portrait (540px) to show 2 per line → so 2-col kicks
       in at <540px boundary. Use 480px to give Surface Duo headroom
       since some viewports report effective width slightly less than
       physical pixels due to scrollbar/zoom rounding.
     - Surface Duo landscape (720px) shows 2 + 1 orphan; orphan needs to
       be centered horizontally (handled by the :last-child rule below).
     - Galaxy Z Fold portrait (344px) stays 1-col with normal card width.

   Final breakpoints:
     < 480px       → 1 col
     480-879px     → 2 col, with the orphan 3rd card centered
     ≥ 880px       → 3 col (Surface Pro 7 portrait 912px lands here) */
@media (min-width: 480px) {
  .about-quotes__grid { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 880px) {
  .about-quotes__grid { grid-template-columns: repeat(3, 1fr); }
}
/* Orphan card centering: a card that is BOTH the last child AND
   :nth-child(odd) (i.e. card #1, #3, #5...) in a 2-col grid is an
   orphan on its own row. Span both columns and constrain to half
   width centered, so it sits visually centered. Only applies in the
   2-col band (480-879px). */
@media (min-width: 480px) and (max-width: 879px) {
  .about-quotes__card:last-child:nth-child(odd) {
    grid-column: 1 / -1;
    justify-self: center;
    width: 100%;
    max-width: calc(50% - clamp(10px, 1.25vw, 14px));
  }
}
.about-quotes__card {
  /* v1.69 — RESET the <blockquote> UA default margin (1em 40px). Every
     browser applies that margin by default, which was eating 80px of
     horizontal width per card on every viewport since v1.62. This is the
     single root cause of every "cards too narrow" complaint from v1.62
     through v1.68. With this reset, the card actually fills its grid
     cell as intended. */
  margin: 0;
  padding: 32px 28px 24px;
  display: flex;
  flex-direction: column;
  height: 100%;
}
.about-quotes__card .contact__quote-text {
  flex-grow: 1;
  font-size: clamp(17px, 1.4vw, 21px);
  margin-bottom: 24px;
}
.about-quotes__card .contact__quote-foot {
  /* v1.65 — Daniel: "make the stars vertically centered with the name and
     position on the right". Was align-items: flex-start in v1.64 which
     pinned stars to the top of the attribution block. */
  align-items: center;
  gap: 14px;
}
/* v1.64 — 2-tier attribution: name + role only (context dropped per Daniel:
   "I hate how the bottom of the review card is so unbalanced"). The
   variable-height role wrap made cards uneven. Role gets a reserved
   min-height to absorb 1-line vs 2-line role text, so all cards align. */
.about-quotes__card .contact__quote-attribution {
  gap: 4px;
}
.about-quotes__card .contact__quote-role {
  font-family: var(--font-body);
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  color: rgba(255, 255, 255, 0.72);
  line-height: 1.4;
  /* Reserve 2 lines of vertical space. Roles that fit in 1 line still
     occupy the same vertical footprint as roles that wrap to 2. Keeps
     the divider-line position consistent across the row.
     v1.67/68 — only reserve at multi-col widths (≥480px). At <480px each
     card stacks alone so reservation adds dead space below the quote
     text. The orphan card at 480-879px also benefits from reservation
     so its height matches its siblings. */
  min-height: calc(12.5px * 1.4 * 2);
}
@media (max-width: 479px) {
  /* v1.68 — only the empty-space-killing changes Daniel asked for. The
     v1.67 padding-shrink ("24px 22px 20px") is REVERTED — Daniel said
     "return to normal width". Card padding stays at the default
     32px 28px 24px. We only drop the role min-height (no reservation
     needed when cards stack alone) and trim the text->foot margin a bit. */
  .about-quotes__card .contact__quote-text { margin-bottom: 16px; }
  .about-quotes__card .contact__quote-role { min-height: 0; }
}
.about-quotes__cta {
  margin-top: clamp(32px, 4vw, 48px);
  text-align: center;
}

/* ---------- STORY + TIMELINE ---------- */
.about-story {
  padding: clamp(64px, 8vw, 112px) 0;
  background: var(--color-bg-alt);
}
.about-story__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(40px, 5vw, 72px);
}
@media (min-width: 960px) {
  .about-story__inner {
    grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
    gap: clamp(48px, 6vw, 96px);
  }
}
.about-story__copy .eyebrow { margin-bottom: 18px; }
.about-story__title { margin: 0 0 32px; }
.about-story__narrative {
  font-size: clamp(15px, 1.1vw, 17px);
  line-height: 1.7;
  color: var(--color-text-soft);
  max-width: 56ch;
}
.about-story__narrative p { margin: 0 0 18px; }
.about-story__narrative p:last-child { margin-bottom: 0; }

.about-timeline {
  list-style: none;
  margin: 0;
  padding: 0;
  position: relative;
}
.about-timeline::before {
  content: "";
  position: absolute;
  left: 0;
  top: 6px;
  bottom: 6px;
  width: 1px;
  background: var(--color-border);
}
.about-timeline__item {
  position: relative;
  padding: 0 0 28px 28px;
  display: grid;
  grid-template-columns: 70px 1fr;
  gap: 20px;
  align-items: baseline;
}
.about-timeline__item:last-child { padding-bottom: 0; }
.about-timeline__item::before {
  content: "";
  position: absolute;
  left: -4px;
  top: 10px;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: var(--red);
  box-shadow: 0 0 0 4px var(--color-bg-alt);
}
.about-timeline__year {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(22px, 1.8vw, 28px);
  letter-spacing: -0.02em;
  color: var(--red);
  line-height: 1;
}
.about-timeline__heading {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(17px, 1.3vw, 20px);
  line-height: 1.25;
  color: var(--color-text);
  margin-bottom: 6px;
}
.about-timeline__desc {
  font-size: 14px;
  line-height: 1.55;
  color: var(--color-text-soft);
}

/* ---------- WHY US (numbers cards) ---------- */
.about-why {
  padding: clamp(64px, 8vw, 112px) 0;
  background: var(--color-bg);
}
.about-why__header {
  text-align: center;
  margin: 0 auto clamp(48px, 6vw, 80px);
  max-width: 720px;
}
.about-why__header .eyebrow { margin-bottom: 18px; }
.about-why__header .h-section { margin: 0 0 20px; text-align: center; }
.about-why__lead { margin: 0 auto; max-width: 56ch; }
.about-why__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(20px, 2.5vw, 32px);
}
@media (min-width: 760px) {
  .about-why__grid { grid-template-columns: repeat(3, 1fr); }
}
.about-why-card {
  position: relative;
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 16px;
  padding: clamp(28px, 3vw, 40px);
  transition: transform 0.25s var(--ease-out), border-color 0.25s var(--ease-out);
}
.about-why-card:hover {
  transform: translateY(-3px);
  border-color: var(--red);
}
.about-why-card__rank {
  position: absolute;
  top: clamp(20px, 2vw, 28px);
  right: clamp(20px, 2vw, 28px);
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.12em;
  color: var(--color-text-mute);
}
.about-why-card__value {
  font-family: var(--font-display);
  font-variation-settings: "opsz" 144, "wght" 500;
  font-style: italic;
  font-size: clamp(36px, 4.5vw, 56px);
  line-height: 1;
  letter-spacing: -0.025em;
  color: var(--red);
  margin: 8px 0 12px;
}
.about-why-card__unit {
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 500;
  color: var(--color-text-soft);
  margin-bottom: 24px;
  line-height: 1.4;
}
.about-why-card__heading {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(20px, 1.6vw, 24px);
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--color-text);
  margin: 0 0 12px;
}
.about-why-card__body {
  font-size: 14.5px;
  line-height: 1.6;
  color: var(--color-text-soft);
  margin: 0;
}

/* ---------- FOUNDER ---------- */
.about-founder {
  padding: clamp(64px, 8vw, 120px) 0;
  background: var(--color-bg-alt);
  scroll-margin-top: 120px; /* anchor target room for sticky header */
}
.about-founder__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(40px, 5vw, 80px);
  align-items: start;
}
@media (min-width: 880px) {
  .about-founder__inner {
    grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr);
  }
}
.about-founder__copy .eyebrow { margin-bottom: 18px; }
.about-founder__name { margin: 0 0 8px; }
.about-founder__role {
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--red);
  margin-bottom: 28px;
}
.about-founder__bio {
  font-size: clamp(15px, 1.1vw, 17px);
  line-height: 1.7;
  color: var(--color-text-soft);
  max-width: 56ch;
  margin-bottom: 32px;
}
.about-founder__bio p { margin: 0 0 18px; }
.about-founder__bio p:last-child { margin-bottom: 0; }

.about-founder__chips {
  list-style: none;
  margin: 0 0 32px;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 12px;
}
@media (min-width: 600px) {
  .about-founder__chips { grid-template-columns: repeat(2, 1fr); }
}
.about-founder__chip {
  border-left: 2px solid var(--red);
  padding: 6px 0 6px 14px;
}
.about-founder__chip-label {
  display: block;
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: 15px;
  line-height: 1.25;
  color: var(--color-text);
  margin-bottom: 2px;
}
.about-founder__chip-sub {
  display: block;
  font-size: 12px;
  letter-spacing: 0.04em;
  color: var(--color-text-soft);
}
.about-founder__actions {
  display: flex;
  gap: 14px;
  flex-wrap: wrap;
}
.about-founder__visual {
  position: relative;
  border-radius: 16px;
  overflow: hidden;
  aspect-ratio: 4 / 5;
  background: var(--color-surface);
}
.about-founder__visual img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ---------- INSTITUTIONAL ACCREDITATIONS ---------- */
.about-institutional {
  padding: clamp(64px, 8vw, 112px) 0;
  background: var(--color-bg);
}
.about-institutional__header {
  max-width: 760px;
  margin-bottom: clamp(40px, 5vw, 64px);
}
.about-institutional__header .eyebrow { margin-bottom: 18px; }
.about-institutional__header .h-section { margin: 0 0 24px; }
.about-institutional__lead { margin: 0; max-width: 70ch; }
.about-institutional__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(20px, 2.5vw, 28px);
}
@media (min-width: 720px) {
  .about-institutional__grid { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1100px) {
  .about-institutional__grid { grid-template-columns: repeat(4, 1fr); }
}
.about-inst-card {
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 14px;
  padding: clamp(24px, 2.5vw, 32px);
  display: flex;
  flex-direction: column;
  transition: border-color 0.25s var(--ease-out), transform 0.25s var(--ease-out);
}
.about-inst-card:hover {
  border-color: var(--red);
  transform: translateY(-3px);
}
.about-inst-card__sponsor {
  font-family: var(--font-body);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--red);
  margin-bottom: 14px;
}
.about-inst-card__project {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(18px, 1.4vw, 22px);
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--color-text);
  margin: 0 0 6px;
}
.about-inst-card__role {
  font-family: var(--font-body);
  font-size: 11.5px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--color-text-soft);
  margin-bottom: 16px;
}
.about-inst-card__desc {
  font-size: 14px;
  line-height: 1.55;
  color: var(--color-text-soft);
  margin: 0 0 16px;
  flex-grow: 1;
}
.about-inst-card__link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 13px;
  font-weight: 600;
  color: var(--red);
  text-decoration: none;
}
.about-inst-card__link:hover { text-decoration: underline; }

/* ---------- INDUSTRY RECOGNITION (v1.62 — partners row + 14 badges) ----- */
.about-recognition {
  padding: clamp(64px, 8vw, 112px) 0;
  background: var(--color-bg-alt);
}
.about-recognition__header {
  text-align: center;
  margin: 0 auto clamp(48px, 6vw, 72px);
  max-width: 760px;
}
.about-recognition__header .eyebrow { margin-bottom: 18px; }
.about-recognition__header .h-section { margin: 0 0 20px; }
.about-recognition__lead {
  margin: 0 auto;
  max-width: 60ch;
  text-align: center;
}
.about-recognition__subhead {
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--color-text-mute);
  margin-bottom: clamp(24px, 3vw, 36px);
  text-align: center;
}
.about-recognition__partners {
  margin-bottom: clamp(56px, 7vw, 88px);
}
.about-recognition__partners-row {
  /* .creds__row from homepage handles the wrap + spacing. About-specific
     overrides below: 8-column grid (since Clutch is excluded — was 9
     logos, now 8) at wide widths, and larger logo height for stronger
     visual presence. v1.64: Daniel asked to make this row larger after
     Clutch was removed. */
  margin: 0 auto;
}
@media (min-width: 1100px) {
  /* About partners has 8 logos (Clutch excluded); override homepage's
     9-col layout to use 8 columns at wide widths. With flexbox we
     achieve this via flex-basis on each item. */
  .about-recognition__partners-row.creds__row > .cred-logo {
    flex: 0 0 calc(12.5% - 14px);
    max-width: calc(12.5% - 14px);
  }
}
.about-recognition__partners-row .cred-logo {
  height: 96px; /* was 72px on homepage */
}
.about-recognition__partners-row .cred-logo--image img {
  height: 80px; /* was 64px on homepage */
}
.about-recognition__badges-block {
  /* nothing extra */
}
.about-recognition__badges-grid {
  /* v1.71 — switched from CSS grid to flexbox so the orphan last row
     centers automatically. With 14 badges in 5-col layout we get 5/5/4;
     the orphan row of 4 needs to be centered, not left-aligned. With
     flexbox + justify-content: center, full rows fill edge-to-edge
     (no visible centering effect) while orphan rows pick up the free
     space and distribute it equally on both sides. Each badge's
     flex-basis is set to (100% / N - gap-allowance) per breakpoint,
     matching the desired column count. */
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: flex-start;
  gap: clamp(20px, 2.5vw, 32px) clamp(16px, 2vw, 28px);
  max-width: 1200px;
  margin: 0 auto;
}
.about-recognition__badges-grid > .about-recognition__badge {
  /* Default: 2-col layout below 480px. flex-basis = 50% minus half the
     column gap so two items fit cleanly per row. */
  flex: 0 0 calc(50% - clamp(8px, 1vw, 14px));
  max-width: calc(50% - clamp(8px, 1vw, 14px));
  min-width: 0;
}
@media (min-width: 480px) {
  /* 3-col: 100/3 ≈ 33.333%. Subtract (2/3 of gap) per item so 3 fit
     with 2 gaps between them. */
  .about-recognition__badges-grid > .about-recognition__badge {
    flex: 0 0 calc(33.333% - clamp(11px, 1.34vw, 19px));
    max-width: calc(33.333% - clamp(11px, 1.34vw, 19px));
  }
}
@media (min-width: 820px) {
  /* 5-col: 20% - (4/5 of gap) per item. */
  .about-recognition__badges-grid > .about-recognition__badge {
    flex: 0 0 calc(20% - clamp(13px, 1.6vw, 23px));
    max-width: calc(20% - clamp(13px, 1.6vw, 23px));
  }
}
@media (min-width: 1200px) {
  /* 7-col: 100/7 ≈ 14.286%. Subtract (6/7 of gap) per item. With 14
     badges this divides evenly into 2 rows of 7 (no orphan). */
  .about-recognition__badges-grid > .about-recognition__badge {
    flex: 0 0 calc(14.286% - clamp(14px, 1.72vw, 24px));
    max-width: calc(14.286% - clamp(14px, 1.72vw, 24px));
  }
}
.about-recognition__badge {
  margin: 0;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  transition: transform 0.25s var(--ease-out);
  /* v1.64: badge can be rendered as either <figure> or <a> (when linking
     to the Clutch profile). Anchor styling needs to inherit color and
     drop the default underline. */
  color: inherit;
  text-decoration: none;
}
.about-recognition__badge:hover { transform: translateY(-3px); }
a.about-recognition__badge:hover .about-recognition__badge-label {
  color: var(--color-text);
}
.about-recognition__badge img {
  display: block;
  width: 100%;
  max-width: 120px;
  height: auto;
}
.about-recognition__badge-label {
  font-family: var(--font-body);
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: 0.04em;
  color: var(--color-text-soft);
  line-height: 1.3;
  max-width: 130px;
}
.about-recognition__cta {
  margin-top: clamp(40px, 5vw, 64px);
  text-align: center;
}

/* ---------- GEOGRAPHY ---------- */
.about-geo {
  padding: clamp(64px, 8vw, 112px) 0;
  background: var(--ink);
  color: var(--white);
}
.about-geo__header {
  max-width: 720px;
  margin: 0 auto clamp(40px, 5vw, 64px);
  text-align: center;
}
.about-geo__header .eyebrow {
  color: var(--red);
  margin-bottom: 18px;
}
.about-geo__header .h-section {
  margin: 0 0 24px;
  color: var(--white);
  text-align: center;
}
.about-geo__header .h-section em { color: var(--red); }
.about-geo__lead {
  color: rgba(255, 255, 255, 0.7);
  margin: 0 auto;
  max-width: 60ch;
}
.about-geo__map {
  position: relative;
  max-width: 1100px;
  margin: 0 auto;
  color: rgba(255, 255, 255, 0.45);
}
.about-geo__map .site-footer__world {
  position: relative;
  width: 100%;
  height: auto;
}
.about-geo__map .site-footer__world svg {
  width: 100%;
  height: auto;
  max-height: 520px;
  display: block;
}

/* ====================================================================
   SERVICES PAGE (v1.72)
   Sections:
     .services-hero               — same as .about-hero, aliased via dual class
     .services-pitch              — centered band, "Why one team"
     .services-list               — build / market service lists with numeric counter
     .services-industries-cta     — band that links to /industries/
   The hero reuses .about-hero CSS verbatim by sharing the class.
   ==================================================================== */

/* ---------- SERVICES PITCH ---------- */
.services-pitch {
  padding-block: clamp(56px, 7vw, 96px);
  /* v1.74 — Daniel: "hero section white, and next two sections one after
     another (why one team, we build), also white, makes it kinda boring."
     Pitch now sits on --color-bg-alt so there's a visible surface break
     between the hero and the Build list. Sequence becomes:
       hero (default) → pitch (alt) → build (default) → market (alt). */
  background: var(--color-bg-alt);
}
.services-pitch__inner {
  max-width: 760px;
  margin: 0 auto;
  text-align: center;
}
.services-pitch__eyebrow { margin-bottom: 18px; }
.services-pitch__heading {
  margin: 0 0 24px;
  text-align: center;
}
.services-pitch__heading strong {
  color: var(--red);
  font-weight: inherit;
}
.services-pitch__body {
  /* v1.76 — was --color-text-mute (intended for eyebrows/captions). Body
     paragraphs should use --color-text-soft. */
  color: var(--color-text-soft);
  font-size: clamp(17px, 1.2vw, 19px);
  line-height: 1.6;
  margin: 0 0 16px;
  max-width: 60ch;
  margin-left: auto;
  margin-right: auto;
}
.services-pitch__body:last-child { margin-bottom: 0; }

/* ---------- SERVICES LIST (build + market) ---------- */
.services-list {
  padding-block: clamp(64px, 8vw, 112px);
}
.services-list--build {
  background: var(--color-bg);
}
.services-list--market {
  background: var(--color-bg-alt);
}
/* Light/dark token alt-bg fallback — same approach as homepage. */
.services-list .section__header {
  max-width: 720px;
  margin: 0 auto clamp(40px, 5vw, 64px);
  text-align: center;
}
.services-list .section__header .eyebrow {
  margin-bottom: 18px;
}
.services-list .section__header .h-section {
  margin: 0 0 20px;
  text-align: center;
}
.services-list__intro {
  /* v1.76 — body paragraph, use --color-text-soft not --color-text-mute. */
  color: var(--color-text-soft);
  font-size: clamp(16px, 1.1vw, 18px);
  line-height: 1.6;
  margin: 0 auto;
  max-width: 60ch;
}
.services-list__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(32px, 3.5vw, 48px) clamp(24px, 3vw, 56px);
  max-width: 1100px;
  margin: 0 auto;
}
@media (min-width: 720px) {
  .services-list__grid { grid-template-columns: 1fr 1fr; }
}
.services-list__item {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.services-list__number {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-size: clamp(20px, 1.4vw, 22px);
  font-weight: 500;
  color: var(--red);
  letter-spacing: 0;
  line-height: 1;
  margin-bottom: 4px;
}
.services-list__name {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(22px, 1.7vw, 28px);
  line-height: 1.15;
  letter-spacing: -0.02em;
  margin: 0;
  color: var(--color-text);
}
.services-list__name em {
  font-style: italic;
  font-variation-settings: var(--font-display-italic);
  color: var(--red);
  font-weight: inherit;
}
.services-list__desc {
  /* v1.76 — body text, use --color-text-soft. */
  color: var(--color-text-soft);
  font-size: clamp(15px, 1.05vw, 16.5px);
  line-height: 1.55;
  margin: 0;
  max-width: 52ch;
}

/* ---------- SERVICES — INDUSTRIES CTA ---------- */
.services-industries-cta {
  padding-block: clamp(64px, 8vw, 112px);
  /* v1.74 — sit on --color-bg-alt so this section visually differs from
     the Selected Work section below (which uses --color-bg). */
  background: var(--color-bg-alt);
  text-align: center;
}
.services-industries-cta__inner {
  max-width: 720px;
  margin: 0 auto;
}
.services-industries-cta .eyebrow { margin-bottom: 18px; }
.services-industries-cta__heading {
  margin: 0 0 20px;
  text-align: center;
}
.services-industries-cta__heading em {
  font-style: italic;
  font-variation-settings: var(--font-display-italic);
  color: var(--red);
  font-weight: inherit;
}
.services-industries-cta__body {
  /* v1.76 — body text, use --color-text-soft. */
  color: var(--color-text-soft);
  font-size: clamp(16px, 1.1vw, 18px);
  line-height: 1.6;
  margin: 0 auto 32px;
  max-width: 60ch;
}
.services-industries-cta__btn {
  margin: 0 auto;
}

/* ====================================================================
   COMPOSITION CARD — DARK MODE VISIBILITY FIX (v1.74)
   --------------------------------------------------------------------
   Problem: in dark mode, page bg = --brand-ink AND the composition card
   bg = var(--ink) which aliases to the same value. So the card
   disappears against the page background, especially on About and
   Services. Daniel: "the card on the right is actually visible on the
   homepage, compared to the other pages in dark mode."

   Fix: in dark mode, give .hero__composition + .about-card a subtle
   visible border PLUS a lift shadow so the card has clear edges
   regardless of how dark the surrounding page is. The card bg stays
   on var(--ink) (same as before) so the dark-card design language is
   preserved — only the edge treatment changes. Applied to BOTH cards
   so homepage / about / services all behave identically.

   Light mode is unchanged: the existing shadow already gives the card
   plenty of separation against the off-white page bg.
   ==================================================================== */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .hero__composition,
  :root:not([data-theme="light"]) .about-card {
    border: 1px solid rgba(255, 255, 255, 0.1);
    box-shadow:
      0 1px 0 rgba(255, 255, 255, 0.04) inset,
      0 20px 60px rgba(0, 0, 0, 0.55),
      0 2px 8px rgba(0, 0, 0, 0.35);
  }
}
:root[data-theme="dark"] .hero__composition,
:root[data-theme="dark"] .about-card {
  border: 1px solid rgba(255, 255, 255, 0.1);
  box-shadow:
    0 1px 0 rgba(255, 255, 255, 0.04) inset,
    0 20px 60px rgba(0, 0, 0, 0.55),
    0 2px 8px rgba(0, 0, 0, 0.35);
}

/* ====================================================================
   COMPOSITION CARD — STACKED-LAYOUT HEIGHT FIX (v1.77 + v1.78)
   --------------------------------------------------------------------
   v1.77 — Daniel: "iphone se horizontal - the top hero black card on
   (homepage; about; services) pages is too tall. It was not like this
   before." Dropped min-height: 480px on the card itself below 720px.
   v1.78 — Two follow-ups from Daniel's next round of feedback:
     a) On homepage at iPhone SE landscape (667), there was still ~94px
        of empty space below the card. Cause: .hero__visual (the wrapper
        around the card) has its own min-height: 420px, separate from
        the card's min-height. v1.77 dropped the card but left the
        wrapper at 420px, so the card centered inside the taller wrapper
        and left a gap below. v1.78 also resets .hero__visual.
     b) iPhone 14 Pro Max landscape (932×430) was still hitting the
        full 480px card height because v1.77's breakpoint was 719.
        Extended to 960 — the same threshold where .hero__inner switches
        from 1-col to 2-col. So this rule fires whenever copy and card
        are stacked vertically (when there's no horizontal space to
        balance the card visual against the copy column).
   ==================================================================== */
@media (max-width: 959px) {
  .hero__composition,
  .about-card,
  .hero__visual {
    min-height: 0;
  }
}

/* ====================================================================
   ABOUT GEO → PREFOOTER SEAM (v1.79)
   --------------------------------------------------------------------
   Daniel: "mobile portrait - about page - why are there two lines
   between the where we work section and the still thinking about it
   section?"
   .about-geo (world map, dark --ink band) is immediately followed by
   .prefooter (also a dark --ink band). Both have generous vertical
   padding: geo padding-bottom clamp(64px,8vw,112px) + prefooter
   padding-top clamp(56px,7vw,96px). Because both backgrounds are the
   same color, the seam is invisible and the two paddings compound into
   one oversized void — ~120px at mobile portrait, reading as "two lines"
   of empty space.

   Fix: when .about-geo is directly followed by .prefooter, drop the
   geo's bottom padding. The prefooter's own top padding then provides
   all the breathing room for the seam — no doubling. Uses the adjacent
   sibling selector so this only applies on the about page (the only
   place these two dark bands touch). */
.about-geo:has(+ .prefooter) {
  padding-bottom: 0;
}
/* Fallback for browsers without :has() support — explicitly target the
   adjacency by giving .prefooter a negative-free reset is not possible
   without :has(), so we instead reduce the geo bottom padding via a
   body-class-free structural rule. Modern baseline (2024+) supports
   :has() across all evergreen browsers; this fallback is belt-and-
   suspenders for older Safari. */
@supports not (selector(:has(*))) {
  /* Without :has(), we can't detect the following sibling from the geo
     side. Accept a single combined gap instead by trimming the
     prefooter top padding on the about page body class. */
  body.page-template-page-about .prefooter {
    padding-top: clamp(40px, 5vw, 64px);
  }
}

/* ====================================================================
   SERVICE DETAIL PAGES (v1.80)
   page-service-detail.php — 7 sections. Reuses tokens + button system.
   Section bg alternation follows the locked rule (no two adjacent the
   same): hero(default) → what(alt) → how(default) → deliverables(alt)
   → timeline(dark, both modes) → selected-work(default) → cta(alt).
   ==================================================================== */

/* ---------- 1. HERO ---------- */
.service-hero {
  padding-block: clamp(40px, 6vw, 88px);
  background: var(--color-bg);
}
/* .service-hero__inner grid is provided by .about-hero__inner (the markup
   carries both classes) so the grid/gap/breakpoint are identical to the
   /services/ page hero. No grid rules needed here. */
.service-hero__breadcrumb {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 14px;
  color: var(--color-text-mute);
  margin-bottom: 20px;
}
.service-hero__breadcrumb a { color: var(--color-text-mute); text-decoration: none; }
.service-hero__breadcrumb a:hover { color: var(--red); }
.service-hero__eyebrow { margin-bottom: 16px; }
.service-hero__title { margin: 0 0 20px; }
.service-hero__lead {
  color: var(--color-text-soft);
  max-width: 56ch;
  margin: 0 0 32px;
}
.service-hero__ctas { display: flex; flex-wrap: wrap; gap: 16px; }
.service-hero__visual { position: relative; }
.service-hero__img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 24px;
  box-shadow: var(--shadow-card);
}

/* ---------- 2. WHAT IT IS ---------- */
.service-what { padding-block: clamp(56px, 7vw, 96px); background: var(--color-bg-alt); }
.service-what__inner { max-width: 760px; margin: 0 auto; text-align: center; }
.service-what__inner .eyebrow { margin-bottom: 18px; }
.service-what__heading { margin: 0 0 28px; text-align: center; }
.service-what__heading em { font-style: italic; font-variation-settings: var(--font-display-italic); color: var(--red); font-weight: inherit; }
.service-what__heading strong { color: var(--red); font-weight: inherit; }
.service-what__p {
  color: var(--color-text-soft);
  font-size: clamp(16px, 1.15vw, 18px);
  line-height: 1.65;
  margin: 0 auto 18px;
  max-width: 62ch;
  text-align: left;
}
.service-what__p:last-child { margin-bottom: 0; }
.service-what__p strong { color: var(--color-text); }

/* ---------- 3. HOW WE DO IT ---------- */
.service-how { padding-block: clamp(64px, 8vw, 112px); background: var(--color-bg); }
.service-how .section__header .eyebrow { margin-bottom: 18px; }
.service-how__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(24px, 3vw, 40px);
  max-width: 1100px;
  margin: 0 auto;
}
@media (min-width: 580px) and (max-width: 899px) {
  .service-how__grid { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 900px) {
  .service-how__grid { grid-template-columns: repeat(4, 1fr); }
}
.service-how__card { display: flex; flex-direction: column; gap: 10px; }
.service-how__num {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-size: clamp(22px, 1.6vw, 26px);
  font-weight: 500;
  color: var(--red);
  line-height: 1;
}
.service-how__name {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(19px, 1.4vw, 22px);
  line-height: 1.2;
  letter-spacing: -0.015em;
  margin: 0;
  color: var(--color-text);
}
.service-how__desc { color: var(--color-text-soft); font-size: 15.5px; line-height: 1.55; margin: 0; }

/* ---------- 4. DELIVERABLES ---------- */
.service-deliverables { padding-block: clamp(64px, 8vw, 112px); background: var(--color-bg-alt); }
.service-deliverables__inner { max-width: 900px; margin: 0 auto; }
.service-deliverables .section__header .eyebrow { margin-bottom: 18px; }
.service-deliverables__list {
  list-style: none;
  margin: 0 auto;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px 32px;
}
@media (min-width: 640px) { .service-deliverables__list { grid-template-columns: 1fr 1fr; } }
.service-deliverables__item {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  color: var(--color-text-soft);
  font-size: 16px;
  line-height: 1.5;
}
.service-deliverables__check {
  flex: 0 0 auto;
  width: 22px; height: 22px;
  border-radius: 50%;
  background: rgba(255, 33, 61, 0.1);
  color: var(--red);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 12px;
  margin-top: 1px;
}
.service-deliverables__note {
  margin: clamp(28px, 3vw, 40px) auto 0;
  max-width: 60ch;
  text-align: center;
  color: var(--color-text-mute);
  font-size: 14.5px;
  line-height: 1.55;
}

/* ---------- 4b. RESOURCE DOWNLOAD (optional PDF, e.g. portfolio) ---------- */
.service-resource { padding-block: clamp(48px, 6vw, 80px); }
.service-resource__card {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: clamp(24px, 4vw, 56px);
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 24px;
  padding: clamp(32px, 4vw, 56px);
  box-shadow: var(--shadow-card);
}
.service-resource__text { min-width: 0; }
.service-resource__text .eyebrow { margin-bottom: 14px; }
.service-resource__heading {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(24px, 2.4vw, 34px);
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin: 0 0 12px;
  color: var(--color-text);
}
.service-resource__heading em { font-style: italic; font-variation-settings: var(--font-display-italic); color: var(--red); font-weight: inherit; }
.service-resource__body {
  margin: 0;
  color: var(--color-text-soft);
  font-size: clamp(15px, 1.1vw, 17px);
  line-height: 1.6;
  max-width: 52ch;
}
.service-resource__action {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 10px;
  flex-shrink: 0;
}
.service-resource__meta { font-size: 13px; color: var(--color-text-mute); }
@media (max-width: 719px) {
  .service-resource__card { flex-direction: column; align-items: flex-start; text-align: left; }
  .service-resource__action { align-items: stretch; width: 100%; }
  /* Long RU/RO labels ("Descărcați portofoliul (PDF)") are wider than the
     full-width button on phones; .btn is nowrap+overflow:hidden so they clip.
     Let this button wrap to two lines and grow in height instead. */
  .service-resource__action .btn {
    justify-content: center;
    white-space: normal;
    height: auto;
    min-height: 54px;
    padding-top: 12px;
    padding-bottom: 12px;
    line-height: 1.25;
  }
}

/* ============================================================
 * PORTFOLIO — single project (work-single) — v2.05
 * ============================================================ */

/* ---------- HERO ---------- */
.work-hero { padding-top: clamp(40px, 6vw, 88px); }
.work-hero__title {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 400;
  font-size: clamp(34px, 5vw, 60px);
  line-height: 1.04;
  letter-spacing: -0.025em;
  margin: 18px 0 24px;
  color: var(--color-text);
}
.work-hero__title em { font-style: italic; font-variation-settings: var(--font-display-italic); color: var(--red); }
.work-hero__summary { margin: 0 0 28px; max-width: 56ch; color: var(--color-text-soft); font-size: clamp(16px, 1.2vw, 18px); line-height: 1.6; }
.work-hero__services { list-style: none; margin: 0 0 24px; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
.work-chip {
  display: inline-block; padding: 7px 14px;
  border: 1px solid var(--color-border); border-radius: 999px;
  font-size: 13px; font-weight: 500;
  color: var(--color-text-soft); text-decoration: none;
  transition: color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.work-chip:hover { color: var(--red); border-color: var(--red); }
.work-hero__meta { display: flex; flex-wrap: wrap; gap: 18px; margin-bottom: 28px; }
.work-hero__meta-item { font-size: 14px; color: var(--color-text-mute); position: relative; }
.work-hero__meta-item + .work-hero__meta-item::before { content: "·"; position: absolute; left: -11px; color: var(--color-text-mute); }
.work-hero__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 18px; }
.work-hero__result {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-size: clamp(18px, 1.6vw, 22px);
  color: var(--red);
}
/* Hero lead lines are kept to 3-5 words, so they all use the same MONTACO
 * red-result type — no size variant. The --quote modifier only signals that
 * the text is a client quote (rendered with quotation marks in the template). */
.work-hero__media { border-radius: 20px; overflow: hidden; box-shadow: var(--shadow-card); }
.work-hero__image { display: block; width: 100%; height: auto; }

/* ---------- STICKY SERVICE NAV ---------- */
/* --work-nav-top is set dynamically by assets/js/work-nav.js to match the
 * site-header's sticky-bottom. Fallback 72px in case JS doesn't run. */
:root { --work-nav-top: 72px; }
.work-nav {
  position: sticky; top: var(--work-nav-top);
  z-index: 50;
  background: var(--color-bg);
  border-bottom: 1px solid var(--color-border);
}
.work-nav__scroller {
  display: flex; flex-wrap: nowrap;
  gap: 2px;
  overflow-x: auto;
  scrollbar-width: none;
  padding: 4px 0;
  -webkit-overflow-scrolling: touch;
}
.work-nav__scroller::-webkit-scrollbar { display: none; }
.work-nav__link {
  flex: 0 0 auto;
  display: inline-flex; align-items: baseline; gap: 6px;
  padding: 7px 12px;
  border-radius: 999px;
  text-decoration: none;
  color: var(--color-text-soft);
  font-size: 12.5px;
  font-weight: 500;
  white-space: nowrap;
  transition: color var(--t-fast) var(--ease), background var(--t-fast) var(--ease);
}
.work-nav__link:hover { color: var(--red); }
.work-nav__link.is-active {
  color: var(--brand-paper);
  background: var(--brand-ink);
}
.work-nav__num {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  color: var(--red);
  font-size: 12.5px;
  line-height: 1;
}
.work-nav__link.is-active .work-nav__num { color: var(--red); }
.work-nav__label { letter-spacing: -0.005em; }

/* ---------- SERVICE MODULE (shared skeleton) ---------- */
.work-module {
  padding-block: clamp(64px, 8vw, 112px);
  scroll-margin-top: calc(var(--work-nav-top) + 80px);
}

/* --------------------------------------------------------------------
 * Module cadence — LOCKED EXPLICIT COLORS (NOT theme tokens), because
 * --color-bg / --color-surface resolve to near-identical values in each
 * theme (both ~white in light mode, both ~black in dark mode), making
 * "alternation" invisible. Locked colors create real rhythm regardless
 * of the visitor's theme: dark panels are dark in both modes, light
 * panels are light in both modes. Same discipline as the locked-dark
 * sections in the project rules (testimonials, "how we engage", etc.).
 *
 * Cadence (Build -> Market order): light / grey / DARK / light / grey
 * / DARK / light / grey / light / DARK. 3 dark moments + 2 grey + 5
 * light = real visual rhythm, with strong punctuation. The headline
 * result band + CTA below stay dark, so the page ends on a dark beat.
 * -------------------------------------------------------------------- */

/* --------------------------------------------------------------------
 * v2.14 — Revert v2.13's tier cadence. All modules respect the theme,
 * matching the rest of the site. ONE exception: the FIRST module after
 * the hero is locked dark, providing visual variation on portfolio
 * project pages (per Daniel's "make the NEXT section dark" request).
 *
 * Mechanism: scope CSS variable overrides to .work-hero + .work-module,
.work-nav + .work-module
 * so all inner cards/text using --color-bg, --color-surface, --color-text,
 * etc. automatically pick up the dark treatment inside that module only.
 * -------------------------------------------------------------------- */

.work-hero + .work-module,
.work-nav + .work-module {
  background: var(--punctuation-bg);
  color: var(--punctuation-text);
  /* Override theme tokens within this module so inner cards adapt */
  --color-bg: var(--punctuation-bg);
  --color-surface: rgba(255,255,255,0.04);
  --color-text: #ffffff;
  --color-text-mute: rgba(255,255,255,0.6);
  --color-border: rgba(255,255,255,0.12);
}

/* Module heading/lede/label adapters for the first-of-type dark module */
.work-hero + .work-module,
.work-nav + .work-module .work-module__heading { color: #ffffff; }
.work-hero + .work-module,
.work-nav + .work-module .work-module__lede    { color: rgba(255,255,255,0.84); }
.work-hero + .work-module,
.work-nav + .work-module .work-module__label   { color: rgba(255,255,255,0.6); }
.work-hero + .work-module,
.work-nav + .work-module .work-module__heading em { color: var(--red); }

/* Branding-specific elements when Branding is the first module */
.work-hero + .work-module,
.work-nav + .work-module .work-feature-mark__tile {
  /* The feature card stays a CLEAN white panel so the logo reads well
   * against the dark module background. */
  background: #ffffff;
  border-color: rgba(219,35,58,0.3);
}
.work-hero + .work-module,
.work-nav + .work-module .work-feature-mark__label    { color: var(--red); }
.work-hero + .work-module,
.work-nav + .work-module .work-feature-mark__sub      { color: rgba(255,255,255,0.65); }
.work-hero + .work-module,
.work-nav + .work-module .work-feature-mark__caption  { color: rgba(255,255,255,0.78); }
.work-hero + .work-module,
.work-nav + .work-module .work-feature-mark__caption strong { color: var(--red); }
.work-hero + .work-module,
.work-nav + .work-module .work-feature-mark__cta {
  border-color: rgba(255,255,255,0.22);
  color: rgba(255,255,255,0.88);
}
.work-hero + .work-module,
.work-nav + .work-module .work-feature-mark__cta:hover,
.work-hero + .work-module,
.work-nav + .work-module .work-feature-mark__cta:focus-visible {
  border-color: var(--red);
  color: var(--red);
}

/* Inner brand/palette/type/book cards when Branding is the first module */
.work-hero + .work-module,
.work-nav + .work-module .work-brand-card {
  background: rgba(255,255,255,0.04);
  border-color: rgba(255,255,255,0.12);
}
.work-hero + .work-module,
.work-nav + .work-module .work-brand-card__label,
.work-hero + .work-module,
.work-nav + .work-module .work-palette-row__hex,
.work-hero + .work-module,
.work-nav + .work-module .work-type-row__role,
.work-hero + .work-module,
.work-nav + .work-module .work-book__meta { color: rgba(255,255,255,0.6); }
.work-hero + .work-module,
.work-nav + .work-module .work-palette-row__name,
.work-hero + .work-module,
.work-nav + .work-module .work-type-row__sample,
.work-hero + .work-module,
.work-nav + .work-module .work-type-row__name,
.work-hero + .work-module,
.work-nav + .work-module .work-book__title { color: #ffffff; }
.work-hero + .work-module,
.work-nav + .work-module .work-book {
  background: rgba(255,255,255,0.04);
  border-color: rgba(255,255,255,0.12);
  color: #ffffff;
}
.work-hero + .work-module,
.work-nav + .work-module .work-book:hover { border-color: var(--red); color: var(--red); }
.work-hero + .work-module,
.work-nav + .work-module .work-book__icon { color: var(--red); }

/* If a different service ends up first (project without Branding), cover
 * its surfaces too: stat tiles, feature tiles, flow steps, etc. */
.work-hero + .work-module,
.work-nav + .work-module .work-stat,
.work-hero + .work-module,
.work-nav + .work-module .work-feature,
.work-hero + .work-module,
.work-nav + .work-module .work-web-lead__item,
.work-hero + .work-module,
.work-nav + .work-module .work-web-grid__item,
.work-hero + .work-module,
.work-nav + .work-module .work-flow__step,
.work-hero + .work-module,
.work-nav + .work-module .work-growth,
.work-hero + .work-module,
.work-nav + .work-module .work-crm-tool,
.work-hero + .work-module,
.work-nav + .work-module .work-rep-card {
  background: rgba(255,255,255,0.04);
  border-color: rgba(255,255,255,0.12);
  color: #ffffff;
}
.work-hero + .work-module,
.work-nav + .work-module .work-stat__caption,
.work-hero + .work-module,
.work-nav + .work-module .work-growth__caption,
.work-hero + .work-module,
.work-nav + .work-module .work-feature__body { color: rgba(255,255,255,0.78); }
.work-hero + .work-module,
.work-nav + .work-module .work-pill {
  background: rgba(255,255,255,0.06);
  border-color: rgba(255,255,255,0.18);
  color: rgba(255,255,255,0.88);
}
.work-module__head { max-width: 64ch; margin-bottom: clamp(36px, 4vw, 56px); }
.work-module__eyebrow {
  display: flex; align-items: baseline; gap: 14px;
  margin-bottom: 18px;
}
.work-module__num {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-size: clamp(28px, 3vw, 40px);
  color: var(--red);
  line-height: 1;
  font-weight: 400;
}
.work-module__label {
  font-size: 13px; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--color-text-mute);
  font-weight: 500;
}
.work-module__heading {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 400;
  font-size: clamp(28px, 3.4vw, 48px);
  line-height: 1.08;
  letter-spacing: -0.022em;
  margin: 0 0 18px;
  color: var(--color-text);
}
.work-module__heading em { font-style: italic; font-variation-settings: var(--font-display-italic); color: var(--red); font-weight: inherit; }
.work-module__lede {
  margin: 0;
  color: var(--color-text-soft);
  font-size: clamp(16px, 1.25vw, 19px);
  line-height: 1.55;
  max-width: 60ch;
}

/* ---------- STAT GRID (3-up) — used by SEO, Ads ---------- */
.work-stat-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(20px, 2.5vw, 32px);
  margin-top: clamp(32px, 4vw, 48px);
}
@media (min-width: 720px) {
  .work-stat-grid { grid-template-columns: repeat(3, 1fr); }
}
.work-stat {
  padding: clamp(28px, 3vw, 44px);
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 18px;
  box-shadow: var(--shadow-card);
}
.work-stat__number {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(54px, 7vw, 96px);
  line-height: 0.95;
  letter-spacing: -0.035em;
  color: var(--red);
  margin-bottom: 18px;
}
.work-stat__caption {
  font-size: clamp(14px, 1.05vw, 16px);
  line-height: 1.4;
  color: var(--color-text-soft);
}

/* ---------- PILL ROW (platform/keyword chips) ---------- */
.work-pill-row {
  list-style: none; margin: clamp(24px, 3vw, 36px) 0 0; padding: 0;
  display: flex; flex-wrap: wrap; gap: 8px;
}
.work-pill {
  display: inline-block;
  padding: 6px 14px;
  border-radius: 999px;
  border: 1px solid var(--color-border);
  background: var(--color-surface);
  font-size: 13px;
  color: var(--color-text-soft);
}

/* ---------- CRO module (single huge stat) ---------- */
.work-cro {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(24px, 3vw, 40px);
  align-items: center;
  margin-top: clamp(32px, 4vw, 48px);
  padding: clamp(40px, 5vw, 72px);
  background: var(--brand-ink);
  color: #fff;
  border-radius: 22px;
}
@media (min-width: 720px) {
  .work-cro { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}
.work-cro__hero { text-align: left; }
.work-cro__number {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(80px, 12vw, 160px);
  line-height: 0.9;
  letter-spacing: -0.04em;
  color: var(--red);
  margin: 0;
}
.work-cro__caption {
  margin-top: 12px;
  font-size: clamp(15px, 1.1vw, 17px);
  color: rgba(255,255,255,0.78);
  max-width: 32ch;
}
.work-cro__flows-label {
  margin: 0 0 12px;
  font-size: 12px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.6);
}
.work-cro__flows-list {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: 10px;
}
.work-cro__flows-list li {
  padding-left: 22px;
  position: relative;
  font-size: 15.5px;
  color: rgba(255,255,255,0.92);
}
.work-cro__flows-list li::before {
  content: "→";
  position: absolute; left: 0; color: var(--red);
}

/* ---------- HEADLINE RESULT BAND (the "climax") ---------- */
.work-result-band {
  background: var(--punctuation-bg);
  color: #fff;
  padding-block: clamp(80px, 10vw, 144px);
  text-align: center;
}
.work-result-band__inner { max-width: 980px; margin: 0 auto; }
.work-result-band__kicker {
  margin: 0 0 28px;
  font-size: clamp(14px, 1.1vw, 16px);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: rgba(255,255,255,0.66);
}
.work-result-band__metric {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(64px, 10vw, 144px);
  line-height: 0.94;
  letter-spacing: -0.035em;
  color: var(--red);
  margin: 0 0 24px;
}
.work-result-band__caption {
  margin: 0;
  font-size: clamp(15px, 1.15vw, 17px);
  color: rgba(255,255,255,0.78);
}

/* ---------- VERIFIED QUOTE (dark, kept from earlier) ---------- */
.work-section { padding-block: clamp(48px, 6vw, 88px); scroll-margin-top: calc(var(--work-nav-top) + 80px); }
.work-section--quote { background: var(--punctuation-bg); }
.work-quote { max-width: 760px; margin: 0 auto; text-align: center; color: #fff; }
.work-quote__badge {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 6px 14px; border: 1px solid rgba(255,255,255,0.18); border-radius: 999px;
  font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; color: rgba(255,255,255,0.82);
  margin-bottom: 26px;
}
.work-quote__star { color: var(--red); }
.work-quote__text {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 400;
  font-size: clamp(22px, 2.6vw, 34px);
  line-height: 1.28;
  letter-spacing: -0.015em;
  margin: 0 0 28px;
}
.work-quote__foot { display: flex; flex-direction: column; align-items: center; gap: 8px; }
.work-quote__stars { color: #f5b50a; letter-spacing: 2px; }
.work-quote__name { font-weight: 600; }
.work-quote__meta { color: rgba(255,255,255,0.66); font-size: 14px; margin-left: 8px; }

/* ---------- 01 BRANDING & IDENTITY ---------- */
/* Section caption that frames the comparison (above the tiles) */
.work-ba__caption {
  margin: 0 0 clamp(20px, 2.5vw, 32px);
  font-size: clamp(14px, 1.1vw, 16px);
  color: rgba(15,26,29,0.7);
  letter-spacing: 0.005em;
  max-width: 60ch;
}
.work-ba__caption strong { color: var(--red); font-weight: 600; }

/* The before/after grid */
.work-ba {
  position: relative;
  display: grid; grid-template-columns: 1fr;
  gap: clamp(20px, 2.5vw, 36px);
  margin-bottom: clamp(40px, 4vw, 64px);
  max-width: 980px;
  align-items: center;
  justify-items: center;
}
.work-ba__pair { width: 100%; max-width: 480px; }
@media (min-width: 720px) {
  .work-ba {
    grid-template-columns: 1fr auto 1fr;
    gap: clamp(16px, 2vw, 32px);
    align-items: center;
    justify-items: stretch;
  }
  .work-ba__pair { max-width: none; }
}

/* Each side: heading above the tile */
.work-ba__pair { margin: 0; display: flex; flex-direction: column; gap: 12px; }
.work-ba__heading { display: flex; flex-direction: column; gap: 2px; padding: 0 4px; }
.work-ba__heading-label {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-size: clamp(20px, 2.2vw, 28px);
  line-height: 1.05;
  font-weight: 400;
  letter-spacing: -0.015em;
  color: var(--color-text-mute);
}
.work-ba__heading-label--ours { color: var(--red); }
.work-ba__heading-sub {
  font-size: 12px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--color-text-mute);
  font-weight: 500;
}
.work-ba__pair--after .work-ba__heading-sub { color: var(--color-text-soft); }

/* Tile (the image canvas itself) */
.work-ba__tile {
  position: relative;
  background: #fff;
  border: 1px solid rgba(15,26,29,0.1);
  border-radius: 14px;
  aspect-ratio: 4 / 3;
  /* v2.26 — flex (not grid place-items) so the logo centers within the FULL
   * box. With aspect-ratio making the box taller than its single grid track,
   * place-items:center centered within the track, not the box, pinning the
   * image high and reading as off-center. Flex align/justify fills the box. */
  display: flex; align-items: center; justify-content: center;
  padding: clamp(20px, 2.5vw, 40px);
  overflow: hidden;
  transition: transform var(--t-fast) var(--ease);
}
.work-ba__tile:hover { transform: translateY(-2px); }
.work-ba__tile img {
  max-width: 88%; max-height: 85%;
  width: auto; height: auto;
  object-fit: contain;
  display: block;
}

/* De-emphasize the "before" tile so it visually reads as legacy */
.work-ba__pair--before .work-ba__tile {
  filter: saturate(0.85) brightness(0.97);
  opacity: 0.92;
}
.work-ba__pair--before .work-ba__tile::after {
  /* Subtle "legacy" tape across the top-left corner */
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(135deg, rgba(15,26,29,0.04) 0%, rgba(15,26,29,0) 30%);
  pointer-events: none;
}

/* Spotlight on the "after" tile — red glow + lift, makes attribution obvious */
.work-ba__pair--after .work-ba__tile {
  box-shadow: 0 14px 40px rgba(219,35,58,0.18), 0 2px 8px rgba(0,0,0,0.06);
  border-color: rgba(219,35,58,0.3);
}
/* v2.27 — Opt-in nudge inside the popup after-tile (see
 * .work-feature-mark__tile--nudge). Same artwork, same correction: push the
 * high-sitting MONTACO logo content DOWN 2.6% to read centered. */
.work-ba__tile--after.work-ba__tile--nudge img { transform: translateY(2.6%); }

/* The arrow between the two tiles */
.work-ba__divider {
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  margin: 0 auto;
  padding: 0;
  background: var(--red);
  color: #fff;
  border-radius: 50%;
  box-shadow: 0 6px 18px rgba(219,35,58,0.32);
  align-self: center;
  justify-self: center;
  flex: 0 0 auto;
}
.work-ba__divider-arrow {
  width: 22px;
  height: 22px;
  display: block;
  margin: 0;
}
/* Show horizontal arrow on desktop, vertical on mobile (when tiles stack) */
.work-ba__divider-arrow--h { display: none; }
.work-ba__divider-arrow--v { display: block; }
@media (min-width: 720px) {
  .work-ba__divider-arrow--h { display: block; }
  .work-ba__divider-arrow--v { display: none; }
  .work-ba__divider { margin-bottom: 0; }
}

/* Make the after-tile's heading-label larger because "OUR REBRAND" is the
 * primary reading target — we want the eye drawn there first. */
.work-ba__heading-label--ours { font-size: clamp(24px, 2.6vw, 34px); }

/* ---------- CORNERSTONE branding extras (Moldasig et al.) ----------
 * Used only by the cornerstone branding partial; standard projects never
 * render these. Reuses the module's existing spacing/colour tokens. */
/* Real-world brand-application mockups — responsive 2/3-up grid. Mixed
 * orientations (landscape/square/portrait) all sit in uniform 4:3 tiles. */
.work-brand-mockups {
  list-style: none; margin: 0 0 clamp(28px, 4vw, 56px); padding: 0;
  display: grid; grid-template-columns: 1fr; gap: 16px;
}
@media (min-width: 600px) { .work-brand-mockups { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 900px) { .work-brand-mockups { grid-template-columns: repeat(3, 1fr); } }
.work-brand-mockups__item {
  margin: 0;
  border-radius: 14px;
  overflow: hidden;
  background: #ffffff;
  border: 1px solid rgba(15,26,29,0.1);
  box-shadow: 0 8px 24px rgba(0,0,0,0.08);
}
.work-brand-mockups__item a {
  display: block;
  cursor: zoom-in; /* clickable: opens the fullscreen lightbox */
}
.work-brand-mockups__item img {
  display: block;
  width: 100%; height: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  transition: transform var(--t-med, 0.3s) var(--ease, ease);
}
.work-brand-mockups__item a:hover img { transform: scale(1.03); }
/* VIG corporate-standards callout next to the featured logo */
.work-brand-vig {
  display: flex; align-items: flex-start; gap: 10px;
  margin: 6px 0 4px;
  font-size: 14px; line-height: 1.5;
}
.work-brand-vig__badge {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  font-family: "Poppins", sans-serif; font-weight: 700; font-size: 12px; letter-spacing: 0.04em;
  color: #ffffff; background: var(--red, #db233a);
  padding: 3px 8px; border-radius: 5px; margin-top: 1px;
}
/* Brand personality grid */
.work-brand-personality { margin: clamp(28px, 4vw, 48px) 0; }
.work-brand-personality__grid {
  display: grid; grid-template-columns: 1fr; gap: 16px;
  margin-top: 14px;
}
@media (min-width: 720px) { .work-brand-personality__grid { grid-template-columns: repeat(4, 1fr); } }
.work-brand-trait {
  padding: 18px;
  border-radius: 14px;
  border: 1px solid rgba(255,255,255,0.12);
  background: rgba(255,255,255,0.04);
}
.work-brand-trait__name { margin: 0 0 6px; font-size: 16px; color: var(--red, #db233a); }
.work-brand-trait__body { margin: 0; font-size: 14px; line-height: 1.55; }

.work-brand-grid {
  display: grid; grid-template-columns: 1fr;
  gap: 16px;
}
@media (min-width: 720px) { .work-brand-grid { grid-template-columns: repeat(3, 1fr); } }
.work-brand-card {
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 18px;
  padding: clamp(24px, 2.5vw, 32px);
}
.work-brand-card__label {
  margin: 0 0 16px;
  font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--color-text-mute);
  font-weight: 600;
}
.work-palette-row { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.work-palette-row__swatch { display: grid; grid-template-columns: 32px 1fr auto; align-items: center; gap: 12px; }
.work-palette-row__chip { display: block; width: 32px; height: 32px; border-radius: 8px; border: 1px solid var(--color-border); }
.work-palette-row__name { font-size: 13.5px; color: var(--color-text); font-weight: 500; }
.work-palette-row__hex { font-size: 11.5px; color: var(--color-text-mute); font-variant-numeric: tabular-nums; text-transform: uppercase; letter-spacing: 0.04em; }
.work-type-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 14px; }
.work-type-row { display: grid; grid-template-columns: 56px 1fr; align-items: center; gap: 14px; }
.work-type-row__sample { font-size: 38px; line-height: 1; color: var(--color-text); }
.work-type-row__meta { display: flex; flex-direction: column; gap: 2px; }
.work-type-row__name { font-size: 13.5px; color: var(--color-text); font-weight: 500; }
.work-type-row__role { font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--color-text-mute); }
/* Space between the two download links inside the merged Brand assets card. */
.work-brand-card--downloads .work-book + .work-book { margin-top: 12px; }
.work-book {
  display: flex; align-items: center; gap: 14px;
  padding: 16px;
  border: 1px solid var(--color-border);
  border-radius: 14px;
  text-decoration: none;
  color: var(--color-text);
  transition: border-color var(--t-fast) var(--ease), background var(--t-fast) var(--ease);
}
.work-book:hover { border-color: var(--red); background: var(--color-bg); }
.work-book__icon { color: var(--red); display: grid; place-items: center; }
.work-book__icon svg { width: 28px; height: 28px; }
.work-book__text { flex: 1 1 auto; display: flex; flex-direction: column; gap: 2px; }
.work-book__title { font-size: 13.5px; font-weight: 500; }
.work-book__meta { font-size: 11px; color: var(--color-text-mute); letter-spacing: 0.04em; }
.work-book__arrow { font-size: 18px; color: var(--red); }

.work-web-lead {
  display: grid; grid-template-columns: 1fr;
  gap: 16px;
  margin-bottom: clamp(20px, 2.5vw, 32px);
}
@media (min-width: 720px) { .work-web-lead { grid-template-columns: 1fr 1fr; gap: 20px; } }
.work-web-lead__item {
  margin: 0;
  border-radius: 14px;
  overflow: hidden;
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  box-shadow: var(--shadow-card);
}
.work-web-lead__item a { display: block; line-height: 0; }
.work-web-lead__item img {
  display: block; width: 100%; height: auto;
  aspect-ratio: 16 / 10;
  object-fit: cover; object-position: top center;
}
.work-web-lead__item figcaption {
  padding: 10px 14px;
  font-size: 12.5px;
  color: var(--color-text-mute);
  border-top: 1px solid var(--color-border);
  background: var(--color-bg);
}

.work-web-grid {
  list-style: none; margin: 0 0 clamp(40px, 4vw, 56px); padding: 0;
  display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 14px;
}
.work-web-grid__item {
  margin: 0;
  border-radius: 12px;
  overflow: hidden;
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  box-shadow: var(--shadow-card);
}
.work-web-grid__item a { display: block; line-height: 0; }
.work-web-grid__item img {
  display: block; width: 100%; height: auto;
  aspect-ratio: 16 / 10;
  object-fit: cover; object-position: top center;
}
.work-web-grid__caption {
  margin: 0;
  padding: 8px 12px;
  font-size: 11.5px;
  color: var(--color-text-mute);
  border-top: 1px solid var(--color-border);
  background: var(--color-bg);
}

/* ---------- 02 WEB & APP DEVELOPMENT ---------- */
.work-feature-grid {
  display: grid; grid-template-columns: 1fr;
  gap: 16px;
}
@media (min-width: 720px) { .work-feature-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .work-feature-grid { grid-template-columns: repeat(3, 1fr); } }
.work-feature {
  padding: clamp(20px, 2.2vw, 28px);
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 14px;
}
.work-feature__title {
  font-size: 16px;
  font-weight: 600;
  margin: 0 0 8px;
  color: var(--color-text);
  letter-spacing: -0.005em;
}
.work-feature__body {
  margin: 0;
  font-size: 14px;
  line-height: 1.5;
  color: var(--color-text-soft);
}
.work-web-foot {
  margin-top: clamp(32px, 4vw, 48px);
  display: flex; flex-wrap: wrap;
  align-items: flex-end; justify-content: space-between;
  gap: 28px;
}
.work-web-foot__tech { flex: 1 1 auto; min-width: 280px; }
.work-web-foot__label {
  margin: 0 0 12px;
  font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--color-text-mute);
  font-weight: 600;
}
.work-web-foot__cta { flex: 0 0 auto; }

/* ---------- 03 DESIGN & CONVERSION ---------- */
.work-design {
  display: grid; grid-template-columns: 1fr;
  gap: clamp(24px, 3vw, 40px);
  align-items: start;
}
@media (min-width: 960px) {
  .work-design { grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr); }
}
.work-design__shot {
  margin: 0;
  border-radius: 18px;
  overflow: hidden;
  box-shadow: var(--shadow-card);
  background: var(--color-surface);
}
.work-design__shot img { display: block; width: 100%; height: auto; }
.work-design__decisions-label {
  margin: 0 0 18px;
  font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--color-text-mute);
  font-weight: 600;
}
.work-decisions-list { list-style: none; counter-reset: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 18px; }
.work-decision { display: grid; grid-template-columns: 44px 1fr; gap: 16px; align-items: start; }
.work-decision__num {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-size: 28px;
  line-height: 1;
  color: var(--red);
}
.work-decision__title { margin: 0 0 4px; font-size: 16px; font-weight: 600; color: var(--color-text); }
.work-decision__body { margin: 0; font-size: 14px; line-height: 1.5; color: var(--color-text-soft); }
.work-design__tool { margin: 24px 0 0; }

/* ---------- 06 CONTENT & SOCIAL ---------- */
.work-growth-grid {
  display: grid; grid-template-columns: 1fr;
  gap: 16px;
  margin-bottom: clamp(28px, 3vw, 40px);
}
@media (min-width: 720px) { .work-growth-grid { grid-template-columns: 1fr 1fr; } }
.work-growth {
  padding: clamp(28px, 3vw, 44px);
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 18px;
  box-shadow: var(--shadow-card);
}
.work-growth__platform {
  margin: 0 0 18px;
  font-size: 12px; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--color-text-mute);
  font-weight: 600;
}
.work-growth__numbers {
  display: flex; flex-wrap: wrap; align-items: baseline;
  gap: 14px;
  margin-bottom: 6px;
}
.work-growth__from {
  font-family: var(--font-display);
  font-size: clamp(28px, 3.5vw, 44px);
  line-height: 1;
  color: var(--color-text-mute);
  text-decoration: line-through;
  text-decoration-color: rgba(127, 127, 127, 0.4);
}
.work-growth__arrow {
  font-size: 28px;
  color: var(--red);
}
.work-growth__to {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-size: clamp(54px, 7vw, 96px);
  line-height: 1;
  letter-spacing: -0.035em;
  color: var(--red);
}
.work-growth__caption {
  margin: 0;
  font-size: 13px;
  color: var(--color-text-soft);
}

/* ---------- 07 MARKETING AUTOMATION ---------- */
.work-flow {
  list-style: none; margin: 0 0 clamp(32px, 4vw, 48px); padding: 0;
  display: flex; flex-wrap: nowrap;
  gap: 12px;
  overflow-x: auto;
  /* v2.26 — keep horizontal scroll, hide the visible scrollbar. Firefox uses
   * scrollbar-width; Webkit uses ::-webkit-scrollbar; legacy IE/Edge uses
   * -ms-overflow-style. The bottom padding (was 6px to accommodate the
   * scrollbar) is now 0 since the bar no longer renders. */
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.work-flow::-webkit-scrollbar {
  display: none;
  width: 0;
  height: 0;
}
.work-flow__step {
  flex: 0 0 auto;
  display: flex; flex-direction: column; gap: 8px;
  padding: 18px 22px;
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 12px;
  min-width: 160px;
  position: relative;
}
.work-flow__step + .work-flow__step::before {
  content: "→";
  position: absolute; left: -14px; top: 50%;
  transform: translateY(-50%);
  color: var(--red);
  font-size: 16px;
}
.work-flow__num {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-size: 14px;
  color: var(--red);
  line-height: 1;
}
.work-flow__label {
  font-size: 14px; font-weight: 500;
  color: var(--color-text);
  letter-spacing: -0.005em;
}
.work-auto-body {
  display: grid; grid-template-columns: 1fr;
  gap: 28px;
}
@media (min-width: 720px) {
  .work-auto-body { grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); }
}

/* Reused checklist (Marketing Automation + CRM) */
.work-checklist {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: 12px;
}
.work-checklist li {
  display: grid; grid-template-columns: 24px 1fr; gap: 10px; align-items: start;
  font-size: 14.5px;
  color: var(--color-text-soft);
  line-height: 1.5;
}
.work-checklist__check {
  display: grid; place-items: center;
  width: 22px; height: 22px;
  border-radius: 999px;
  background: var(--red);
  color: #fff;
  font-size: 11px;
  line-height: 1;
}

/* ---------- 09 REPUTATION & LOCAL SEO ---------- */
/* Two platform cards side by side: GBP + Facebook. Each is a mocked
 * brand-faithful review card. Cards always render on white regardless
 * of theme (they're meant to read as "screenshots of real platforms"). */
.work-rep-cards {
  display: grid; grid-template-columns: 1fr;
  gap: 16px;
  margin-bottom: clamp(28px, 3vw, 40px);
}
@media (min-width: 720px) { .work-rep-cards { grid-template-columns: 1fr 1fr; gap: 20px; } }
.work-rep-card {
  /* v2.20 — theme-respecting (was hardcoded white card that read
   * jarringly on dark module bg in dark mode). Brand colors used
   * for Google/Facebook accents (blue, Google star yellow) stay. */
  background: var(--color-surface);
  color: var(--color-text);
  border: 1px solid var(--color-border);
  border-radius: 16px;
  box-shadow: 0 8px 24px rgba(0,0,0,0.06), 0 2px 6px rgba(0,0,0,0.04);
  padding: clamp(20px, 2.5vw, 28px);
}
.work-rep-card__header {
  display: flex; justify-content: space-between; align-items: center;
  margin-bottom: 18px;
}
.work-rep-card__verified {
  font-size: 11px;
  color: var(--color-text-mute);
  letter-spacing: 0.02em;
}
.work-rep-card__name {
  margin: 0 0 4px;
  font-size: 22px; font-weight: 500;
  color: var(--color-text);
  letter-spacing: -0.01em;
}
.work-rep-card__category {
  margin: 0 0 16px;
  font-size: 13px; color: var(--color-text-mute);
}
.work-rep-card__rating-row {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
}
.work-rep-card__number {
  font-size: 28px; font-weight: 500;
  color: var(--color-text);
  line-height: 1;
  letter-spacing: -0.02em;
}
.work-rep-card__pct {
  font-size: 18px;
  font-weight: 500;
  color: var(--color-text-mute);
}
.work-rep-card__count { font-size: 13px; color: var(--color-text-mute); }
.work-rep-card__sub {
  margin: 8px 0 0;
  font-size: 12.5px;
  color: var(--color-text-mute);
}

/* GBP card specifics */
.work-gbp__google {
  font-family: "Poppins", sans-serif;
  font-weight: 600;
  font-size: 16px;
  letter-spacing: -0.02em;
}
.work-gbp__stars { color: #f9ab00; letter-spacing: 1px; font-size: 18px; }
.work-gbp__star.is-half { opacity: 0.55; }
.work-rep-card--gbp .work-rep-card__count { color: #1a73e8; }

/* Facebook card specifics */
.work-fb__brand { display: inline-flex; align-items: center; gap: 8px; }
.work-fb__wordmark {
  font-family: "Poppins", sans-serif;
  font-weight: 600;
  font-size: 16px;
  color: #1877F2;
  letter-spacing: -0.01em;
}
.work-fb__thumb {
  display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px;
  background: rgba(24,119,242,0.12);
  border-radius: 999px;
}
.work-rep-card--fb .work-rep-card__rating-row--fb .work-rep-card__count {
  font-weight: 500; color: #1877F2;
}

/* BBB card specifics */
.work-bbb__brand { display: inline-flex; align-items: center; gap: 8px; }
/* Match the Google wordmark height (26px) so the BBB card header is the same
 * height as the GBP card — keeps the body content vertically aligned across
 * both reputation cards. */
.work-bbb__logo { height: 26px; width: auto; display: block; }
.work-bbb__badge {
  display: inline-flex; align-items: center; justify-content: center;
  font-family: "Poppins", sans-serif;
  font-weight: 700; font-size: 13px; letter-spacing: 0.04em;
  color: #ffffff; background: #00558c;
  padding: 4px 9px; border-radius: 5px;
}
.work-rep-card--bbb .work-rep-card__count { color: #00558c; }

/* ---------- 10 CRM IMPLEMENTATION ---------- */
.work-crm-tools { margin-bottom: clamp(28px, 3vw, 40px); }
.work-crm-grid {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: 10px;
}
@media (min-width: 720px) { .work-crm-grid { grid-template-columns: repeat(5, 1fr); } }
.work-crm-tool {
  padding: 14px 16px;
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 12px;
  font-size: 13.5px;
  font-weight: 500;
  text-align: center;
  color: var(--color-text);
  /* v2.26 — vertically center text inside the card. The grid auto-equalizes
   * row heights to the tallest card; shorter labels need flex centering to
   * sit in the vertical middle rather than at the top with padding. */
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100%;
}

/* ---------- 5. TIMELINE (dark band, both modes) ---------- */
.service-timeline {
  /* Reuses the homepage .how section (dark --brand-ink band, both modes) +
     .how__grid (responsive 1/2/3-col with orphan centering) + .how-card
     (dark surface, hover lift, Fraunces italic red number). The only
     timeline-specific addition is the per-card phase label below. */
}
.service-timeline__label {
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--red);
  margin: -10px 0 10px;
}

/* ---------- 7. CTA + CONTACT FORM ---------- */
/* The service-detail CTA reuses the homepage .contact / .contact__inner /
   .contact__left / .trust-list / .contact__quote classes verbatim, so it
   inherits all of the homepage contact styling and is guaranteed identical.
   .service-cta is kept only as an optional hook for future per-service
   tweaks; it adds no styling of its own. */

/* ---------- /services/ list — linked item affordance (v1.80) ---------- */
.services-list__item--linked {
  text-decoration: none;
  color: inherit;
  border-radius: 14px;
}
.services-list__item--linked:hover .services-list__name { color: var(--red); }
.services-list__arrow {
  display: inline-block;
  margin-left: 8px;
  color: var(--red);
  opacity: 0;
  transition: opacity var(--t-med) var(--ease);
}
.services-list__item--linked:hover .services-list__arrow {
  opacity: 1;
}


/* ============================================================
 * Work lightbox / slider (vanilla, scoped to portfolio pages)
 * ============================================================ */
.work-lightbox {
  position: fixed; inset: 0;
  background: rgba(8, 12, 14, 0.94);
  display: none;
  align-items: center; justify-content: center;
  z-index: 1000;
  padding: 24px;
}
.work-lightbox.is-open { display: flex; }
.work-lightbox__figure {
  margin: 0;
  max-width: min(92vw, 1400px);
  max-height: 88vh;
  display: flex; flex-direction: column;
  align-items: center;
  gap: 16px;
}
.work-lightbox__image {
  display: block;
  max-width: 100%;
  max-height: 80vh;
  width: auto; height: auto;
  border-radius: 8px;
  box-shadow: 0 20px 60px rgba(0,0,0,0.4);
  background: #1a2326;
  position: relative; z-index: 1; /* keep BELOW the controls (z-index: 5) */
}
.work-lightbox__caption {
  color: rgba(255,255,255,0.85);
  font-size: 14px;
  text-align: center;
  max-width: 80ch;
}
.work-lightbox__close,
.work-lightbox__prev,
.work-lightbox__next {
  position: absolute;
  z-index: 5; /* ABOVE the image — without this the image (later in the DOM)
                 painted on top and ate taps on the arrows, so the slider
                 didn't advance on touch. */
  display: grid; place-items: center;
  width: 48px; height: 48px;
  background: rgba(255,255,255,0.08);
  color: #fff;
  border: 1px solid rgba(255,255,255,0.16);
  border-radius: 999px;
  font-size: 24px;
  cursor: pointer;
  transition: background 150ms ease, transform 150ms ease;
}
.work-lightbox__close:hover,
.work-lightbox__prev:hover,
.work-lightbox__next:hover {
  background: var(--red);
  border-color: var(--red);
  transform: scale(1.05);
}
.work-lightbox__close { top: 20px; right: 20px; }
.work-lightbox__prev  { top: 50%; left: 20px;  transform: translateY(-50%); }
.work-lightbox__next  { top: 50%; right: 20px; transform: translateY(-50%); }
.work-lightbox__prev:hover { transform: translateY(-50%) scale(1.05); }
.work-lightbox__next:hover { transform: translateY(-50%) scale(1.05); }
.work-lightbox__counter {
  position: absolute;
  bottom: 24px; left: 50%;
  transform: translateX(-50%);
  color: rgba(255,255,255,0.66);
  font-size: 13px;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.06em;
}
@media (max-width: 720px) {
  /* Bigger, brighter tap targets on mobile; arrows hugged to the edges so
     they sit beside the image, not on top of it. */
  .work-lightbox__prev,
  .work-lightbox__next {
    width: 50px; height: 50px; font-size: 24px;
    background: rgba(255,255,255,0.26);
  }
  .work-lightbox__prev { left: 8px; }
  .work-lightbox__next { right: 8px; }
  .work-lightbox__close {
    width: 46px; height: 46px; font-size: 22px; top: 12px; right: 12px;
    background: rgba(255,255,255,0.26);
  }
}

/* Hover affordance on lightbox-able thumbs */
a[data-lightbox-group] {
  cursor: zoom-in;
}

/* ============================================================
 * Back to top button (subfooter, discreet, left side)
 * v2.09 — Sits inside .site-footer__bottom between copyright
 * and legal nav. Theme switch stays on far right; chatbot will
 * eventually float bottom-right of the viewport — neither is
 * crowded by this button.
 * ============================================================ */
.site-footer__top {
  display: inline-grid;
  place-items: center;
  width: 32px; height: 32px;
  padding: 0;
  margin: 0;
  background: transparent;
  border: 1px solid rgba(255,255,255,0.22);
  border-radius: 999px;
  color: inherit;
  cursor: pointer;
  opacity: 0.78;
  transition: opacity 150ms ease, border-color 150ms ease, color 150ms ease, background 150ms ease, transform 150ms ease;
}
.site-footer__top:hover,
.site-footer__top:focus-visible {
  opacity: 1;
  color: var(--red);
  border-color: var(--red);
  transform: translateY(-1px);
  outline: none;
}
.site-footer__top svg {
  width: 14px; height: 14px;
  transition: transform 150ms ease;
}
.site-footer__top:hover svg,
.site-footer__top:focus-visible svg { transform: translateY(-2px); }
/* v2.12 — Footer bg is always dark (per project rules, in both themes),
 * so the circle's faint-white border must stay regardless of the theme.
 * Previously the light-mode override made it dark-on-dark = invisible. */

/* ============================================================
 * Mobile phone-frame showcase (Web Dev module)
 * v2.10 — single mobile screenshot in a minimal device frame.
 * Sits between the lead calculator screens and the internal-
 * pages grid. The screenshot is clickable to open in the
 * existing work-lightbox (group="web") at full size.
 * ============================================================ */
.work-mobile {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(28px, 4vw, 48px);
  align-items: center;
  margin: clamp(36px, 4vw, 56px) 0;
  padding: clamp(32px, 4vw, 56px);
  /* v2.20 — theme-respecting card surface (was hardcoded #fff,
   * showed as glaring white panel on dark module bg in dark mode) */
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: 18px;
  /* v2.21 — Lift the section with a soft shadow. Light mode gets
   * a subtle drop shadow; dark mode gets a red-tinted brand glow
   * + deeper shadow (same pattern used by .work-feature-mark__tile
   * elsewhere) so the section reads as a featured "showcase" block. */
  box-shadow:
    0 20px 50px rgba(0, 0, 0, 0.08),
    0 4px 12px rgba(0, 0, 0, 0.04);
  transition: box-shadow var(--t-fast) var(--ease), transform var(--t-fast) var(--ease);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .work-mobile {
    border-color: rgba(219, 35, 58, 0.18);
    box-shadow:
      0 24px 60px rgba(219, 35, 58, 0.14),
      0 12px 28px rgba(0, 0, 0, 0.45),
      0 2px 8px rgba(0, 0, 0, 0.25);
  }
}
:root[data-theme="dark"] .work-mobile {
  border-color: rgba(219, 35, 58, 0.18);
  box-shadow:
    0 24px 60px rgba(219, 35, 58, 0.14),
    0 12px 28px rgba(0, 0, 0, 0.45),
    0 2px 8px rgba(0, 0, 0, 0.25);
}
@media (min-width: 760px) {
  .work-mobile {
    grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr);
  }
}
.work-mobile__heading {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 400;
  font-size: clamp(24px, 2.6vw, 36px);
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin: 0 0 16px;
  color: var(--color-text);
}
.work-mobile__heading em {
  font-style: italic;
  font-variation-settings: var(--font-display-italic);
  color: var(--red);
}
.work-mobile__body {
  margin: 0;
  font-size: clamp(15px, 1.15vw, 17px);
  line-height: 1.55;
  color: var(--color-text-mute);
  max-width: 44ch;
}
.work-mobile__phone {
  display: flex;
  justify-content: center;
  align-items: flex-start;
}
.work-mobile__phone-frame {
  position: relative;
  width: 100%;
  max-width: 280px;
  aspect-ratio: 9 / 19.5;
  background: #0F1A1D;
  border-radius: 36px;
  padding: 10px;
  /* v2.22 — Clip the screenshot to the rounded frame. The inner screen
   * sizes via height:100% against the frame's aspect-ratio height; Safari
   * (iPad) can fail to resolve that %, letting the screen collapse to the
   * image's natural height and spill out the bottom of the frame. Clipping
   * the frame itself makes the spill impossible no matter how the inner
   * height resolves. box-shadow renders outside the border box, so the
   * phone's drop shadow is unaffected. */
  overflow: hidden;
  box-shadow:
    0 0 0 1px rgba(15,26,29,0.18),
    0 20px 48px rgba(0,0,0,0.18),
    0 6px 14px rgba(0,0,0,0.08);
}
.work-mobile__phone-notch {
  position: absolute;
  top: 14px;
  left: 50%;
  transform: translateX(-50%);
  width: 86px;
  height: 22px;
  background: #0F1A1D;
  border-radius: 0 0 14px 14px;
  z-index: 2;
}
.work-mobile__phone-notch::after {
  content: "";
  position: absolute;
  top: 8px;
  left: 50%;
  transform: translateX(-50%);
  width: 6px; height: 6px;
  background: #2a3438;
  border-radius: 50%;
}
.work-mobile__phone-screen {
  position: relative;
  width: 100%;
  height: 100%;
  background: #f5f5f4;
  border-radius: 28px;
  /* v2.11 — Native vertical scroll inside the phone with the scrollbar
   * hidden (same technique as production newlightdigital.com). When the
   * cursor is over the phone, mouse wheel scrolls the inner image; when
   * outside, the wheel scrolls the page. Image is its NATURAL height so
   * there's actual content to scroll through. */
  overflow-y: auto;
  overflow-x: hidden;
  scrollbar-width: none;            /* Firefox */
  -ms-overflow-style: none;         /* old IE/Edge */
  -webkit-overflow-scrolling: touch;
  display: block;
  /* v2.12 — Force GPU compositing so iOS Safari paints the inner image
   * immediately instead of waiting for a touch event. Classic iOS quirk
   * with overflow:auto containers — without this, the inner image
   * stays blank until first tap. */
  -webkit-transform: translateZ(0);
          transform: translateZ(0);
  will-change: scroll-position;
}
.work-mobile__phone-screen::-webkit-scrollbar { display: none; }
/* Mobile preview is a static image (not a lightbox link) — normal cursor,
 * not clickable. Kept the `a` rule harmless in case markup ever changes. */
.work-mobile__phone-screen a { display: block; line-height: 0; }
.work-mobile__phone-screen, .work-mobile__phone-screen img { cursor: default; }
.work-mobile__phone-screen img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 28px;
}

/* v2.11 — Dark-mode "Request a quote" button styled like the hero
 * "View live site" btn--outline (faint white outline + prominent white
 * outline on hover). Was previously only scoped to .hero/.about-hero,
 * so the header CTA fell through to the default light-mode styling. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .site-header .btn--outline,
  :root:not([data-theme="light"]) .site-header .header-cta {
    background: transparent;
    color: rgba(255, 255, 255, 0.85);
    border-color: rgba(255, 255, 255, 0.2);
  }
  :root:not([data-theme="light"]) .site-header .btn--outline:hover,
  :root:not([data-theme="light"]) .site-header .btn--outline:focus-visible,
  :root:not([data-theme="light"]) .site-header .header-cta:hover,
  :root:not([data-theme="light"]) .site-header .header-cta:focus-visible {
    background: transparent;
    color: var(--white);
    border-color: var(--white);
    box-shadow: none;
  }
}
:root[data-theme="dark"] .site-header .btn--outline,
:root[data-theme="dark"] .site-header .header-cta {
  background: transparent;
  color: rgba(255, 255, 255, 0.85);
  border-color: rgba(255, 255, 255, 0.2);
}
:root[data-theme="dark"] .site-header .btn--outline:hover,
:root[data-theme="dark"] .site-header .btn--outline:focus-visible,
:root[data-theme="dark"] .site-header .header-cta:hover,
:root[data-theme="dark"] .site-header .header-cta:focus-visible {
  background: transparent;
  color: var(--white);
  border-color: var(--white);
  box-shadow: none;
}

/* ============================================================
 * v2.11 — Branding feature-mark card (the single "Our rebrand"
 * logo card shown on the page) + comparison <dialog> popup.
 * ============================================================ */
.work-feature-mark {
  display: grid;
  grid-template-columns: 1fr;
  gap: clamp(20px, 2.5vw, 36px);
  align-items: center;
  margin-bottom: clamp(40px, 4vw, 56px);
  max-width: 920px;
}
@media (min-width: 720px) {
  .work-feature-mark { grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr); }
}
.work-feature-mark__tile {
  position: relative;
  margin: 0;
  background: #ffffff;
  border: 1px solid rgba(15,26,29,0.1);
  border-radius: 16px;
  aspect-ratio: 4 / 3;
  /* v2.26 — flex (not grid place-items). aspect-ratio makes the box taller
   * than its single grid track, so place-items:center left the logo pinned
   * high-in-track (visually low/off-center). Flex centers within the box. */
  display: flex; align-items: center; justify-content: center;
  padding: clamp(28px, 3.5vw, 56px);
  overflow: hidden;
  box-shadow: 0 14px 40px rgba(219,35,58,0.14), 0 2px 8px rgba(0,0,0,0.06);
  border-color: rgba(219,35,58,0.25);
}
.work-feature-mark__tile img {
  max-width: 88%; max-height: 85%;
  width: auto; height: auto;
  object-fit: contain;
  display: block;
}
/* v2.27 — The vertical logo nudge is OPT-IN per project, to correct a logo
 * FILE whose content sits off-center inside its own (square) canvas. The tile
 * flex-centers the image box; if the artwork has unequal top/bottom whitespace
 * the logo still reads off-center. MONTACO's montaco-new-logo2.webp content
 * sits HIGH (193px top vs 245px bottom whitespace in a 1000px square = its
 * center is 2.6% above the canvas center), so we push it DOWN 2.6% to read
 * centered. Measured live, not guessed (gapTop==gapBottom at this value).
 * Value is specific to that artwork — re-measure if the logo file changes.
 * Un-flagged logos (e.g. 2FL) have NO transform and stay flex-centered. */
.work-feature-mark__tile--nudge img {
  transform: translateY(2.6%);
}
.work-feature-mark__copy { display: flex; flex-direction: column; gap: 8px; }
.work-feature-mark__label {
  margin: 0;
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-italic);
  font-style: italic;
  font-size: clamp(28px, 3.2vw, 44px);
  line-height: 1.05;
  font-weight: 400;
  letter-spacing: -0.02em;
  color: var(--red);
}
.work-feature-mark__sub {
  margin: 0;
  font-size: 12px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: rgba(15,26,29,0.6);
  font-weight: 500;
}
.work-feature-mark__caption {
  margin: 12px 0 0;
  font-size: 15px;
  line-height: 1.55;
  color: rgba(15,26,29,0.72);
  max-width: 44ch;
}
.work-feature-mark__caption strong { color: var(--red); font-weight: 600; }
.work-feature-mark__cta {
  align-self: flex-start;
  margin-top: 16px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 18px;
  background: transparent;
  border: 1px solid rgba(15,26,29,0.18);
  border-radius: 999px;
  font: inherit;
  font-size: 13px;
  font-weight: 500;
  color: rgba(15,26,29,0.85);
  cursor: pointer;
  transition: border-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease), background var(--t-fast) var(--ease), transform var(--t-fast) var(--ease);
}
.work-feature-mark__cta:hover,
.work-feature-mark__cta:focus-visible {
  border-color: var(--red);
  color: var(--red);
  transform: translateY(-1px);
  outline: none;
}
.work-feature-mark__cta-arrow {
  font-size: 14px;
  transition: transform var(--t-fast) var(--ease);
}
.work-feature-mark__cta:hover .work-feature-mark__cta-arrow,
.work-feature-mark__cta:focus-visible .work-feature-mark__cta-arrow {
  transform: translateX(3px);
}

/* The comparison <dialog> popup itself */
.work-compare-dialog {
  padding: 0;
  background: transparent;
  border: 0;
  max-width: min(96vw, 1100px);
  width: 100%;
  max-height: 92vh;
  /* Theme-aware light/dark. The dialog lives inside the first ("punctuation")
     module, which locally forces dark surface/text tokens for its inner cards
     (line ~5256). The popup must NOT inherit those — it should match the PAGE
     theme. So we re-resolve the theme tokens here from the brand primitives,
     keyed off the same light/dark signals :root uses. */
  --color-surface: var(--brand-paper);
  --color-text: var(--brand-ink);
  --color-text-soft: var(--brand-gray-deep);
  --color-text-mute: var(--brand-gray-deep);
  --color-border: var(--brand-gray-line);
  color: var(--color-text);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .work-compare-dialog {
    --color-surface: var(--brand-ink-soft);
    --color-text: var(--brand-paper);
    --color-text-soft: rgba(255,255,255,0.72);
    --color-text-mute: rgba(255,255,255,0.62);
    --color-border: rgba(255,255,255,0.1);
  }
}
:root[data-theme="dark"] .work-compare-dialog {
  --color-surface: var(--brand-ink-soft);
  --color-text: var(--brand-paper);
  --color-text-soft: rgba(255,255,255,0.72);
  --color-text-mute: rgba(255,255,255,0.62);
  --color-border: rgba(255,255,255,0.1);
}
.work-compare-dialog::backdrop {
  background: rgba(8,12,14,0.88);
  backdrop-filter: blur(2px);
}
.work-compare-dialog__inner {
  position: relative;
  background: var(--color-surface);
  border-radius: 18px;
  padding: clamp(28px, 3.5vw, 48px);
  box-shadow: 0 24px 70px rgba(0,0,0,0.4);
  max-height: 92vh;
  overflow-y: auto;
}
.work-compare-dialog__close {
  position: absolute; top: 12px; right: 12px;
  width: 36px; height: 36px;
  display: grid; place-items: center;
  background: transparent;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  font-size: 22px; line-height: 1;
  color: var(--color-text);
  cursor: pointer;
  transition: border-color 150ms ease, color 150ms ease, background 150ms ease;
}
.work-compare-dialog__close:hover,
.work-compare-dialog__close:focus-visible {
  border-color: var(--red);
  color: var(--red);
  outline: none;
}
.work-compare-dialog__title {
  margin: 0 0 8px;
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 400;
  font-size: clamp(22px, 2.4vw, 30px);
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--color-text);
}
.work-compare-dialog__caption {
  margin: 0 0 clamp(20px, 2.5vw, 28px);
  font-size: 14px;
  color: var(--color-text-soft);
  max-width: 60ch;
}
.work-compare-dialog__caption strong { color: var(--red); font-weight: 600; }
/* Inside the dialog, the .work-ba grid uses the same v2.10 styling already
 * defined elsewhere — labels, tiles, divider, etc. — so it renders
 * consistently. */
.work-compare-dialog .work-ba { margin: 0; max-width: 100%; }
.work-compare-dialog .work-ba__caption { display: none; /* Title above replaces it */ }

/* ============================================================
 * v2.11 — Design & Conversion "View full homepage" reveal toggle
 * ============================================================ */
.work-design__reveal { margin-top: clamp(28px, 3vw, 40px); display: flex; flex-direction: column; gap: clamp(20px, 2.5vw, 32px); }
.work-design__reveal-btn {
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 20px;
  background: transparent;
  border: 1px solid currentColor;
  border-radius: 999px;
  font: inherit;
  font-size: 13.5px;
  font-weight: 500;
  color: inherit;
  cursor: pointer;
  opacity: 0.7;
  transition: opacity var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease), transform var(--t-fast) var(--ease);
}
.work-design__reveal-btn:hover,
.work-design__reveal-btn:focus-visible {
  opacity: 1;
  outline: none;
  transform: translateY(-1px);
}
.work-design__reveal-arrow {
  display: inline-block;
  font-size: 14px;
  transition: transform var(--t-fast) var(--ease);
}
.work-design__reveal-btn.is-open .work-design__reveal-arrow {
  transform: rotate(180deg);
}
.work-design__shot-wrap {
  border-radius: 18px;
  overflow: hidden;
  background: var(--color-surface);
  border: 1px solid rgba(255,255,255,0.1);
}
/* v2.12 — Explicit display:none for [hidden] to defeat any inherited
 * display rule that might otherwise show the screenshot even when
 * hidden attribute is set. Some mobile browsers under certain CSS
 * contexts have shown intermittent failures here. */
.work-design__shot-wrap[hidden] { display: none !important; }
/* Within the locked-DARK Design module, override the wrap border to suit. */
.work-module--design .work-design__shot-wrap { border-color: rgba(255,255,255,0.12); background: rgba(255,255,255,0.04); }
.work-design__shot-wrap .work-design__shot { margin: 0; padding: 0; background: transparent; border: 0; box-shadow: none; }
.work-design__shot-wrap .work-design__shot img { display: block; width: 100%; height: auto; }
/* Make decisions read full-width when image is hidden */
.work-module--design .work-design__decisions { max-width: 1200px; }
@media (min-width: 720px) {
  .work-decisions-list { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
}

/* ============================================================
 * v2.16 — Scroll-padding-top so anchor jumps land BELOW the
 * sticky bars instead of being hidden behind them. The site
 * header is ~80px and the portfolio sticky nav adds ~43px,
 * so portfolio pages need ~140px of scroll padding. Pages
 * without the portfolio nav only need the header offset.
 *
 * Using :has() with a graceful fallback for old browsers
 * (those just get a small site-wide offset, which is fine).
 * ============================================================ */
html { scroll-padding-top: 88px; }
html:has(.work-nav) { scroll-padding-top: 140px; }

/* ============================================================
 * v2.19 — Restore locked-dark bg on the FIRST module.
 *
 * v2.18's alternation `article.work-single > .work-module:nth-child(odd)`
 * has specificity (0,3,1), which beat the v2.14 locked-dark rule
 * `.work-hero + .work-module, .work-nav + .work-module` (specificity 0,2,0).
 * Result: bg flipped to white, but the locked-dark rule's
 * `--color-text: #ffffff` token cascade still applied → white text
 * on white bg in the Branding module in light theme.
 *
 * Fix: same specificity (0,3,1), placed LAST in source order so it
 * wins the cascade for just the first-module background. The token
 * cascade from the v2.14 block already handles text + inner cards.
 * ============================================================ */
article.work-single > .work-hero + .work-module,
article.work-single > .work-nav  + .work-module {
  background: var(--punctuation-bg);
}

/* ============================================================
 * v2.20 — .btn--outline inside work-modules in dark mode.
 * Default .btn--outline uses currentColor for border, which
 * in dark mode is pure white → harsh hard outline that fights
 * the rest of the page. The hero uses a softer faint-white
 * pattern; replicate that for outline buttons inside work
 * modules so the Web Dev "View live site" matches the hero
 * "View live site" tone in dark mode.
 * ============================================================ */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .work-module .btn--outline {
    background: transparent;
    color: rgba(255, 255, 255, 0.85);
    border-color: rgba(255, 255, 255, 0.22);
  }
  :root:not([data-theme="light"]) .work-module .btn--outline:hover,
  :root:not([data-theme="light"]) .work-module .btn--outline:focus-visible {
    background: transparent;
    color: #fff;
    border-color: #fff;
    box-shadow: none;
  }
}
:root[data-theme="dark"] .work-module .btn--outline {
  background: transparent;
  color: rgba(255, 255, 255, 0.85);
  border-color: rgba(255, 255, 255, 0.22);
}
:root[data-theme="dark"] .work-module .btn--outline:hover,
:root[data-theme="dark"] .work-module .btn--outline:focus-visible {
  background: transparent;
  color: #fff;
  border-color: #fff;
  box-shadow: none;
}

/* ============================================================
 * v2.23 — Marketing Automation flow: stack vertically on mobile
 *
 * The .work-flow row uses flex-wrap: nowrap + overflow-x: auto
 * which shows an ugly horizontal scrollbar on mobile (5 steps
 * × 160px each + gaps far exceeds a 380px viewport). On mobile,
 * stack the steps vertically and flip the connector arrow from
 * right-pointing (→) to down-pointing (↓).
 * ============================================================ */
@media (max-width: 719px) {
  .work-flow {
    flex-direction: column;
    flex-wrap: nowrap;
    overflow-x: visible;
    gap: 24px;
    padding-bottom: 0;
  }
  .work-flow__step {
    width: 100%;
    min-width: 0;
  }
  .work-flow__step + .work-flow__step::before {
    /* Switch from horizontal "→" to vertical "↓", and position
       above the next step instead of to its left. */
    content: "↓";
    left: 50%;
    top: -18px;
    transform: translateX(-50%);
    font-size: 14px;
    line-height: 1;
  }
}

/* ===========================================================================
   UTILITY PAGES — 404, legal (privacy/terms), thank-you, maintenance.
   Added for the custom-pages build. All use semantic tokens so they adapt to
   light/dark automatically. One shared narrow container keeps long-form copy
   at a comfortable reading measure.
   =========================================================================== */

/* Narrow reading column for prose-y pages. */
.container--narrow {
  max-width: 760px;
}

/* ---------- Search form (used on 404; had no styles before) ---------- */
.search-form {
  display: flex;
  gap: 10px;
  width: 100%;
}
.search-form__input {
  flex: 1 1 auto;
  min-width: 0;
  height: 54px;
  padding: 0 18px;
  font-family: var(--font-body);
  font-size: 15px;
  color: var(--color-text);
  background: var(--color-surface);
  border: 1.5px solid var(--color-border);
  border-radius: 6px;
  transition: border-color var(--t-med) var(--ease);
}
.search-form__input:focus-visible {
  outline: none;
  border-color: var(--red);
}
.search-form__submit {
  flex: 0 0 auto;
}

/* ---------- 404 / error ---------- */
.error-404 {
  text-align: center;
  /* Tighter top than the default .section rhythm — the page has no hero, so
     the big top padding left an awkward empty band under the header. */
  padding-top: clamp(36px, 4vw, 64px);
}
.error-404 .container {
  display: flex;
  flex-direction: column;
  align-items: center;
}
/* Animated error mark — the ring sweeps in, then the two strokes draw the X,
   then a small pop. Mirrors the thank-you check (reuses its keyframes).
   pathLength="1" normalizes the dash maths on every shape. */
.error-404__icon {
  display: inline-flex;
  width: 72px;
  height: 72px;
  color: var(--red);
  margin-bottom: 26px;
}
.error-404__icon svg { width: 100%; height: 100%; overflow: visible; }
.error-404__icon-ring,
.error-404__icon-x1,
.error-404__icon-x2 {
  stroke-dasharray: 1;
  stroke-dashoffset: 1;
}
.error-404__icon-ring {
  transform-box: fill-box;
  transform-origin: center;
  transform: rotate(-90deg);
  animation: nld-check-ring 0.5s var(--ease-out) forwards;
}
.error-404__icon-x1 { animation: nld-check-tick 0.26s var(--ease-out) 0.42s forwards; }
.error-404__icon-x2 { animation: nld-check-tick 0.26s var(--ease-out) 0.64s forwards; }
.error-404__icon { animation: nld-check-pop 0.32s var(--ease) 0.86s both; }
@media (prefers-reduced-motion: reduce) {
  .error-404__icon,
  .error-404__icon-ring,
  .error-404__icon-x1,
  .error-404__icon-x2 {
    animation: none;
    stroke-dashoffset: 0;
  }
  .error-404__icon-ring { transform: rotate(-90deg); }
}
.error-404 .eyebrow { justify-content: center; }
.error-404__title {
  margin-top: 6px;
}
.error-404__lead {
  margin: 18px auto 0;
  text-align: center;
}
.error-404__actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 14px;
  margin-top: 36px;
}
.error-404__links {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 10px 22px;
  margin-top: 36px;
}
.error-404__links a {
  font-size: 14px;
  font-weight: 500;
  color: var(--color-text-soft);
  text-decoration: none;
  border-bottom: 1px solid transparent;
  transition: color var(--t-med) var(--ease), border-color var(--t-med) var(--ease);
}
.error-404__links a:hover,
.error-404__links a:focus-visible {
  color: var(--red);
  border-bottom-color: var(--red);
}
.error-404__search {
  width: 100%;
  max-width: 460px;
  margin: 40px auto 0;
}

/* ---------- Legal documents (privacy, terms, …) ---------- */
.legal__header {
  padding-top: clamp(48px, 7vw, 96px);
  padding-bottom: clamp(28px, 4vw, 48px);
  border-bottom: 1px solid var(--color-border);
}
.legal__header .eyebrow { margin-bottom: 14px; }
.legal__updated {
  margin-top: 16px;
  font-size: 14px;
  color: var(--color-text-mute);
}
.legal__body {
  padding-top: clamp(36px, 5vw, 64px);
  padding-bottom: clamp(72px, 9vw, 128px);
}

/* Rich-text prose — first real styling for editor content on this theme.
   Scoped to .legal__prose so it can't leak into other components. */
/* Long Russian words in the title (e.g. "конфиденциальности") and long URLs in
   the body must wrap instead of overflowing the viewport on mobile. */
.legal__title {
  overflow-wrap: break-word;
  hyphens: auto;
}
.legal__prose {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.75;
  color: var(--color-text-soft);
  overflow-wrap: break-word;
}
.legal__prose > *:first-child { margin-top: 0; }
/* Legacy imported legal copy sometimes opens with its own in-content <h1>
   (e.g. "Our Privacy Policy"). The page already has the real <h1> in the
   header, so style any in-content h1 to match h2 — consistent serif display
   look, no rogue sans-serif default. (Editors should ideally demote it to h2.) */
.legal__prose h1,
.legal__prose h2 {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(22px, 2.6vw, 30px);
  line-height: 1.15;
  letter-spacing: -0.02em;
  color: var(--color-text);
  margin: 2.2em 0 0.6em;
}
.legal__prose h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(18px, 2vw, 22px);
  line-height: 1.2;
  color: var(--color-text);
  margin: 1.8em 0 0.5em;
}
.legal__prose h4 {
  font-weight: 600;
  font-size: 16px;
  color: var(--color-text);
  margin: 1.6em 0 0.4em;
}
.legal__prose p { margin: 0 0 1.1em; }
.legal__prose ul,
.legal__prose ol { margin: 0 0 1.1em; padding-left: 1.5em; }
.legal__prose ul { list-style: disc; }
.legal__prose ol { list-style: decimal; }
.legal__prose li { margin: 0 0 0.5em; }
.legal__prose a {
  color: var(--red);
  text-decoration: none;
  overflow-wrap: anywhere;
}
.legal__prose a:hover,
.legal__prose a:focus-visible {
  color: var(--red-dark);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.legal__prose strong { color: var(--color-text); font-weight: 600; }
.legal__prose blockquote {
  margin: 1.4em 0;
  padding-left: 20px;
  border-left: 3px solid var(--color-border);
  color: var(--color-text);
}
.legal__prose table {
  width: 100%;
  border-collapse: collapse;
  margin: 1.4em 0;
  font-size: 15px;
}
.legal__prose th,
.legal__prose td {
  text-align: left;
  padding: 10px 12px;
  border: 1px solid var(--color-border);
}
.legal__prose hr {
  border: 0;
  border-top: 1px solid var(--color-border);
  margin: 2em 0;
}

/* ---------- Thank-you / confirmation ---------- */
.thankyou__inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
}
.thankyou__icon {
  display: inline-flex;
  width: 64px;
  height: 64px;
  color: var(--red);
  margin-bottom: 26px;
}
.thankyou__icon svg { width: 100%; height: 100%; overflow: visible; }

/* Animated check — the ring sweeps in, then the tick strokes on, with a small
   confirming pop at the end. pathLength="1" on both shapes normalizes the
   dash maths regardless of their real geometry. */
.thankyou__icon-ring,
.thankyou__icon-check {
  stroke-dasharray: 1;
  stroke-dashoffset: 1;
}
.thankyou__icon-ring {
  transform-box: fill-box;
  transform-origin: center;
  transform: rotate(-90deg); /* start the sweep from the top */
  animation: nld-check-ring 0.5s var(--ease-out) forwards;
}
.thankyou__icon-check {
  animation: nld-check-tick 0.3s var(--ease-out) 0.42s forwards;
}
.thankyou__icon {
  animation: nld-check-pop 0.32s var(--ease) 0.7s both;
}
@keyframes nld-check-ring {
  to { stroke-dashoffset: 0; }
}
@keyframes nld-check-tick {
  to { stroke-dashoffset: 0; }
}
@keyframes nld-check-pop {
  0%   { transform: scale(1); }
  45%  { transform: scale(1.08); }
  100% { transform: scale(1); }
}
@media (prefers-reduced-motion: reduce) {
  .thankyou__icon,
  .thankyou__icon-ring,
  .thankyou__icon-check {
    animation: none;
    stroke-dashoffset: 0;
  }
  .thankyou__icon-ring { transform: rotate(-90deg); }
}
.thankyou .eyebrow { justify-content: center; }
.thankyou__title { margin-top: 8px; }
.thankyou__content {
  margin: 20px auto 0;
  max-width: 600px;
  font-size: 16px;
  line-height: 1.7;
  color: var(--color-text-soft);
}
.thankyou__content .lead { margin: 0 auto; text-align: center; }
.thankyou__content p { margin: 0 0 1em; }
.thankyou__content a { color: var(--red); text-decoration: underline; text-underline-offset: 2px; }
.thankyou__actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 14px;
  margin-top: 40px;
}

/* ---------- Maintenance (standalone 503 page) ---------- */
.maintenance-page {
  margin: 0;
  background: var(--color-bg);
  color: var(--color-text);
}
.maintenance {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  padding: 48px 0;
}
.maintenance__inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
}
.maintenance__brand {
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--color-text-mute);
  margin-bottom: 32px;
}
.maintenance__icon {
  display: inline-flex;
  width: 56px;
  height: 56px;
  color: var(--red);
  margin-bottom: 24px;
}
.maintenance__icon svg { width: 100%; height: 100%; }
.maintenance__title { margin: 0; }
.maintenance__message {
  margin: 18px auto 0;
  max-width: 520px;
  text-align: center;
}
.maintenance__message p { margin: 0 0 0.8em; }
.maintenance__back {
  margin-top: 28px;
  font-size: 15px;
  color: var(--color-text-soft);
}
.maintenance__back strong { color: var(--color-text); }
.maintenance__contact {
  margin-top: 14px;
  font-size: 15px;
  color: var(--color-text-soft);
}
.maintenance__contact a {
  color: var(--red);
  text-decoration: underline;
  text-underline-offset: 2px;
}

/* ===========================================================================
   BLOG — index (home.php), archives (archive.php), search (search.php).
   Reuses the locked .insight-card component (parts/post-card.php). Adds the
   hero header, category filter + sort controls, featured lead card, grid,
   and pagination. Semantic tokens → adapts to light/dark.
   =========================================================================== */

/* ---------- Hero header ---------- */
.blog-hero {
  padding-top: clamp(40px, 5vw, 72px);
}
.blog-hero .eyebrow { margin-bottom: 14px; }
.blog-hero__title { margin-top: 6px; }
.blog-hero__intro {
  margin-top: 18px;
  max-width: 62ch;
}
.blog-hero__intro p { margin: 0 0 0.6em; }
.blog-hero__intro p:last-child { margin-bottom: 0; }
.blog-hero__search {
  margin-top: 26px;
  max-width: 480px;
}

/* The listing section sits right under the hero, so trim its default top. */
.blog-listing {
  padding-top: clamp(28px, 3.5vw, 48px);
}

/* ---------- Controls: category filter + sort ---------- */
.blog-controls {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 16px 28px;
  padding-bottom: 22px;
  margin-bottom: clamp(28px, 4vw, 44px);
  border-bottom: 1px solid var(--color-border);
}
.blog-filter {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.blog-filter__chip {
  display: inline-flex;
  align-items: center;
  font-size: 13px;
  font-weight: 500;
  line-height: 1;
  padding: 9px 15px;
  border-radius: 999px;
  border: 1px solid var(--color-border);
  color: var(--color-text-soft);
  text-decoration: none;
  white-space: nowrap;
  transition: color var(--t-med) var(--ease),
              border-color var(--t-med) var(--ease),
              background-color var(--t-med) var(--ease);
}
.blog-filter__chip:hover,
.blog-filter__chip:focus-visible {
  color: var(--color-text);
  border-color: var(--color-text);
}
/* Active chip inverts against the page in both themes. */
.blog-filter__chip.is-active {
  background: var(--color-text);
  border-color: var(--color-text);
  color: var(--color-bg);
}
.blog-sort {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
}
.blog-sort__label {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--color-text-mute);
}
.blog-sort__list {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 16px;
  list-style: none;
  margin: 0;
  padding: 0;
}
.blog-sort__link {
  font-size: 13px;
  font-weight: 500;
  color: var(--color-text-soft);
  text-decoration: none;
  transition: color var(--t-med) var(--ease);
}
.blog-sort__link:hover,
.blog-sort__link:focus-visible { color: var(--red); }
.blog-sort__link.is-active { color: var(--red); font-weight: 600; }

/* ---------- Grid (uses .insight-card) ---------- */
.blog-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 20px;
}
@media (min-width: 600px) { .blog-grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 980px) { .blog-grid { grid-template-columns: repeat(3, 1fr); } }

/* MOBILE: compact horizontal cards (small thumbnail beside title) so a long
   list of articles scrolls fast. Applies to every blog LISTING grid (index,
   archives, search, related). The homepage Insights (.insights__grid) and the
   prominent featured lead (.blog-featured) are intentionally NOT affected. */
@media (max-width: 599px) {
  .blog-grid,
  .insights__grid { gap: 12px; }
  :is(.blog-grid, .insights__grid) .insight-card { flex-direction: row; align-items: stretch; }
  :is(.blog-grid, .insights__grid) .insight-card__img {
    flex: 0 0 112px;
    width: 112px;
    aspect-ratio: 1 / 1;
  }
  :is(.blog-grid, .insights__grid) .insight-card__img-icon { font-size: 22px; }
  :is(.blog-grid, .insights__grid) .insight-card__body {
    padding: 12px 14px;
    min-height: 0;
    justify-content: center;
    gap: 0;
  }
  :is(.blog-grid, .insights__grid) .insight-card__meta {
    margin-bottom: 6px;
    font-size: 10px;
    gap: 4px 10px;
  }
  :is(.blog-grid, .insights__grid) .insight-card__title {
    font-size: 15px;
    line-height: 1.3;
    margin-bottom: 0;
    -webkit-line-clamp: 3;
  }
  /* Drop the excerpt + read link on mobile — the whole card is the link. */
  :is(.blog-grid, .insights__grid) .insight-card__excerpt,
  :is(.blog-grid, .insights__grid) .insight-card__read { display: none; }
  :is(.blog-grid, .insights__grid) .insight-card__badge {
    top: 8px;
    left: 8px;
    padding: 3px 8px;
    font-size: 10px;
  }
}

/* ---------- Featured lead card ---------- */
.blog-featured { margin-bottom: clamp(24px, 3vw, 36px); }
@media (min-width: 768px) {
  .insight-card--featured { flex-direction: row; }
  .insight-card--featured .insight-card__img {
    flex: 0 0 56%;
    width: 56%;
    aspect-ratio: auto;
    min-height: 340px;
  }
  .insight-card--featured .insight-card__body {
    justify-content: center;
    padding: clamp(28px, 3vw, 48px);
    min-height: 0;
  }
  .insight-card--featured .insight-card__title {
    font-size: clamp(22px, 2.3vw, 30px);
    line-height: 1.18;
    margin-bottom: 14px;
  }
  .insight-card--featured .insight-card__excerpt {
    font-size: 15px;
    line-height: 1.6;
    -webkit-line-clamp: 4;
  }
  .insight-card--featured .insight-card__read { font-size: 14px; }
}

/* ---------- Pagination ---------- */
.blog-pagination { margin-top: clamp(40px, 5vw, 64px); }
.blog-pagination .nav-links {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 8px;
}
.blog-pagination .page-numbers {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  height: 44px;
  padding: 0 14px;
  border-radius: 8px;
  border: 1px solid var(--color-border);
  color: var(--color-text);
  text-decoration: none;
  font-size: 14px;
  font-weight: 500;
  transition: border-color var(--t-med) var(--ease),
              background-color var(--t-med) var(--ease),
              color var(--t-med) var(--ease);
}
.blog-pagination a.page-numbers:hover,
.blog-pagination a.page-numbers:focus-visible {
  border-color: var(--color-text);
}
.blog-pagination .page-numbers.current {
  background: var(--color-text);
  border-color: var(--color-text);
  color: var(--color-bg);
}
.blog-pagination .page-numbers.dots {
  border-color: transparent;
  min-width: 0;
  padding: 0 4px;
}

/* ---------- Empty state ---------- */
.blog-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 22px;
  padding: clamp(40px, 6vw, 80px) 0;
}

/* ===========================================================================
   SINGLE ARTICLE (single.php) — editorial reading layout.
   Reuses .insight-card (related) + .prefooter. Semantic tokens → light/dark.
   =========================================================================== */

/* ---------- Hero ---------- */
.article-hero {
  padding-top: clamp(32px, 4.5vw, 60px);
}
/* Back link + category sit on ONE line with clear space between them. */
.article-hero__top {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 28px;
  margin-bottom: 18px;
}
.article-hero__back {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 14px;
  font-weight: 500;
  color: var(--color-text-soft);
  text-decoration: none;
  transition: color var(--t-med) var(--ease);
}
.article-hero__back:hover { color: var(--red); }
.article-hero__cat {
  display: inline-flex;
  text-decoration: none;
}
.article-hero__cat:hover { color: var(--red-dark); }
.article-hero__title { margin: 0 0 20px; }
.article-hero__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  font-size: 14px;
  color: var(--color-text-mute);
}
.article-hero__author { font-weight: 600; color: var(--color-text); }
.article-hero__author a { color: inherit; text-decoration: none; }
.article-hero__author a:hover,
.article-hero__author a:focus-visible { text-decoration: underline; }
.article-hero__dot { color: var(--color-border); }

.article-hero__media {
  margin-top: clamp(28px, 4vw, 48px);
}
.article-hero__img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 16px;
}
.article-hero__updated { color: var(--color-text-mute); }

/* ---------- Breadcrumbs (article hero; styled trail, Yoast emits schema) --- */
.breadcrumbs {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px 8px;
  margin-bottom: 18px;
  font-size: 13px;
  color: var(--color-text-mute);
}
.breadcrumbs a {
  color: var(--color-text-soft);
  text-decoration: none;
  transition: color var(--t-med) var(--ease);
}
.breadcrumbs a:hover { color: var(--red); }
.breadcrumbs__sep { color: var(--color-border); }
.breadcrumbs__current {
  color: var(--color-text-mute);
  max-width: 42ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ---------- Reading progress bar (driven by article-toc.js) ---------- */
.reading-progress {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 100;
  height: 3px;
  width: 100%;
  transform-origin: 0 50%;
  transform: scaleX(0);
  background: var(--red);
  will-change: transform;
}
body.admin-bar .reading-progress { top: 32px; }

/* ---------- Body wrap + two-column layout (sticky TOC rail on desktop) ---- */
.article-body-wrap {
  padding-top: clamp(36px, 5vw, 60px);
  padding-bottom: clamp(56px, 7vw, 96px);
}
.article-main {
  max-width: 760px;
  margin: 0 auto;
}
@media (min-width: 1100px) {
  .article-layout--with-toc {
    display: grid;
    grid-template-columns: 240px minmax(0, 720px);
    gap: 64px;
    justify-content: center;
    align-items: start;
  }
  .article-layout--with-toc .article-main {
    max-width: none;
    margin: 0;
  }
  .article-layout--with-toc .article-toc-rail {
    position: sticky;
    top: 100px;
  }
}

/* ---------- Table of contents ---------- */
.article-toc {
  background: var(--color-bg-alt);
  border: 1px solid var(--color-border);
  border-radius: 14px;
  padding: 22px 26px;
  margin-bottom: clamp(32px, 4vw, 48px);
}
.article-toc__label {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--color-text-mute);
  margin: 0 0 12px;
}
.article-toc__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.article-toc__item--l3 { padding-left: 18px; }
.article-toc__item a {
  font-size: 15px;
  line-height: 1.4;
  color: var(--color-text-soft);
  text-decoration: none;
  transition: color var(--t-med) var(--ease);
}
.article-toc__item--l3 a { font-size: 14px; }
.article-toc__item a:hover { color: var(--red); }
/* Active section (set by article-toc.js as you scroll). */
.article-toc__item a.is-active {
  color: var(--red);
  font-weight: 600;
}

/* ---------- Article prose ---------- */
.article-body {
  font-family: var(--font-body);
  font-size: 17px;
  line-height: 1.78;
  color: var(--color-text-soft);
}
.article-body > *:first-child { margin-top: 0; }
.article-body :is(h2, h3, h4)[id] { scroll-margin-top: 100px; }
.article-body h2,
.article-body .wp-block-heading:is(h2) {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(24px, 3vw, 34px);
  line-height: 1.15;
  letter-spacing: -0.02em;
  color: var(--color-text);
  margin: 1.9em 0 0.55em;
}
.article-body h3,
.article-body .wp-block-heading:is(h3) {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(20px, 2.2vw, 25px);
  line-height: 1.2;
  color: var(--color-text);
  margin: 1.7em 0 0.5em;
}
.article-body h4 {
  font-weight: 600;
  font-size: 18px;
  color: var(--color-text);
  margin: 1.6em 0 0.4em;
}
.article-body p { margin: 0 0 1.3em; }
/* Restore list markers — the global reset (ul,ol{list-style:none}) for nav
   menus had stripped bullets/numbers from article content. */
.article-body ul,
.article-body ol { margin: 0 0 1.3em; padding-left: 1.5em; }
.article-body ul { list-style: disc; }
.article-body ol { list-style: decimal; }
.article-body ul ul { list-style: circle; margin: 0.5em 0; }
.article-body ol ol { list-style: lower-alpha; margin: 0.5em 0; }
.article-body li { margin: 0 0 0.55em; }
.article-body li::marker { color: var(--color-text-mute); }
.article-body a {
  color: var(--red);
  text-decoration: none;
}
.article-body a:hover,
.article-body a:focus-visible {
  color: var(--red-dark);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.article-body strong { color: var(--color-text); font-weight: 600; }
.article-body img,
.article-body .wp-block-image img {
  max-width: 100%;
  height: auto;
  border-radius: 12px;
}
.article-body figure { margin: 1.8em 0; }
.article-body figure figcaption {
  font-size: 13px;
  color: var(--color-text-mute);
  text-align: center;
  margin-top: 10px;
}
.article-body blockquote {
  margin: 1.8em 0;
  padding: 4px 0 4px 22px;
  border-left: 3px solid var(--red);
  font-size: 19px;
  line-height: 1.6;
  color: var(--color-text);
}
.article-body blockquote p:last-child { margin-bottom: 0; }
.article-body hr {
  border: 0;
  border-top: 1px solid var(--color-border);
  margin: 2.2em 0;
}
.article-body :is(h2, h3) + p { margin-top: 0; }

/* In-content Gutenberg button block (wp:buttons) — restyle to match the site's
   button design. Inverts against the page (dark-on-light / light-on-dark) and
   goes red on hover, like our primary button. Overrides the core block-library
   styles and the .article-body link color/underline. */
.article-body .wp-block-buttons {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin: 1.7em 0;
}
.article-body .wp-block-button { margin: 0; }
.article-body .wp-block-button__link,
.article-body a.wp-block-button__link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 54px;
  padding: 0 28px;
  font-family: var(--font-body);
  font-size: 15px;
  font-weight: 500;
  line-height: 1;
  border-radius: 6px;
  border: 1.5px solid var(--color-text);
  background: var(--color-text);
  color: var(--color-bg);
  text-decoration: none;
  letter-spacing: -0.005em;
  transition: background-color var(--t-med) var(--ease),
              border-color var(--t-med) var(--ease),
              color var(--t-med) var(--ease),
              transform 140ms ease;
}
.article-body .wp-block-button__link:hover,
.article-body .wp-block-button__link:focus-visible {
  background: var(--red);
  border-color: var(--red);
  color: var(--brand-paper);
  transform: translateY(-1px);
}

/* ---------- In-content CTA block (Gutenberg "CTA Block HTML" → .s-block1) ----
   The block markup is fixed in post content; we only style it here. Its button
   carries a bare .btn class, so we give it a real solid look. */
.s-block1 {
  margin: clamp(36px, 5vw, 56px) 0;
}
.s-block1__inner {
  display: flex;
  overflow: hidden;
  border-radius: 18px;
  background: var(--brand-ink);
  box-shadow: var(--shadow-card);
}
.s-block1__body {
  flex: 1 1 auto;
  padding: clamp(28px, 4vw, 44px);
}
/* Scoped with .s-block1 to outrank .article-body h2 (the block sits inside the
   article body, so a bare .s-block1__title loses the color cascade). */
.s-block1 .s-block1__title {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(22px, 2.6vw, 30px);
  line-height: 1.15;
  letter-spacing: -0.02em;
  color: var(--brand-paper);
  margin: 0 0 12px;
}
.s-block1 .s-block1__text {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.6;
  color: rgba(255, 255, 255, 0.78);
  margin: 0 0 24px;
}
.s-block1__btn { margin: 0; }
/* Override the bare .btn so it renders as a solid red CTA on the dark panel. */
.s-block1__btn .btn {
  background: var(--red);
  color: var(--brand-paper);
  border-color: var(--red);
  text-decoration: none;
}
.s-block1__btn .btn:hover,
.s-block1__btn .btn:focus-visible {
  background: var(--red-dark);
  border-color: var(--red-dark);
  color: var(--brand-paper);
}
/* Decorative right panel (the empty .s-block1__pic) — a brand-red wash. */
.s-block1__pic {
  flex: 0 0 34%;
  position: relative;
  background:
    radial-gradient(circle at 70% 30%, rgba(255, 33, 61, 0.55), transparent 60%),
    linear-gradient(135deg, var(--red) 0%, var(--red-dark) 100%);
  font-size: 0;
}
@media (max-width: 720px) {
  .s-block1__pic { display: none; }
}

/* ---------- Share ---------- */
.article-share {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: clamp(36px, 5vw, 52px);
  padding-top: 24px;
  border-top: 1px solid var(--color-border);
}
.article-share__label {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--color-text-mute);
  margin-right: 4px;
}
.article-share__link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid var(--color-border);
  color: var(--color-text);
  transition: color var(--t-med) var(--ease),
              border-color var(--t-med) var(--ease),
              background-color var(--t-med) var(--ease),
              transform var(--t-med) var(--ease);
}
.article-share__link svg { width: 16px; height: 16px; }
.article-share__link:hover {
  color: var(--brand-paper);
  background: var(--ink);
  border-color: var(--ink);
  transform: translateY(-2px);
}

/* ---------- Author bio ---------- */
.article-author {
  display: flex;
  gap: 18px;
  align-items: flex-start;
  margin-top: clamp(36px, 5vw, 52px);
  padding: 26px;
  background: var(--color-bg-alt);
  border: 1px solid var(--color-border);
  border-radius: 14px;
}
.article-author__avatar {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  background: var(--ink);
  color: var(--brand-paper);
  font-weight: 600;
  font-size: 18px;
  letter-spacing: 0.02em;
}
/* Real author headshot in the byline (same round frame as the initials). */
.article-author__photo {
  flex: 0 0 auto;
  width: 52px;
  height: 52px;
  border-radius: 50%;
  object-fit: cover;
  object-position: center center;
}
.article-author__photo-link { display: inline-flex; flex: 0 0 auto; line-height: 0; }
.article-author__name {
  font-weight: 600;
  color: var(--color-text);
  margin: 0 0 6px;
}
/* Byline name links to the author archive (E-E-A-T). Keep the locked look:
   inherit color, no static underline — underline only on hover for affordance. */
.article-author__name a {
  color: inherit;
  text-decoration: none;
}
.article-author__name a:hover,
.article-author__name a:focus-visible {
  text-decoration: underline;
}
.article-author__bio {
  font-size: 15px;
  line-height: 1.6;
  color: var(--color-text-soft);
  margin: 0;
}

/* ---------- Prev / next ---------- */
.article-nav {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  margin-top: clamp(40px, 5vw, 56px);
}
.article-nav__link {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 20px 22px;
  border: 1px solid var(--color-border);
  border-radius: 12px;
  text-decoration: none;
  transition: border-color var(--t-med) var(--ease),
              transform var(--t-med) var(--ease);
}
.article-nav__link:hover { border-color: var(--color-text); transform: translateY(-2px); }
.article-nav__link--next { text-align: right; align-items: flex-end; }
.article-nav__dir {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--red);
}
.article-nav__title {
  font-size: 15px;
  font-weight: 500;
  color: var(--color-text);
  line-height: 1.35;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* ---------- Related ---------- */
.related-posts {
  background: var(--color-bg-alt);
}
@media (max-width: 560px) {
  .article-nav { grid-template-columns: 1fr; }
}

/* ---------- Author page (author.php) ---------- */
.author-hero {
  padding-top: clamp(40px, 5vw, 72px);
  padding-bottom: clamp(8px, 2vw, 20px);
}
.author-hero__inner {
  display: flex;
  gap: clamp(20px, 3vw, 32px);
  align-items: flex-start;
}
.author-hero__avatar {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 84px;
  height: 84px;
  border-radius: 50%;
  background: var(--ink);
  color: var(--brand-paper);
  font-weight: 600;
  font-size: 30px;
  letter-spacing: 0.02em;
}
/* Real author portrait (E-E-A-T) — same round frame as the initials avatar. */
.author-hero__photo {
  flex: 0 0 auto;
  width: 84px;
  height: 84px;
  border-radius: 50%;
  object-fit: cover;
  object-position: center center;
}
.author-hero .eyebrow { margin-bottom: 12px; }
.author-hero__name { margin: 0 0 16px; }
.author-hero__bio {
  font-size: 16px;
  line-height: 1.7;
  color: var(--color-text-soft);
  max-width: 60ch;
}
.author-hero__bio p { margin: 0 0 0.8em; }
.author-hero__cta { margin-top: 24px; }
@media (max-width: 560px) {
  .author-hero__inner { flex-direction: column; }
  .author-hero__avatar { width: 64px; height: 64px; font-size: 24px; }
  .author-hero__photo { width: 64px; height: 64px; }
}

/* ---------- Industry chips (article tags → industry pages) ---------- */
.article-industries {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px 14px;
  margin-top: clamp(32px, 4vw, 44px);
  padding-top: 24px;
  border-top: 1px solid var(--color-border);
}
.article-industries__label {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--color-text-mute);
}
.article-industries__list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  list-style: none;
  margin: 0;
  padding: 0;
}
.article-industries__chip {
  display: inline-flex;
  align-items: center;
  font-size: 13px;
  font-weight: 500;
  line-height: 1;
  padding: 8px 14px;
  border-radius: 999px;
  border: 1px solid var(--color-border);
  color: var(--color-text-soft);
  text-decoration: none;
  transition: color var(--t-med) var(--ease),
              border-color var(--t-med) var(--ease),
              background-color var(--t-med) var(--ease);
}
.article-industries__chip:hover,
.article-industries__chip:focus-visible {
  color: var(--brand-paper);
  background: var(--ink);
  border-color: var(--ink);
}

/* ---------- "Most read" strip (blog index, page 1) ---------- */
.most-read__head { margin-bottom: clamp(24px, 3vw, 36px); }
.most-read__head .eyebrow { margin-bottom: 10px; }
.most-read__title {
  font-family: var(--font-display);
  font-variation-settings: var(--font-display-opsz);
  font-weight: 500;
  font-size: clamp(24px, 3vw, 34px);
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--color-text);
  margin: 0;
}
.most-read__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 4px 40px;
}
@media (min-width: 760px) { .most-read__list { grid-template-columns: 1fr 1fr; } }
.most-read__link {
  display: flex;
  gap: 16px;
  align-items: baseline;
  padding: 16px 0;
  border-top: 1px solid var(--color-border);
  text-decoration: none;
}
.most-read__num {
  flex: 0 0 auto;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 20px;
  color: var(--red);
  width: 1.6em;
}
.most-read__body { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.most-read__post-title {
  font-size: 16px;
  font-weight: 500;
  line-height: 1.35;
  color: var(--color-text);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  transition: color var(--t-med) var(--ease);
}
.most-read__link:hover .most-read__post-title { color: var(--red); }
.most-read__meta {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--color-text-mute);
}
.most-read__cat { color: var(--red); }

/* ---------- Service page: discreet "From the blog" strip (above footer) ---- */
.service-articles {
  padding: clamp(48px, 6vw, 76px) 0;
  border-top: 1px solid var(--color-border);
}
.service-articles__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px 20px;
  margin-bottom: clamp(22px, 3vw, 32px);
}
.service-articles__label {
  margin: 0;
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--color-text-mute);
}
.service-articles__list {
  display: grid;
  grid-template-columns: 1fr;
  gap: 18px 32px;
}
@media (min-width: 640px)  { .service-articles__list { grid-template-columns: 1fr 1fr; } }
@media (min-width: 1000px) { .service-articles__list { grid-template-columns: repeat(3, 1fr); } }

/* Compact post card: small thumbnail beside title + read link. */
.post-mini {
  display: flex;
  gap: 14px;
  align-items: center;
  text-decoration: none;
}
.post-mini__img {
  flex: 0 0 auto;
  width: 84px;
  height: 84px;
  border-radius: 10px;
  overflow: hidden;
  background: var(--color-bg-alt);
}
.post-mini__photo {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.post-mini__body {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
}
.post-mini__title {
  font-size: 15px;
  font-weight: 500;
  line-height: 1.35;
  color: var(--color-text);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  transition: color var(--t-med) var(--ease);
}
.post-mini:hover .post-mini__title,
.post-mini:focus-visible .post-mini__title { color: var(--red); }
.post-mini__read {
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--red);
}

/* ===========================================================================
   INDUSTRY PAGES (page-industry.php) — most sections reuse service-detail
   components (.service-hero, .service-how, .work-card, .blog-grid, .contact).
   Only the "How we help" service links need their own styling.
   =========================================================================== */
.industry-how__lead {
  max-width: 640px;
  margin: 0 auto clamp(28px, 4vw, 40px);
  text-align: center;
  font-size: clamp(16px, 1.3vw, 19px);
  line-height: 1.6;
  color: var(--color-text-soft);
}
.industry-services {
  display: grid;
  grid-template-columns: 1fr;
  gap: 14px;
  max-width: 760px;
  margin: 0 auto;
}
@media (min-width: 640px) { .industry-services { grid-template-columns: 1fr 1fr; } }
.industry-service {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 18px 22px;
  border: 1px solid var(--color-border);
  border-radius: 12px;
  background: var(--color-surface);
  text-decoration: none;
  transition: border-color var(--t-med) var(--ease), transform var(--t-med) var(--ease);
}
.industry-service:hover,
.industry-service:focus-visible { border-color: var(--color-text); transform: translateY(-2px); }
.industry-service__name { font-weight: 500; color: var(--color-text); }
.industry-service__arrow { color: var(--red); flex: 0 0 auto; }

/* Dark "How we help" band — the one black section on industry pages. It exists
   in EVERY language (unlike the EN-only guides section), so it anchors the
   background rhythm consistently: the cadence never lands two grays in a row on
   RO/RU. White service tiles become subtle translucent tiles on the dark ground. */
.service-deliverables.industry-how--dark { background: var(--ink); }
.industry-how--dark .eyebrow--plain { color: rgba(255, 255, 255, 0.55); }
.industry-how--dark .h-section { color: var(--white); }
.industry-how--dark .industry-how__lead { color: rgba(255, 255, 255, 0.72); }
.industry-how--dark .industry-service {
  background: rgba(255, 255, 255, 0.05);
  border-color: rgba(255, 255, 255, 0.14);
}
.industry-how--dark .industry-service__name { color: var(--white); }
.industry-how--dark .industry-service:hover,
.industry-how--dark .industry-service:focus-visible { border-color: rgba(255, 255, 255, 0.45); transform: translateY(-2px); }

/* /industries/ INDEX grid — every industry as a name + proof-hint + arrow card.
   Reuses the .industry-service look; 1 / 2 / 3 columns. */
.industries-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 14px;
  max-width: 1000px;
  margin: 0 auto;
}
@media (min-width: 600px) { .industries-grid { grid-template-columns: 1fr 1fr; } }
@media (min-width: 960px) { .industries-grid { grid-template-columns: repeat(3, 1fr); } }
/* Fluid XL: on big screens fill the (now wider) container and go 4-up so the
   grid doesn't sit as a narrow island. */
@media (min-width: 1600px) { .industries-grid { max-width: none; grid-template-columns: repeat(4, 1fr); } }
.industry-index-card {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 5px;
  padding: 20px 48px 20px 22px;
  border: 1px solid var(--color-border);
  border-radius: 14px;
  background: var(--color-surface);
  text-decoration: none;
  transition: border-color var(--t-med) var(--ease), transform var(--t-med) var(--ease);
}
.industry-index-card:hover,
.industry-index-card:focus-visible { border-color: var(--color-text); transform: translateY(-2px); }
.industry-index-card__name { font-weight: 600; font-size: 17px; line-height: 1.3; color: var(--color-text); }
.industry-index-card__hint { font-size: 13px; line-height: 1.4; color: var(--color-text-mute); }
.industry-index-card__arrow {
  position: absolute; top: 50%; right: 20px;
  transform: translateY(-50%);
  color: var(--red); font-size: 18px; line-height: 1;
  transition: transform var(--t-fast) var(--ease);
}
.industry-index-card:hover .industry-index-card__arrow,
.industry-index-card:focus-visible .industry-index-card__arrow { transform: translateY(-50%) translateX(3px); }

/* ============================================================
   CONTACT PAGE (page-contact-us.php)
   ============================================================ */

/* Hero quick-call phones, under the trust list. */
.contact-hero__phones { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 28px; }
.contact-hero__phone {
  display: flex; flex-direction: column; gap: 2px;
  padding: 12px 20px; border: 1px solid var(--color-border); border-radius: 12px;
  background: var(--color-surface); text-decoration: none;
  transition: border-color var(--t-med) var(--ease), transform var(--t-med) var(--ease);
}
.contact-hero__phone:hover { border-color: var(--color-text); transform: translateY(-2px); }
.contact-hero__phone-label { font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--color-text-mute); }
.contact-hero__phone-num { font-weight: 600; color: var(--color-text); }

/* Contact-detail cards. */
.contact-cards { display: grid; grid-template-columns: 1fr; gap: 16px; max-width: 880px; margin: 0 auto; }
@media (min-width: 700px) { .contact-cards { grid-template-columns: repeat(3, 1fr); } }
.contact-card {
  display: flex; flex-direction: column; align-items: center; text-align: center; gap: 8px;
  padding: 28px 22px; border: 1px solid var(--color-border); border-radius: 16px;
  background: var(--color-surface); text-decoration: none;
  transition: border-color var(--t-med) var(--ease), transform var(--t-med) var(--ease);
}
.contact-card:hover { border-color: var(--color-text); transform: translateY(-3px); }
.contact-card__icon { display: flex; width: 44px; height: 44px; align-items: center; justify-content: center; border-radius: 50%; background: var(--brand-red-pale, #FFF5F6); color: var(--red); }
.contact-card__icon svg { width: 22px; height: 22px; }
.contact-card__label { font-size: 12px; letter-spacing: .12em; text-transform: uppercase; color: var(--color-text-mute); }
.contact-card__value { font-weight: 600; font-size: 18px; color: var(--color-text); }

/* Social row (light bg — override the dark-footer icon styling). */
.contact-social { margin-top: 32px; display: flex; flex-direction: column; align-items: center; gap: 12px; }
.contact-social__label { font-size: 12px; letter-spacing: .12em; text-transform: uppercase; color: var(--color-text-mute); }
.contact-social__links { display: flex; gap: 10px; }
.contact-social .site-footer__social {
  color: var(--color-text-soft);
  border: 1px solid var(--color-border); border-radius: 50%;
  width: 40px; height: 40px; display: flex; align-items: center; justify-content: center;
  transition: color var(--t-med) var(--ease), border-color var(--t-med) var(--ease), transform var(--t-med) var(--ease);
}
.contact-social .site-footer__social:hover { color: var(--red); border-color: var(--red); transform: translateY(-2px); }
.contact-social .site-footer__social svg { width: 18px; height: 18px; }

/* Reviews. */
.contact-reviews__grid { display: grid; grid-template-columns: 1fr; gap: 20px; }
@media (min-width: 760px) { .contact-reviews__grid { grid-template-columns: repeat(3, 1fr); } }
.contact-review { margin: 0; display: flex; flex-direction: column; gap: 14px; padding: 28px; border: 1px solid var(--color-border); border-radius: 16px; background: var(--color-surface); }
.contact-review__stars { color: var(--red); letter-spacing: 2px; font-size: 14px; }
.contact-review__text { font-size: 16px; line-height: 1.55; color: var(--color-text); margin: 0; }
.contact-review__foot { display: flex; flex-direction: column; gap: 2px; margin-top: auto; }
.contact-review__name { font-weight: 600; color: var(--color-text); }
.contact-review__role { font-size: 13px; color: var(--color-text-mute); }

/* FAQ — native <details> accordion (no JS). */
.faq { display: flex; flex-direction: column; gap: 12px; }
.faq__item { border: 1px solid var(--color-border); border-radius: 14px; background: var(--color-surface); overflow: hidden; }
.faq__q { display: flex; align-items: center; justify-content: space-between; gap: 16px; cursor: pointer; list-style: none; padding: 20px 24px; font-weight: 600; font-size: 17px; color: var(--color-text); }
.faq__q::-webkit-details-marker { display: none; }
.faq__icon { position: relative; flex: 0 0 auto; width: 18px; height: 18px; }
.faq__icon::before, .faq__icon::after { content: ""; position: absolute; background: var(--red); transition: transform var(--t-med) var(--ease); }
.faq__icon::before { top: 8px; left: 0; width: 18px; height: 2px; }
.faq__icon::after { top: 0; left: 8px; width: 2px; height: 18px; }
.faq__item[open] .faq__icon::after { transform: scaleY(0); }
.faq__a { padding: 0 24px 22px; }
.faq__a p { margin: 0; color: var(--color-text-soft); line-height: 1.6; }

/* Find us — lazily-embedded Google Map. */
.contact-map { position: relative; border: 1px solid var(--color-border); border-radius: 18px; overflow: hidden; background: var(--color-surface); aspect-ratio: 16 / 7; }
@media (max-width: 599px) { .contact-map { aspect-ratio: 4 / 5; } }
.contact-map__frame { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; display: block; }
.contact-find__address { font-style: normal; text-align: center; margin: 0 auto clamp(22px, 3vw, 32px); color: var(--color-text-soft); line-height: 1.7; }
.contact-find__company { font-weight: 700; color: var(--color-text); }
.contact-find__note { text-align: center; margin-top: 20px; }

/* Messaging pills (WhatsApp / Viber / Telegram) on the contact page. */
.contact-chat { margin-top: 30px; display: flex; flex-direction: column; align-items: center; gap: 12px; }
.contact-chat__label { font-size: 12px; letter-spacing: .12em; text-transform: uppercase; color: var(--color-text-mute); }
.contact-chat__links { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; }
.contact-chat__link {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 11px 20px; border-radius: 999px;
  border: 1px solid var(--color-border); background: var(--color-surface);
  color: var(--color-text); font-weight: 600; text-decoration: none;
  transition: border-color var(--t-med) var(--ease), transform var(--t-med) var(--ease);
}
.contact-chat__link:hover { transform: translateY(-2px); }
.contact-chat__icon { display: flex; }
.contact-chat__icon svg { width: 24px; height: 24px; }
.contact-chat__link--whatsapp .contact-chat__icon { color: #25D366; }
.contact-chat__link--viber .contact-chat__icon { color: #7360F2; }
.contact-chat__link--telegram .contact-chat__icon { color: #26A5E4; }
.contact-chat__link--whatsapp:hover { border-color: #25D366; }
.contact-chat__link--viber:hover { border-color: #7360F2; }
.contact-chat__link--telegram:hover { border-color: #26A5E4; }

/* The "what happens next" section reuses .service-how, which sets its own white
   background — that would override section--alt. Force the alt band so the
   contact page keeps its alternating rhythm (no white-after-white). */
.contact-next.section--alt { background: var(--color-bg-alt); }

/* Footer messaging row — reuses .site-footer__social icon styling. */
.site-footer__chat { margin-top: 22px; margin-bottom: 24px; }
.site-footer__chat-label { display: block; font-size: 11px; letter-spacing: .12em; text-transform: uppercase; opacity: .55; margin-bottom: 20px; }
.site-footer__chat-links { display: flex; gap: 10px; }
/* Messaging glyphs (esp. Viber) carry more detail than the social icons, so
   render them a touch larger than the 15px socials to stay crisp. */
.site-footer__chat-link svg { width: 19px; height: 19px; }

/* Industry-page "Free guides" downloads grid (ungated ex-ebooks). Reuses the
   .work-book card; arranged 1/2/3-up. */
/* Flex (not grid) so rows are CENTERED — fewer-than-3 and last-row orphans
   center instead of left-aligning. Cards have a fixed basis (no grow) so a
   lone card stays card-width and centered, not stretched. */
.industry-downloads {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 12px;
  max-width: 1040px;
  margin: 0 auto;
}
.industry-download { flex: 0 1 330px; }
.industry-download { background: var(--color-surface); }
.industry-download .work-book__title { line-height: 1.35; }
.industry-download .work-book__meta { font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--color-text-mute); }
/* Keep the download icon a fixed 28×28 in every card — without this the flex
   item shrinks (squishing the icon) when a title runs to 2–3 lines. */
.industry-download .work-book__icon { flex: 0 0 28px; }
.industry-download .work-book__icon svg { width: 28px; height: 28px; }

/* Careers page (simple, centered). */
.careers-hero__inner { text-align: center; }
.careers-hero__title { margin: 14px 0 22px; }
.careers-hero__lead, .careers-hero__body { max-width: 640px; margin-left: auto; margin-right: auto; }
.careers-hero__body { margin-top: 18px; color: var(--color-text-soft); line-height: 1.7; }
.careers-content { max-width: 640px; margin: 28px auto 0; text-align: left; }
.careers-hero__cta { margin-top: 32px; }
