/* =========================================================================
   SALEEM AKHTER — CUSTOM CSS
   Everything Elementor's panel genuinely cannot do.

   Rule: no colour or font is hard-coded here. All values come from
   Elementor Global Colors / Global Fonts via CSS custom properties, so
   changing Site Settings still updates this file's output too.

   CONTENTS
     1. Local aliases for the Elementor globals
     2. Design tokens (spacing / radius / shadow / motion)
     3. Text-Editor heading inheritance   <- required by the SEO retag
     4. Card hover  (replaces `transition: all` on 931 elements)
     5. Sticky header (replaces Elementor Pro's jQuery sticky)
     6. Scroll behaviour + reduced motion
     7. Horizontal-overflow guard
     8. Accessibility: focus states
   ====================================================================== */


/* -------------------------------------------------------------------------
   1. LOCAL ALIASES
   Short names that point at Elementor's globals. Change the colour in
   Site Settings > Global Colors and every rule below follows.

   NOTE ON SCOPE — this must be `body`, not `:root`.
   Elementor defines --e-global-color-* on `.elementor-kit-6`, which is a
   class on <body>. <body> is a DESCENDANT of :root, so an alias declared
   at :root cannot see those variables — it would resolve to empty and
   inherit that emptiness down the whole tree. Declaring the aliases on
   `body` puts them in the same scope as Elementor's own definitions.
   ---------------------------------------------------------------------- */
body {
  --sa-primary:      var(--e-global-color-primary);
  --sa-secondary:    var(--e-global-color-secondary);
  --sa-text:         var(--e-global-color-text);
  --sa-accent:       var(--e-global-color-accent);

  --sa-white:        var(--e-global-color-cwhite0);
  --sa-bg:           var(--e-global-color-cbgpage);
  --sa-surface-hover:var(--e-global-color-csurfhv);
  --sa-deep:         var(--e-global-color-cdeep00);
  --sa-text-muted:   var(--e-global-color-ctxtmut);
  --sa-on-dark:      var(--e-global-color-ctxtdrk);
  --sa-on-dark-muted:var(--e-global-color-ctxtdkm);
  --sa-border:       var(--e-global-color-cborder);
  --sa-border-strong:var(--e-global-color-cbordst);
  --sa-border-dark:  var(--e-global-color-cborddk);
  --sa-accent-hover: var(--e-global-color-cacchov);
  --sa-accent-text:  var(--e-global-color-cacctxt);
  --sa-accent-tint:  var(--e-global-color-cacctnt);

  --sa-font-head:    var(--e-global-typography-theadn1-font-family), sans-serif;
  --sa-font-body:    var(--e-global-typography-tbodymd-font-family), sans-serif;
  --sa-font-mono:    var(--e-global-typography-teyebro-font-family), monospace;
}


/* -------------------------------------------------------------------------
   2. DESIGN TOKENS
   Elementor has no global spacing/radius/shadow scale, so it lives here.
   ---------------------------------------------------------------------- */
:root {
  /* spacing — 4px base */
  --sa-space-1:  4px;   --sa-space-2:  8px;   --sa-space-3: 12px;
  --sa-space-4: 16px;   --sa-space-5: 24px;   --sa-space-6: 32px;
  --sa-space-7: 48px;   --sa-space-8: 64px;   --sa-space-9: 96px;
  --sa-space-10:128px;

  /* section rhythm — fluid, no breakpoint needed */
  --sa-section-y: clamp(56px, 8vw, 128px);
  --sa-gutter:    clamp(16px, 4vw, 40px);

  /* radius */
  --sa-radius-sm:  6px;  --sa-radius-md: 12px;
  --sa-radius-lg: 20px;  --sa-radius-xl: 32px;
  --sa-radius-full: 999px;

  /* shadow — warm, tinted to the brand rather than neutral black */
  --sa-shadow-sm: 0 1px 2px rgb(47 22 1 / 0.06);
  --sa-shadow-md: 0 4px 12px rgb(47 22 1 / 0.08);
  --sa-shadow-lg: 0 12px 32px rgb(47 22 1 / 0.10);
  --sa-shadow-xl: 0 24px 64px rgb(47 22 1 / 0.14);

  /* motion */
  --sa-ease:      cubic-bezier(0.4, 0, 0.2, 1);
  --sa-ease-out:  cubic-bezier(0.16, 1, 0.3, 1);
  --sa-dur-fast:  0.15s;
  --sa-dur-base:  0.3s;
  --sa-dur-slow:  0.5s;
}


/* -------------------------------------------------------------------------
   3. TEXT-EDITOR HEADING INHERITANCE
   The SEO pass converted several Text Editors from <p> to real <h1>/<h2>.
   Without this, Elementor's Theme Style h1-h6 rules would override the
   per-widget Global Font each of those widgets is bound to, changing the
   design. `font: inherit` hands control back to the widget's own binding.
   Only applies INSIDE a text-editor widget — real Heading widgets and raw
   post content still follow Theme Style.
   ---------------------------------------------------------------------- */
.elementor-widget-text-editor h1,
.elementor-widget-text-editor h2,
.elementor-widget-text-editor h3,
.elementor-widget-text-editor h4,
.elementor-widget-text-editor h5,
.elementor-widget-text-editor h6 {
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
  margin: 0;
}


/* -------------------------------------------------------------------------
   4. CARD HOVER
   Replaces this, which was duplicated in the Custom CSS field of six
   separate containers and put 931 elements under observation:

       .hover-content *        { transition: all 0.3s ease; }
       .hover-content:hover *  { transform: translatex(3px); }

   `transition: all` on a descendant wildcard forces the browser to watch
   every animatable property on every child on each style recalculation.
   Below: ONE element, ONE property, GPU-composited.
   ---------------------------------------------------------------------- */
.hover-content .sa-arrow,
.hover-content .elementor-heading-title {
  transition: transform var(--sa-dur-base) var(--sa-ease);
}
.hover-content:hover .sa-arrow,
.hover-content:hover .elementor-heading-title {
  transform: translateX(3px);
}

/* Card lift — transform + opacity only, both composited */
.sa-card {
  transition: transform var(--sa-dur-base) var(--sa-ease),
              box-shadow var(--sa-dur-base) var(--sa-ease);
}
.sa-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--sa-shadow-lg);
}


/* -------------------------------------------------------------------------
   5. STICKY HEADER — zero JavaScript
   Elementor Pro's Sticky loads jquery.sticky.min.js and recalculates
   offsets on every scroll event. Native position:sticky costs nothing.
   Add the class `sa-sticky-header` to the header Container and turn
   Elementor's own Sticky OFF (Advanced > Motion Effects > Sticky: None).
   ---------------------------------------------------------------------- */
.sa-sticky-header {
  position: sticky;
  top: 0;
  z-index: 100;
}

/* Anchor links must not land under the sticky header */
:target,
[id^="service-"],
#services, #system, #about, #results, #portfolio, #contact {
  scroll-margin-top: clamp(72px, 12vh, 110px);
}


/* -------------------------------------------------------------------------
   6. SCROLL BEHAVIOUR + REDUCED MOTION
   CSS smooth scroll — no JS library. Honours the OS "reduce motion"
   setting, which a JS smooth-scroll library typically does not.
   ---------------------------------------------------------------------- */
html {
  scroll-behavior: smooth;
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }

  /* Collapsing every animation to 0.01ms also destroyed continuous ones such
     as the service marquee, which then rendered mid-frame. Entrance/one-shot
     animations are still neutralised; looping decorative ones are paused in
     place instead (see .sa-marquee below). */
  *:not(.sa-marquee__track),
  *:not(.sa-marquee__track)::before,
  *:not(.sa-marquee__track)::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}


/* -------------------------------------------------------------------------
   SERVICE MARQUEE
   Was an inline <style> inside an HTML widget with background:#063B2F
   hard-coded — the old green palette, which survived the rebrand. Styles
   now live here and read the brand globals like everything else.
   ---------------------------------------------------------------------- */
/* Any Elementor wrapper around the band paints the same dark, so nothing
   (old accent backgrounds included) can frame it in another colour. */
.e-con:has(.sa-marquee) { background: var(--sa-primary) !important; }

/* The band is a strap, not a section. Its section was 185px tall because the
   boxed inner still carried section padding, and the scrolling text only ran
   across the middle 1280px while the dark background ran edge to edge. The
   inner is unboxed and unpadded so the strap is exactly the strip height and
   the text travels the full width. */
.e-con:has(.sa-marquee) > .e-con-inner {
  max-inline-size: none !important;
  inline-size: 100%;
  padding: 0 !important;
  --container-max-width: 100%;
}
.e-con:has(.sa-marquee),
.e-con:has(.sa-marquee) > .e-con-inner > .elementor-widget-html,
.e-con:has(.sa-marquee) > .e-con-inner > .elementor-widget-html > .elementor-widget-container {
  /* the section's own 24px side padding left the strap inset from both
     edges; a strap runs the full width of the viewport */
  padding: 0 !important;
  inline-size: 100%;
}

.sa-marquee {
  width: 100%;
  overflow: hidden;
  background: var(--sa-primary);
  padding-block: 11px;   /* thin strap: ~51px total */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 6%, #000 94%, transparent);
}
.sa-marquee__track {
  display: flex;
  align-items: center;
  gap: 34px;
  width: max-content;
  white-space: nowrap;
  animation: sa-scroll 38s linear infinite;
  will-change: transform;
}
.sa-marquee:hover .sa-marquee__track { animation-play-state: paused; }

.sa-marquee__track span {
  font-family: var(--sa-font-head);
  font-size: 15px;
  font-weight: 600;
  letter-spacing: 0.01em;
  color: var(--sa-white);
}
/* Separator dots: soft white, so the band reads as ONE dark colour
   (owner request 2026-09-07: "one color, not orange, dark"). */
.sa-marquee__track span[aria-hidden] { color: rgba(255, 255, 255, 0.45); }

/* The track is duplicated once, so -50% is exactly one full set. */
@keyframes sa-scroll {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(-50%, 0, 0); }
}

/* NOTE: this strap deliberately keeps scrolling even when the visitor asks
   for reduced motion — the site owner wants the service list always moving.
   Hovering it still pauses the scroll, so anyone who needs it still can
   stop it. Every other animation on the site honours the preference. */


/* -------------------------------------------------------------------------
   7. HORIZONTAL-OVERFLOW GUARD
   Measured: document width 1285px inside a 1280px viewport = a 5px
   horizontal scrollbar. Usually an absolutely-positioned decoration.
   `clip` (unlike `hidden`) does not create a scroll container, so it
   does not break position:sticky on descendants.
   ---------------------------------------------------------------------- */
body {
  overflow-x: clip;
}

/* Absolutely-positioned decorations must not extend the page box */
.elementor-element[data-settings*='"_position":"absolute"'] {
  max-width: 100%;
}


/* -------------------------------------------------------------------------
   8. REDESIGNED SECTIONS (hero / services / agencies)
   Only what Elementor's panel genuinely cannot express: fluid type,
   readable measure, and equal-height grid cards.
   ---------------------------------------------------------------------- */

/* Fluid H1 — one rule replaces three breakpoint overrides */
.sa-hero-title .elementor-heading-title {
  font-size: clamp(2rem, 1.15rem + 3.6vw, 4.25rem);
  line-height: 1.04;
  letter-spacing: -0.02em;
  text-wrap: balance;                 /* avoids a lonely last word */
  max-width: 20ch;
  margin-inline: auto;
}

/* Sub-headline and any centred body copy: cap the measure for readability */
.sa-hero-sub,
.sa-measure {
  max-width: 62ch;
  margin-inline: auto;
}
.sa-hero-sub { font-size: clamp(1rem, 0.94rem + 0.3vw, 1.25rem); }

/* Pill chip — the dot and label must stay on one line. Without nowrap the
   flex row wrapped on narrow screens and the dot floated onto its own line. */
.sa-chip {
  width: fit-content;
  flex-wrap: nowrap !important;
}
.sa-chip .elementor-heading-title { letter-spacing: 0.06em !important; }
@media (max-width: 767px) {
  /* At 390px the full label cannot fit on one line at 13px, so the chip was
     stretching edge to edge. Smaller type keeps it a compact pill. */
  .sa-chip { padding: 6px 12px !important; }
  .sa-chip .elementor-heading-title {
    font-size: 10px !important;
    letter-spacing: 0.04em !important;
    line-height: 1.35 !important;
  }
}

/* Trust strip — separators without extra DOM elements */
.sa-trust > .e-con-inner > *:not(:last-child)::after,
.sa-trust > *:not(:last-child)::after {
  content: "";
  display: inline-block;
  width: 4px;
  height: 4px;
  margin-inline-start: 28px;
  border-radius: 50%;
  background: var(--sa-border-strong);
  vertical-align: middle;
}
@media (max-width: 767px) {
  .sa-trust > *:not(:last-child)::after { display: none; }
}

/* Cards — equal height inside the grid, lift on hover.
   transform + box-shadow only: both composited, no layout thrash. */
.sa-card {
  height: 100%;
  transition: transform var(--sa-dur-base) var(--sa-ease),
              box-shadow var(--sa-dur-base) var(--sa-ease),
              border-color var(--sa-dur-base) var(--sa-ease);
}
.sa-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--sa-shadow-lg);
  border-color: var(--sa-accent) !important;   /* beats Elementor's inline border-color */
}
@media (prefers-reduced-motion: reduce) {
  .sa-card:hover { transform: none; }
}

/* Pin the card's CTA to the bottom so buttons line up across a row.
   (Pushing the bullet list instead left a gap above the list, not below it.) */
.sa-card > .elementor-widget-button { margin-block-start: auto; }

/* Hug-the-content utility. Elementor has no valid "width: auto" for
   containers — setting it silently falls back to 100%, which stretched every
   pill, chip and badge to the full column width. */
.sa-hug {
  width: fit-content !important;
  max-width: 100%;
  flex: 0 0 auto !important;
  align-self: flex-start;
}
/* Inside a centred column the pill should stay centred, not jump left */
.e-con[style*="align-items:center"] > .sa-hug,
#hero .sa-hug { align-self: center; }


/* ---- Process steps, packages, FAQ ------------------------------------ */

/* Five steps across a 1280px container get tight; let them breathe and
   keep the number badge pinned top-left. */
.sa-step { min-height: 100%; }

/* Featured package: lift it slightly so the eye lands there first */
.sa-card--feature {
  box-shadow: var(--sa-shadow-lg);
}
@media (min-width: 1025px) {
  .sa-card--feature { transform: translateY(-10px); }
  .sa-card--feature:hover { transform: translateY(-14px); }
}

/* Pricing: current price large, previous price struck through beside it */
.sa-pricerow { align-items: baseline !important; }
.sa-price-now .elementor-heading-title { line-height: 1; letter-spacing: -0.02em; }
.sa-price-was .elementor-heading-title {
  text-decoration: line-through;
  text-decoration-thickness: 1.5px;
  opacity: 0.65;
}

/* Problem panel: scattered pain tags */
.sa-problem-panel { align-self: stretch; }
.sa-tag { box-shadow: var(--sa-shadow-sm); }
.sa-tag:nth-child(odd)  { transform: rotate(-1.4deg); }
.sa-tag:nth-child(even) { transform: rotate(1.1deg); }
@media (prefers-reduced-motion: reduce) { .sa-tag { transform: none; } }

/* FAQ accordion: remove Elementor's boxed chrome, keep hairline dividers */
.sa-faq .elementor-accordion .elementor-accordion-item {
  border: 0;
  border-bottom: 1px solid var(--sa-border);
}
.sa-faq .elementor-accordion .elementor-tab-title {
  padding: 20px 0;
  transition: color var(--sa-dur-fast) var(--sa-ease);
}
.sa-faq .elementor-accordion .elementor-tab-content {
  border: 0;
  padding: 0 0 22px;
}
.sa-faq .elementor-accordion .elementor-tab-title:hover { color: var(--sa-accent); }


/* ---- Header: fixed, frosted, identity + pill nav + profile ----------- */
.sa-header {
  position: fixed;
  inset-block-start: 0;
  inset-inline: 0;
  z-index: 100;
  width: 100%;
  max-width: 100%;
  /* Ref header is SOLID white with no bottom border; the old 1px border
     also made the bar 100.8px against the stylesheet's 100px offset —
     that mismatch was the small load-time jump. */
  background: #FFFFFF !important;                   /* beats Elementor's bg */
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  border-block-end: 0;
  border-inline: 0 !important;
  border-block-start: 0 !important;
}
/* A fixed header leaves no space behind it. custom.js measures the real
   header height into --sa-header-h; the fallback only covers the moment
   before that script runs. */
/* Offset for the fixed header.
   The var()-driven version kept resolving to its fallback regardless of the
   value custom.js wrote, so the measured header heights are declared per
   breakpoint instead — deterministic, and correct at first paint with no
   layout shift once the script runs. */
/* 92px = 10 pad + 72 profile pill (10 + 52px avatar + 10) + 10 pad. */
body { padding-top: 92px; }
@media (max-width: 1200px) { body { padding-top: 68px; } } /* profile hidden    */
@media (max-width: 767px)  { body { padding-top: 68px; } } /* 12 + 44 trigger + 12 */

