/* ==========================================================================
   Swabi Laundry - design system
   2026-08-05. Loaded LAST and render-blocking. Owns type, colour and rhythm.

   SCOPE: presentation only. No copy, no markup, no layout structure changes.

   WHY THIS FILE EXISTS
   style.min.css has no system. Sizes and colours were chosen per element as
   problems appeared, then pinned with !important so the previous fix would
   stop overriding them. Measured on the live site, one page was running:
     - 5 different near-blacks for text (#000, #333, #212529, #444, rgb(30,30,30))
     - 2 different teals (#006666 token AND the raw CSS keyword `teal` #008080)
     - Bootstrap's default blue #0d6efd leaking through on 25 elements
     - h1 declared at 2.5rem!important AND 1.75rem; .pricing-hero-content h1
       and .offers-hero-section h1 each declared TWICE with different values
   That is why every previous restyle failed. This file states the rules once.

   MEASURED TARGETS (from competitors' live CSS, 2026-08-05)
     Laundryheap  h1 72px / lh 64px (0.89) wt 400 · Founders Grotesk · body Inter 16/24
     Washmen      h1 56px / lh 1.2        wt 600 · Anderson Grotesk · body Inter 16/1.5
     Swabi (was)  h1 40px / lh 48px (1.20) wt 700 REQUESTED, 600 RENDERED · Poppins 18/1.6
   Display:body ratio was 2.22x against their 3.50x and 4.50x. That was the gap.
   ========================================================================== */

/* --- 1. Faces -------------------------------------------------------------
   Instrument Sans (display) + Inter (body). Both SIL Open Font License, both
   verified available on Google Fonts. This mirrors what BOTH competitors do:
   a grotesk for display, Inter for body. Neither of them sets everything in
   one family, and neither should we.

   font-display:swap, NOT optional. `optional` silently discards the font if it
   is not ready in ~100ms and never swaps it in - the old Poppins rules did
   exactly that, so an unknown share of visits rendered in Arial and nobody
   noticed. Paired with <link rel=preload>, swap effectively never shows.

   PAID UPGRADE: the one axis where free is genuinely capped is the display
   face. Founders Grotesk (Klim, ~USD 300 web licence) is what Laundryheap
   uses. Swap it into --font-display and change nothing else. Do this LAST -
   the setting below matters more than the face, and it is free.             */

/* VARIABLE FONTS - ONE FILE PER FAMILY, weight declared as a RANGE.
   The first version of this file declared 7 static faces. Google Fonts served
   the same VARIABLE file for every weight request, so those 7 URLs were only
   2 distinct files (verified by sha256: 3 Instrument Sans identical, 4 Inter
   identical). Under 7 names the browser would have fetched the same 48KB Inter
   file four times - 192KB to deliver 48KB - and the same 30KB Instrument Sans
   three times. Caught at packaging time by comparing file sizes, which were
   suspiciously identical.
   A range descriptor lets the browser set the `wght` axis per use. */
@font-face{
  font-family:'InstrumentSans';
  src:url('/assets/fonts/InstrumentSans.woff2') format('woff2-variations'),
      url('/assets/fonts/InstrumentSans.woff2') format('woff2');
  font-weight:400 700;font-style:normal;font-display:swap;
}
@font-face{
  font-family:'Inter';
  src:url('/assets/fonts/Inter.woff2') format('woff2-variations'),
      url('/assets/fonts/Inter.woff2') format('woff2');
  font-weight:100 900;font-style:normal;font-display:swap;
}

/* Metric-matched fallback so the swap does not move the page. */
@font-face{font-family:'Inter-fallback';src:local('Arial');size-adjust:107%;ascent-override:90%;descent-override:22.5%;line-gap-override:0%}