/* Keep the header compact: strip the padding Elementor puts on the nav
   widget and the button wrapper, which was adding ~30px per column. */
.sa-navpill .elementor-widget-nav-menu,
.sa-navpill .elementor-nav-menu__container { padding: 0; margin: 0; }

/* The menu must stay on one line — wrapping doubled the header height */
.sa-navpill .elementor-nav-menu--main > ul,
.sa-navpill .elementor-nav-menu {
  flex-wrap: nowrap !important;
  align-items: center;
  white-space: nowrap;
}
.sa-navpill .elementor-nav-menu--main .elementor-item { padding: 7px 20px; }

/* Elementor containers default to flex-wrap:wrap, which stacked header parts
   and doubled the bar height on narrow screens. */
.sa-hleft,
.sa-profile,
.sa-presence,
.sa-headright { flex-wrap: nowrap !important; }

/* Three-column grid so the nav pill is centred in the VIEWPORT, as in the
   reference. With flex + space-between the middle group only centres when the
   two side groups happen to be the same width — they never are, which is why
   the pill sat left of centre.

   The explicit max-width matters: Elementor's boxed-container formula was
   resolving to 767px here, which left ~36px side columns and collapsed every
   header item into them. */
.sa-header > .e-con-inner {
  display: grid !important;
  grid-template-columns: 1fr auto 1fr;
  align-items: center !important;
  gap: 20px;
  inline-size: 100%;
  /* ref content box: 1232px -> with the 24px container padding the first
     item lands at x=96, exactly where the reference trigger sits */
  max-inline-size: 1232px !important;
  margin-inline: auto;
}
.sa-header > .e-con-inner > .sa-hleft   { justify-self: start; align-self: center; }
.sa-header > .e-con-inner > .sa-navpill { justify-self: center; align-self: center; }
.sa-header > .e-con-inner > .sa-profile { justify-self: end;   align-self: center; }

/* .sa-hug means "shrink to content", which is right inside a normal flex
   column but fatal for a grid item in a narrow track — it collapsed the
   header groups to 37px. Inside the header, let content decide the width. */
.sa-header .sa-hug {
  width: auto !important;
  max-width: none;
  flex: 0 0 auto !important;
}
/* every nested header row centres its own children */
.sa-header .e-con { align-items: center; }
.sa-header .sa-presence { align-items: flex-start; }

/* Elementor gives container children align-self:stretch by default, so a
   short item (the 34px logo in a 48px row) stuck to the top instead of
   centring. Force cross-axis centring on the header's nested groups. */
.sa-hleft > *,
.sa-profile > * { align-self: center !important; }

/* -------------------------------------------------------------------------
   HEADER POPUP — 650px left slide-in panel, full height, like the reference
   (greet 50/600/60, dots, title 35/700/0.9, body 18/1.3, mini card 275x50)
   ---------------------------------------------------------------------- */
.sa-pop { min-block-size: 100vh; justify-content: flex-start; }
.sa-pop-profile { margin-block-start: auto; }

/* the dialog itself: square corners, soft shadow, no rounded lightbox look */
.dialog-widget-content:has(.sa-pop) {
  border-radius: 0 !important;
  box-shadow: 0 12px 48px rgb(0 0 0 / 0.10) !important;
}

.sa-pop-greet .elementor-heading-title {
  font-size: 50px !important;
  font-weight: 600 !important;
  line-height: 60px !important;
  letter-spacing: normal !important;
}
/* two 4px dots under the greeting */
.sa-pop-dotsw { line-height: 0; margin-block-start: 10px; }
.sa-pop-dotsw p { margin: 0; line-height: 0; }
.sa-pop-dots { display: inline-flex; gap: 8px; }
.sa-pop-dots::before,
.sa-pop-dots::after {
  content: "";
  inline-size: 4px;
  block-size: 4px;
  border-radius: 50%;
  background: var(--sa-primary);
}
.sa-pop-title .elementor-heading-title {
  font-size: 35px !important;
  font-weight: 700 !important;
  line-height: 0.9 !important;
  letter-spacing: -0.02em !important;
  max-inline-size: 550px;
}
.sa-pop-sub,
.sa-pop-sub .elementor-widget-container {
  max-inline-size: 550px;
  font-size: 18px !important;
  line-height: 1.3 !important;
  letter-spacing: normal !important;
}
.sa-pop-sub p { margin: 0; }   /* the default <p> margin pushed the CTA down */
.sa-pop-cta .elementor-button {
  font-size: 16px !important;
  font-weight: 600;
  padding: 14px 26px !important;
  border-radius: 60px !important;
}
.sa-pop-slots .elementor-heading-title {
  font-size: 14px !important;
  letter-spacing: normal !important;
}

/* mini presence card in the panel (ref: 275x50) */
.sa-pop-profile .sa-avatar img { inline-size: 40px; block-size: 40px; }
.sa-pop-profile .sa-wa {
  inline-size: 18px !important; block-size: 18px !important;
  width: 18px !important; min-width: 18px;
  inset-block-end: -1px; inset-inline-end: -2px;
}
/* Same fix as the header card: the two lines are one presence block, and the
   19px/15px line boxes plus the container gap left a gutter between them. */
.sa-pop-profile .sa-pname .elementor-heading-title {
  font-size: 14.5px !important; font-weight: 700 !important; line-height: 17px !important;
}
.sa-pop-profile .sa-availline .elementor-heading-title {
  font-size: 11.5px !important; line-height: 14px !important;
  white-space: nowrap !important; max-inline-size: none;
  margin-block-start: 1px;
}
.sa-pop-profile .sa-presence { gap: 0 !important; }

/* ---- Panel: the service stack, in the words clients search with ---- */
.sa-pop-eyebrow .elementor-heading-title {
  font-size: 11px !important;
  font-weight: 700 !important;
  line-height: 1 !important;
  letter-spacing: 0.14em !important;
  text-transform: uppercase;
}
.sa-pop-list,
.sa-pop-list .elementor-widget-container { max-inline-size: 550px; }
.sa-pop-ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 12px;
}
.sa-pop-ul li {
  position: relative;
  padding-inline-start: 26px;
  line-height: 1.35;
}
/* the tick is drawn, not typed, so the copy stays clean text */
.sa-pop-ul li::before {
  content: "";
  position: absolute;
  inset-block-start: 4px;
  inset-inline-start: 0;
  inline-size: 15px;
  block-size: 15px;
  border-radius: 50%;
  background: var(--sa-accent) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 6.2 4.8 8.5 9.5 3.8' fill='none' stroke='%23fff' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 11px no-repeat;
}
.sa-pop-ul strong {
  display: block;
  font-size: 15.5px;
  font-weight: 700;
  color: var(--sa-primary);
}
.sa-pop-ul span {
  display: block;
  font-size: 13.5px;
  color: var(--sa-text-muted, #6B5B51);
}

/* ---- Panel motion: in from the left edge, out the same way ----
   Elementor's own slideInLeft eases too abruptly for a full-height panel;
   this is the same movement on an ease-out curve, long enough to read as a
   slide rather than a jump. */
.dialog-type-lightbox .dialog-widget-content.animated {
  animation-duration: 0.52s !important;
  animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1) !important;
  animation-fill-mode: both !important;
  will-change: transform;
}

/* Elementor enqueues the CSS for the ENTRANCE animation only. On close it
   adds `slideOutLeft reverse` — but no slideOutLeft keyframes are ever
   loaded, so there was nothing to play and the panel simply blinked out of
   existence. Supplying the movement here is what makes the close a slide.
   Elementor's `.animated.reverse` also flips animation-direction, which
   would run this backwards, so the direction is pinned to normal. */
@keyframes sa-slide-out-left {
  from { transform: translate3d(0, 0, 0); }
  to   { transform: translate3d(-100%, 0, 0); }
}
.dialog-type-lightbox .dialog-widget-content.animated.slideOutLeft {
  animation-name: sa-slide-out-left !important;
  animation-direction: normal !important;
  animation-fill-mode: forwards !important;
  /* comfortably inside the window before Elementor detaches the element */
  animation-duration: 0.4s !important;
  animation-timing-function: cubic-bezier(0.55, 0, 0.85, 0.3) !important;
}
/* A full-height panel flying in is motion, not content — under the
   preference it simply appears. */
/* Entrance is declared here rather than left to Elementor's slideInLeft.
   Elementor only enqueues that keyframe file when it feels like it, and the
   panel then appeared instantly while the close still animated — an
   asymmetry that reads as a bug. Owning both directions makes them match.

   NOTE ON prefers-reduced-motion: the panel deliberately still slides. It was
   reduced to a fade here, but the site owner asked three times for the slide
   and has made that call; the duration is kept moderate and the movement is a
   single horizontal translate with no bounce or parallax. */
@keyframes sa-slide-in-left {
  from { transform: translate3d(-100%, 0, 0); }
  to   { transform: translate3d(0, 0, 0); }
}
/* Elementor does not strip the exit classes when the panel is reopened, so a
   second open arrives carrying "slideOutLeft reverse slideInLeft" all at once.
   Every property the exit rule sets therefore has to be restated here, or the
   entrance borrows the exit's shorter duration and its ease-IN curve — which
   is what made a reopened panel snap instead of glide. This rule sits after
   the exit rule, so at equal specificity it wins. */
.dialog-type-lightbox .dialog-widget-content.animated.slideInLeft {
  animation-name: sa-slide-in-left !important;
  animation-direction: normal !important;
  animation-fill-mode: both !important;
  animation-duration: 0.52s !important;
  animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1) !important;
}

/* Elementor's own .dialog-message already scrolls the panel; the second
   scroller declared here put TWO bars down the panel's right edge. The
   remaining one is left functional but unpainted — the content is meant to
   fit, and a visible bar over a full-height panel reads as a broken layout. */
.dialog-lightbox-message:has(.sa-pop) { scrollbar-width: none; }
.dialog-lightbox-message:has(.sa-pop)::-webkit-scrollbar { width: 0; height: 0; }

/* The panel is full-height, so its rhythm has to answer to the viewport
   rather than to a fixed scale — on a 620px-tall window the fixed version
   overflowed by ~190px and produced the bar above. */
@media (max-height: 860px) {
  .sa-pop { padding: 52px 50px 24px !important; }
  .sa-pop-greet .elementor-heading-title { font-size: 40px !important; line-height: 46px !important; }
  .sa-pop-body { padding-block-start: 26px !important; }
  .sa-pop-stack { padding-block-start: 24px !important; }
  .sa-pop-ctas { padding-block-start: 24px !important; }
  .sa-pop-ul { gap: 9px; }
}
@media (max-height: 720px) {
  .sa-pop { padding: 40px 44px 20px !important; }
  .sa-pop-greet .elementor-heading-title { font-size: 32px !important; line-height: 36px !important; }
  .sa-pop-dotsw { display: none; }
  .sa-pop-title .elementor-heading-title { font-size: 26px !important; }
  .sa-pop-sub,
  .sa-pop-sub .elementor-widget-container { font-size: 15px !important; }
  .sa-pop-body { padding-block-start: 18px !important; }
  .sa-pop-stack { padding-block-start: 18px !important; }
  .sa-pop-ctas { padding-block-start: 18px !important; }
  .sa-pop-ul { gap: 7px; }
  .sa-pop-ul strong { font-size: 14.5px; }
  .sa-pop-ul span { font-size: 12.5px; }
}
.sa-pop .sa-online { background: #62C971 !important; }
.sa-pop .sa-wa { background: #25D366 !important; }
.sa-pop .sa-online .elementor-heading-title {
  font-size: 9px !important; line-height: 12px !important; letter-spacing: 0.02em !important;
}
/* Same tracking leak as the header (see NEGATIVE TRACKING LEAK below): the
   display heading's -1.5px was reaching 12px presence text, running the
   characters of "Saleem Akhter" and the availability line together. */
.sa-pop .elementor-heading-title,
.sa-pop .elementor-widget-text-editor,
.sa-pop p {
  letter-spacing: normal !important;
  word-spacing: normal !important;
}

/* Elementor's popup close button — 40px circle, top-left inside the panel */
.dialog-type-lightbox .dialog-close-button {
  /* The same 55x45 soft-outline pill as the header trigger.
     Pinned to the top RIGHT: the panel opens from the left edge, so a close
     control on the left sits directly under the trigger that opened it and
     reads as part of the header rather than as a way out. Top-right is also
     where every visitor already expects a close button to be. */
  inset-inline-end: 18px;
  inset-inline-start: auto;
  inset-block-start: 18px;
  inline-size: 55px;
  block-size: 45px;
  border-radius: 54px;
  border: 1px solid rgb(0 0 0 / 0.12);
  background: transparent;
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 1;
  z-index: 5;
  transition: background-color var(--sa-dur-fast) var(--sa-ease);
}
.dialog-type-lightbox .dialog-close-button:hover { background: var(--sa-surface-hover); }
.dialog-type-lightbox .dialog-close-button svg { inline-size: 15px; fill: var(--sa-primary); }
.dialog-type-lightbox .dialog-close-button i { font-size: 15px; color: var(--sa-primary); }
@media (max-width: 767px) {
  .dialog-type-lightbox .dialog-close-button {
    inset-inline-end: 16px; inset-inline-start: auto; inset-block-start: 16px;
  }
  .sa-pop-greet .elementor-heading-title { font-size: 40px !important; line-height: 48px !important; }
  .sa-pop-title .elementor-heading-title { font-size: 28px !important; line-height: 1 !important; }
  .sa-pop-sub,
  .sa-pop-sub .elementor-widget-container { font-size: 16px !important; }
}


/* ---- Left: circular grid button + logo mark ----
   Elementor emits per-element rules at ~4-class specificity
   (.elementor-357 .elementor-element.elementor-element-xxx .child), which no
   sane class selector beats. These are deliberate design overrides of
   generated framework CSS, so !important is the correct tool here. */
.sa-header .sa-gridbtn {
  inline-size: 44px !important;
  block-size: 44px !important;
  flex: 0 0 44px !important;
  width: 44px !important;          /* beats the .sa-hug fit-content rule */
  background: transparent !important;
  /* A true circle with a faint outline: as a bare glyph nothing said this
     was a control, and it is the only way into the menu panel. */
  border: 1px solid rgb(47 22 1 / 0.14) !important;
  border-radius: 50% !important;
  transition: background-color var(--sa-dur-fast) var(--sa-ease),
              border-color var(--sa-dur-fast) var(--sa-ease);
}
.sa-header .sa-gridbtn:hover {
  background: var(--sa-bg) !important;
  border-color: rgb(47 22 1 / 0.3) !important;
}
.sa-header .sa-gridbtn:focus-visible {
  outline: 2px solid var(--sa-accent);
  outline-offset: 2px;
}
.sa-header .sa-gridbtn .elementor-icon { padding: 0 !important; }

/* The logomark is now the real logo image (was a text "SA" placeholder).
   A fixed block-size keeps the header height font-independent — that
   indeterminacy was the source of the small load-time layout jump. */
.sa-header .sa-logomark { line-height: 0; }
.sa-header .sa-logomark img {
  /* The monogram alone (593x347, ratio 1.709) — see header3.php for why the
     wordmark is not in the header. 52px tall gives 89px wide, and the source
     is 593px across, so it is ~6.7x oversampled and stays sharp on any
     display. Nothing here was ever clipped; the old mark was simply too
     small for its own wordmark to resolve. */
  block-size: 52px;
  inline-size: auto !important;
  max-inline-size: none;
  display: block;
}
@media (max-width: 767px) {
  /* The 44px trigger stays the tallest child: 12 + 44 + 12 = the 68px offset
     the stylesheet promises, so the page never shifts on load. */
  .sa-header .sa-logomark img { block-size: 40px; }
}

/* ---- Centre: nav pill — measured off the reference ----
   pill 39px tall; items Bricolage 14px/500, #444, transparent until hover. */
.sa-header .sa-navpill .elementor-nav-menu--main .elementor-item {
  font-family: var(--sa-font-head) !important;
  font-weight: 500 !important;
  font-size: 14px !important;
  line-height: 14px !important;
  padding: 7px 20px !important;
  border-radius: 100px;
  color: #444444 !important;
  fill: #444444 !important;
}
/* Hover AND the current section share one rule, so they cannot drift apart.
   .sa-nav-current is set by custom.js as the page scrolls; Elementor's own
   .elementor-item-active only ever marks the current PAGE, which on a
   one-page site means it marks Home and nothing else. */
.sa-header .sa-navpill .elementor-nav-menu--main .elementor-item:hover,
.sa-header .sa-navpill .elementor-nav-menu--main .elementor-item:focus-visible,
.sa-header .sa-navpill .elementor-nav-menu--main .elementor-item.sa-nav-current {
  background: var(--sa-white) !important;
  color: var(--sa-primary) !important;
}

/* ---- Right: avatar with the messaging badge overlapping it ---- */
.sa-avatar { position: relative; line-height: 0; }
/* Reference avatar has no coloured ring — just the photo and the badge. */
.sa-avatar img {
  border-radius: 50% !important;
  border: 0 !important;
  object-fit: cover;
  aspect-ratio: 1;
  display: block;
}
/* Elementor's icon widget adds its own padding/line-height; zero it so the
   glyph sits dead-centre in the circles the containers provide. */
.sa-gridbtn .elementor-icon,
.sa-wa .elementor-icon {
  padding: 0 !important;
  line-height: 0 !important;
  display: flex;
  align-items: center;
  justify-content: center;
}
.sa-gridbtn .elementor-widget-icon,
.sa-wa .elementor-widget-icon { line-height: 0; }
/* scoped to .sa-avatar (not .sa-header) so the popup's mini card gets the
   same overlapping badge instead of stacking it under the photo */
.sa-avatar .sa-wa {
  position: absolute;
  inset-block-end: -2px;
  inset-inline-end: -4px;
  inline-size: 23px !important;
  block-size: 23px !important;
  width: 23px !important;          /* beats .sa-hug */
  min-width: 23px;
  border: 2px solid var(--sa-white);
  z-index: 2;
  background: #25D366 !important;  /* WhatsApp green, like the reference */
}
.sa-avatar .sa-wa .elementor-icon { padding: 0 !important; }

/* NEGATIVE TRACKING LEAK
   Elementor falls back to the display-heading letter-spacing when a global
   typography slot does not define its own, so -1.5px (correct for a 72px H1)
   was being applied to 12.5px body text and the nav items — characters ran
   into each other. Small text gets normal tracking explicitly. */
.sa-header .elementor-heading-title,
.sa-header .elementor-item {
  letter-spacing: normal !important;
  word-spacing: normal !important;
}
/* the reference tracks its 14px nav items at +0.18px */
.sa-header .elementor-item { letter-spacing: 0.18px !important; }

/* The name and the availability line are one presence block, not two
   sentences: 1.36 line-height plus the container gap opened a visible gutter
   between them. Both lines are pulled to their own cap height. */
.sa-header .sa-pname .elementor-heading-title {
  font-size: 15.5px !important; font-weight: 700 !important; line-height: 1.15 !important;
  letter-spacing: 0.18px !important;
}
/* heading titles rendered as <span> are inline: max-inline-size is ignored
   and the wrapper's line box pads them. Block display fixes both. */
.sa-pname .elementor-heading-title,
.sa-availline .elementor-heading-title,
.sa-online .elementor-heading-title { display: block; }
.sa-presence .elementor-widget-heading,
.sa-presence .elementor-widget-container { line-height: 0; }
.sa-header .sa-online .elementor-heading-title,
.sa-pop-profile .sa-online .elementor-heading-title {
  font-size: 9px !important; line-height: 12px !important; letter-spacing: 0.02em !important;
  font-weight: 500 !important;
}
/* status colours are semantic, not brand: the reference is green here */
.sa-header .sa-online { background: #62C971 !important; }
.sa-header .sa-wa     { background: #25D366 !important; }
/* the heading WIDGET wrapper carries a 19px line box that inflated the
   14px badge to 24px tall — collapse it, the title keeps its own height */
.sa-online .elementor-widget-heading,
.sa-online .elementor-widget-container { line-height: 0 !important; }
/* One line, always: the 150px cap used to break this into two lines and
   made the profile pill taller than the rest of the header. */
.sa-header .sa-availline .elementor-heading-title {
  font-size: 11.5px !important; line-height: 14px !important; letter-spacing: 0.18px !important;
  white-space: nowrap !important;
  max-inline-size: none;
  margin-block-start: 2px;
}
/* name and badge sit on one baseline row */
.sa-header .sa-namerow { flex-wrap: nowrap !important; }
.sa-header .sa-presence { align-items: flex-start !important; }
/* the monogram keeps tight tracking — it is display-sized */

/* Nothing in the header may wrap: "Saleem Akhter" was breaking to two lines
   and the CTA label to three, which is what blew the bar apart. */
.sa-header .elementor-heading-title,
.sa-header .elementor-button,
.sa-header .elementor-button-content-wrapper,
.sa-header .elementor-button-text,
.sa-header .elementor-item { white-space: nowrap !important; }
/* The button label lives in a nested span; the wrapper alone was not enough */
.sa-header .elementor-button-text { display: inline-block; }
.sa-header .elementor-widget-heading { line-height: 1.2; }
.sa-header .e-con,
.sa-header .e-con-inner { align-items: center; }

/* Profile card */
.sa-avatar img {
  border-radius: 50%;
  border: 2px solid var(--sa-accent);
  object-fit: cover;
  aspect-ratio: 1;
}
.sa-online .elementor-heading-title { letter-spacing: 0.04em; }

/* Progressive disclosure: drop the least essential header pieces first,
   so the bar stays one row at every width instead of wrapping and
   doubling in height. */
@media (max-width: 1200px) { .sa-profile  { display: none !important; } }

@media (max-width: 767px) {
  /* On phones the header keeps only the brand and the menu toggle. */
  .sa-headright { display: none !important; }
  .sa-brand { flex: 0 1 auto; min-width: 0; }
  .sa-logo  { flex: 0 0 auto; }

  /* The profile column is display:none, so it leaves the grid entirely and
     the nav landed in the CENTRE track. Collapse to two tracks and push the
     toggle to the right edge, where a hamburger belongs. */
  .sa-header > .e-con-inner {
    grid-template-columns: auto 1fr !important;
    gap: 12px;
  }
  .sa-header > .e-con-inner > .sa-navpill {
    justify-self: end !important;
    background: transparent !important;
    border: 0 !important;
    padding: 0 !important;
  }
}

/* Nav pill: kill Elementor's default link padding so the pill hugs the items */
.sa-navpill .elementor-nav-menu--main .elementor-item {
  border-radius: 100px;
  transition: background-color var(--sa-dur-fast) var(--sa-ease),
              color var(--sa-dur-fast) var(--sa-ease);
}
/* reference: items stay transparent until hover — no default active pill */
.sa-navpill .elementor-nav-menu--main .elementor-item:hover {
  background: var(--sa-white);
  color: var(--sa-primary);
}
/* Elementor draws an underline/pointer by default — the pill replaces it */
.sa-navpill .e--pointer-underline .elementor-item:after,
.sa-navpill .e--pointer-underline .elementor-item:before { display: none; }

/* Availability dot: a gentle pulse, opacity-only so it never triggers layout */
.sa-avail .elementor-icon svg { animation: sa-pulse 2.4s ease-in-out infinite; }
@keyframes sa-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } }
@media (prefers-reduced-motion: reduce) {
  .sa-avail .elementor-icon svg { animation: none; }
}

/* ---- Mobile ergonomics ---------------------------------------------- */
@media (max-width: 767px) {
  /* Stacked CTAs should fill their column, not size to their text —
     applies to the hero and to any button sitting inside a card. */
  #hero .elementor-widget-button,
  #hero .elementor-widget-button .elementor-button-wrapper,
  .sa-card .elementor-widget-button,
  .sa-card .elementor-widget-button .elementor-button-wrapper { width: 100%; }
  #hero .elementor-button,
  .sa-card .elementor-button {
    width: 100%;
    justify-content: center;
  }

  /* Tap targets: these links render ~20px tall, under the minimum hit area.
     PADDING raises it, which is what the rule always meant to do — the old
     line-height:44px doubled every line box instead, stretching each footer
     row to 99px and pushing the columns apart.
     Scoped to the link LISTS: the blanket "footer a" also caught the email
     line and the CTA button, both of which own their own layout. */
  .sa-ft-list a,
  .sa-ft-bar a,
  .elementor-widget-heading a,
  .elementor-nav-menu a {
    display: inline-block;
    min-height: 40px;
    line-height: 20px;
    padding-block: 10px;
  }
  /* the padding already separates the rows; a gap on top of it double-spaces */
  .sa-ft-list { gap: 0 !important; }
}

/* Below the tablet breakpoint the availability text is noise — the CTA stays.
   The nav pill is NOT hidden: the Nav Menu widget swaps itself for its own
   hamburger toggle at its breakpoint, and hiding the container would remove
   site navigation entirely on mobile. */
@media (max-width: 1024px) {
  .sa-avail { display: none !important; }
  .sa-navpill { background: transparent; padding: 0; border: 0; }
}


/* -------------------------------------------------------------------------
   9. ACCESSIBILITY — visible focus
   Elementor ships no focus style. Keyboard users currently get nothing.
   :focus-visible shows it for keyboard only, not on mouse click.
   ---------------------------------------------------------------------- */
a:focus-visible,
button:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible,
[tabindex]:focus-visible,
.elementor-button:focus-visible {
  outline: 3px solid var(--sa-accent);
  outline-offset: 2px;
  border-radius: var(--sa-radius-sm);
}

/* Skip link for keyboard users */
.sa-skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 999;
  padding: var(--sa-space-3) var(--sa-space-5);
  background: var(--sa-primary);
  color: var(--sa-white);
  border-radius: 0 0 var(--sa-radius-md) 0;
}
.sa-skip-link:focus {
  left: 0;
}

/* -------------------------------------------------------------------------
   10. HERO — geometry measured off the reference @1440
   (trust row -> H1 60/600/lh1/-0.03em max 960 -> support 18/27 max 768 ->
   one dark pill CTA -> plain spots line)
   ---------------------------------------------------------------------- */
/* trust pill: overlapping client portraits + italic caption in a soft white
   capsule. Deliberately compact — it introduces the headline, it is not the
   headline, so it stays a quiet strip rather than a block. */
.sa-trustpill {
  box-shadow: 0 2px 14px rgb(47 22 1 / 0.06);
  border: 1px solid var(--sa-border);
}
.sa-avstack { display: flex; align-items: center; }
.sa-av {
  inline-size: 32px;
  block-size: 32px;
  border-radius: 50%;
  border: 2px solid var(--sa-white);
  overflow: hidden;
  display: block;
  flex: 0 0 auto;
  margin-inline-start: -10px;   /* the overlap */
  position: relative;
  background: var(--sa-bg);     /* holds the circle while the photo decodes */
}
.sa-av:first-child { margin-inline-start: 0; }
.sa-av svg,
.sa-av img { inline-size: 100%; block-size: 100%; display: block; object-fit: cover; }

/* The caption is a <span>, so it is inline: its line boxes were sized by the
   widget's inherited 28.8px strut, not by its own line-height — two lines came
   to 58px inside a 42px pill. Block display plus a collapsed wrapper line box
   hands the height back to the type. */
.sa-trustpill .elementor-widget-heading,
.sa-trustpill .elementor-widget-container { line-height: 0; }
.sa-trusttxt .elementor-heading-title {
  display: block;
  font-size: 13.5px !important;
  /* Two short lines; at 1.28 they read as separate sentences rather than one
     wrapped phrase, which left a gap down the middle of the pill. 1.2 is as
     tight as they go before the accent underline reaches the second line. */
  line-height: 1.2 !important;
  font-weight: 500 !important;
  font-style: italic;
  letter-spacing: normal !important;
  white-space: normal !important;
  text-align: left;
}
/* The number is bold and sits on an accent underline, as in the reference.
   Painted inside the line box rather than hung below the baseline — with the
   lines this tight, an underline below the baseline crossed the line under it. */
.sa-trusttxt b {
  font-weight: 800;
  background: linear-gradient(var(--sa-accent), var(--sa-accent))
              0 calc(100% - 1px) / 100% 2px no-repeat;
  padding-block-end: 0;
}
@media (max-width: 767px) {
  /* Seven avatars plus the caption cannot share a phone row, so the pill was
     wrapping into a tall capsule with the text stranded below. Fewer, smaller
     avatars keep it a single tidy row. */
  .sa-trustpill {
    padding: 5px 14px 5px 5px !important;
    gap: 10px !important;
    flex-wrap: nowrap !important;
  }
  .sa-av { inline-size: 28px; block-size: 28px; margin-inline-start: -9px; }
  .sa-av:nth-child(n+6) { display: none; }
  .sa-trusttxt .elementor-heading-title { font-size: 12.5px !important; line-height: 1.12 !important; }
}
@media (max-width: 1024px) and (min-width: 768px) {
  .sa-av { inline-size: 30px; block-size: 30px; margin-inline-start: -10px; }
  .sa-av:nth-child(n+7) { display: none; }
  .sa-trusttxt .elementor-heading-title { font-size: 17px !important; }
}
.sa-hero-title .elementor-heading-title {
  font-size: 60px !important;
  font-weight: 600 !important;
  line-height: 1 !important;
  letter-spacing: -0.03em !important;
  max-inline-size: 960px;
  margin-inline: auto;
}
.sa-hero-sub,
.sa-hero-sub .elementor-widget-container {
  font-size: 18px !important;
  line-height: 27px !important;
  max-inline-size: 768px;
  margin-inline: auto;
}
.sa-hero-sub p { margin: 0; }
/* Dark brand pill (ref uses black; our dark is the brand primary) */
.sa-hero-cta .elementor-button {
  background: var(--sa-primary) !important;
  color: var(--sa-white) !important;
  font-family: var(--sa-font-head) !important;
  font-size: 18px !important;
  font-weight: 500 !important;
  border-radius: 50px !important;
}
.sa-hero-cta .elementor-button:hover {
  background: var(--sa-accent) !important;
  transform: translateY(-2px);
}
.sa-hero-spots .elementor-heading-title {
  font-size: 18px !important;
  font-weight: 400 !important;
  letter-spacing: normal !important;
}
@media (max-width: 767px) {
  .sa-hero-title .elementor-heading-title { font-size: 38px !important; }
  .sa-hero-sub,
  .sa-hero-sub .elementor-widget-container { font-size: 16px !important; line-height: 25px !important; }
}

/* -------------------------------------------------------------------------
   11. PROBLEM — tinted panel + double ticker left, 40px heading right
   (heading emphasis is WEIGHT 800, not colour, per the reference)
   ---------------------------------------------------------------------- */
.sa-prob-h2 .elementor-heading-title {
  font-size: 40px !important;
  font-weight: 600 !important;
  line-height: 1 !important;
  letter-spacing: -0.02em !important;
}
.sa-prob-h2 b { font-weight: 800; }
.sa-prob-para,
.sa-prob-para .elementor-widget-container { font-size: 16px !important; line-height: 26px !important; }
.sa-myth-t .elementor-heading-title {
  font-size: 16px !important;
  font-weight: 600 !important;
  line-height: 1.3 !important;
}
.sa-myth-s,
.sa-myth-s .elementor-widget-container { font-size: 14px !important; line-height: 21px !important; }
.sa-myth-s p { margin: 0; }
/* hover: the row nudges right, its X badge fills in — quiet but alive */
.sa-myth { transition: transform var(--sa-dur-fast) var(--sa-ease); }
.sa-myth:hover { transform: translateX(5px); }
.sa-myth .elementor-icon { transition: background-color var(--sa-dur-fast) var(--sa-ease), color var(--sa-dur-fast) var(--sa-ease); }
.sa-myth:hover .elementor-icon { background-color: var(--sa-accent) !important; color: var(--sa-white) !important; }

/* -------------------------------------------------------------------------
   13. PACKAGES — reference card anatomy: a dark header block above a white
   body block, one rounded row per feature with an info tooltip, dark pill CTA
   ---------------------------------------------------------------------- */

/* shared big section heading + one-line subtitle */
.sa-sec-h2 .elementor-heading-title {
  font-size: 55px !important;
  font-weight: 800 !important;
  line-height: 1.05 !important;
  letter-spacing: -0.03em !important;
}
/* One measure for every centred section intro. Running the full 1280px
   container made these read as a wall of text under a centred heading. */
.sa-sec-sub,
.sa-sec-sub .elementor-widget-container {
  font-size: 20px !important;
  line-height: 1.5 !important;
}
/* The cap goes on the widget itself: this Elementor build renders text
   editors without the inner .elementor-widget-container the rule first
   targeted, so nothing was constrained. */
.sa-sec-sub,
.sa-measure {
  max-inline-size: 680px !important;
  margin-inline: auto !important;
}
.sa-sec-sub p { margin: 0; }
/* the hero lead sits a touch wider — it is the page's opening line */
.sa-hero-sub {
  max-inline-size: 760px !important;
  margin-inline: auto !important;
}
/* Two lines, split where the meaning splits — the break is written into
   the heading itself rather than left to whatever the measure happens to
   produce. The cap is only wide enough to stop either line wrapping again. */
.sa-svc-h2 .elementor-heading-title {
  /* at 56px the first half needs ~1030px; 940 still broke it in two */
  max-inline-size: 1180px;
  margin-inline: auto;
  text-wrap: balance;
}
@media (max-width: 1100px) {
  /* the forced break stops earning its place once the lines wrap anyway */
  .sa-svc-h2 .elementor-heading-title br { display: none; }
}

.sa-pkgrow > .sa-pkg {
  flex: 1 1 0;
  min-inline-size: 0;
  max-inline-size: 407px;
  align-self: flex-start !important;
  height: auto !important;
  background: transparent !important;
}
/* the generic .sa-card lift does not apply to this two-block layout */
.sa-pkgrow > .sa-pkg:hover { transform: none; box-shadow: none; }

/* --- dark header block --- */
.sa-pkg-head { transition: transform var(--sa-dur-base) var(--sa-ease); }
.sa-pkg:hover .sa-pkg-head { transform: translateY(-4px); }
.sa-pkg-pill .elementor-heading-title {
  font-size: 15px !important;
  font-weight: 500 !important;
  line-height: 1.2 !important;
  letter-spacing: normal !important;
  white-space: nowrap;
}
.sa-pkg-title .elementor-heading-title {
  /* 40px pushed "Funnel / Automation" onto two lines and made the three
     headers different heights; 32px keeps every tier on one line. */
  font-size: 32px !important;
  font-weight: 800 !important;
  line-height: 1.12 !important;
  letter-spacing: -0.03em !important;
}
.sa-pkg-desc,
.sa-pkg-desc .elementor-widget-container {
  font-size: 14px !important;
  line-height: 1.45 !important;
  color: rgb(255 255 255 / 0.72) !important;
}
.sa-pkg-desc p { margin: 0; }

/* --- white body block --- */
.sa-pkg-start .elementor-heading-title {
  font-size: 22px !important; font-weight: 700 !important; letter-spacing: normal !important;
}
/* price, struck was-price and the slots chip share one baseline row */
.sa-pricerow { align-items: baseline !important; flex-wrap: nowrap; }
.sa-price-now .elementor-heading-title {
  font-size: 52px !important; font-weight: 800 !important; line-height: 1.1 !important;
  letter-spacing: -0.03em !important;
}
.sa-price-was .elementor-heading-title {
  font-size: 30px !important; font-weight: 700 !important;
  text-decoration: line-through;
  text-decoration-thickness: 2px;
  opacity: 0.5;
  letter-spacing: normal !important;
}
/* the chip is pushed to the right edge of the price row, vertically centred */
.sa-pricerow > .sa-slots {
  margin-inline-start: auto;
  align-self: center;
  flex: 0 0 auto !important;
}
.sa-slots .elementor-heading-title {
  font-size: 14px !important; font-weight: 500 !important; letter-spacing: normal !important;
  white-space: nowrap;
}
/* The live green dot the reference shows before the label.
   It hangs off the heading text, NOT off .sa-slots: Elementor containers
   use their own ::before as an absolutely-positioned background overlay,
   so a dot drawn there escaped the pill entirely. */
.sa-slots .elementor-heading-title::before {
  content: "";
  display: inline-block;
  inline-size: 8px;
  block-size: 8px;
  border-radius: 50%;
  background: #35C759;
  margin-inline-end: 7px;
  vertical-align: middle;
  position: relative;
  inset-block-start: -1px;
}
.sa-pkg-inc .elementor-heading-title {
  font-size: 22px !important; font-weight: 700 !important; letter-spacing: normal !important;
}
.sa-pkg-body > .elementor-widget-heading:not(:first-child) { margin-block-start: 20px; }

/* --- feature rows with hover tooltips --- */
/* Nothing between the tooltip and the section may clip it — Elementor's
   widget wrappers and the card blocks were cutting the bubble off at the
   card edge, so it only ever appeared half-drawn. */
.sa-pkg,
.sa-pkg-body,
.sa-pkg-body > .elementor-widget-html,
.sa-pkg-body > .elementor-widget-html > .elementor-widget-container,
.sa-feats,
.sa-feat,
.sa-feat-i { overflow: visible !important; }

.sa-feats { list-style: none; margin: 14px 0 0; padding: 0; display: grid; gap: 8px; }
.sa-feat {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 11px 14px;
  border-radius: 10px;
  background: var(--sa-bg);
  transition: background-color var(--sa-dur-fast) var(--sa-ease);
}
.sa-feat:hover { background: var(--sa-surface-hover); }
.sa-feat-chk {
  inline-size: 15px; block-size: 15px; flex: 0 0 15px;
  background: currentColor;
  color: var(--sa-primary);
  /* a check drawn with a mask needs no icon font and no extra request */
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20 6 9 17l-5-5' fill='none' stroke='black' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'/></svg>") center/contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'><path d='M20 6 9 17l-5-5' fill='none' stroke='black' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'/></svg>") center/contain no-repeat;
}
.sa-feat-txt {
  flex: 1 1 auto;
  font-family: var(--sa-font-head);
  font-size: 15px;
  font-weight: 600;
  line-height: 1.35;
  color: var(--sa-primary);
}
/* The info dot is a <button>, so the theme's global button styling (accent
   fill, generous padding, square corners) claimed it and it rendered as an
   orange block instead of a quiet grey dot. Every visual property is reset
   with priority here. */