/* --- 2. Tokens ----------------------------------------------------------- */
:root{
  --font-display:'InstrumentSans','Inter','Inter-fallback',system-ui,Arial,sans-serif;
  --font-body:'Inter','Inter-fallback',system-ui,-apple-system,'Segoe UI',Arial,sans-serif;

  /* TYPE SCALE - every size on the site comes from here. Nothing else.
     h1 tops out at 4.5rem/72px against a 1rem/16px body = 4.5x, matching
     Laundryheap. It was 2.22x. */
  --t-xs:0.8125rem;                        /* 13 legal, captions        */
  --t-sm:0.875rem;                         /* 14 labels, meta           */
  --t-base:1rem;                           /* 16 body                   */
  --t-lg:1.125rem;                         /* 18 lead paragraph         */
  --t-xl:1.375rem;                         /* 22 h5                     */
  --t-2xl:1.125rem;                        /* 18  h4 - see the h3 note below */
  --t-3xl:1.25rem;                         /* 20  h3 - FIXED, not fluid.
       MEASURED 2026-08-06: this site uses h3 as a SMALL heading. Live values
       with this file disabled: service-card h3 = 16px, promo h3 = 17.6px.
       Sections are h2 (48px). Earlier versions set h3 to 30-36px, roughly
       DOUBLING every card title on the site - cards wrapped to 2 lines, the
       promo headline orphaned "order!" on its own line, and card titles
       competed with section headings. Two per-component overrides were added
       to paper over it before the pattern was obvious.
       A global scale maps size to TAG; this site's tags do not carry the
       roles that scale assumes. h3 stays modest. */
  --t-4xl:clamp(2.25rem,4.5vw,3rem);       /* 36->48  h2                */
  --t-5xl:clamp(2.75rem,7vw,4.5rem);       /* 44->72  h1                */

  /* INK - ONE hue, four steps. Replaces the five competing near-blacks.
     Cool-shifted to sit with the teal rather than fight it. */
  --ink:#0B1F24;                           /* headings                  */
  --ink-body:#33474D;                      /* body copy                 */
  --ink-muted:#5E7176;                     /* meta, captions. #6B7F85 measured
                                              4.2:1 on white - under the 4.5
                                              AA floor. Darkened 2026-08-05. */
  --ink-faint:#9AAAAF;                     /* disabled, placeholders    */
  --rule:#E2E9EA;                          /* borders, dividers         */
  --surface:#F5F8F8;                       /* tinted panels             */

  /* BRAND - ONE teal, and it is the HEADER's teal.
     The site was running FOUR: #006666 (token), #008080 (raw CSS keyword),
     #0A3D39 (/book), #0A5F58 (site header). v1 of this file standardised on
     #006666 and made it worse - the header stayed #0A5F58, so two different
     teals were visible at once. That is the "not interacting well".
     #0A5F58 wins because it is the largest brand surface on every page.  */
  --brand:#0A5F58;                         /* THE teal - the header's    */
  --brand-ink:#084A45;                     /* hover / pressed            */
  --brand-deep:#06322E;                    /* darkest - text on amber    */
  --brand-wash:#E9F4F2;                    /* tinted backgrounds         */
  --accent:#F4A62A;                        /* the amber CTA, unchanged   */

  /* ON-DARK. The header is a dark surface; ink-coloured text on it measured
     1.79:1 in v1 of this file - unreadable, and my regression, not the
     site's. WCAG AA needs 4.5:1 for body text. */
  --on-dark:#FFFFFF;
  --on-dark-muted:rgba(255,255,255,0.76);

  /* SPACE - 8px grid. Applied to type rhythm only in this file; layout
     containers are left alone deliberately (see section 6). */
  --s-1:0.25rem; --s-2:0.5rem;  --s-3:0.75rem; --s-4:1rem;
  --s-6:1.5rem;  --s-8:2rem;    --s-12:3rem;   --s-16:4rem;
}

/* --- 3. Base ------------------------------------------------------------- */
body{
  font-family:var(--font-body)!important;
  font-size:var(--t-base)!important;
  line-height:1.6!important;
  font-weight:400;
  color:var(--ink-body)!important;
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  text-rendering:optimizeLegibility;
}

/* --- 4. Scale -------------------------------------------------------------
   Large, lighter, tighter. That combination is the whole difference between
   "designed" and "template". We had heavy + small + loose.

   THE `:not(#_)` IS LOAD-BEARING. DO NOT "TIDY" IT AWAY.
   A bare `h1{...!important}` LOSES to style.min.css's
   `.hero-title,.location-content h1{font-size:2.5rem!important}` - when both
   carry !important, specificity breaks the tie and a class (0,1,1) beats a
   bare element (0,0,1). The first version of this file omitted the guard; it
   was tested against the live DOM and moved the h1 by ZERO pixels. That is
   the same wall every previous attempt to restyle this site hit.
   `:not(#_)` buys ID-level specificity (1,0,1) while matching nothing real.
   It is ugly because style.min.css is ugly. See the DELETE list in PATCH.md.

   WEIGHT DESCENDS AS SIZE ASCENDS - optical compensation. Big type needs less
   weight to read as strong; small type needs more. h1 at 500, h4 at 600.
   Laundryheap sets its 72px h1 at weight 400 for exactly this reason.        */

h1:not(#_),.h1:not(#_){
  font-family:var(--font-display)!important;
  font-size:var(--t-5xl)!important;
  line-height:0.98!important;
  letter-spacing:-0.032em!important;
  font-weight:500!important;
  color:var(--ink)!important;
  margin-bottom:var(--s-6)!important;
  text-wrap:balance;
}
h2:not(#_),.h2:not(#_){
  font-family:var(--font-display)!important;
  font-size:var(--t-4xl)!important;
  line-height:1.05!important;
  letter-spacing:-0.026em!important;
  font-weight:500!important;
  color:var(--ink)!important;              /* kills color:teal!important */
  margin-bottom:var(--s-4)!important;
  text-wrap:balance;
}
h3:not(#_),.h3:not(#_){
  font-family:var(--font-display)!important;
  font-size:var(--t-3xl)!important;
  line-height:1.3!important;
  letter-spacing:-0.012em!important;
  font-weight:600!important;
  color:var(--ink)!important;
  margin-bottom:var(--s-3)!important;
  text-wrap:balance;   /* stops "...your first order!" orphaning the last word */
}
h4:not(#_),.h4:not(#_){
  font-family:var(--font-display)!important;
  font-size:var(--t-2xl)!important;
  line-height:1.25!important;
  letter-spacing:-0.014em!important;
  font-weight:600!important;
  color:var(--ink)!important;
  margin-bottom:var(--s-3)!important;
}
h5:not(#_),.h5:not(#_){
  font-family:var(--font-body)!important;
  font-size:var(--t-xl)!important;
  line-height:1.35!important;
  letter-spacing:-0.008em!important;
  font-weight:600!important;
  color:var(--ink)!important;
}

/* NO global `p{max-width:68ch}` here. It was in v1-v4 and it is good typography
   in the abstract, but it fights the site's own container widths: a 755px
   paragraph inside an 813px centred column reads as misaligned against a
   full-width centred heading above it. Reported visually 2026-08-05. Measure
   control belongs to the section that owns the layout, not to a global rule. */