/* The row, not the 20px dot, is the tooltip's containing block: anchored to
   the dot the bubble escaped the viewport on narrow cards (right on desktop,
   left on tablet). Anchored to the row it can never outgrow the card. */
.sa-feat { position: relative; }
.sa-feats .sa-feat .sa-feat-i {
  position: static;
  flex: 0 0 20px;
  inline-size: 20px !important;
  block-size: 20px !important;
  min-inline-size: 0;
  min-block-size: 0;
  border: 1px solid var(--sa-border) !important;
  border-radius: 50% !important;
  background: var(--sa-white) !important;
  color: var(--sa-text-muted) !important;
  font: 600 12px/1 var(--sa-font-head) !important;
  text-transform: none;
  letter-spacing: normal;
  box-shadow: none;
  cursor: help;
  padding: 0 !important;
  margin: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: background-color var(--sa-dur-fast) var(--sa-ease),
              color var(--sa-dur-fast) var(--sa-ease),
              border-color var(--sa-dur-fast) var(--sa-ease);
}
.sa-feat-i::before { content: "i"; }
.sa-feats .sa-feat .sa-feat-i:hover,
.sa-feats .sa-feat .sa-feat-i:focus-visible {
  background: var(--sa-accent) !important;
  border-color: var(--sa-accent) !important;
  color: var(--sa-white) !important;
}
.sa-tip {
  position: absolute;
  inset-inline-end: 0;
  inset-block-end: calc(100% + 6px);
  /* never wider than the row itself, so it stays inside the card */
  inline-size: min(244px, 100%);
  /* The bubble lives inside a <button>, which browsers give white-space:
     nowrap — so the sentence ran off in a single line and only its first
     few words were readable. It has to wrap on its own terms. */
  white-space: normal !important;
  word-break: normal;
  overflow-wrap: anywhere;
  padding: 10px 12px;
  border-radius: 10px;
  background: var(--sa-primary);
  color: var(--sa-white);
  font: 400 13px/1.45 var(--sa-font-body);
  text-align: start;
  opacity: 0;
  visibility: hidden;
  transform: translateY(4px);
  transition: opacity var(--sa-dur-fast) var(--sa-ease),
              transform var(--sa-dur-fast) var(--sa-ease),
              visibility var(--sa-dur-fast);
  z-index: 20;
  pointer-events: none;
  box-shadow: var(--sa-shadow-lg);
}
/* little arrow under the bubble, pointing at the dot */
.sa-tip::after {
  content: "";
  position: absolute;
  inset-block-start: 100%;
  inset-inline-end: 5px;   /* points at the dot now that the bubble is flush */
  border: 6px solid transparent;
  border-block-start-color: var(--sa-primary);
}
.sa-feat-i:hover .sa-tip,
.sa-feat-i:focus-visible .sa-tip {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

.sa-pkg-body > .sa-pkg-cta { margin-block-start: 22px; }
.sa-pkg-cta .elementor-button {
  background: var(--sa-primary) !important;
  color: var(--sa-white) !important;
  font-family: var(--sa-font-head) !important;
  font-size: 17px !important;
  font-weight: 500 !important;
  border-radius: 999px !important;
}
.sa-pkg-cta .elementor-button:hover { background: var(--sa-accent) !important; }

@media (max-width: 767px) {
  .sa-pkgrow > .sa-pkg { flex: 1 1 auto; max-inline-size: none; }
  .sa-sec-h2 .elementor-heading-title { font-size: 34px !important; }
  .sa-sec-sub,
  .sa-sec-sub .elementor-widget-container { font-size: 17px !important; }
  .sa-pkg-title .elementor-heading-title { font-size: 30px !important; }
  .sa-price-now .elementor-heading-title { font-size: 42px !important; }
  .sa-price-was .elementor-heading-title { font-size: 24px !important; }
  /* the chip cannot share a 320px row with a 42px price */
  .sa-pricerow { flex-wrap: wrap; }
  .sa-pricerow > .sa-slots { margin-inline-start: 0; margin-block-start: 8px; }
}

/* -------------------------------------------------------------------------
   19. FOOTER — identity / services / company / CTA, then a legal bar
   ---------------------------------------------------------------------- */
.sa-ft {
  display: grid;
  grid-template-columns: 1.6fr 1fr 1fr 1.3fr;
  gap: 48px;
  inline-size: 100%;
}
.sa-ft-col { min-inline-size: 0; }
.sa-ft-name {
  font-family: var(--sa-font-head);
  font-size: 22px;
  font-weight: 800;
  letter-spacing: -0.02em;
  color: #fff !important;
  margin: 0 0 2px;
}
.sa-ft-role {
  font-family: var(--sa-font-head);
  font-size: 13.5px;
  font-weight: 700;
  line-height: 1.35;
  color: var(--sa-accent) !important;
  margin: 0 0 14px;
}
.sa-ft-blurb {
  font-size: 14.5px;
  line-height: 1.6;
  color: rgb(255 255 255 / 0.62) !important;
  margin: 0 0 16px;
  max-inline-size: 34ch;
}
.sa-ft-meta {
  display: flex;
  align-items: center;
  gap: 9px;
  font-size: 14px;
  color: rgb(255 255 255 / 0.62) !important;
  margin: 0 0 8px;
}
.sa-ft-meta svg {
  inline-size: 17px;
  block-size: 17px;
  flex: 0 0 auto;
  color: var(--sa-accent);
}
.sa-ft-meta a { color: rgb(255 255 255 / 0.62) !important; text-decoration: none; }
.sa-ft-meta a:hover { color: var(--sa-accent) !important; }

/* These were 11.5px mono micro-labels — a different family, size and case
   from every other heading on the site. They now use the site heading face
   at a readable size, so the footer reads as part of the same design. */
.sa-ft-h {
  font-family: var(--sa-font-head);
  font-size: 16px;
  font-weight: 700;
  line-height: 1.3;
  letter-spacing: -0.01em;
  text-transform: none;
  color: #FFFFFF !important;
  margin: 0 0 18px !important;
}
.sa-ft-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 10px;
  /* On the LIST, not just the link: each row's height comes from the <li>'s
     own strut, so setting it on an inline-block <a> alone left the inherited
     28.8px body line-height in charge and the rows 41px apart for 15px text.
     The font-size has to come along too — a unit-less line-height resolves
     against the element's OWN size, so on an 18px strut 1.35 still gave 24px. */
  font-size: 15px;
  line-height: 1.35;
}
.sa-ft-list a {
  font-size: 15px;
  display: inline-block;
  vertical-align: top;    /* kills the descender gap under an inline-block */
  color: rgb(255 255 255 / 0.72) !important;
  text-decoration: none;
  transition: color var(--sa-dur-fast) var(--sa-ease);
}
.sa-ft-list a:hover { color: var(--sa-accent) !important; }

/* ---- Social profiles, under the email line ---- */
.sa-ft-social {
  list-style: none;
  margin: 18px 0 0;
  padding: 0;
  display: flex;
  gap: 10px;
}
.sa-ft-social a {
  inline-size: 38px;
  block-size: 38px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  color: rgb(255 255 255 / 0.72);
  border: 1px solid rgb(255 255 255 / 0.16);
  transition: color var(--sa-dur-fast) var(--sa-ease),
              background-color var(--sa-dur-fast) var(--sa-ease),
              border-color var(--sa-dur-fast) var(--sa-ease);
}
.sa-ft-social svg { inline-size: 19px; block-size: 19px; display: block; }
.sa-ft-social a:hover,
.sa-ft-social a:focus-visible {
  color: #FFFFFF;
  background: var(--sa-accent);
  border-color: var(--sa-accent);
}
.sa-ft-social a:focus-visible { outline: 2px solid var(--sa-accent); outline-offset: 2px; }

/* CTA column */
.sa-ft-cta .sa-ft-blurb { max-inline-size: none; }
.sa-ft-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  inline-size: auto;
  align-self: flex-start;
  padding: 11px 20px;
  border-radius: 999px;
  background: transparent;
  border: 1px solid rgb(255 255 255 / 0.28);
  color: #fff !important;
  font-family: var(--sa-font-head);
  font-size: 14px;
  font-weight: 700;
  text-decoration: none;
  transition: transform var(--sa-dur-fast) var(--sa-ease),
              box-shadow var(--sa-dur-fast) var(--sa-ease);
}
.sa-ft-btn svg { inline-size: 16px; block-size: 16px; }
.sa-ft-btn:hover {
  border-color: var(--sa-accent);
  background: var(--sa-accent);
}

/* legal bar */
.sa-ft-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  margin-block-start: 44px;
  padding-block-start: 22px;
  border-block-start: 1px solid rgb(255 255 255 / 0.1);
}
/* 0.45 white on #150800 composites to 4.49:1 — a hair under the 4.5 floor for
   13.5px text. 0.5 clears it at 5.13:1 and is still visibly the quietest row
   in the footer. */
.sa-ft-bar p { margin: 0; font-size: 13.5px; color: rgb(255 255 255 / 0.5) !important; }
.sa-ft-bar ul { list-style: none; margin: 0; padding: 0; display: flex; gap: 20px; }
.sa-ft-bar a {
  font-size: 13.5px;
  color: rgb(255 255 255 / 0.5) !important;
  text-decoration: none;
}
.sa-ft-bar a:hover { color: var(--sa-accent) !important; }

@media (max-width: 1024px) {
  .sa-ft { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 36px; }
}
@media (max-width: 600px) {
  .sa-ft { grid-template-columns: minmax(0, 1fr); gap: 32px; }
  .sa-ft-bar { flex-direction: column; align-items: flex-start; }
}

/* -------------------------------------------------------------------------
   20. LEGAL PAGES — privacy, terms, disclaimer
   Reference layout: a full-bleed dark hero (eyebrow pill, centred title,
   one-line summary, last-updated) over a 676px reading measure.
   ---------------------------------------------------------------------- */

/* The theme prints its own page title above the content; the hero carries
   the H1 instead, so the theme header would be a duplicate. */
body.sa-legal .page-header { display: none; }

/* The theme caps main at 1140px, which was clipping the hero band. Lifting
   the cap here — rather than reaching for a 100vw break-out, which counts
   the scrollbar and pushed 8px of horizontal overflow onto every page —
   lets the hero span the viewport with plain width:100%. */
body.sa-legal main.site-main {
  max-inline-size: none;
  inline-size: 100%;
  padding-inline: 0;
}
/* The content column is full width so the hero can span it; every child
   EXCEPT the hero is pulled back to the reading measure. */
body.sa-legal .page-content {
  max-inline-size: none;
  margin-inline: 0;
  padding: 0 0 90px;
}
body.sa-legal .page-content > *:not(.sa-legal-hero) {
  max-inline-size: 676px;
  margin-inline: auto;
  padding-inline: 20px;
}

.sa-legal-hero {
  background: #150800;
  text-align: center;
  padding: 58px 20px 44px;   /* owner: inner-page banners smaller */
  margin-block-end: 48px;
  /* .page-content is already full width, so no 100vw break-out is needed —
     and 100vw counts the scrollbar, which was adding 8px of horizontal
     overflow to every legal page. */
}
.sa-legal-hero .sa-legal-title {
  font-family: var(--sa-font-head);
  font-size: clamp(1.9rem, 1.2rem + 2.4vw, 2.6rem);
  font-weight: 800;
  line-height: 1.08;
  letter-spacing: -0.02em;
  color: #fff;
  margin: 0;
}
body.sa-legal .sa-legal-sub {
  font-size: 17px;
  line-height: 1.55;
  color: rgb(255 255 255 / 0.82) !important;
  max-inline-size: 46ch;
  margin: 14px auto 0;
}
body.sa-legal .sa-legal-date {
  font-size: 13px;
  color: rgb(255 255 255 / 0.62) !important;
  margin: 26px 0 0;
}

/* No catch-all page rule: the only non-legal page is the Elementor front
   page, and it sets its own widths. A blanket 760px cap here squeezed the
   entire homepage. */
body.sa-legal .page-content h2 {
  font-family: var(--sa-font-head);
  font-size: 25.6px;
  font-weight: 800;
  line-height: 1.25;
  letter-spacing: -0.02em;
  color: var(--sa-primary);
  margin-block: 34px 14px;
  /* A hairline above each clause so the document has rhythm without the
     rule reading as a hard divider — 7%% opacity, just enough to sense. */
  padding-block-start: 22px;
  border-block-start: 1px solid rgb(47 22 1 / 0.07);
}
/* the first clause needs no rule: nothing precedes it */
body.sa-legal .page-content h2:first-of-type {
  margin-block-start: 40px;
  padding-block-start: 0;
  border-block-start: 0;
}
body.sa-legal .page-content p,
body.sa-legal .page-content li {
  font-size: 16.3px;
  line-height: 29px;
  color: var(--sa-text);
}
body.sa-legal .page-content p { margin-block: 0 16px; }
body.sa-legal .page-content ul { padding-inline-start: 22px; margin-block: 0 18px; }
body.sa-legal .page-content li { margin-block-end: 10px; }
body.sa-legal .page-content li::marker { color: var(--sa-accent); }
body.sa-legal .page-content a { color: var(--sa-accent); }
body.sa-legal .page-content strong { color: var(--sa-primary); font-weight: 600; }
/* the standfirst under the page title */
body.sa-legal .page-content .sa-legal-lead {
  font-size: 18.5px;
  line-height: 1.6;
  color: var(--sa-text-muted);
  padding: 20px 22px;
  background: var(--sa-bg);
  border-inline-start: 3px solid var(--sa-accent);
  border-radius: 0 12px 12px 0;
  margin-block-end: 8px;
}
body.sa-legal .page-header .entry-title {
  font-family: var(--sa-font-head);
  font-size: clamp(2rem, 1.2rem + 3vw, 3.2rem);
  font-weight: 800;
  letter-spacing: -0.03em;
  color: var(--sa-primary);
  max-inline-size: 760px;
  margin-inline: auto;
  padding-inline: 20px;
  padding-block-start: 40px;
}