p:not(#_){color:var(--ink-body)!important}
.lead,p.lead{font-size:var(--t-lg)!important;line-height:1.55!important;color:var(--ink-body)!important}
small,.small,.text-sm{font-size:var(--t-sm)!important;color:var(--ink-muted)!important}
.text-muted:not(#_){color:var(--ink-muted)!important}

/* --- 5. Colour normalisation ---------------------------------------------
   Collapses the five competing near-blacks onto one ink, the two teals onto
   one brand, and stops Bootstrap's default blue leaking through.            */
.text-dark:not(#_),.text-black:not(#_){color:var(--ink)!important}
.text-primary:not(#_){color:var(--brand)!important}

/* Links - INLINE TEXT LINKS ONLY.
   A bare `a{color:...}` also repaints every link that is styled as a BUTTON,
   and buttons carry their own background. Measured live 2026-08-06:
       .btn-hero-primary   brand #0A5F58 on #006666    1.11:1  invisible
       "Visit cleanmyshoes.ae"  #0A5F58 on #0d6efd     1.67:1  unreadable
   Both rendered WHITE before this file touched them. Scoping to links inside
   running text fixes it without needing to enumerate every button class -
   a link in a <p> or <li> is editorial; a standalone <a> is usually a control.
   `!important` is still needed: without it these lose to section rules and 35
   links stay on the WRONG teal (#008080, the raw CSS keyword). */
:is(p,li,td,dd,blockquote,figcaption) a:not(#_),
:is(p,li,td,dd,blockquote,figcaption) a:not(#_):visited{
  color:var(--brand)!important;
  text-underline-offset:0.18em;
  text-decoration-thickness:0.06em;
}
:is(p,li,td,dd,blockquote,figcaption) a:not(#_):hover{color:var(--brand-ink)!important}

/* THE HEADER IS LEFT ALONE, DELIBERATELY.
   v1 of this file forced `nav a` and `header a` to ink. The header sits on a
   dark teal and its own styling was already correct - white on #0A5F58 at
   7.52:1. Overriding it dropped muted text to 1.79:1 and made near-black sit
   against teal. The site got this right; the patch broke it. Do not re-add a
   blanket nav colour rule. Only the two exceptions below are safe:          */

/* 1. Dropdown panels are WHITE surfaces, so their items do read as ink.
      style.min.css set these to #333 in one place and the keyword `teal` in
      another. */
.dropdown-menu .dropdown-item:not(#_){color:var(--ink)!important}
.dropdown-menu .dropdown-item:not(#_):hover{color:var(--brand)!important;background-color:var(--brand-wash)!important}

/* 2. `.nav-cta` - NEVER set a background on this class, and never match it
      unqualified. It names TWO different things:
          /book                <a class="nav-cta">   the amber WhatsApp button
          every other page     <div class="nav-cta"> a layout WRAPPER holding
                               the language picker, phone number and book button
      An unqualified `.nav-cta{background-color:...}` painted that wrapper as a
      235x48 amber slab with square corners across the header on every content
      page. Reported visually 2026-08-05 after three rounds of me insisting the
      header measured clean - it did measure clean, because I was measuring
      overflow and contrast, never "did I invent a background".
      The site already styles the real button. Take the text colour only. */
a.nav-cta:not(#_),a.nav-cta:not(#_):visited{
  color:var(--brand-deep)!important;
  font-weight:600!important;
}
a.nav-cta:not(#_):hover{color:var(--brand-deep)!important}

/* --- 5b. DARK SURFACES - MUST COME AFTER EVERY INK RULE ABOVE -------------
   The page is not uniformly light. It has dark teal bands, and the site
   already marks them with its own `.bg-teal` / `.text-white` convention:
       nav.navbar-redesign · div.core-sidebar
       section.stats-section.bg-teal.text-white · footer.bg-teal.text-white
   The ink rules above carry :not(#_) specificity, which OUTRANKS the site's
   plain `.text-white`. So v1 and v2 of this file silently pushed body copy
   and headings onto dark teal:
       ink        #0B1F24 on #006666 -> 2.50:1
       ink-body   #33474D on #006666 -> 1.44:1
       brand      #0A5F58 on #006666 -> 1.11:1
   Measured result: 67 elements below WCAG AA before the patch, 81 after.
   The patch made accessibility WORSE. This block is the fix.

   LESSON: never set a global text colour without knowing the surface under
   it. CSS cannot infer that, so every dark container has to be named.        */
.bg-teal *:not(#_),
nav.navbar-redesign *:not(#_),
.core-sidebar *:not(#_){color:var(--on-dark)!important}

.bg-teal h1:not(#_),.bg-teal h2:not(#_),.bg-teal h3:not(#_),.bg-teal h4:not(#_),
.core-sidebar h1:not(#_),.core-sidebar h2:not(#_),
.core-sidebar h3:not(#_),.core-sidebar h4:not(#_){color:var(--on-dark)!important}

.bg-teal .text-muted:not(#_),.bg-teal small:not(#_),
.core-sidebar .text-muted:not(#_),.core-sidebar small:not(#_),
header .text-muted:not(#_),nav .text-muted:not(#_),
header small:not(#_),nav small:not(#_){color:var(--on-dark-muted)!important}

/* Links on dark bands read white with an underline, not brand teal. */
.bg-teal a:not(#_),.core-sidebar a:not(#_){color:var(--on-dark)!important;text-decoration:underline}

/* The amber CTA is re-asserted LAST with extra specificity, because the
   `nav.navbar-redesign *` rule above would otherwise turn it white on amber. */
/* Re-asserted after the dark-band rules above, which would otherwise turn the
   amber button's label white. Colour ONLY - the site owns this button's
   background, and forcing one here is what painted the wrapper amber. */
a.nav-cta:not(#_):not(#__),a.nav-cta:not(#_):not(#__):visited,
a.nav-cta:not(#_):not(#__) *{
  color:var(--brand-deep)!important;
}

/* Primary buttons keep white labels wherever they sit. */
.btn-primary:not(#_):not(#__),.btn-primary:not(#_):not(#__) *{color:#fff!important}

/* The "Visit cleanmyshoes.ae" CTA carries an INLINE style hardcoding Bootstrap's
   default blue (#0d6efd) on a teal-branded site - the only blue on the page.
   Inline styles beat author rules, so this needs !important to reach it.
   Colour only; padding, radius and size are left exactly as authored. */
section.shoe-cleaning-aeo a[style]:not(#_):not(#__){
  background:var(--brand)!important;
  color:#fff!important;
}
section.shoe-cleaning-aeo a[style]:not(#_):not(#__):hover{background:var(--brand-ink)!important}

/* --- 5c. LIGHT ISLANDS INSIDE DARK BANDS ---------------------------------
   THIS IS THE BUG THIS FILE KEEPS SHIPPING. Fourth occurrence, 2026-08-05.

   `.bg-teal *`, `nav.navbar-redesign *` and `.core-sidebar *` are broad by
   necessity, and they overshoot onto any child that paints its OWN light
   background. Caught visually, NOT by the contrast audit, which scored them
   as "20 remaining pre-existing failures":
       a.btn-book       white on white   1.00:1   invisible button
       a.btn-sidebar    white on white   1.00:1   invisible button
       .btn-phone       white on amber   2.03:1
       .contact-info-card  white on #F5F5F5  1.09:1  (v4 scoped this fix to
                        .core-sidebar; the card actually lives in footer.bg-teal)

   Every light island has to be named. CSS cannot detect "this child repainted
   its background", so there is no clever general rule - only this list. When a
   new light component is added inside a dark band, it must be added here. */
:is(.bg-teal,nav.navbar-redesign,.core-sidebar,footer.bg-teal)
  :is(.btn-book,.btn-sidebar,.card,.contact-info-card,.bg-white,.bg-light,
      .dropdown-menu,.dropdown-menu-custom):not(#_):not(#__),
:is(.bg-teal,nav.navbar-redesign,.core-sidebar,footer.bg-teal)
  :is(.btn-book,.btn-sidebar,.card,.contact-info-card,.bg-white,.bg-light,
      .dropdown-menu,.dropdown-menu-custom):not(#_):not(#__) *{
  color:var(--ink-body)!important;
}
:is(.bg-teal,nav.navbar-redesign,.core-sidebar,footer.bg-teal)
  :is(.card,.contact-info-card,.bg-white):not(#_):not(#__) :is(h1,h2,h3,h4,h5,.fw-bold,.text-teal){
  color:var(--ink)!important;
}

/* --- 5f. FOOTER "AREAS WE SERVE" BAND - MISSING GUTTER -------------------
   Reported as "overflow". It is NOT overflow: documentElement.scrollWidth
   equals clientWidth at 390, 530, 1280 and 1920 - there is no horizontal
   scrollbar at any width, patched or unpatched.

   The band is a direct child of footer.bg-teal that sits OUTSIDE the
   .container-custom wrapper, with padding-left:0 at every level of its chain:
       footer.bg-teal > .container-custom   left 256  w 1400  padL 22px  ✓
       footer.bg-teal > div (no class)      left   0  w 1912  padL  0px  ✗
   So "Areas We Serve in Dubai" starts at x=0 and the "Laundry JLT" link sits
   at left:0 - flush to the screen edge, first glyph touching the bezel. In a
   screenshot that reads as clipped text ("reas We Serve", "aundry JLT").

   Fix: give it the same width and gutter as the columns above it. The teal
   background belongs to the footer, not this div, so constraining the div
   does not shrink the coloured band. PRE-EXISTING - not caused by this file. */
footer.bg-teal > div:not([class]):not(#_){
  max-width:1400px;
  margin-left:auto!important;
  margin-right:auto!important;
  padding-left:22px!important;
  padding-right:22px!important;
}

/* --- 5e. COMPONENT-SCOPED TYPE -------------------------------------------
   A global scale maps size to TAG. Real components need size mapped to ROLE.
   `.step-title` is an h3 inside a 3-up card - it must not compete with the
   page h2. Reported visually 2026-08-05; the global h3 made card titles
   nearly as large as section headings. */
.step-title:not(#_):not(#__){
  font-size:1.375rem!important;              /* 22px */
  line-height:1.3!important;
  letter-spacing:-0.01em!important;
}
/* FAQ questions. The site set these at 18.4px; body{font-size:16px} pulled them
   down to 16px inside a pill that stayed 60px tall, which reads as unbalanced
   even though the text measures dead-centre (offset -1px, verified). Restore
   the intended size - the box was designed around it. */
.faq-button:not(#_):not(#__),.accordion-button:not(#_):not(#__){
  font-size:1.125rem!important;              /* 18px */
  line-height:1.35!important;
}
/* NO align-items override on .process-step. I added `align-items:center` to
   correct a 3px badge offset and it made the offset +16px - the row contains
   the title AND its description, so centring aligns the badge to the middle of
   the whole text block instead of to the title. `flex-start` was already right.
   The perceived misalignment was the 36px h3 towering over the badge; sizing
   .step-title to 22px above fixes it. Measured: -3px offset, imperceptible.
   Do not re-add this rule. */

/* --- 5d. BUTTONS - LABEL MUST BEAT ITS OWN BACKGROUND --------------------
   Named individually because each sits on a different surface. The teal-on-teal
   pair is PRE-EXISTING, not caused by this file, but it renders an invisible
   "BOOK NOW" on a booking page, so it is fixed here rather than left alone. */
/* Third :not() needed - the light-island rule in 5c also matches these and
   would otherwise hand them --ink-body. These are brand buttons on white, so
   they take the brand teal, which is also what the site intended (it used
   #0d7377, a fourth teal; this unifies it). */
a.btn-book:not(#_):not(#__):not(#___),a.btn-book:not(#_):not(#__):not(#___) *,
a.btn-sidebar:not(#_):not(#__):not(#___),a.btn-sidebar:not(#_):not(#__):not(#___) *{
  color:var(--brand)!important;                  /* white background */
}
/* NO .btn-phone rule. It sits on the TEAL nav and the site already renders it
   white at 5.62:1. I coloured it deep teal because it appeared to sit on amber
   - but that amber was the wrapper background THIS FILE had invented. When the
   invented background was removed, the "fix" for it became dark-on-teal at
   2.48:1. A fix built on top of a bug becomes a bug when the bug is removed.
   Do not re-add. */
.btn-teal:not(#_):not(#__),.btn-teal:not(#_):not(#__) *,
.btn-check-now:not(#_):not(#__),.btn-check-now:not(#_):not(#__) *,
.faq-contact-btn:not(#_):not(#__),.faq-contact-btn:not(#_):not(#__) *{
  color:#fff!important;                          /* teal background - was teal-on-teal at 1.11:1 */
}
/* Bootstrap .btn-light is #F8F9FA - a near-WHITE button. Inside a .bg-teal
   .text-white section it inherits white and vanishes ("BOOK NOW", 1.05:1).
   The .btn-light.text-teal variant elsewhere was already correct. */
.btn-light:not(#_):not(#__),.btn-light:not(#_):not(#__) *{
  color:var(--brand-deep)!important;
}

/* Bootstrap's default body colour #212529 leaks through on components the
   theme never styled. Collapse it onto our ink. */
.accordion-body:not(#_),.card-body:not(#_),.list-group-item:not(#_){color:var(--ink-body)!important}
.btn-primary:not(#_){
  background-color:var(--brand)!important;
  border-color:var(--brand)!important;
  color:#fff!important;
}
.btn-primary:not(#_):hover,.btn-primary:not(#_):focus{
  background-color:var(--brand-ink)!important;
  border-color:var(--brand-ink)!important;
}
.btn:not(#_),button:not(#_),a.nav-cta:not(#_){   /* `a.` - see the .nav-cta note in 5 */
  font-family:var(--font-body)!important;
  font-size:var(--t-base)!important;
  font-weight:600!important;
  letter-spacing:-0.005em!important;
  line-height:1.2!important;
}
::selection{background:var(--brand);color:#fff}

/* --- 5g. THE WHITE GAP on the homepage services block --------------------
   PRE-EXISTING, not caused by this file - verified by A/B with the stylesheet
   disabled (row 900 / container 1400 in both states).
   The container is 1400px but its contents are explicitly narrower:
       p    max-width:800px   (style.min.css)
       .row max-width:900px   (INLINE on the element)
   so an 800-900px column sat left-aligned in a 1400px box, leaving ~500px of
   dead space. Narrowing the container to 940px (900 + its 2x20px padding)
   makes the whole block a centred 900px column. Nothing is widened - long
   body text at 1400px would be far worse to read than the gap was to look at. */
.services-brand-trimmed .container-custom:not(#_){max-width:940px!important}
.services-brand-trimmed p:not(#_){max-width:none!important}

/* --- 5h. AEO / long-form keyword sections --------------------------------
   .about-aeo-section · .aeo-quick-reference · .shoe-cleaning-aeo
   These exist for search and the COPY IS DELIBERATE - not touched here. This
   is presentation only. Measured problems:
     - paragraphs 900px wide at 18px = ~100 characters per line (60-75 reads)
     - tables at 4px cell padding with no header treatment - crammed
     - h2 at 48px on a supplementary block competes with the page's own title
   Constraining the CONTAINER (rather than each element) keeps headings, text
   and tables on one shared edge - the mistake in an earlier version was
   capping <p> alone, which left paragraphs narrower than the headings above
   them and read as broken alignment. */
/* 700px + 17px = 72 characters per line, MEASURED on a real 358-character
   paragraph (chars / rendered line count), not estimated. For reference:
       880px @16px -> 90 chars    760px @16px -> 90    700px @17px -> 72
       660px @17px -> 72          620px @17px -> 60
   60-75 is the readable band. An earlier pass guessed average glyph width and
   concluded 880px was fine; counting rendered lines said 90. */
:is(.about-aeo-section,.aeo-quick-reference,.shoe-cleaning-aeo) .container:not(#_){
  max-width:700px!important;
}
:is(.about-aeo-section,.aeo-quick-reference,.shoe-cleaning-aeo) h2:not(#_):not(#__){
  font-size:2rem!important;                 /* 32 - supplementary, not a page title */
  line-height:1.15!important;
  margin-bottom:var(--s-6)!important;
}
:is(.about-aeo-section,.aeo-quick-reference,.shoe-cleaning-aeo) h3:not(#_):not(#__){
  font-size:1.375rem!important;             /* 22 - a real article sub-heading needs a
                                               step above body; card titles do not */
  line-height:1.3!important;
  margin-top:var(--s-8)!important;
  margin-bottom:var(--s-3)!important;
}
:is(.about-aeo-section,.aeo-quick-reference,.shoe-cleaning-aeo) p:not(#_),
:is(.about-aeo-section,.aeo-quick-reference,.shoe-cleaning-aeo) li:not(#_){
  font-size:1.0625rem!important;            /* 17 - see the measure note above */
  line-height:1.75!important;
}

/* Tables: give them room and a real header row. */
:is(.aeo-quick-reference,.shoe-cleaning-aeo) table:not(#_){
  width:100%!important;
  border-collapse:collapse!important;
  font-size:0.9375rem!important;
  margin:var(--s-6) 0!important;
  background:#fff!important;
  border:1px solid var(--rule)!important;
}
:is(.aeo-quick-reference,.shoe-cleaning-aeo) th:not(#_){
  background:var(--brand-wash)!important;
  color:var(--ink)!important;
  font-weight:600!important;
  text-align:left!important;
  padding:12px 16px!important;
  border-bottom:1px solid var(--rule)!important;
}
:is(.aeo-quick-reference,.shoe-cleaning-aeo) td:not(#_){
  padding:12px 16px!important;
  border-bottom:1px solid var(--rule)!important;
  color:var(--ink-body)!important;
  vertical-align:top!important;
}
:is(.aeo-quick-reference,.shoe-cleaning-aeo) tbody tr:nth-child(even) td:not(#_){
  background:#FBFCFC!important;
}
/* Wide tables must scroll inside their own box, never push the page sideways. */
:is(.aeo-quick-reference,.shoe-cleaning-aeo) .table-responsive:not(#_){
  overflow-x:auto!important;
}

/* --- 6. What this file deliberately does NOT do --------------------------
   It does not touch layout containers, grid, section padding, card widths or
   image sizing. Those need eyes on a rendered page across breakpoints, and
   changing them blind is how you ship a broken mobile layout. The 8px space
   tokens are defined above and used only for type rhythm; wiring them into
   layout is a separate, visual pass.

   REVERTING THE TEAL HEADINGS: if teal headings are a deliberate brand call
   rather than drift, change `--ink` to `var(--brand)` in section 2. One line,
   everything follows. I set them near-black because both competitors reserve
   colour for CTAs, and blanket-coloured headings are the loudest template
   signal on a page - but it is your brand, not mine.                        */