/* -------------------------------------------------------------------------
   18. WHITE-LABEL / AGENCIES
   Left rail (eyebrow, H2, lead, proof plates, CTA) against benefit cards,
   then a numbered "how it runs" band and an objection row.
   ---------------------------------------------------------------------- */
.sa-wl-eyebrow .elementor-heading-title { letter-spacing: 0.16em !important; }
.sa-wl-h2 .elementor-heading-title {
  font-size: 44px !important;
  font-weight: 700 !important;
  line-height: 1.08 !important;
  letter-spacing: -0.03em !important;
}
.sa-wl-h2 b { font-weight: 800; color: var(--sa-accent); }
.sa-wl-lead p { margin: 0 0 14px; }
.sa-wl-lead p:last-child { margin-bottom: 0; }
.sa-wl-lead strong { color: var(--sa-primary); font-weight: 600; }

/* proof plates */
.sa-wl-proof {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 10px;
  margin-block: 4px 6px;
}
.sa-wl-stat {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 12px 10px;
  border-radius: 12px;
  background: var(--sa-white);
}
.sa-wl-num {
  font-family: var(--sa-font-head);
  font-size: 22px;
  font-weight: 800;
  line-height: 1;
  letter-spacing: -0.02em;
  color: var(--sa-accent);
}
.sa-wl-lab { font-size: 11.5px; line-height: 1.3; color: var(--sa-text-muted); }

/* benefit cards */
.sa-wl-card {
  border: 1px solid transparent;
  transition: transform var(--sa-dur-fast) var(--sa-ease),
              border-color var(--sa-dur-fast) var(--sa-ease),
              box-shadow var(--sa-dur-fast) var(--sa-ease);
}
.sa-wl-card:hover {
  transform: translateX(6px);
  border-color: var(--sa-accent);
  box-shadow: var(--sa-shadow-md);
}
.sa-wl-ct .elementor-heading-title {
  font-size: 18px !important; font-weight: 700 !important; line-height: 1.25 !important;
}
.sa-wl-cd, .sa-wl-cd p { font-size: 14px !important; line-height: 1.55 !important; margin: 0; }

/* how-it-runs band */
.sa-wl-h3 .elementor-heading-title {
  font-size: 26px !important; font-weight: 700 !important; letter-spacing: -0.02em !important;
}
.sa-wl-steps {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 16px;
  counter-reset: none;
}
.sa-wl-step {
  position: relative;
  padding: 20px 18px 22px;
  border-radius: 16px;
  background: var(--sa-white);
  border-block-start: 3px solid var(--sa-accent);
}
/* a hairline linking the steps into one run, hidden on the last */
.sa-wl-step::after {
  content: "";
  position: absolute;
  inset-block-start: -3px;
  inset-inline-end: -16px;
  inline-size: 16px;
  block-size: 3px;
  background: rgb(253 99 1 / 0.35);
}
.sa-wl-step:last-child::after { display: none; }
.sa-wl-n {
  font-family: var(--sa-font-mono, var(--sa-font-head));
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.14em;
  color: var(--sa-accent);
}
.sa-wl-st {
  font-family: var(--sa-font-head);
  font-size: 16.5px;
  font-weight: 700;
  line-height: 1.25;
  color: var(--sa-primary);
  margin: 6px 0 6px;
}
.sa-wl-sd { font-size: 13.5px; line-height: 1.5; color: var(--sa-text-muted); margin: 0; }

/* objection row */
.sa-wl-objs {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
  margin-block-start: 4px;
}
.sa-wl-obj {
  display: flex;
  flex-direction: column;
  gap: 5px;
  padding: 16px 18px;
  border-radius: 14px;
  border: 1px dashed rgb(47 22 1 / 0.18);
}
.sa-wl-q {
  font-family: var(--sa-font-head);
  font-size: 14.5px;
  font-weight: 700;
  color: var(--sa-primary);
}
.sa-wl-a { font-size: 13.5px; line-height: 1.5; color: var(--sa-text-muted); }

@media (max-width: 1024px) {
  .sa-wl-steps { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .sa-wl-step::after { display: none; }
  .sa-wl-objs { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 767px) {
  .sa-wl-h2 .elementor-heading-title { font-size: 32px !important; }
  .sa-wl-proof { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .sa-wl-steps { grid-template-columns: minmax(0, 1fr); }
}

/* -------------------------------------------------------------------------
   16. PORTFOLIO — hover-scroll gallery, matching the reference mechanism:
   a 250px window over a much taller page image, translated up on hover
   over 0.7s so the whole page scrolls past.
   ---------------------------------------------------------------------- */
/* A deeper ink than the brand primary, chosen by the owner for this band */
.sa-pfsec { background: #150800 !important; }
.sa-pf-sub,
.sa-pf-sub .elementor-widget-container { color: rgb(255 255 255 / 0.7) !important; }

/* A grid, not a flex row: with flex the last card on a short row stretched
   to fill the whole width. Grid columns keep every card the same size and
   leave the gap after the last one. */
.sa-pfrow {
  inline-size: 100%;
  display: grid !important;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  align-items: stretch;
}
.sa-pfrow > .elementor-widget-html { min-inline-size: 0; }

.sa-pf {
  display: flex;
  flex-direction: column;
  block-size: 100%;
  border-radius: 16px;
  overflow: hidden;                       /* clips the image window's corners */
  background: rgb(255 255 255 / 0.04);
  border: 0;                              /* owner: no outline on these cards */
  transition: transform var(--sa-dur-base) var(--sa-ease),
              box-shadow var(--sa-dur-base) var(--sa-ease),
              background-color var(--sa-dur-base) var(--sa-ease);
}
.sa-pf:hover,
.sa-pf:focus-within {
  transform: translateY(-4px);
  background: rgb(255 255 255 / 0.07);
  box-shadow: 0 18px 40px rgb(0 0 0 / 0.35);
}

/* the window: fixed height, everything taller than it is hidden */
.sa-pf-win {
  block-size: 250px;
  overflow: hidden;
  position: relative;
  background: #16100C;
  flex: 0 0 auto;
}
/* the page image: full height, parked at the top, slides up on hover.
   --pf-shift is (image height - window height) in the image's own scale;
   the SVG is 400x900 rendered at the card width, so the shift is expressed
   as a percentage of the rendered image instead of a pixel figure. */
/* Tall page screenshots keep their natural height and scroll; wide ones
   (workflow and dashboard captures) are shorter than the window, so they
   fill it and crop instead of leaving a gap under themselves. */
.sa-pf-shot {
  display: block;
  inline-size: 100%;
  block-size: auto;
  min-block-size: 250px;
  object-fit: cover;
  object-position: 50% 0;
}
.sa-pf-scroll {
  transform: translateY(0);
  /* --pf-dur is written per card in PHP from that card's own travel
     distance, so every screenshot scrolls at the SAME speed (~1400px/s,
     the reference's rate) instead of every card sharing one duration —
     which made the tall ones tear past at nearly double that.
     The site-wide reduced-motion rule flattens every transition to
     0.01ms; this pan only ever runs because the visitor chose to hover a
     card, so it is exempted the same way the service strap is. */
  transition: transform var(--pf-dur, 0.7s) ease !important;
  will-change: transform;
}
.sa-pf:hover .sa-pf-scroll,
.sa-pf:focus-within .sa-pf-scroll {
  /* the whole page runs past: everything below the 250px window */
  transform: translateY(calc(-100% + 250px));
}
/* a hint that the panel scrolls, fading out while it does */
.sa-pf-win::after {
  content: "";
  position: absolute;
  inset-inline: 0;
  inset-block-end: 0;
  block-size: 64px;
  background: linear-gradient(to top, rgb(22 16 12 / 0.85), transparent);
  opacity: 1;
  transition: opacity var(--sa-dur-base) var(--sa-ease);
  pointer-events: none;
}
.sa-pf:hover .sa-pf-win::after { opacity: 0; }

/* Compact body: the category pill was removed and the block tightened,
   so the artwork carries the card rather than a tall block of text. */
.sa-pf-body { padding: 15px 16px 16px; display: flex; flex-direction: column; flex: 1 1 auto; }
/* Elementor's kit styles the bare h3 at 30px/600 in brand-primary, which
   beat a single class here — the titles came out dark on a dark card. */
.sa-pf .sa-pf-title {
  font-family: var(--sa-font-head) !important;
  font-size: 18px !important;
  font-weight: 800 !important;
  line-height: 1.22 !important;
  letter-spacing: -0.02em !important;
  color: #FFFFFF !important;
  margin: 0 0 6px !important;
}
.sa-pf-desc {
  font-size: 13.5px;
  line-height: 1.5;
  color: rgb(255 255 255 / 0.62);
  margin: 0 0 11px;
}
.sa-pf-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-block-end: 12px; }
.sa-pf-chip {
  font-family: var(--sa-font-mono, var(--sa-font-head));
  font-size: 10.5px;
  color: rgb(255 255 255 / 0.6);
  background: rgb(255 255 255 / 0.06);
  border-radius: 5px;
  padding: 4px 8px;
}
.sa-pf-link {
  margin-block-start: auto;
  font-family: var(--sa-font-head);
  font-size: 13.5px;
  font-weight: 700;
  color: var(--sa-accent);
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: 7px;
}
.sa-pf-slotnote {
  margin-block-start: auto;
  font-family: var(--sa-font-mono, var(--sa-font-head));
  font-size: 11.5px;
  color: rgb(253 99 1 / 0.8);
}
.sa-pf.is-slot { border: 1px dashed rgb(253 99 1 / 0.35); }
/* landscape captures fit the window already — there is nothing to pan */
.sa-pf-shot.is-wide { object-position: 50% 50%; }

/* ---- tab bar ---- */
.sa-pf-tabs {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px;
  inline-size: 100%;
}
/* The theme fills every bare <button> with the accent colour, which made
   all seven tabs look selected at once. Every visual property is stated
   with priority so only .is-active reads as chosen.
   On this near-black band an orange fill sat heavy next to the orange
   heading and the orange links, so the chosen tab is white instead —
   the strongest possible contrast, and it leaves the accent to the
   heading and the card links where it still means something. */
.sa-pf-tabs .sa-pf-tab {
  font-family: var(--sa-font-head) !important;
  font-size: 13px !important;
  font-weight: 600 !important;
  text-transform: none !important;
  letter-spacing: normal !important;
  line-height: 1 !important;
  color: rgb(255 255 255 / 0.62) !important;
  background: transparent !important;
  border: 1px solid rgb(255 255 255 / 0.14) !important;
  border-radius: 999px !important;
  padding: 8px 15px !important;
  box-shadow: none !important;
  cursor: pointer;
  transition: background-color var(--sa-dur-fast) var(--sa-ease),
              color var(--sa-dur-fast) var(--sa-ease),
              border-color var(--sa-dur-fast) var(--sa-ease);
}
.sa-pf-tabs .sa-pf-tab:hover {
  color: #fff !important;
  border-color: rgb(255 255 255 / 0.4) !important;
  background: rgb(255 255 255 / 0.07) !important;
}
.sa-pf-tabs .sa-pf-tab.is-active {
  background: #FFFFFF !important;
  border-color: #FFFFFF !important;
  color: #150800 !important;
}

/* ---- load more ---- */
.sa-pf-morewrap {
  inline-size: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
}
.sa-pf-morewrap .sa-pf-more {
  font-family: var(--sa-font-head) !important;
  font-size: 15px !important;
  font-weight: 700 !important;
  text-transform: none !important;
  letter-spacing: normal !important;
  color: #fff !important;
  background: transparent !important;
  border: 1px solid rgb(255 255 255 / 0.25) !important;
  border-radius: 999px !important;
  padding: 13px 30px !important;
  box-shadow: none !important;
  cursor: pointer;
  transition: background-color var(--sa-dur-fast) var(--sa-ease),
              border-color var(--sa-dur-fast) var(--sa-ease);
}
.sa-pf-morewrap .sa-pf-more:hover {
  background: #FFFFFF !important;
  border-color: #FFFFFF !important;
  color: #150800 !important;
}

/* ---- lightbox: the full screenshot, scrollable at full width ---- */
/* The whole overlay scrolls, not an inner box — with the scroller nested,
   the wheel did nothing unless the pointer happened to be inside it and
   the visitor had to drag the scrollbar. */
.sa-lb {
  position: fixed;
  inset: 0;
  z-index: 100000;
  background: rgb(10 4 0 / 0.94);
  -webkit-backdrop-filter: blur(4px);
          backdrop-filter: blur(4px);
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: 64px 16px 40px;
}
.sa-lb-scroll {
  inline-size: min(1000px, 100%);
  margin-inline: auto;
  border-radius: 10px;
  overflow: hidden;
}
.sa-lb-img { display: block; inline-size: 100%; block-size: auto; }
.sa-lb-close {
  position: absolute;
  inset-block-start: 14px;
  inset-inline-end: 18px;
  inline-size: 44px !important;
  block-size: 44px !important;
  border-radius: 999px !important;
  border: 1px solid rgb(255 255 255 / 0.25) !important;
  background: rgb(255 255 255 / 0.08) !important;
  color: #fff !important;
  font-size: 26px !important;
  line-height: 1 !important;
  padding: 0 !important;
  cursor: pointer;
}
.sa-lb-close:hover { background: #FFFFFF !important; color: #150800 !important; }
/* the window advertises that it opens */
.sa-pf-win.is-zoomable { cursor: zoom-in; }

/* -------------------------------------------------------------------------
   17b. FOOTER ON BLACK
   The footer's greys were picked against the old brown band. On #000000
   the muted text fell to 4:1 and the social links to 1.9:1 — effectively
   invisible. They are lifted here to clear 4.5:1 against black.
   ---------------------------------------------------------------------- */
footer .elementor-heading-title,
footer .elementor-widget-text-editor,
footer .elementor-widget-text-editor *,
footer p,
footer li,
footer span,
footer a { color: rgb(255 255 255 / 0.72) !important; }
footer a:hover { color: var(--sa-accent) !important; }
/* social glyphs were the darkest thing on the page */
footer .elementor-social-icon i,
footer .elementor-social-icon svg,
footer .elementor-icon-list-icon svg,
footer .elementor-icon svg {
  fill: rgb(255 255 255 / 0.78) !important;
  color: rgb(255 255 255 / 0.78) !important;
}
footer .elementor-social-icon:hover i,
footer .elementor-social-icon:hover svg { fill: var(--sa-accent) !important; }
/* headings stay full white so the columns still have a hierarchy */
footer h2 .elementor-heading-title,
footer h3 .elementor-heading-title,
footer h4 .elementor-heading-title { color: #FFFFFF !important; }
footer hr,
footer .elementor-divider-separator { border-color: rgb(255 255 255 / 0.14) !important; }

/* -------------------------------------------------------------------------
   17. BUTTON CONSISTENCY
   Radii had drifted across the site — 50px on the hero, 60px in the popup,
   100px on the contact form, 999px on the package CTAs. They are all pills
   now, matching "Book a call with me".
   ---------------------------------------------------------------------- */
.elementor-button,
.sa-hero-cta .elementor-button,
.sa-pop-cta .elementor-button,
.sa-pkg-cta .elementor-button,
.elementor-field-type-submit button,
input[type="submit"] { border-radius: 999px !important; }

/* The calendar glyph was drawn in brand-primary on a brand-primary button,
   so it only appeared once hover turned the background orange. Button icons
   take the button's own text colour. */
.elementor-button .elementor-button-icon svg,
.elementor-button .elementor-button-icon i {
  fill: currentColor !important;
  color: currentColor !important;
}
.sa-pf-count {
  margin: 0;
  font-size: 13px;
  color: rgb(255 255 255 / 0.45);
}
.sa-pf-link span { transition: transform var(--sa-dur-fast) var(--sa-ease); }
.sa-pf:hover .sa-pf-link span { transform: translateX(5px); }

@media (max-width: 1024px) {
  .sa-pfrow { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 767px) {
  .sa-pfrow { grid-template-columns: minmax(0, 1fr); }
  .sa-pf-win { block-size: 210px; }
  .sa-pf:hover .sa-pf-scroll,
  .sa-pf:focus-within .sa-pf-scroll { transform: translateY(calc(-100% + 210px)); }
}
/* The pan keeps its full 0.7s under reduced motion too. Halving it there
   was what made the scroll feel snapped rather than smooth — and it is
   hover-triggered, never automatic, so the preference is not at stake. */

/* -------------------------------------------------------------------------
   15. PROCESS — four stage cards stepping down across the row, each with
   its own animated illustration and a short checklist
   ---------------------------------------------------------------------- */
.sa-pcrow { inline-size: 100%; }
.sa-pcrow > .elementor-widget-html { flex: 1 1 0; min-inline-size: 0; }
.sa-pc {
  display: flex;
  flex-direction: column;
  block-size: 100%;
  padding: 18px 18px 22px;
  border: 1px solid var(--sa-border);
  border-radius: 20px;
  background: var(--sa-white);
  /* the staircase: each card sits a step lower than the one before it */
  margin-block-start: calc(var(--pc-step) * 40px);
  transition: transform var(--sa-dur-base) var(--sa-ease),
              box-shadow var(--sa-dur-base) var(--sa-ease),
              border-color var(--sa-dur-base) var(--sa-ease);
}
.sa-pc:hover {
  transform: translateY(-6px);
  box-shadow: var(--sa-shadow-lg);
  border-color: var(--sa-accent);
}
.sa-pc-art {
  border-radius: 14px;
  background: var(--sa-bg);
  overflow: hidden;
  margin-block-end: 16px;
}
.sa-pc-art svg { display: block; inline-size: 100%; block-size: auto; }
.sa-pc-num {
  font-family: var(--sa-font-head);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.12em;
  color: var(--sa-accent);
  margin-block-end: 4px;
}
.sa-pc-title {
  font-family: var(--sa-font-head);
  font-size: 21px;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.02em;
  color: var(--sa-primary);
  margin: 0 0 6px;
}
.sa-pc-desc {
  font-size: 14.5px;
  line-height: 1.5;
  color: var(--sa-text-muted);
  margin: 0 0 14px;
}
.sa-pc-list { list-style: none; margin: auto 0 0; padding: 0; display: grid; gap: 7px; }
.sa-pc-list li {
  display: flex;
  align-items: center;
  gap: 9px;
  font-family: var(--sa-font-head);
  font-size: 13.5px;
  font-weight: 600;
  color: var(--sa-primary);
  background: var(--sa-bg);
  border-radius: 999px;
  padding: 8px 13px;
  transition: background-color var(--sa-dur-fast) var(--sa-ease);
}
.sa-pc:hover .sa-pc-list li { background: var(--sa-surface-hover); }
.sa-pc-tick {
  inline-size: 15px;
  block-size: 15px;
  flex: 0 0 15px;
  border-radius: 50%;
  background: var(--sa-accent);
  position: relative;
}
.sa-pc-tick::after {
  content: "";
  position: absolute;
  inset-block-start: 4px;
  inset-inline-start: 4px;
  inline-size: 6px;
  block-size: 3px;
  border-inline-start: 1.8px solid #fff;
  border-block-end: 1.8px solid #fff;
  transform: rotate(-45deg);
}
@media (max-width: 1024px) {
  /* two per row: the staircase restarts on each line */
  .sa-pcrow > .elementor-widget-html { flex: 1 1 calc(50% - 11px); }
  .sa-pc { margin-block-start: 0; }
}
@media (max-width: 767px) {
  .sa-pcrow > .elementor-widget-html { flex: 1 1 auto; }
  .sa-pc-title { font-size: 19px; }
}

/* -------------------------------------------------------------------------
   14. FAQ — reference layout: each row is its OWN rounded card on a soft
   tint (not hairline dividers), with a circled number badge, a 20/700
   question and a thin plus on the right edge
   ---------------------------------------------------------------------- */
.sa-faq { inline-size: 100%; max-inline-size: 1200px; margin-inline: auto; }
.sa-faq .elementor-accordion-item {
  border: 1px solid var(--sa-border) !important;
  border-radius: 14px;
  background: linear-gradient(180deg, var(--sa-white), var(--sa-bg));
  margin-block-end: 12px;
  overflow: hidden;
  transition: border-color var(--sa-dur-fast) var(--sa-ease),
              box-shadow var(--sa-dur-fast) var(--sa-ease);
}
.sa-faq .elementor-accordion-item:hover { box-shadow: var(--sa-shadow-md); }
.sa-faq .elementor-accordion-item:has(.elementor-active) { border-color: var(--sa-accent) !important; }
.sa-faq .elementor-tab-title {
  padding: 18px 22px !important;
  background: transparent !important;
  display: flex;
  align-items: center;
  gap: 16px;
  transition: color var(--sa-dur-fast) var(--sa-ease);
}
.sa-faq .elementor-tab-title a,
.sa-faq .elementor-tab-title .elementor-accordion-title {
  font-family: var(--sa-font-head) !important;
  font-size: 20px !important;
  font-weight: 700 !important;
  line-height: 1.35 !important;
  letter-spacing: normal !important;
  display: flex;
  align-items: center;
  gap: 16px;
  flex: 1 1 auto;
}
/* the "01" badge: a white circle with a hairline, as in the reference */
.sa-faq-n {
  flex: 0 0 40px;
  inline-size: 40px;
  block-size: 40px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--sa-border);
  border-radius: 50%;
  background: var(--sa-white);
  font-size: 14px;
  font-weight: 600;
  color: var(--sa-text-muted);
  transition: background-color var(--sa-dur-fast) var(--sa-ease),
              color var(--sa-dur-fast) var(--sa-ease),
              border-color var(--sa-dur-fast) var(--sa-ease);
}
.sa-faq .elementor-tab-title:hover { color: var(--sa-accent); }
.sa-faq .elementor-tab-title:hover .sa-faq-n,
.sa-faq .elementor-tab-title.elementor-active .sa-faq-n {
  background: var(--sa-accent);
  border-color: var(--sa-accent);
  color: var(--sa-white);
}
/* thin plus/minus pinned to the right edge */
.sa-faq .elementor-accordion-icon {
  margin: 0 0 0 auto !important;
  font-size: 24px;
  order: 2;
  flex: 0 0 auto;
  font-weight: 300;
}
.sa-faq .elementor-accordion-icon svg { inline-size: 20px; block-size: 20px; }
.sa-faq .elementor-tab-content {
  padding: 0 22px 22px 78px !important;   /* 78 = badge + gap + tab padding */
  border: 0 !important;
  background: transparent !important;
  font-size: 16px !important;
  line-height: 26px !important;
  max-inline-size: 980px;
}
@media (max-width: 767px) {
  .sa-faq .elementor-tab-title,
  .sa-faq .elementor-tab-title a,
  .sa-faq .elementor-tab-title .elementor-accordion-title { font-size: 16px !important; gap: 12px; }
  .sa-faq .elementor-tab-title { padding: 14px 14px !important; }
  .sa-faq-n { flex-basis: 32px; inline-size: 32px; block-size: 32px; font-size: 12px; }
  .sa-faq .elementor-tab-content { padding: 0 14px 18px 58px !important; }
}

/* -------------------------------------------------------------------------
   12. ABOUT — full-bleed dark band, portrait bottom-left, socials beneath
   (reference layout; brand primary instead of black)
   ---------------------------------------------------------------------- */
.sa-about {
  /* the band must reach the viewport edges even though the section is boxed */
  position: relative;
  overflow: hidden;
}
.sa-about > .e-con-inner { align-items: flex-end; }

/* portrait sits ON the band floor, so it needs no bottom padding */
.sa-about-photo { align-self: flex-start; }
.sa-about-photo img {
  display: block;
  inline-size: 100%;
  block-size: auto;
  max-block-size: 560px;
  object-fit: contain;
  object-position: bottom center;
}
.sa-about-left { justify-content: flex-end; }

.sa-follow-a .elementor-heading-title {
  font-size: 18px !important;
  font-weight: 400 !important;
  letter-spacing: normal !important;
}
.sa-follow-b .elementor-heading-title {
  font-size: 22px !important;
  font-weight: 700 !important;
  letter-spacing: normal !important;
}
/* Social icons: white glyphs that warm to the accent on hover */
.sa-socrow { line-height: 0; }
.sa-soc .elementor-icon { padding: 0 !important; line-height: 0 !important; }
.sa-soc svg,
.sa-soc i { transition: color var(--sa-dur-fast) var(--sa-ease), fill var(--sa-dur-fast) var(--sa-ease); }
.sa-soc { transition: transform var(--sa-dur-fast) var(--sa-ease); }
.sa-soc:hover { transform: translateY(-3px); }
.sa-soc:hover svg { fill: var(--sa-accent) !important; }
.sa-soc:hover i  { color: var(--sa-accent) !important; }

.sa-about-iam .elementor-heading-title {
  font-size: 44px !important;
  font-weight: 400 !important;
  line-height: 1.1 !important;
  letter-spacing: -0.02em !important;
}
.sa-about-role .elementor-heading-title {
  font-size: 54px !important;
  font-weight: 800 !important;
  line-height: 1.02 !important;
  letter-spacing: -0.03em !important;
}
/* italic tagline, exactly one notch brighter than the body copy */
.sa-about-tag,
.sa-about-tag .elementor-widget-container {
  font-size: 20px !important;
  font-style: italic;
  line-height: 1.4 !important;
}
.sa-about-tag p { margin: 0; }
/* body copy on a dark ground: pure white is too harsh at this size */
.sa-about-p,
.sa-about-p .elementor-widget-container {
  font-size: 17px !important;
  line-height: 1.65 !important;
  color: rgb(255 255 255 / 0.72) !important;
  max-inline-size: 760px;
}
.sa-about-p p { margin: 0; }

@media (max-width: 1024px) {
  .sa-about-iam .elementor-heading-title  { font-size: 34px !important; }
  .sa-about-role .elementor-heading-title { font-size: 38px !important; }
}
@media (max-width: 767px) {
  .sa-about-photo img { max-block-size: 380px; margin-inline: auto; }
  .sa-about-iam .elementor-heading-title  { font-size: 28px !important; }
  .sa-about-role .elementor-heading-title { font-size: 30px !important; }
  .sa-about-tag,
  .sa-about-tag .elementor-widget-container { font-size: 17px !important; }
  .sa-about-p,
  .sa-about-p .elementor-widget-container { font-size: 16px !important; }
  /* on phones the follow block reads better after the story, not before */
  .sa-about > .e-con-inner { flex-direction: column; }
  .sa-follow { padding-block-end: 0 !important; padding-block-start: 32px; }
}

/* The panel is the artwork alone (the word-chip ticker under it was removed
   at the owner's request), so the SVG fills the panel and its height drives
   the panel's height — which sits level with the text column beside it. */
.sa-problem-panel { overflow: hidden; }
/* The panel centres its children, and in a column flex box that shrinks
   them to their content width — which capped the artwork at 300px inside a
   538px panel. The widget wrapper has to be told to span the panel. */
.sa-problem-panel > .elementor-widget-html,
.sa-problem-panel > .elementor-widget-html > .elementor-widget-container {
  inline-size: 100%;
  align-self: stretch;
}
.sa-prob-svg { inline-size: 100%; display: flex; }
.sa-prob-svg svg { display: block; inline-size: 100%; block-size: auto; }


/* The footer now shares the contact section's ground, so without a seam the
   two dark bands merge into one slab. A single hairline separates them. */
body .sa-footer { border-block-start: 1px solid rgb(255 255 255 / 0.09); }

/* The theme's paragraph rule (margin-bottom: 1em) outweighed the footer
   classes, so the name sat 22px off its role line; and the button was
   inheriting a 28.8px line box, making a 14px label 53px tall. */
/* The name and the rotating role pill were almost touching at 2px. The pill
   is a bordered chip, not a line of text, so it needs room to read as its own
   object rather than as a second line of the heading. */
body .sa-ft-name { margin: 0 0 12px !important; }
body .sa-ft-role { margin: 0 0 18px !important; }
body .sa-ft-blurb { margin: 0 0 16px !important; }
body .sa-ft-meta { margin: 0 0 8px !important; }
body .sa-ft-btn { line-height: 1 !important; }

/* Elementor's kit styles bare h3 at 30px/600, which beat the single class
   on the footer column headings — they rendered at twice the intended size. */
body .sa-ft .sa-ft-h {
  font-size: 16px !important;
  font-weight: 700 !important;
  line-height: 1.3 !important;
  letter-spacing: -0.01em !important;
  text-transform: none !important;
  color: #FFFFFF !important;
}

/* -------------------------------------------------------------------------
   22. HEADER SEAM
   The fixed header is white and the page ground is cream, so the strip of
   body background behind the header shows as a band the moment the header
   height and the body offset disagree by even a pixel — a webfont landing
   late, JS not running, a plugin changing the bar. Measured at 0 here, but
   the failure mode is one pixel wide and hard to notice in testing.
   Painting the body the same colour as whatever sits directly under the
   header removes the symptom outright, in every one of those cases.
   ---------------------------------------------------------------------- */
body.home { background-color: #FAF7F4; }          /* matches the hero band */
body.sa-legal { background-color: #150800; }      /* legal hero is ink */

/* The ink body above paints the whole legal page, which left the document
   text dark-on-dark below the hero. The ink is only wanted in the strip
   behind the fixed header, so the content column takes back a light ground
   and the hero keeps its own. */
body.sa-legal .page-content { background-color: #FCFAF7; }

/* -------------------------------------------------------------------------
   23. HERO BACKDROP — three faint lanes with the stack's marks drifting
   The section becomes the positioning context; the backdrop fills it and
   sits under everything else, ignoring the pointer entirely.
   ---------------------------------------------------------------------- */
#hero { position: relative; overflow: hidden; }
/* Left positioned, .e-con-inner became the backdrop's containing block
   and clipped it to the 1280px content column instead of the full band.
   Elementor already gives each widget position:relative, so the content
   paints above the z-index:0 backdrop without this. */
#hero > .e-con-inner > .elementor-element:not(:has(> .sa-hero-bg)) {
  position: relative;
  z-index: 1;
}

/* Elementor gives every widget wrapper position:relative, so an absolute
   child with inset:0 measured against that zero-height wrapper instead of
   the section — the backdrop rendered at 0x0. The WRAPPER is what has to
   be taken out of flow. */
#hero .elementor-widget-html:has(> .sa-hero-bg) {
  position: absolute;
  inset: 0;
  z-index: 0;
  inline-size: 100%;
  block-size: 100%;
  pointer-events: none;
}
.sa-hero-bg {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  line-height: 0;
}
.sa-hero-bg svg {
  /* width-fitted with the viewBox aspect kept, anchored to the top: the
     arc band then scales with the viewport instead of being blown up to
     cover a tall hero, which is what pushed it onto the text on narrow
     screens. */
  inline-size: 100%;
  block-size: auto;
  display: block;
}

/* A slow decorative drift is exactly what a reduced-motion preference is
   for, and unlike the service strap nothing here is content — the lanes
   simply hold still. */
@media (prefers-reduced-motion: reduce) {
  .sa-hero-bg animateMotion { display: none; }
}

/* -------------------------------------------------------------------------
   24. INLINE SVG ICON SHELLS — services and the Problem list
   The Elementor icon widget can only draw a Font Awesome glyph, so every
   card wore the same shape. These are real SVGs in the markup instead; the
   shell reproduces the tinted rounded square the icon widget used to make.
   ---------------------------------------------------------------------- */
.sa-ico-w { line-height: 0; }
.sa-ico {
  --ico: 48px;
  inline-size: var(--ico);
  block-size: var(--ico);
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: calc(var(--ico) * 0.26);
  background: var(--sa-accent-tint);
  color: var(--sa-accent);
}
.sa-ico svg {
  inline-size: 56%;
  block-size: 56%;
  display: block;
  overflow: visible;         /* the gauge needle sweeps past its own box */
}
/* The service marks answer a hover on the card as a whole, not on the icon. */
.sa-card .sa-ico {
  transition: background-color var(--sa-dur-fast) var(--sa-ease),
              color var(--sa-dur-fast) var(--sa-ease);
}
.sa-card:hover .sa-ico { background: var(--sa-accent); color: var(--sa-white); }

/* These marks are SMIL, which no CSS property can reach — repeatCount is an
   SVG attribute, not a style — so they are deliberately left running under a
   reduced-motion preference. That preference exists for movement that can
   provoke vestibular symptoms: large travel, parallax, rapid flashing. A 24px
   glyph easing over two to three seconds is none of those, and the panel
   slide (which IS large travel) is reduced to a fade above. If these ever
   need stopping, it has to be done in script via svg.pauseAnimations(). */

/* -------------------------------------------------------------------------
   25. PROBLEM LIST — one marked objection per row
   ---------------------------------------------------------------------- */
.sa-myth {
  /* Elementor's mobile default stacked the mark above the title while the
     desktop kept them side by side; the row is pinned at every width. */
  flex-direction: row !important;
  flex-wrap: nowrap !important;
  align-items: flex-start !important;
}
.sa-myth-ico { padding-block-start: 1px; }
.sa-myth .sa-ico { --ico: 30px; border-radius: 9px; }
.sa-myth-txt { min-inline-size: 0; }   /* lets long titles wrap, not overflow */

/* The display heading's -1.5px tracking was reaching these 16px titles and
   closing the gaps between letters — "A website is enough." read as one
   word. Titles get their own, slightly tightened tracking. */
.sa-myth-t .elementor-heading-title {
  /* normal, not merely "less negative": at 16px semibold in Bricolage the
     counters close up as soon as the tracking goes below zero. */
  letter-spacing: normal !important;
  word-spacing: normal !important;
  font-size: 16.5px !important;
  line-height: 1.3 !important;
}
.sa-myth-s,
.sa-myth-s p {
  letter-spacing: normal !important;
  line-height: 1.45 !important;
}
@media (max-width: 767px) {
  .sa-myth { gap: 11px !important; }
  .sa-myth .sa-ico { --ico: 26px; border-radius: 8px; }
  .sa-myth-t .elementor-heading-title { font-size: 15px !important; }
}


/* -------------------------------------------------------------------------
   26. CONTACT FORM — confirmation panel, and the icon-box tracking leak
   ---------------------------------------------------------------------- */

/* NEGATIVE TRACKING LEAK, third instance.
   Elementor falls back to the display-heading letter-spacing when a global
   typography slot defines none, so -1.5px (correct for a 72px H1) was being
   applied to the 14px icon-box titles in the contact section — "Call me"
   rendered as "Callme" and "WhatsApp me" as "WhatsAppme". */
.elementor-icon-box-title,
.elementor-icon-box-title span,
.elementor-icon-box-description {
  letter-spacing: normal !important;
  word-spacing: normal !important;
}

/* ---- Success panel (replaces the form; built in custom.js) ----
   The form sits in a WHITE card inside the dark contact section, so this is
   styled for a light ground — an earlier pass assumed the section's ink and
   rendered white text on white. */
.sa-done {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  padding: 44px 28px 40px;
  border-radius: 20px;
  background: transparent;
}
.sa-done-mark {
  inline-size: 72px;
  block-size: 72px;
  /* Brand accent, not a generic success green (owner's call): the panel is
     already unambiguous from the tick and the copy, so the colour is free to
     be the site's own. */
  color: var(--sa-accent);
  margin-block-end: 20px;
}
.sa-done-h {
  font-family: var(--sa-font-head);
  font-size: 26px;
  font-weight: 800;
  line-height: 1.2;
  letter-spacing: -0.02em;
  color: var(--sa-primary);
  margin: 0 0 10px;
}
.sa-done-p {
  font-size: 15.5px;
  line-height: 1.6;
  color: var(--sa-text);
  margin: 0;
  max-inline-size: 46ch;
}
.sa-done-alt {
  margin-block-start: 14px;
  color: var(--sa-text-muted);
  font-size: 14.5px;
}
/* Matches the site's primary pill (hero and footer CTAs) rather than
   WhatsApp green, so the panel closes in the site's own voice. */
.sa-done-cta {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-block-start: 22px;
  padding: 13px 26px;
  border-radius: 60px;
  background: var(--sa-primary);
  color: #FFFFFF !important;
  font-family: var(--sa-font-head);
  font-size: 15px;
  font-weight: 700;
  text-decoration: none;
  transition: background-color var(--sa-dur-fast) var(--sa-ease);
}
.sa-done-cta:hover { background: var(--sa-accent); }
.sa-done-cta:focus-visible { outline: 2px solid var(--sa-primary); outline-offset: 3px; }

@media (max-width: 767px) {
  .sa-done { padding: 34px 20px 32px; }
  .sa-done-mark { inline-size: 60px; block-size: 60px; margin-block-end: 16px; }
  .sa-done-h { font-size: 22px; }
  .sa-done-p { font-size: 14.5px; }
}

/* -------------------------------------------------------------------------
   27. ACCENT BUTTONS — white label text
   Every button that actually renders on the accent fill carries a white
   label (owner's call 2026-09-09); the dark brand ink it used to use made
   the button read as washed out beside the site's dark pill CTAs.

   Contrast, stated plainly: white on #FD6301 is 3.02:1. That clears the 3:1
   floor WCAG sets for large text and graphical objects, but not the 4.5:1
   floor for body-sized labels. Reaching 4.5:1 with white would need the
   orange darkened to roughly #B34700, which is off-brand — so the label size
   is the lever if this ever has to pass: at 18.66px/700 or 24px the 3:1 rule
   applies and these already qualify.
   ---------------------------------------------------------------------- */
#agencies .elementor-button,
#contact .elementor-button[type="submit"],
#contact .elementor-form .elementor-button,
.sa-pkg .elementor-button.sa-pkg-cta--feature {
  color: #FFFFFF !important;
  fill: #FFFFFF !important;
}
#agencies .elementor-button .elementor-button-text,
#contact .elementor-form .elementor-button .elementor-button-text {
  color: inherit !important;
}

/* -------------------------------------------------------------------------
   28. SLOTS CHIP + FORM BUTTON HOVER
   ---------------------------------------------------------------------- */

/* The chip was carrying 14px text in a 7/14 pill — heavier than the quiet
   status note it is meant to be. Tightened, and the dot now breathes. */
.sa-slots {
  padding: 4px 12px 4px 10px !important;
}
.sa-slots .elementor-heading-title {
  font-size: 12.5px !important;
  line-height: 1.35 !important;
}
.sa-slots .elementor-heading-title::before {
  inline-size: 7px;
  block-size: 7px;
  margin-inline-end: 6px;
  /* A live-status dot that does not move reads as a printed bullet. The
     pulse is a ring drawn with box-shadow, so nothing reflows. */
  animation: sa-slot-pulse 2.2s ease-out infinite;
}
@keyframes sa-slot-pulse {
  0%   { box-shadow: 0 0 0 0 rgb(53 199 89 / 0.55); }
  70%  { box-shadow: 0 0 0 7px rgb(53 199 89 / 0); }
  100% { box-shadow: 0 0 0 0 rgb(53 199 89 / 0); }
}
/* A repeating pulse is exactly what the preference is for; the dot stays,
   it simply stops moving. */
@media (prefers-reduced-motion: reduce) {
  .sa-slots .elementor-heading-title::before { animation: none !important; }
}

/* The form's submit button had no hover state at all — the one control the
   whole page funnels toward gave no feedback that it was live. */
#contact .elementor-form .elementor-button,
#contact .elementor-form button[type="submit"] {
  transition: background-color var(--sa-dur-fast) var(--sa-ease),
              transform var(--sa-dur-fast) var(--sa-ease),
              box-shadow var(--sa-dur-fast) var(--sa-ease) !important;
}
#contact .elementor-form .elementor-button:hover,
#contact .elementor-form button[type="submit"]:hover {
  background-color: var(--sa-accent-hover) !important;
  transform: translateY(-2px);
  box-shadow: 0 10px 24px rgb(253 99 1 / 0.32);
}
#contact .elementor-form .elementor-button:active,
#contact .elementor-form button[type="submit"]:active {
  transform: translateY(0);
  box-shadow: 0 4px 12px rgb(253 99 1 / 0.28);
}
@media (prefers-reduced-motion: reduce) {
  #contact .elementor-form .elementor-button:hover,
  #contact .elementor-form button[type="submit"]:hover { transform: none; }
}

/* Same inherited-strut problem as the trust pill: the heading WIDGET carries
   the theme's 28.8px line box, so a 12.5px label still produced a 29px row
   and the chip stayed 39px tall regardless of its padding. */
.sa-slots .elementor-widget-heading,
.sa-slots .elementor-widget-container { line-height: 0 !important; }
.sa-slots .elementor-heading-title { display: block; }

/* Under a reduced-motion preference the expanding ring is replaced by a slow
   opacity breathe. Nothing travels or changes size — the dot still reads as
   live rather than as a printed bullet, which is what removing it outright
   did. */
@keyframes sa-slot-breathe {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.45; }
}
@media (prefers-reduced-motion: reduce) {
  .sa-slots .elementor-heading-title::before {
    animation: sa-slot-breathe 3s ease-in-out infinite !important;
    box-shadow: none !important;
  }
}

/* -------------------------------------------------------------------------
   29. FOOTER ROLE ROTATOR
   The role line under the name cycles the five things people search for.
   Every phrase is in the markup — only the painting rotates — so all five
   are indexable and the screen reader hears one sentence, not five scraps.
   ---------------------------------------------------------------------- */
body .sa-ft-role {
  /* the <p> is now just a wrapper; the pill inside carries the styling */
  color: inherit !important;
  line-height: 0;
}
.sa-ftr {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 6px 14px 6px 11px;
  border-radius: 999px;
  background: rgb(255 255 255 / 0.07);
  border: 1px solid rgb(255 255 255 / 0.14);
  font-family: var(--sa-font-head);
  font-size: 13px;
  font-weight: 700;
  line-height: 1.3;
  letter-spacing: normal;
  color: #FFFFFF;          /* was the accent orange — owner asked for white */
  white-space: nowrap;
}
.sa-ftr-dot {
  inline-size: 6px;
  block-size: 6px;
  flex: 0 0 auto;
  border-radius: 50%;
  background: var(--sa-accent);   /* the one spot of brand left in the pill */
}
/* One grid cell for all five, so the pill is as wide as the longest phrase
   and never resizes mid-cycle. */
.sa-ftr-slot {
  display: grid;
  align-items: center;
  justify-items: start;
}
.sa-ftr-item {
  grid-area: 1 / 1;
  opacity: 0;
  animation: sa-ftr-cycle var(--sa-ftr-loop, 13s) ease-in-out infinite both;
  animation-delay: calc(var(--i) * var(--sa-ftr-loop, 13s) / 5 - 0.5s);
}
/* Each phrase holds its whole 1/5 slot (20%) and only then leaves, so its
   fade-out and the next one's fade-in run over the same 2.5% window. With
   symmetric easing the two opacities sum to 1 and the pill never dims. */
@keyframes sa-ftr-cycle {
  0%     { opacity: 0; transform: translateY(0.35em); }
  2.5%   { opacity: 1; transform: translateY(0); }
  20%    { opacity: 1; transform: translateY(0); }
  22.5%  { opacity: 0; transform: translateY(-0.35em); }
  100%   { opacity: 0; transform: translateY(-0.35em); }
}
.sa-ftr-sr {
  position: absolute;
  inline-size: 1px; block-size: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}
/* Under a reduced-motion preference the phrases still rotate — the owner
   asked for that twice — but they cross-fade in place with the translateY
   removed, so nothing travels. Movement is the part of this the preference
   is actually about.

   Every longhand is restated: the blanket at the top of this file forces
   animation-duration to 0.01ms and iteration-count to 1 at the same (0,1,0)
   specificity, so a shorthand here would leave those two winning on source
   order and the phrases would flash past once and stop. */
@keyframes sa-ftr-fade {
  0%     { opacity: 0; }
  2.5%   { opacity: 1; }
  20%    { opacity: 1; }
  22.5%  { opacity: 0; }
  100%   { opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .sa-footer .sa-ftr-item {
    animation-name: sa-ftr-fade !important;
    animation-duration: var(--sa-ftr-loop, 13s) !important;
    animation-timing-function: ease-in-out !important;
    animation-iteration-count: infinite !important;
    animation-fill-mode: both !important;
    animation-delay: calc(var(--i) * var(--sa-ftr-loop, 13s) / 5 - 0.5s) !important;
    transform: none !important;
  }
}
@media (max-width: 767px) {
  .sa-ftr { font-size: 12px; padding: 5px 12px 5px 10px; }
}

/* The footer-on-dark block sets every footer text node to 72% white with
   !important, which is right for body copy but leaves this pill's label
   muted. It is a label on its own chip, so it takes full white. */
body .sa-footer .sa-ftr,
body .sa-footer .sa-ftr-item { color: #FFFFFF !important; }

/* The slots figure changes daily, so its digit must not change the line's
   width — tabular figures make every digit the same advance, and the line is
   centred, so a 3 and a 7 land in exactly the same place. */
.sa-hero-spots .elementor-heading-title,
.sa-pop-slots .elementor-heading-title,
.sa-headcta .elementor-heading-title {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}

/* Cards are now direct children of the grid (rendered by [sa_portfolio])
   rather than each sitting in its own Elementor widget wrapper, so the
   min-inline-size that stops a long title blowing out a column has to apply
   to the article too. Both selectors are kept: the wrapper form is still
   what Elementor produces if the grid is ever rebuilt from the builder. */
.sa-pfrow > .sa-pf { min-inline-size: 0; }

/* The filter and "load more" hide cards with the hidden attribute. The UA
   rule for that is [hidden] { display: none } at zero specificity, which
   .sa-pf { display: flex } silently beats — so every card stayed on screen
   and "Showing 6 of 52" was a lie. This only became reachable when the cards
   themselves became the grid items; previously the attribute went on an
   Elementor wrapper that had no display rule of its own. */
.sa-pf[hidden] { display: none !important; }

/* -------------------------------------------------------------------------
   30. PORTFOLIO SPACING after the move to [sa_portfolio]
   The grid gap (26px) and the space between the tab bar, the grid and the
   load-more control (30px) used to come from Elementor container `gap`
   settings, because each of those was its own container. The shortcode
   renders plain HTML, so nothing supplied them and every column and row
   ran flush together. They belong in CSS now — the markup owns its own
   rhythm rather than borrowing it from the page builder.
   ---------------------------------------------------------------------- */
.sa-pfrow { gap: 26px; }
.sa-pf-tabs { margin-block-end: 30px; }
.sa-pf-morewrap { margin-block-start: 30px; }

@media (max-width: 1024px) {
  .sa-pfrow { gap: 22px; }
}
@media (max-width: 767px) {
  .sa-pfrow { gap: 18px; }
  .sa-pf-tabs { margin-block-end: 22px; }
  .sa-pf-morewrap { margin-block-start: 22px; }
}

/* -------------------------------------------------------------------------
   31. LAYOUT STABILITY

   Everything here exists to make the first paint match the settled page, so
   nothing jumps a second after load. Measured causes, in the order they used
   to fire:

     1. the portfolio grid rendered all 74 cards and JavaScript then removed
        68 of them  -> now pre-hidden server-side (see inc/portfolio.php)
     2. Elementor's accordion auto-expanded the first question and custom.js
        closed it again  -> suppressed below until the handler has settled
   ---------------------------------------------------------------------- */

/* Hidden while the accordion initialises. Added by an inline head script and
   removed by custom.js the moment the widget is ready, a visitor clicks, or a
   1.2s backstop expires — whichever comes first. The server markup is already
   all-closed, so this changes nothing visually; it only stops the flash. */
.sa-faq-boot .sa-faq .elementor-tab-content {
  display: none !important;
}

/* The grid never reflows into a different column count mid-load. */
.sa-pfrow { contain: layout; }

/* Reserve the media box before the screenshot decodes. The cards already
   carry width/height, but the pan wrapper is what actually sets the height,
   and an undecoded image left it at zero for a frame. */
.sa-pf-win { aspect-ratio: auto; min-block-size: 250px; }

/* -------------------------------------------------------------------------
   32. FOOTER GROUND — pinned by class, not by generated id

   The footer's dark background is set on the container in Elementor and
   emitted into uploads/elementor/css/post-383.css, keyed to a generated
   element id that changes every time the footer is rebuilt. Twice now that
   file has regenerated without the rule, leaving white text on the cream
   page background — unreadable, and only visible if you happen to scroll to
   the bottom after a rebuild.

   The class is stable, so declaring it here means the footer can never lose
   its ground again regardless of what Elementor writes.
   ---------------------------------------------------------------------- */
.sa-footer,
.elementor-location-footer > .sa-footer {
  background-color: #150800 !important;
}

/* -------------------------------------------------------------------------
   33. MOTION — one hover behaviour for the whole site

   Two separate complaints, one cause.

   "Hover jumps to the right border" — the agency benefit cards and the myth
   rows moved themselves sideways with transform: translateX() on :hover.
   Sliding an element out from under the pointer is not just abrupt to look
   at, it is unstable: hover a card near its left edge and the card moves
   right, the cursor is left outside it, hover ends, the card moves back
   under the cursor, hover starts again. That loop is the flicker.

   The intent was good — the row should feel alive — so it is kept, but
   expressed as a left accent bar that grows in a pseudo-element. A
   pseudo-element cannot change the hit area, so it cannot flicker, and the
   card stays exactly where the eye put it.

   "Hover on and off is not smooth" — of 53 hover rules only a handful
   declared a transition, so most snapped instantly in BOTH directions. The
   block below gives every interactive thing one shared, slightly longer
   curve. Transitions live on the base selector, never on :hover, which is
   what makes the return journey animate too.

   Only compositor-friendly and paint-only properties are listed. A blanket
   `transition: all` would animate layout properties as well and turn a
   width change into a stutter.
   ---------------------------------------------------------------------- */
:root {
  /* Distinct from --sa-dur-fast (0.15s), which stays for micro-feedback such
     as a button press. Hover wants a touch more travel time to read as
     deliberate rather than twitchy. */
  --sa-dur-hover: 0.26s;
}

a,
button,
.elementor-button,
.sa-card,
.sa-pkg,
.sa-pf,
.sa-pf-tab,
.sa-pf-link,
.sa-myth,
.sa-wl-card,
.sa-soc,
.sa-pc,
.sa-tag,
.sa-gridbtn,
.sa-ft-list a,
.elementor-icon,
.elementor-icon-box-wrapper,
.elementor-field-textual,
input[type="submit"] {
  transition-property: color, background-color, border-color, box-shadow,
                       opacity, transform, fill, stroke, outline-color;
  transition-duration: var(--sa-dur-hover);
  transition-timing-function: var(--sa-ease);
}

/* ---- the two rows that used to slide sideways ---- */

.sa-wl-card,
.sa-myth {
  transform: none !important;   /* replaces the translateX on :hover */
}

/* The response is colour and depth only: the border warms to the accent and
   the card lifts on a shadow. Nothing moves, so the pointer never loses the
   element it is hovering.
   (An earlier version grew an accent bar down the left edge. It read as a
   stray line poking out past the card's rounded corner, so it is gone —
   the border already says "this one" without adding a second marker.) */
.sa-wl-card:hover,
.sa-wl-card:focus-within {
  border-color: var(--sa-accent);
  box-shadow: var(--sa-shadow-md);
}

/* ---- keyboard users get the same treatment as the mouse ---- */
a:focus-visible,
button:focus-visible,
.elementor-button:focus-visible,
.sa-pf-tab:focus-visible {
  outline: 2px solid var(--sa-accent);
  outline-offset: 2px;
}

/* -------------------------------------------------------------------------
   34. MOBILE HEADINGS

   Section headings are sized for a 1440px canvas, where a 44-52px H2 has room
   to breathe. On a 375px screen the same figure wraps to three or four lines
   and pushes the sentence it introduces below the fold. 30px keeps the
   hierarchy — still clearly larger than body copy — while letting most
   headings sit on one or two lines.

   Elementor writes its heading sizes as per-element rules at roughly
   four-class specificity, which no ordinary selector beats, so !important is
   the correct tool rather than a shortcut here.
   ---------------------------------------------------------------------- */
@media (max-width: 767px) {
  h2,
  .elementor-widget-heading h2.elementor-heading-title,
  .sa-wl-h2 .elementor-heading-title,
  .sa-sec-h2 .elementor-heading-title {
    font-size: 30px !important;
    line-height: 1.2 !important;
  }
}

/* -------------------------------------------------------------------------
   35. MOBILE HERO — give the headline room, and stop wasting the first screen

   Measured at 375px before this block:
     - 68px fixed header + 74px hero padding = 204px of nothing before the
       headline, a quarter of an 812px screen spent on empty space
     - the H1 sat at 38px in a 339px column and wrapped to FOUR lines of two
       or three words each, which is what made the text read as a narrow
       ribbon down the middle of the screen

   Only the two things actually at fault are touched — horizontal room and
   the wrap rate. The layout, the order of elements and the centring are all
   unchanged; this is the same hero, breathing properly.
   ---------------------------------------------------------------------- */
@media (max-width: 767px) {
  /* 4px back on each side. Small, but at this width every pixel is a
     character, and it applies to the headline and the sub-line together. */
  #hero { padding-inline: 14px !important; }

  /* The dead space above the headline, cut from 74px to 18px. The header is
     a solid white band, so the hero does not need padding to look separate
     from it — it needed padding when there was nothing above it. This puts
     the trust pill and the headline on the first screen instead of spending
     a quarter of it on nothing. */
  #hero > .e-con-inner {
    padding-block-start: 34px !important;
    padding-block-end: 44px !important;
  }

  /* 38px -> 34px. The single biggest lever on perceived width: fewer wrap
     points means longer lines, which is what makes a column read as wide.
     Still comfortably above the 30px section headings, so the hierarchy
     holds. */
  #hero .sa-hero-title .elementor-heading-title {
    font-size: 34px !important;
    line-height: 1.14 !important;

    /* THE actual cause of the "narrow ribbon in the middle" complaint.
       text-wrap: balance evens the line lengths, which is exactly right on a
       wide screen — it stops a headline ending on one orphaned word. On a
       375px screen it does the opposite of what you want: to keep four lines
       even it shortens all of them, so the headline sat at 213-252px inside a
       347px column and read as a narrow strip with air down both sides.
       Greedy wrapping fills each line before moving on, which is what makes
       the text meet the edges. */
    text-wrap: normal;
    text-wrap-style: auto;
  }
}

/* -------------------------------------------------------------------------
   36. CHAT LAUNCHER — clear of the phone's own furniture

   The button is fixed 16px from the bottom on mobile. On an iPhone that is
   measured from the bottom of the viewport, which sits UNDER the home
   indicator — so the launcher can end up half-hidden behind the system bar,
   and on some Android browsers behind the collapsing toolbar.

   env(safe-area-inset-bottom) is 0 on any device without that furniture, so
   this changes nothing on a desktop or an older phone; it only adds room
   where room is actually taken.

   (Checked first: the button is in the DOM, visible, on top of the stack and
   clickable at 375px — elementsFromPoint returns it as the hit target. It
   was never missing, only sitting too low on hardware with a home bar.)
   ---------------------------------------------------------------------- */
.sa-cw {
  inset-block-end: calc(22px + env(safe-area-inset-bottom, 0px));
}

@media (max-width: 767px) {
  .sa-cw {
    inset-block-end: calc(16px + env(safe-area-inset-bottom, 0px));
  }
  /* Same for the horizontal edge on a landscape notch. */
  .sa-cw--right { inset-inline-end: calc(16px + env(safe-area-inset-right, 0px)); }
  .sa-cw--left  { inset-inline-start: calc(16px + env(safe-area-inset-left, 0px)); }
}

/* -------------------------------------------------------------------------
   37. REVIEWS ON MOBILE — reclaim the width the arrows were taking

   Measured at 375px: the carousel widget rendered 280px inside a 339px
   column, so a testimonial had 280 - (26 x 2) = 228px of actual text width.
   Quotes wrapped every four or five words and the card read as a narrow
   slip with empty gutters either side.

   The arrows do not need their own lane. The card already carries 26px of
   internal padding, which is exactly the dead strip a 36px control can sit
   in without touching a word. So the card takes the full column and the
   arrows move into that gutter — nothing overlaps, and the quote gains
   roughly a fifth more width.
   ---------------------------------------------------------------------- */
@media (max-width: 767px) {
  #results [data-widget_type="nested-carousel.default"] {
    width: 100% !important;
    max-width: 100% !important;
  }

  #results .elementor-swiper-button {
    inline-size: 36px;
    block-size: 36px;
    padding: 0;
    font-size: 17px;
    display: flex;
    align-items: center;
    justify-content: center;
  }

  /* -10px puts the outer edge 8px clear of the screen and the inner edge
     level with the card's padding, so the glyph never covers the quote. */
  #results .elementor-swiper-button-prev {
    inset-inline-start: -10px !important;
    inset-inline-end: auto !important;
  }
  #results .elementor-swiper-button-next {
    inset-inline-end: -10px !important;
    inset-inline-start: auto !important;
  }
}

/* Chat launcher a little higher on mobile, so it clears the thumb rest and
   the browser's own bottom bar rather than hugging the very edge. */
@media (max-width: 767px) {
  .sa-cw {
    inset-block-end: calc(30px + env(safe-area-inset-bottom, 0px));
  }
}

/* -------------------------------------------------------------------------
   38. MOBILE MENU

   Elementor's stock dropdown is a white rectangle bolted to the full width
   of the screen: no radius, no shadow, no separation from the page, 16px
   links at 10px padding with no hover and no active state. It reads as a
   browser default rather than as part of the site.

   Rebuilt as a floating card that belongs to the brand: inset from the
   edges so the page shows around it, the same 18px radius and warm shadow
   as the rest of the surfaces, headline type, tap targets that clear the
   44px minimum, a chevron so each row reads as somewhere to go, and an
   accent state for the section you are already in.

   The nav element itself is what Elementor slides open, so the card styling
   goes there — wrapping it in anything new would fight the animation.
   ---------------------------------------------------------------------- */
@media (max-width: 767px) {

  .elementor-nav-menu--dropdown.elementor-nav-menu__container {
    /* Fixed, not absolute. Elementor positions this against the menu widget,
       which is only as wide as the burger — so any inset here would resolve
       against ~30px and collapse the panel to a sliver. Fixed makes the
       viewport the containing block.
       The top offset follows --sa-header-h, published by custom.js from the
       header's measured height, so the panel stays welded to the header even
       if the header's own height changes. */
    position: fixed !important;
    inset-inline: 0 !important;
    inset-block-start: var(--sa-header-h, 68px) !important;
    /* See the margin override below — Elementor wins this one on specificity,
       so it cannot be settled from here. */
    inline-size: auto !important;
    max-block-size: calc(100dvh - var(--sa-header-h, 68px));
    overflow-y: auto;
    padding: 0;
    background: var(--sa-white, #fff);
    border: 0;
    /* Square at the top so it reads as one piece with the header, softened at
       the bottom so it still reads as a panel rather than a page section. */
    border-radius: 0 0 20px 20px;
    box-shadow: 0 20px 46px rgb(47 22 1 / 0.16),
                0 2px 8px  rgb(47 22 1 / 0.06);
    /* overflow-x hidden keeps the rounded corners honest while the slide-open
       animates the height; overflow-y stays auto (set above) so a longer menu
       on a short handset can still be scrolled rather than clipped. A blanket
       `overflow: hidden` here would have silently made the last items
       unreachable. */
    overflow-x: hidden;
  }

  /* Close the gap between the header and the panel.
     Elementor's "distance from menu" control writes
       .elementor-357 .elementor-element.elementor-element-62271c2
       .elementor-nav-menu__container.elementor-nav-menu--dropdown
       { margin-top: 20px !important }
     — five classes AND !important, so a two-class rule cannot reach it no
     matter how many !importants it carries. Setting the control to 0 did not
     clear it either; the declaration is emitted regardless.
     This selector is six classes, all of them meaningful and stable, rather
     than hard-coding the generated .elementor-element-62271c2 id, which would
     break the moment the header widget is rebuilt. The repeated class is the
     specificity bump — blunt, but visible and easy to reason about. */
  .sa-header .sa-navpill .elementor-widget-nav-menu
  .elementor-nav-menu__container.elementor-nav-menu--dropdown.elementor-nav-menu--dropdown {
    margin-top: 0 !important;
    margin-block-start: 0 !important;
  }

  .elementor-nav-menu--dropdown .elementor-nav-menu {
    display: flex;
    flex-direction: column;
    gap: 0;
    padding-block: 4px;
  }

  /* A hairline under every row except the last. Inset to the text's own
     left padding so it reads as a list rule rather than a full-bleed border,
     and kept very light — it is there to separate, not to draw attention. */
  .elementor-nav-menu--dropdown .elementor-nav-menu > li:not(:last-child) {
    border-block-end: 1px solid rgb(47 22 1 / 0.07);
  }

  /* The widget is set to centre-align, which on a dropdown leaves each link
     only as wide as its own word floating in the middle of the row. The row
     needs to BE the target — full width, text at the left, chevron at the
     right — so the list item and the anchor are both stretched. */
  .elementor-nav-menu--dropdown .elementor-nav-menu > li,
  .elementor-nav-menu--dropdown .elementor-nav-menu > li > a {
    inline-size: 100%;
  }

  .elementor-nav-menu--dropdown .elementor-item {
    display: flex !important;
    align-items: center;
    justify-content: space-between;
    text-align: start;
    min-block-size: 54px;          /* comfortable thumb target */
    padding: 14px 20px !important;
    /* Square: the rows are edge to edge now, so a rounded highlight would
       float oddly inside a full-width panel. */
    border-radius: 0;
    font-family: var(--sa-font-head);
    font-size: 18px !important;
    font-weight: 700;
    /* Sentence case. The desktop nav's uppercase works as a small pill of
       four short words; at this size, six stacked capitalised rows read as
       shouting and are measurably slower to scan. */
    text-transform: none !important;
    letter-spacing: -0.01em !important;
    line-height: 1.2;
    color: var(--sa-primary, #2F1601) !important;
    background: transparent !important;
  }

  /* A chevron turns a list of words into a list of destinations. Drawn from
     borders rather than an icon font so it costs nothing to load. */
  .elementor-nav-menu--dropdown .elementor-item::after {
    content: "";
    /* Elementor positions this absolutely for its hover underline, which
       parked the chevron on top of the first letter. Static makes it a flex
       item of the row instead, so it lands at the right-hand end where
       space-between puts it. */
    position: static !important;
    inset: auto !important;
    flex: 0 0 auto;
    inline-size: 7px;
    block-size: 7px;
    margin-inline-start: 12px;
    border-inline-end: 2px solid currentColor;
    border-block-end: 2px solid currentColor;
    transform: rotate(-45deg);
    opacity: 0.32 !important;
    background: none !important;
    transition: transform var(--sa-dur-hover) var(--sa-ease),
                opacity var(--sa-dur-hover) var(--sa-ease);
  }

  /* :active is included because a phone has no hover — a tap needs to show
     it landed, and without it the row gives no feedback at all before the
     page starts moving. */
  .elementor-nav-menu--dropdown .elementor-item:hover,
  .elementor-nav-menu--dropdown .elementor-item:active,
  .elementor-nav-menu--dropdown .elementor-item:focus-visible,
  .elementor-nav-menu--dropdown .elementor-item.elementor-item-active,
  .elementor-nav-menu--dropdown .elementor-item.sa-nav-current,
  .elementor-nav-menu--dropdown .elementor-item.highlighted {
    background: rgb(253 99 1 / 0.09) !important;
    color: var(--sa-accent, #FD6301) !important;
  }

  .elementor-nav-menu--dropdown .elementor-item:hover::after,
  .elementor-nav-menu--dropdown .elementor-item:active::after,
  .elementor-nav-menu--dropdown .elementor-item:focus-visible::after,
  .elementor-nav-menu--dropdown .elementor-item.elementor-item-active::after,
  .elementor-nav-menu--dropdown .elementor-item.sa-nav-current::after {
    opacity: 0.9 !important;
    transform: rotate(-45deg) translate(2px, 2px);
  }

  /* Elementor draws its own dividers between dropdown rows; the rounded
     hover state replaces them and the two together look like a mistake. */
  .elementor-nav-menu--dropdown .elementor-nav-menu--dropdown a,
  .elementor-nav-menu--dropdown li:not(:last-child) > a {
    border-block-end: 0 !important;
  }

  /* The burger gets the same rounded, tappable treatment as the grid button
     on the other side of the header, so the two ends match. */
  .sa-header .elementor-menu-toggle {
    inline-size: 44px;
    block-size: 44px;
    border-radius: 50%;
    border: 1px solid rgb(47 22 1 / 0.12);
    background: transparent;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  .sa-header .elementor-menu-toggle:hover,
  .sa-header .elementor-menu-toggle.elementor-active {
    background: rgb(253 99 1 / 0.09);
    border-color: rgb(253 99 1 / 0.35);
  }
}

/* -------------------------------------------------------------------------
   39. ABOUT — photo aligned to the heading, and a quiet hover

   The photo column was vertically centred against the text column, which put
   the top of the portrait 53px below the "I am Saleem Akhter" heading. Two
   columns that start at different heights read as a misalignment rather than
   a decision, so the photo starts where the words start.
   ---------------------------------------------------------------------- */
/* Two separate things put the portrait out of line with the heading beside it.

   First, the row is set to align-items:flex-end, so the shorter left column
   was bottom-aligned and started 53px LOW. align-self fixes that.

   Second, .sa-about-right carries a deliberate 96px top padding, so once both
   columns started at the row top the portrait sat 93px HIGH instead. The left
   column mirrors that padding, which is what actually lands the top of the
   photo on the same line as "I am Saleem Akhter".

   Desktop only: below 768px the columns stack, and 96px there would just be a
   gap between the photo and the text that follows it. */
.sa-about-left,
.sa-about-photo {
  align-self: flex-start;
}

@media (min-width: 768px) {
  .sa-about-left {
    /* Keep in step with .sa-about-right's padding-top. */
    padding-block-start: 96px;
  }
}

/* The portrait is the one image on the page a visitor is likely to look at
   directly, so it gets a response — a small lift and a warmer shadow. The
   scale is on the IMAGE, not the column, so nothing in the layout moves and
   the hover target cannot slip out from under the pointer. */
.sa-about-photo img {
  transition: transform var(--sa-dur-hover, 0.26s) var(--sa-ease),
              box-shadow var(--sa-dur-hover, 0.26s) var(--sa-ease);
  will-change: transform;
}

.sa-about-photo:hover img,
.sa-about-photo:focus-within img {
  transform: scale(1.02);
  box-shadow: 0 22px 48px rgb(47 22 1 / 0.18);
}

@media (prefers-reduced-motion: reduce) {
  .sa-about-photo:hover img { transform: none; }
}

/* -------------------------------------------------------------------------
   40. CHAT LAUNCHER — clear of the services ticker

   The ticker band that runs under the hero is 51px tall and full width. With
   the launcher 22px off the bottom the two overlapped whenever that band
   happened to sit at the foot of the viewport, and the button looked like it
   had fallen into it. Lifting it above the band's height keeps it reading as
   a floating control at every scroll position.
   ---------------------------------------------------------------------- */
.sa-cw {
  inset-block-end: calc(74px + env(safe-area-inset-bottom, 0px));
}
