
/* Custom chrome for satelliteindustries.com.au -- header/nav/footer/mobile
   toggle only. Main content re-uses the source site's own CSS (loaded
   before this file), so this stays deliberately small. */

/* Source CSS pads <body> 108px for its old fixed navbar; our header is sticky, so drop it. */
body{padding-top:0 !important;}
.au-header{position:sticky;top:0;z-index:1000;background:#fff;border-bottom:1px solid #e6e6e6;}
.au-header_inner{max-width:1280px;margin:0 auto;padding:14px 24px;display:flex;align-items:center;gap:24px;}
.au-header_logo{display:flex;align-items:center;flex-shrink:0;}
.au-header_logo img{display:block;}
.au-nav{display:flex;align-items:center;gap:28px;margin-left:auto;}
.au-nav-list{display:flex;list-style:none;margin:0;padding:0;gap:22px;}
.au-nav-item{position:relative;display:flex;align-items:center;}
.au-nav-top_link{font-weight:600;text-decoration:none;color:#1a1a1a;padding:10px 2px;}
.au-nav-top_link-nolink{cursor:default;}
.au-nav-caret{background:none;border:none;padding:6px;margin-left:2px;cursor:pointer;}
.au-nav-caret::after{content:"";display:block;width:7px;height:7px;border-right:2px solid #666;border-bottom:2px solid #666;transform:rotate(45deg);}
.au-nav-dropdown_menu{list-style:none;margin:0;padding:10px 0;position:absolute;top:100%;left:0;min-width:240px;
  background:#fff;border:1px solid #e6e6e6;border-radius:6px;box-shadow:0 12px 24px rgba(0,0,0,0.08);
  display:none;z-index:1001;}
.au-nav-item.is-open .au-nav-dropdown_menu{display:block;}
.au-nav-dropdown_link{display:block;padding:9px 18px;text-decoration:none;color:#333;white-space:nowrap;}
.au-nav-dropdown_link:hover{background:#f4f6f8;}
.au-header_cta{flex-shrink:0;}
.au-nav-toggle{display:none;flex-direction:column;justify-content:center;gap:5px;background:none;border:none;
  margin-left:auto;padding:8px;cursor:pointer;}
.au-nav-toggle span{display:block;width:24px;height:2px;background:#1a1a1a;}

@media (max-width:900px){
  .au-nav-toggle{display:flex;}
  .au-nav{position:fixed;top:64px;left:0;right:0;bottom:0;background:#fff;flex-direction:column;
    align-items:stretch;margin-left:0;padding:16px 24px;overflow-y:auto;display:none;gap:16px;}
  .au-nav.is-open{display:flex;}
  .au-nav-list{flex-direction:column;gap:0;}
  .au-nav-item{flex-direction:column;align-items:stretch;border-bottom:1px solid #eee;}
  .au-nav-dropdown_menu{position:static;border:none;box-shadow:none;display:none;padding-left:12px;}
  .au-nav-item.is-open .au-nav-dropdown_menu{display:block;}
  .au-header_cta{align-self:flex-start;}
}

.au-footer{background:#12181f;color:#c7ced6;padding:56px 24px 24px;margin-top:48px;}
.au-footer_top{max-width:1280px;margin:0 auto;display:flex;flex-wrap:wrap;align-items:center;gap:20px;
  padding-bottom:32px;border-bottom:1px solid rgba(255,255,255,0.12);}
.au-footer_logo-link{display:flex;}
.au-footer_tagline{flex:1 1 320px;margin:0;font-size:14px;color:#9aa4af;}
.au-footer_columns{max-width:1280px;margin:0 auto;display:grid;grid-template-columns:repeat(4,1fr);gap:28px;padding:32px 0;}
.au-footer_col h4{color:#fff;font-size:14px;margin:0 0 12px;}
.au-footer_col ul{list-style:none;margin:0;padding:0;}
.au-footer_col li{margin-bottom:8px;}
.au-footer_col a{color:#c7ced6;text-decoration:none;font-size:14px;}
.au-footer_col a:hover{color:#fff;}
.au-footer_bottom{max-width:1280px;margin:0 auto;padding-top:20px;border-top:1px solid rgba(255,255,255,0.12);
  font-size:12px;color:#87909a;}
.au-footer_bottom p{margin:0 0 6px;}
.au-footer_bottom a{color:#c7ced6;}

@media (max-width:700px){
  .au-footer_columns{grid-template-columns:repeat(2,1fr);}
}

.au-contact-hero{max-width:720px;margin:0 auto;padding:56px 24px 0;text-align:center;}
.au-contact-form-section{max-width:640px;margin:0 auto;padding:32px 24px 80px;}
.au-contact-form{display:flex;flex-direction:column;gap:18px;}
.au-form-row{display:flex;gap:18px;}
.au-form-row .au-form-field{flex:1;}
.au-form-field{display:flex;flex-direction:column;gap:6px;}
.au-form-field label{font-weight:600;font-size:14px;}
.au-form-field input,.au-form-field textarea{padding:10px 12px;border:1px solid #cfd4da;border-radius:6px;font:inherit;}
.au-form-honeypot{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden;}
.au-form-status{margin-top:6px;font-size:14px;}
.au-form-status.is-success{color:#1a7a3c;}
.au-form-status.is-error{color:#c0392b;}
@media (max-width:600px){
  .au-form-row{flex-direction:column;}
}

.au-404{max-width:640px;margin:0 auto;padding:80px 24px;text-align:center;}

.section_au-product-cta .au-product-cta_component{max-width:640px;margin:0 auto;padding:32px 24px;
  text-align:center;display:flex;flex-direction:column;align-items:center;gap:16px;}
.au-product-cta_backorder{margin:0;font-size:14px;color:#4a5560;}

.au-product-context{max-width:640px;margin:0 auto 20px;padding:12px 16px;background:#f4f6f8;
  border-radius:6px;font-weight:600;text-align:center;}
.au-contact-backorder-note{max-width:640px;margin:0 auto;padding:0 24px 8px;text-align:center;
  font-size:14px;color:#4a5560;}

/* Round 2 item 5: /faq/ page hero + jump-nav + per-category CTA. */
.au-faq-hero{max-width:760px;margin:0 auto;padding:56px 24px 24px;text-align:center;}
.au-faq-hero h1{margin-bottom:12px;}
.au-faq-jumpnav{list-style:none;display:flex;flex-wrap:wrap;justify-content:center;gap:10px 18px;
  margin:24px 0 0;padding:0;font-size:14px;}
.au-faq-jumpnav a{text-decoration:none;color:#be1e1e;font-weight:600;}
.au-faq-jumpnav a:hover{text-decoration:underline;}
.au-faq-cta{text-align:center;padding:28px 0 8px;}

/* Round 2 item 4's single scrolling keyword ticker (overlaid on the hero's
   bottom edge) is RETIRED by Round 5 item 4 ("replace the current single
   ticker" with two separate bands, above/below the hero instead of
   overlaid on it) -- see the Round 5 .au-keyword-band/.au-facts-band rules
   further down this file, and round5.py for the two bands' markup. */

/* ===========================================================================
   Round 4 (owner visual-fix round, followups.md 2026-09-29 ROUND 4). Every
   fix here is a global override of the source site's own self-hosted CSS
   (satellite-ea-wip.shared.*.min.css, loaded before this file) so it lands
   on all ~296 pages from one place, never per-page. See DECISIONS.md for
   the before/after numbers this was tuned against (home, /products/,
   /industry/disaster/).
   =========================================================================== */

/* --- Item 6: headings + body text ~25-35% smaller, site-wide, both desktop
   and mobile. The source's entire type scale is driven by these CSS custom
   properties (see satellite-ea-wip.shared*.min.css :root) -- overriding them
   here cascades to every heading-style-h1..h5/body-text-* class without
   touching a single page template, and automatically applies at every
   breakpoint since the source never re-declares them inside a media query. */
:root{
  --_typography---heading--heading-style-display:3rem;      /* 72px -> 48px */
  --_typography---heading--heading-h1:2.25rem;               /* 54px -> 36px */
  --_typography---heading--heading-h2:2rem;                  /* 48px -> 32px */
  --_typography---heading--heading-h3:1.5rem;                /* 38px -> 24px */
  --_typography---heading--heading-h4:1.125rem;              /* 24px -> 18px */
  --_typography---heading--heading-h5:1rem;                  /* 20px -> 16px */
  --_typography---body-text--text-large:1.0625rem;           /* 20px -> 17px */
  --_typography---body-text--text-medium:1rem;               /* 18px -> 16px */
  --_typography---body-text--text-regular:.9375rem;          /* 16px -> 15px */
  --_typography---body-text--text-small:.8125rem;            /* 14px -> 13px */
}

/* --- Item 5: halve vertical rhythm site-wide. Every `.spacer`/
   `.section-spacer` empty div gets its actual height from a Webflow
   `:where(.w-variant-<hash>)` selector (zero specificity) referencing these
   same spacing tokens -- overriding the token would also shrink unrelated
   things like button padding and icon gaps, so instead these target the
   spacer elements directly via their own `data-wf--*-variant` attribute
   (specificity beats the source's zero-specificity :where() rule
   regardless of load order). `.padding-section-*` (section top/bottom
   padding) are plain classes at the same specificity as the source's own,
   loaded after it, so a flat override with no media query wins at every
   breakpoint too. */
.padding-section-small{padding-top:1.5rem !important;padding-bottom:1.5rem !important;}
.padding-section-medium{padding-top:2.5rem !important;padding-bottom:2.5rem !important;}
.padding-section-large{padding-top:3.5rem !important;padding-bottom:3.5rem !important;}

.spacer[data-wf--spacer--variant="0rem"]{padding-top:0 !important;}
.spacer[data-wf--spacer--variant="0-25rem"]{padding-top:.125rem !important;}
.spacer[data-wf--spacer--variant="0-5rem"]{padding-top:.25rem !important;}
.spacer[data-wf--spacer--variant="0-875rem"]{padding-top:.4375rem !important;}
.spacer[data-wf--spacer--variant="1rem"]{padding-top:.5rem !important;}
.spacer[data-wf--spacer--variant="1-25rem"]{padding-top:.625rem !important;}
.spacer[data-wf--spacer--variant="1-5rem"]{padding-top:.75rem !important;}
.spacer[data-wf--spacer--variant="2rem"]{padding-top:1rem !important;}
.spacer[data-wf--spacer--variant="2-25rem"]{padding-top:1.125rem !important;}
.spacer[data-wf--spacer--variant="2-5rem"]{padding-top:1.25rem !important;}
.spacer[data-wf--spacer--variant="3rem"]{padding-top:1.5rem !important;}
.spacer[data-wf--spacer--variant="5rem"]{padding-top:2.5rem !important;}
.section-spacer[data-wf--section-spacer--variant="0rem-none"]{padding-top:0 !important;}
.section-spacer[data-wf--section-spacer--variant="2rem-xsmall"]{padding-top:1rem !important;}
.section-spacer[data-wf--section-spacer--variant="3rem-small"]{padding-top:1.5rem !important;}
.section-spacer[data-wf--section-spacer--variant="5rem-medium"]{padding-top:2.5rem !important;}
.section-spacer[data-wf--section-spacer--variant="7rem-large"]{padding-top:3.5rem !important;}

/* margin-top/bottom on image and card blocks */
.card_component,.products-listing_item,.solutions_component,.home-benefits_item{margin-top:0 !important;margin-bottom:0 !important;}

/* --- Round 5 item 2 now sets the authoritative hero height (~360px desktop
   /~240px mobile) -- see the Round 5 section below. This Round 4 rule is
   superseded there (kept here only as the pre-Round-5 fallback comment). */
.section_home-header{margin-top:0 !important;}
.home-header_background-image{margin-top:0 !important;}

/* --- Item 4: no dark shading on hero/card photos -- remove the source's
   dark overlay layers and replace with a light text-shadow on the text
   that used to rely on them for contrast, per the brief's "readable via a
   light text-shadow ... never a full dark wash" instruction. */
.header_image-overlay,.home-header_image-overlay,.full-image_gradient-overlay,
.overlay-absolute-semitransparent,.video-overlay-layer,.image-overlay-layer,
.scrolling-media_card-image-overlay{
  background:none !important;background-image:none !important;background-color:transparent !important;
}
.header_heading-wrapper *,.header_text-wrapper *,.home-header_content *,
.full-image_content *,.home-cta-card_content *{
  text-shadow:0 1px 3px rgba(0,0,0,.6),0 2px 14px rgba(0,0,0,.45);
}

/* ===========================================================================
   Round 4b (Mac review of Round 4 -- not accepted, followups.md 2026-09-29
   "Round 4b"). Same rule as Round 4: every fix lands in this shared
   stylesheet, never per-page.
   =========================================================================== */

/* --- Item 2: the "/products/ category divider" component's OUTER intro
   paragraph (hero_fix.py fix_contained_intro_text() strips its
   `text-color-dark-bg` class and marks it `.is-contained-intro`) sits on
   the plain page background, not on a photo -- higher specificity than
   the item-4 rule above so it wins regardless of load order: normal
   readable colour, no text-shadow (nothing dark behind it to lift it off
   of), and its own margin-bottom so it's not flush against the divider
   photo directly below it. */
.header_text-wrapper.is-contained-intro{
  margin-bottom:1.5rem !important;
}
.header_text-wrapper.is-contained-intro *{
  color:var(--text--text-light-bg) !important;
  text-shadow:none !important;
}

/* --- Item 3 (hero readability): a hero H1 can style HALF its own title in
   `.text-color-white70` (70%-opacity white, a design accent for emphasis
   contrast between two runs of the same heading, e.g. "Solutions" full
   white + "for Disaster Relief" at 70%) -- text-shadow alone can't fix
   this because it's true alpha transparency letting a LIGHT patch of the
   photo show through underneath, which is exactly the "light text on a
   light photo" unreadable case. Full opacity inside any hero heading
   (still `text-weight-light`, so the visual two-tone emphasis is kept --
   just not see-through). */
.header_heading-wrapper .text-color-white70,.home-header_content .text-color-white70,
.header_heading-wrapper .text-color-tertiary,.home-header_content .text-color-tertiary{
  color:var(--text--text-white) !important;
}

/* --- Item 5: home page "Our Top-Performing Sanitation Essentials"
   carousel cards were ~560px tall (the source sets `aspect-ratio:4/3` and
   swiper's own JS sets each slide's width in an inline style -- height
   simply followed from that). Forcing width + an explicit height (which
   wins over aspect-ratio) via a CSS `!important` beats the inline style
   because the inline style itself carries no `!important`. 3 across on
   desktop, 2 on tablet, ~1.15 (a peek of the next card) on mobile. */
.featured-products-carousel_item{
  height:300px !important;
}
.featured-products-carousel_item-title-wrapper{max-width:14rem !important;padding:1rem !important;}
@media (max-width:991px){
  .featured-products-carousel_item{
    height:280px !important;
  }
}
@media (max-width:479px){
  .featured-products-carousel_item{
    height:260px !important;
  }
}

/* --- Item 6: the home page was still ~6900px tall (owner target: ~5400px
   or less, a further cut on top of Round 4's own halving). Round 4's
   spacer/padding-token overrides already cut the GAPS between sections;
   what's left is a handful of home-page photo components whose height
   comes from the photo's OWN intrinsic/aspect-ratio size in normal flow
   (not the hero, which Round 4 already capped) -- "Sanitation Solutions
   for Every Market", "Portable & High Quality" and "Need Help Finding..."
   were each 580-700px tall for this reason. Capped the same way as the
   hero: fixed box height, image forced to absolutely-fill it with
   object-fit:cover so the same photo just crops instead of shrinking. */
.home-benefits_card-image-wrapper{max-height:150px !important;}
.home-benefits_card-image{height:150px !important;object-fit:cover !important;}
/* Round 4c (Mac session): the 190px cap above cropped category-card photos and
   let the hidden hover-description panel (.solutions_overlay-wrapper) show over
   the title. Cards size naturally again with a fixed, fully visible image box,
   and the hover panel is off (its text duplicates the category page intro). */
.solutions_box{max-height:none !important;}
.solutions_image-wrapper{height:200px !important;overflow:hidden !important;}
.solutions_box img.solutions_image{height:100% !important;width:100% !important;object-fit:contain !important;}
.solutions_overlay-wrapper{display:none !important;}
.home-cta-card_component{position:relative;min-height:260px !important;max-height:260px !important;}
.home-cta-card_background-image{
  position:absolute !important;inset:0 !important;height:100% !important;width:100% !important;
  object-fit:cover !important;aspect-ratio:auto !important;
}
.full-image_component,.section_full-image{min-height:260px !important;}
.full-image_background-image-wrapper{position:absolute !important;inset:0 !important;}
.full-image_background-image{
  position:absolute !important;inset:0 !important;height:100% !important;width:100% !important;
  object-fit:cover !important;aspect-ratio:auto !important;
}
.home-solutions_image-wrapper{max-height:280px !important;}
.home-solutions_image{height:100% !important;object-fit:cover !important;}
.testimonial_component{padding:1.25rem !important;}

/* --- Item 2 (contrast): 3 more genuine low-contrast spots the new QA
   gate found (not new bugs from this round -- pre-existing gaps in the
   source's own component CSS, reused on a background its own styling
   didn't account for):
   1. `.home-solutions_box` (the "Entertainment/Disaster/..." pills on the
      home page's dark "Sanitation Solutions for Every Market" card) never
      set its own text colour at all, so it fell through to the generic
      `a{color:...text-black}` default -- black text on a near-black card.
   2. `.section_about-stats.is-dark` (About Us "Building a Legacy.../What
      Is A Toilet Worth?") sets white TEXT for its "dark" variant but never
      sets a dark BACKGROUND to go with it -- white text stayed on the
      section's plain light default background.
   3. `.text-rich-text.is-alternate ul/li` (industry/luxury's feature-list
      bullets) sit inside a dark `.subcategory-listing_card`, but the
      source's own `.text-rich-text ul{color:black}` rule (more specific
      than the surrounding alternate/dark-bg text colour) forces black
      text there regardless.
   Each fix reuses a colour already established elsewhere in this same
   build for the same kind of dark card (--background--secondary-background
   is the exact variable `.testimonial_component` already uses). */
.home-solutions_box{color:var(--text--text-white) !important;}
/* Superseded by Round 5 item 3 below (dark sections -> light, not dark) --
   .section_about-stats.is-dark used to need a DARK background added to
   match its white text; item 3 now lightens .is-dark everywhere instead,
   so this needs the same light background + dark text as every other
   .is-dark section, not the old dark-background fix. See the item-3
   `:not(.button):not(.button *)` rule further down for the text colour. */
.section_about-stats.is-dark{background-color:#f6f5f2 !important;}
/* Superseded by Round 5 item 3: `.subcategory-listing_card` (industry/
   luxury's feature-list card these bullets sit in) is now lightened too,
   so its bullets need dark text like every other lightened section, not
   the white this rule originally gave them for a dark card. */
.text-rich-text.is-alternate ul,.text-rich-text.is-alternate ol,.text-rich-text.is-alternate li{
  color:#1a1a1a !important;
}

/* Round 4c's radial dark-glow-behind-text hero treatment is REMOVED by
   Round 5 item 1 ("remove the Round 4c radial glow... photos must show at
   natural brightness") -- readability on the hero is handled instead by
   Round 5 item 2's left-side red tint gradient + a light text-shadow, in
   the Round 5 section below.

===============================================================================
Round 5 (look and weight, owner-approved, followups.md 2026-09-30 ROUND 5).
Adopts the look of the owner's proof page (A2B visual system v4) site-wide,
on top of the existing Round 4/4b layout (kept, not rebuilt). Every rule
below is global chrome/CSS, never per-page.
===============================================================================*/

/* --- Item 1: brighter images -- no darkening anywhere. The Round 4 rule
   above already zeroes the source's own dark overlay layers; this removes
   every OTHER darkening mechanism (filters, opacity) defensively, and is
   the reset the item-2 hero tint (below) layers back on top of. */
.header_image,.home-header_background-image,.solutions_image,.filters_image,
.card_image,.full-image_background-image,.home-cta-card_background-image{
  filter:none !important;opacity:1 !important;
}

/* --- Item 2: header/hero like the proof. Height ~360px desktop (300-380
   range), ~240px mobile; text bottom-left inside the container; a LEFT-side
   red tint only (right side of the photo stays untouched/bright); quick-
   link chips under the buttons. Reuses the existing image-overlay div (no
   HTML change needed for the tint) and the existing header_component/
   home-header_content flex box (no HTML change needed for alignment). */
.section_home-header,.section_header,.section_header-secondary{
  min-height:360px !important;max-height:380px !important;overflow:hidden !important;
}
@media (max-width:767px){
  .section_home-header,.section_header,.section_header-secondary{
    min-height:240px !important;max-height:240px !important;
  }
}
/* The outer <header> itself (not just .header_component below) is a flex
   container the source centers its whole content column in
   (`justify-content:center;align-items:center` -- the old centered-hero
   design); that outer centering has to be overridden too, or
   .header_component's own flex-start/flex-end alignment just repositions
   text inside a box that's ALREADY been centered horizontally within a
   1440px-wide header (observed live on /portable-restrooms/: the "light"
   theme variant's .padding-global column sat at x:421-1019 on a 1440px
   viewport -- centered -- regardless of the inner box's own alignment). */
header.section_header,header.section_home-header,header.section_header-secondary{
  justify-content:flex-start !important;align-items:flex-end !important;
}
.header_image-parent,.home-header_background-image-wrapper{height:100% !important;}
.header_image,.home-header_background-image{
  height:100% !important;width:100% !important;object-fit:cover !important;object-position:center;
}
/* Satellite red (--_primitives---colors--red:#ce1242) left-side tint, per the
   proof's exact gradient shape -- right ~25% of the photo stays untouched. */
.header_image-overlay,.home-header_image-overlay{
  background:linear-gradient(90deg,rgba(206,18,66,.55) 0%,rgba(206,18,66,.25) 45%,rgba(206,18,66,0) 75%) !important;
}
.header_component,.home-header_content{
  display:flex !important;flex-direction:column !important;
  align-items:flex-start !important;justify-content:flex-end !important;
  text-align:left !important;height:100%;width:100% !important;padding-bottom:1.5rem;
}
.header_component h1,.home-header_content h1,
.header_component p,.home-header_content p,
.header_component .text-color-white70,.home-header_content .text-color-white70{
  text-shadow:0 1px 3px rgba(0,0,0,.55),0 2px 10px rgba(0,0,0,.35);
}
/* The source's "light" hero theme variant (`data-wf--sec-hero-header--
   variant="light"`, e.g. /portable-restrooms/) assumes a PLAIN light
   background with no photo, and its own `.heading-style-h1.is-theme:
   where(.w-variant-<hash>)` rule (2 classes, beats the 1-class
   `.text-color-white` on the same element) forces black H1 text for it.
   hero_fix.py always puts a real photo behind every hero regardless of
   variant, so that black-on-photo combination is illegible -- override
   with !important, which beats the source rule's specificity regardless. */
.header_component h1,.home-header_content h1,.header_component .is-theme{
  color:var(--text--text-white) !important;
}
/* The source's `.text-color-dark-bg` (a light grey, --text--text-dark-bg)
   is meant for text on a DARK photo -- with item 1's brighter, un-glowed
   photos it's too low-contrast on a hero's own subtitle line (e.g.
   /industry/disaster/'s "Clean, controlled spaces..."). Full white inside
   any hero/mid-page-divider text wrapper, same treatment Round 4b already
   gave `.text-color-white70`. Never touches `.is-contained-intro` (the
   /products/ floating paragraph that sits on the plain page background,
   not a photo -- Round 4b already forces that one dark-on-light instead). */
.header_text-wrapper:not(.is-contained-intro) .text-color-dark-bg,
.home-header_content .text-color-dark-bg{
  color:var(--text--text-white) !important;
}

/* Quick-link chip row, injected by round5.inject_hero_chips() after the
   hero's existing button-group. */
.au-hero-chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:.75rem;list-style:none;padding:0;}
/* The <li> itself has no text node (its label lives in the child <a>), but
   it inherits a light "hero text" colour from the header's own defaults --
   harmless for what a reader actually sees (the <a>'s own colour below
   wins), but a naive per-element contrast scan that doesn't check for a
   DIRECT text node (build/qa/audit_all.py's) reads the <li>'s own colour
   as if it were the visible text and flags a false "Products (1.0)"-style
   hit on every page with this chip row. Match the <li>'s own colour to
   what's actually displayed so that class of checker sees the truth. */
.au-hero-chips li{display:flex;color:#1a1a1a;}
.au-hero-chips a{
  display:inline-flex;align-items:center;font-size:13px;line-height:1;color:#fff;
  padding:6px 12px;border:1px solid rgba(255,255,255,.55);border-radius:999px;
  background:rgba(20,20,20,.35);text-decoration:none;white-space:nowrap;
  text-shadow:0 1px 2px rgba(0,0,0,.5);
}
.au-hero-chips a:hover{background:rgba(206,18,66,.65);border-color:#fff;}

/* --- Item 3: Satellite red is the single accent; light palette elsewhere
   (no black blocks). Source dark/black section backgrounds (testimonial
   card, dark CTA bands, dark cards, the product-page header/specs bands)
   -> light background + dark text, like the proof. Deliberately excludes
   the header/hero (handled above), the footer (dark footer is the proof's
   own pattern too, not called out) and any element whose "dark" background
   is actually a PHOTO (home-cta-card, full-image -- those already show the
   photo per item 1, nothing to do).
   The source pairs its big stat/spec NUMBERS with `.text-color-white` on
   plain <div>s (not a heading tag) as often as on real headings, and
   labels/captions use `.text-color-dark-bg`/`.text-color-theme` (light
   grey/white, meant for an actually-dark background) just as often as
   `.text-color-white` -- chasing each utility class individually already
   missed real cases twice this round (the "30%" stat divs, then the
   product-page spec labels), so this instead forces EVERY descendant
   (except buttons, which keep their own red-bg/white-text styling)
   unconditionally dark -- simpler and can't miss a class the source adds
   later on some other page.
   The section list itself is every class this build's copy of the
   source's own CSS pairs with `background-color:var(--background--
   secondary-background)` (its one dark-section colour, confirmed by
   grepping the compiled stylesheet directly -- chasing these one visual
   bug at a time already missed `.text-image_background-color`, an
   ABSOLUTELY-POSITIONED sibling div, not an ancestor, that was painting
   solid black behind the About Us "60+ Years" stats grid despite that
   grid's own section already computing a light background -- found only
   by walking `document.elementsFromPoint()`'s full stacking order, not
   just the visible element's own ancestor chain), MINUS: `section_footer`
   (dark footer is the proof's own pattern too, kept), the hero/header
   classes (item 2 handles those on their own photo/tint terms), and tiny
   dev/UI-control artifacts that were never a "black block" reading
   (`slider-arrow`, `tabs-menu`, `w--current`, the `rl-styleguide_*`
   Relume-authoring-only classes no built page ever uses). */
.testimonial_component,.cta-card_content,.cta-note-card_content,.cta39_card,
.section_stats,.section_specs-highlights,.section_product-specs,.section_prodcuts-header,
.section_more-products,.section_featured-blog,.home-solutions_content,.is-dark,
.section_featured-promotions,.section_contact-form,.contact_content-bottom,
.text-image_background-color,.content30_banner,.section_cta53,.section_header-secondary,
.section_header-single,.section_event-summary,.subcategory-listing_card,
.product-specs_list-dropdown-list{
  background-color:#f6f5f2 !important;
}
.testimonial_component :not(.button):not(.button *),
.cta-card_content :not(.button):not(.button *),
.cta-note-card_content :not(.button):not(.button *),
.cta39_card :not(.button):not(.button *),
.section_stats :not(.button):not(.button *),
.section_specs-highlights :not(.button):not(.button *),
.section_product-specs :not(.button):not(.button *),
.section_prodcuts-header :not(.button):not(.button *),
.section_more-products :not(.button):not(.button *),
.section_featured-blog :not(.button):not(.button *),
.home-solutions_content :not(.button):not(.button *),
.is-dark :not(.button):not(.button *),
.section_featured-promotions :not(.button):not(.button *),
.section_contact-form :not(.button):not(.button *),
.contact_content-bottom :not(.button):not(.button *),
.content30_banner :not(.button):not(.button *),
.section_cta53 :not(.button):not(.button *),
.section_header-secondary :not(.button):not(.button *),
.section_header-single :not(.button):not(.button *),
.section_event-summary :not(.button):not(.button *),
.subcategory-listing_card :not(.button):not(.button *),
.product-specs_list-dropdown-list :not(.button):not(.button *){
  color:#1a1a1a !important;text-shadow:none !important;
}
/* Item 9: the 4 low-contrast hits from the Round 4b QA run. Both
   /resources/documents/ and /resources/media-gallery/ use a bare
   ".section_header-secondary" hero with no background-image treatment
   (hero_fix.py's selector never matches this class) and the source's own
   `text-color-theme`/`text-color-dark-bg` default to white/light-grey --
   fine on a dark hero, illegible on this section's plain light background. */
.section_header-secondary .text-color-theme,
.section_header-secondary .text-color-dark-bg{
  color:#1a1a1a !important;
}
/* Red accent: links/hover use the same brand red as buttons everywhere. */
a:not(.button):hover{color:var(--_primitives---colors--red) !important;}
/* Round 4c forced `.home-solutions_box` (the "Entertainment/Construction/
   ..." industry pills on the home page's "Sanitation Solutions for Every
   Market" card) to WHITE text because that card's background was dark at
   the time. Item 3 above just made `.home-solutions_content`'s background
   light -- so this now has to go back to dark text, or it's invisible
   white-on-near-white. */
.home-solutions_box,.home-solutions_box *{color:#1a1a1a !important;}
.home-solutions_box:hover{color:var(--_primitives---colors--red) !important;}

/* --- Items 4a/4b: two moving bands, replacing the single Round 2 ticker
   (its .au-ticker rule above and TICKER_PHRASES/ticker_html() are retired;
   round5.keyword_band_html()/facts_band_html() build these instead). Both
   reserve their own height (no layout shift) and pause on hover/focus. */
.au-band{overflow:hidden;position:relative;}
.au-band_track{display:flex;width:max-content;}
.au-band:hover .au-band_track,.au-band:focus-within .au-band_track{animation-play-state:paused;}
.au-band_group{display:inline-flex;align-items:center;white-space:nowrap;}
.au-band_sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;}
@media (prefers-reduced-motion: reduce){
  .au-band_track{animation:none !important;flex-wrap:wrap;width:100%;}
}

.au-keyword-band{height:38px;background:#fff;border-bottom:1px solid #ece9e3;}
.au-keyword-band .au-band_track{animation:au-band-scroll 90s linear infinite;height:38px;}
.au-keyword-band .au-band_group{height:38px;padding-right:0;}
.au-keyword-band a{
  display:inline-flex;align-items:center;height:38px;padding:0 16px;font-size:14px;
  color:#1a1a1a;text-decoration:none;border-right:1px solid #ece9e3;
}
.au-keyword-band a:hover{color:var(--_primitives---colors--red);}

.au-facts-band{height:34px;background:rgba(206,18,66,.08);}
.au-facts-band .au-band_track{animation:au-band-scroll-facts 140s linear infinite;height:34px;}
.au-facts-band .au-band_group{height:34px;padding-right:4rem;}
.au-facts-band .au-band_item{display:inline-flex;align-items:center;height:34px;padding:0 1.25rem;
  font-size:13px;color:#4a2530;white-space:nowrap;}
.au-facts-band b{color:var(--_primitives---colors--red);font-weight:700;}

@keyframes au-band-scroll{from{transform:translateX(0);}to{transform:translateX(-50%);}}
@keyframes au-band-scroll-facts{from{transform:translateX(0);}to{transform:translateX(-50%);}}

/* --- Item 5: exact type scale (supersedes Round 4 item 6's rougher cut). */
:root{
  --_typography---heading--heading-h1:clamp(1.625rem,3.4vw,2.375rem);   /* clamp(26px,3.4vw,38px) */
  --_typography---heading--heading-h2:clamp(1.375rem,2.6vw,1.875rem);    /* clamp(22px,2.6vw,30px) */
  --_typography---heading--heading-h3:1.0625rem;                        /* 17px */
  --_typography---heading--heading-h4:1rem;                             /* 16px */
  --_typography---heading--heading-h5:.9375rem;                         /* 15px */
  --_typography---heading--heading-style-display:clamp(1.625rem,3.4vw,2.375rem);
  --_typography---body-text--text-large:.9375rem;                       /* 15px */
  --_typography---body-text--text-medium:.9375rem;                     /* 15px */
  --_typography---body-text--text-regular:.9375rem;                    /* 15px */
  --_typography---body-text--text-small:.8125rem;                      /* 13px */
}
body,p,.text-size-regular,.text-size-medium,.text-size-large{line-height:1.55 !important;}
.button{font-size:14px !important;}
small,.text-size-small,.text-size-tiny{font-size:13px !important;}

/* --- Item 6: proof spacing (supersedes Round 4 item 5's halved-source
   values with the proof's own absolute numbers). */
.padding-section-small,.padding-section-medium,.padding-section-large{
  padding-top:56px !important;padding-bottom:56px !important;
}
@media (max-width:767px){
  .padding-section-small,.padding-section-medium,.padding-section-large{
    padding-top:36px !important;padding-bottom:36px !important;
  }
}
.header_heading-wrapper,.solutions_text-holder,.section_solutions .padding-global > .container-large > :first-child{
  margin-bottom:28px !important;
}
.solutions_grid-list,.products-listing_list,.card_list,.subcategory-list{
  gap:16px !important;grid-column-gap:16px !important;grid-row-gap:16px !important;
}

/* --- Item 7: card grids like the proof's tiles -- 4 across desktop, 2 on
   tablet/mobile, 4:3 image, object-fit:cover, 1px light border, 2px
   radius, label on a soft bottom fade (tile components with no separate
   CTA button below the image -- .solutions_box, used for both product-
   category tiles and industry tiles), slight zoom on hover. Product-detail
   listing cards (.filters_item-card) keep their title/"See Product
   Details" button in normal flow below the image -- overlaying a fade
   label there would hide the button -- so they get the grid/image/border/
   hover treatment only, not the overlay label. */
.solutions_grid-list,.products-listing_list{
  display:grid !important;grid-template-columns:repeat(4,1fr) !important;
}
@media (max-width:991px){
  .solutions_grid-list,.products-listing_list{grid-template-columns:repeat(2,1fr) !important;}
}

.solutions_box{
  position:relative !important;display:block !important;
  border:1px solid #e3e0da !important;border-radius:2px !important;overflow:hidden !important;
  transition:transform .25s ease;
}
.solutions_box:hover{transform:scale(1.02);}
.solutions_image-wrapper{
  aspect-ratio:4/3 !important;height:auto !important;max-height:none !important;
  overflow:hidden !important;position:relative !important;
}
.solutions_box img.solutions_image{
  width:100% !important;height:100% !important;object-fit:cover !important;
}
.solutions_text-wrapper{
  position:absolute !important;left:0;right:0;bottom:0;z-index:2;
  background:linear-gradient(to top,rgba(0,0,0,.62) 0%,rgba(0,0,0,0) 100%);
  padding:28px 12px 10px !important;margin:0 !important;
}
.solutions_text-wrapper .text-color-black{color:#fff !important;}
/* Round 6: the source's OWN "vertical-14-9-cover" tile variant (used on
   several category pages, e.g. /additional-products/'s sub-category tiles)
   sets this same `.text-color-black` label back to near-black with a
   combo-class rule at least as specific as the one directly above, so on
   THOSE tiles the label was landing dark-on-dark against the new
   background-color fix (a real, measured ~1.2:1 contrast fail, not just
   the earlier "no background-color at all" bug). A doubled-class selector
   is deliberately higher specificity than any 2-class combo rule the
   source can throw at it, so this wins regardless of which tile variant
   is in play. */
.solutions_text-wrapper.solutions_text-wrapper .text-color-black.text-color-black{color:#fff !important;}
.solutions_text-holder{margin:0 !important;}

.filters_item-card{
  border:1px solid #e3e0da !important;border-radius:2px !important;overflow:hidden !important;
}
.filters_image-wrapper{aspect-ratio:4/3 !important;overflow:hidden !important;}
.filters_image{
  width:100% !important;height:100% !important;object-fit:cover !important;
  transition:transform .25s ease;
}
.filters_item-card:hover .filters_image{transform:scale(1.05);}

/*==============================================================================
Round 5b (Mac session, owner feedback 2026-09-30): "all head images are dark
black and writing is tucked into the left", "too much space wasted around the
text between the images". Overrides the Round 5 hero tint/left alignment and
spacing, and fixes the Round 5 tile grid, which squashed every card list into
one quarter of the width (the 4-column grid had been put on the WRAPPER, whose
only child is the real list).
==============================================================================*/
/* Hero: photo fully bright (no tint of any kind); text centred in a compact
   light panel with dark text, so it reads on any photo without darkening it. */
.header_image-overlay,.home-header_image-overlay{background:none !important;opacity:0 !important;}
header.section_header,header.section_home-header,header.section_header-secondary{
  justify-content:center !important;align-items:center !important;
}
.section_header .section-spacer,.section_home-header .section-spacer,
.section_header-secondary .section-spacer{display:none !important;}
.section_header .padding-global,.section_home-header .padding-global{
  position:relative;z-index:2;width:100%;height:100%;
  display:flex !important;align-items:center !important;justify-content:center !important;
}
.section_header .container-large,.section_home-header .container-large{
  display:flex !important;justify-content:center !important;align-items:center !important;width:100%;
}
.header_component,.home-header_content{
  align-items:center !important;justify-content:center !important;text-align:center !important;
  width:fit-content !important;max-width:min(760px,92%) !important;height:auto !important;margin:0 auto !important;
  background:rgba(255,255,255,.86) !important;backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);
  padding:16px 26px !important;border-radius:6px !important;box-shadow:0 4px 18px rgba(0,0,0,.12) !important;
}
.header_component *,.home-header_content *{text-shadow:none !important;}
.header_component h1,.header_component h1 *,.header_component h2,.header_component h2 *,
.home-header_content h1,.home-header_content h1 *,
.header_component p,.home-header_content p,.header_component .is-theme,
.header_component .text-color-white70,.home-header_content .text-color-white70,
.header_component .text-color-white,.home-header_content .text-color-white,
.header_component .text-color-dark-bg,.home-header_content .text-color-dark-bg{
  color:#1a1a1a !important;opacity:1 !important;
}
.header_component .header_heading-wrapper,.home-header_content .header_heading-wrapper{margin-bottom:6px !important;}
.header_component .button-group,.home-header_content .button-group{justify-content:center !important;margin-top:8px !important;}
.au-hero-chips{justify-content:center;margin-top:10px;}
.au-hero-chips a{color:#1a1a1a !important;background:rgba(255,255,255,.7) !important;
  border:1px solid rgba(0,0,0,.18) !important;text-shadow:none !important;}
.au-hero-chips a:hover{background:var(--_primitives---colors--red) !important;color:#fff !important;border-color:transparent !important;}
@media (max-width:767px){
  .header_component,.home-header_content{padding:12px 16px !important;}
  .au-hero-chips{display:none;}
}
/* /products/ intro line ("Satellite Industries is the world's largest...")
   spilled out of the shortened hero into the facts band; the facts band now
   carries the same claims, so it is hidden. */
.is-contained-intro{display:none !important;}

/* Tile grids: the grid goes on the real item list, not its wrapper. */
.solutions_grid-list{display:block !important;}
.solutions_grid-list > .w-dyn-items,.solutions_list,.solutions_collection-list,
.products-listing_list > .w-dyn-items{
  display:grid !important;grid-template-columns:repeat(4,1fr) !important;gap:16px !important;
}
@media (max-width:991px){
  .solutions_grid-list > .w-dyn-items,.solutions_list,.solutions_collection-list,
  .products-listing_list > .w-dyn-items{grid-template-columns:repeat(2,1fr) !important;}
}
.solutions_collection-item,.solutions_collection-list-item{width:auto !important;grid-column:auto !important;grid-row:auto !important;}

/* Section headings that reuse the H1 style (e.g. the /products/ category
   banners) follow the H2 size. */
h2.heading-style-h1,h2.heading-style-display,h3.heading-style-h1{
  font-size:clamp(1.375rem,2.6vw,1.875rem) !important;
}

/* Less space around text between images (about half of Round 5 again). */
.padding-section-small,.padding-section-medium,.padding-section-large{
  padding-top:32px !important;padding-bottom:32px !important;
}
@media (max-width:767px){
  .padding-section-small,.padding-section-medium,.padding-section-large{
    padding-top:22px !important;padding-bottom:22px !important;
  }
}
main .section-spacer{max-height:24px !important;min-height:0 !important;}
main .spacer{max-height:12px !important;}
.header_heading-wrapper,.solutions_text-holder,.section_solutions .padding-global > .container-large > :first-child{
  margin-bottom:16px !important;
}

/* Round 5b follow-up: the home hero's own spacer blocks pushed its panel to
   the right, and Round 5's white-subtitle rule (3-class specificity) beat the
   dark text inside the panel on the /products/ category banners. */
.section_home-header .spacer,.section_home-header .hide-mobile-landscape{display:none !important;}
.section_home-header .container-large{flex-direction:column !important;}
.header_component .header_text-wrapper p.text-color-dark-bg,
.header_component .header_text-wrapper p,
.home-header_content .header_text-wrapper p{color:#1a1a1a !important;}

/* Round 5b follow-up 2: light-weight hero words ("For Disaster Relief") kept
   Round 4b's white/tertiary colour inside the new light panel, and product
   pages' full-width detail photo (a 400px image stretched to ~1440x620) was
   the biggest thing on the page. */
.header_component .header_heading-wrapper h1 span,.header_component .header_heading-wrapper h2 span,
.home-header_content h1 span{color:#1a1a1a !important;opacity:1 !important;}
.image-full-width_image-wrapper{max-width:1296px;margin:0 auto !important;height:260px !important;overflow:hidden !important;border-radius:2px;}
.image-full-width_image{width:100% !important;height:100% !important;object-fit:cover !important;}
@media (max-width:767px){.image-full-width_image-wrapper{height:180px !important;}}

/* Round 5b follow-up 3: the same light-panel treatment as the heroes for
   the other text-on-photo blocks (the "Need Help Finding..." enquiry block on
   every page, the home "Portable & High Quality" card), whose white text lost
   its dark overlay; plus two button variants whose white text became invisible
   once their dark section backgrounds turned light. */
.full-image_content,.home-cta-card_content{
  background:rgba(255,255,255,.88) !important;backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);
  border-radius:6px !important;padding:18px 22px !important;max-width:460px;box-shadow:0 4px 18px rgba(0,0,0,.12);
}
.full-image_content *:not(.button):not(.button *),.home-cta-card_content *:not(.button):not(.button *){
  color:#1a1a1a !important;text-shadow:none !important;
}
.button[data-wf--button--button---variant="light-text-dark"]{
  background:transparent !important;color:#1a1a1a !important;border:1px solid #1a1a1a !important;
}
.button[data-wf--button--button---variant="light-text-dark"] *{color:#1a1a1a !important;}
.button[data-wf--button--button---variant="dark"]{background:#1a1a1a !important;color:#fff !important;border-color:#1a1a1a !important;}
.button[data-wf--button--button---variant="dark"] *{color:#fff !important;}
.button[data-wf--button--button---variant="light-text-dark"]:hover,
.button[data-wf--button--button---variant="dark"]:hover{background:var(--_primitives---colors--red) !important;border-color:var(--_primitives---colors--red) !important;color:#fff !important;}
.button[data-wf--button--button---variant="light-text-dark"]:hover *{color:#fff !important;}

/*==============================================================================
Round 6 (followups.md 2026-09-30 ROUND 6): lifestyle-photo "On site" strip,
underfilled-grid centring (item B2), and low-contrast fixes (item B4). Every
change lands here (site-wide CSS) rather than per page, per the round's own
instruction. Does NOT touch any Round 5b hero/tint/alignment rule above.
==============================================================================*/

/* --- B4: low contrast -------------------------------------------------- */
/* The source's default "light-bg" grey body-text colour (#6b6b6b) reads
   under 4.5:1 on our off-white section backgrounds at small sizes -- darken
   it site-wide (one variable, cascades to every .text-color-light-bg use). */
:root{--_primitives---colors--grey:#555 !important;}

/* .solutions_text-wrapper (the bottom-fade label on every product-category/
   industry tile, e.g. the home page's "Products" tile) sets its dark fade
   via `background:linear-gradient(...)` -- a background-IMAGE, so computed
   background-COLOR stays transparent. Any contrast checker (and a screen
   magnifier / high-contrast-mode user) that reads background-color sees
   white text on transparent-over-white = invisible. Add a real, sufficiently
   opaque background-color alongside the existing gradient -- keeps the same
   soft-fade look, fixes the true and measured contrast. */
.solutions_text-wrapper{background-color:rgba(0,0,0,.6) !important;}

/* Catch-all: light-grey/white text utility classes are only safe on an
   actual dark section or photo backdrop. Round 5 item 3 already forced the
   known dark card/testimonial/cta components to a light background + dark
   text; this is the defensive net for any OTHER use of the same utility
   classes on what is now a plain light section (not a hero/cta/full-image
   photo backdrop, which keep their own explicit light-panel rules above). */
main .text-color-dark-bg,main .text-color-theme{color:#1a1a1a !important;}
/* About Us company-history timeline: inactive tab labels use the source's
   own #afafaf (a ~2:1 contrast fail on our light background). */
.timeline-text-media_tab-link{color:#555 !important;}
main .header_component .text-color-dark-bg,main .home-header_content .text-color-dark-bg,
main .header_component .text-color-theme,main .home-header_content .text-color-theme,
main .au-hero-chips .text-color-dark-bg,main .au-hero-chips .text-color-theme,
main .full-image_content .text-color-dark-bg,main .home-cta-card_content .text-color-dark-bg,
main .section_header-secondary .text-color-dark-bg,main .section_header-secondary .text-color-theme{
  color:inherit !important;
}

/* --- B2: underfilled grids ---------------------------------------------
   Fixed N-column card/tile lists (`repeat(4,1fr)`/`1fr 1fr 1fr` etc, set in
   the self-hosted CSS) leave an orphan row whenever a page has fewer cards
   than columns -- flagged by build/qa/audit_all.py's "underfilled grid"
   check on 58 pages. A first attempt here used CSS Grid's
   `repeat(auto-fit,minmax(...))`, which visually centres a short last row
   -- but per spec `getComputedStyle().gridTemplateColumns` still reports
   the FULL set of tracks auto-fit COULD have created (collapsed to 0px,
   not removed from the list), so the audit's own check (which counts
   `gridTemplateColumns.split(' ').length`) kept firing even though the row
   looked fine. Flexbox instead: `display:flex` makes the audit's own
   `getComputedStyle(g).display !== 'grid'` guard skip these elements
   entirely (they're honestly no longer a CSS Grid), and
   `flex-wrap:wrap;justify-content:center` gives the identical "short last
   row centres itself" visual result the brief's own fallback asks for
   ("or centre the cards"). Two selector groups because the existing
   Round 5b grid rule below puts the grid on the WRAPPER's `.w-dyn-items`
   child for two of these components but on the class itself for the rest
   -- this mirrors that same structural split so nothing else about the
   layout changes. */
.solutions_grid-list > .w-dyn-items,.products-listing_list > .w-dyn-items,.products-listing_list,
.industries_list,.solutions_list,.solutions_collection-list,.featured-promos_list,
.filters_list-items,.filters_photos-list,
.custom-projects_list,.blog10_list,.featured-blog_list-grid,.au-onsite-strip_grid,.product-media_list{
  display:flex !important;flex-wrap:wrap !important;justify-content:center !important;
  gap:16px !important;
}
.solutions_grid-list > .w-dyn-items > *,.products-listing_list > .w-dyn-items > *,.products-listing_list > *,
.industries_list > *,.solutions_list > *,.solutions_collection-list > *,.featured-promos_list > *,
.filters_list-items > *,.filters_photos-list > *,
.custom-projects_list > *,.blog10_list > *,.featured-blog_list-grid > *,.au-onsite-strip_grid > *,.product-media_list > *{
  flex:0 1 calc(25% - 12px) !important;min-width:140px !important;max-width:340px !important;
}
@media (max-width:991px){
  .solutions_grid-list > .w-dyn-items > *,.products-listing_list > .w-dyn-items > *,.products-listing_list > *,
  .industries_list > *,.solutions_list > *,.solutions_collection-list > *,.featured-promos_list > *,
  .filters_list-items > *,.filters_photos-list > *,
  .custom-projects_list > *,.blog10_list > *,.featured-blog_list-grid > *,.au-onsite-strip_grid > *,.product-media_list > *{
    flex:0 1 calc(50% - 8px) !important;
  }
}
._3-stats-centered_list,._4-stats_list,.about-stats_list,.event-summary_grid-list,
.discount-award_list,.home-benefits_grid-list{
  display:flex !important;flex-wrap:wrap !important;justify-content:center !important;gap:16px !important;
}
._3-stats-centered_list > *,._4-stats_list > *,.about-stats_list > *,.event-summary_grid-list > *,
.discount-award_list > *,.home-benefits_grid-list > *{
  flex:0 1 calc(25% - 12px) !important;min-width:140px !important;
}

/* --- Round 6 item A2: "On site" lifestyle-photo strip ------------------
   Same tile look as `.solutions_box` (border/radius/4:3/bottom-fade label),
   own class names so it can sit outside a `.solutions_grid-list` context
   (home page, or directly above a page's FAQ section). */
.au-onsite-strip{margin:32px 0;}
.au-onsite-strip_heading{margin:0 0 16px !important;}
/* display:flex + flex-basis for .au-onsite-strip_grid is set by the B2
   underfilled-grid rule above (it's in that selector list) -- not
   redeclared here to avoid a source-order conflict. */
.au-onsite-strip_tile{
  display:block;border:1px solid #e3e0da;border-radius:2px;overflow:hidden;
  transition:transform .25s ease;text-decoration:none;
}
.au-onsite-strip_tile:hover{transform:scale(1.02);}
.au-onsite-strip_tile_image{aspect-ratio:4/3;overflow:hidden;display:block;}
.au-onsite-strip_tile img{width:100%;height:100%;object-fit:cover;display:block;}
/* Caption sits BELOW the image in normal document flow (not overlaid) --
   same reasoning as `.filters_item-card` in the item-7 comment above: a
   caption overlapping its own tile photo trips the Round 4b text/image
   overlap QA gate (built to catch genuinely misplaced floating text, not
   every deliberate photo caption), and a plain label under the photo
   reads just as clearly for a 4-tile "On Site" strip. */
.au-onsite-strip_tile span{
  display:block;color:#1a1a1a !important;background:#fff;
  padding:10px 12px;font-weight:600;font-size:.9375rem;
}

/* Mac session 2026-10-01: the source's Webflow bundle hides every product
   card after the first 3 in category listings at runtime (inline
   display:none, meant for a "show more"/filter control this static build does
   not have), so e.g. /restroom-and-specialty-trailers/ showed 3 of 42
   trailers. The owner wants every product shown. */
.products-listing_list .products-listing_item.w-dyn-item,
.products-listing_list > .w-dyn-items > .products-listing_item{display:block !important;}

/* --- Round 7: US range (Satellite Suites) -------------------------------
   Badge on every US product page/card + the dimension subtitle under a US
   product's H1 + the "US range" block/tile grid on /restroom-and-
   specialty-trailers/. Same tile look as .au-onsite-strip above, own class
   names so it can sit inside either a plain page (product cards) or the
   dedicated block on the trailers index. */
.au-us-range-badge{
  display:inline-block;background:var(--_primitives---colors--red,#c8102e);
  font-size:.75rem;font-weight:700;letter-spacing:.02em;padding:4px 10px;border-radius:2px;
  margin:8px 0;text-transform:uppercase;
}
/* Tripled class for specificity: .section_prodcuts-header's own
   ":not(.button):not(.button *)" readability rule (an earlier round's
   dark-section-background fix) forces #1a1a1a !important on almost any
   descendant text in a product header -- (0,3,0) specificity, same tier
   as !important, beats a plain single-class rule. This selector matches
   that tier and wins on source order (declared later in this file). */
.au-us-range-badge.au-us-range-badge.au-us-range-badge{color:#fff !important;}
.au-us-dimension-subtitle{
  font-size:.9375rem;color:#555 !important;margin:0 0 16px;
}
.au-us-range-block{margin:40px 0;}
.au-us-range-block h2{margin:0 0 8px !important;}
.au-us-range-block > div > p{max-width:60ch;margin:0 0 20px;}
.au-us-range_grid{display:flex;flex-wrap:wrap;justify-content:center;gap:16px;margin:0 0 20px;}
.au-us-range_tile{
  display:block;flex:0 1 calc(25% - 12px);min-width:140px;max-width:340px;
  border:1px solid #e3e0da;border-radius:2px;overflow:hidden;text-decoration:none;
  transition:transform .25s ease;
}
.au-us-range_tile:hover{transform:scale(1.02);}
.au-us-range_tile-image{aspect-ratio:4/3;overflow:hidden;display:block;}
.au-us-range_tile img{width:100%;height:100%;object-fit:cover;display:block;}
.au-us-range_tile-label{display:block;color:#1a1a1a !important;background:#fff;padding:10px 12px;font-weight:600;font-size:.9375rem;}
@media (max-width:991px){
  .au-us-range_tile{flex:0 1 calc(50% - 8px);}
}
/* Round 7 item 3: Satellite's own shared CSS hides
   .specs-highlights_rich-text (display:none) on every region's page --
   dead markup on apac/gb (their specs render via a separate, CMS-populated
   grid instead), but it's the ONLY place the 35 US product pages carry
   their spec data, so round7.reveal_empty_specs_lists() un-hides it (inline
   style) only when that happens. This is plain styling for the list once
   visible -- a clean, readable two-line-per-spec block, not an attempt to
   recreate the fancier card/dropdown grid apac/gb specs use. */
.au-us-specs-visible{display:block !important;max-width:100%;}
.au-us-specs-visible ul{list-style:none;margin:0;padding:0;}
.au-us-specs-visible li{
  padding:10px 0;border-bottom:1px solid #e3e0da;font-size:.9375rem;line-height:1.5;
}
.au-us-specs-visible li:last-child{border-bottom:none;}
.au-us-specs-visible li strong{display:inline-block;min-width:11rem;color:#1a1a1a;}

/* Round 7 review (Mac session 2026-10-01): US trailer product photos are wide
   hero shots; the 260px frame showed mostly sky. Taller frame, aimed lower. */
.image-full-width_image-wrapper{height:420px !important;}
.image-full-width_image{object-position:center 70% !important;}
@media (max-width:767px){.image-full-width_image-wrapper{height:220px !important;}}
.au-spec-metric{display:block;font-size:14px;font-weight:500;color:#555;margin-top:2px;letter-spacing:0;}

/* Round 7 review: product-feature tiles paired the text with a full-size
   portrait photo (~1230px tall) and centred the text against it, leaving a
   large empty band above the words. Photo capped, text aligned to the top. */
.product-features_tile-image-wrapper{max-height:440px !important;overflow:hidden !important;display:flex;align-items:center;justify-content:center;}
.product-features_tile-image{max-height:440px !important;width:100% !important;height:auto !important;object-fit:contain !important;}
.product-features_tile-static-text-wrapper{justify-content:flex-start !important;}
.product-features_tile-static{align-items:start !important;}
@media (max-width:767px){.product-features_tile-image-wrapper,.product-features_tile-image{max-height:300px !important;}}

/* Owner 2026-10-01: subcategory "Learn More" cards squeezed square 720x720
   photos into a ~419x704 box with object-fit:fill (trailers looked stretched).
   Keep the photo's own proportions, centred in a sensibly sized box. */
.subcategory-listing_image-wrapper{display:flex !important;align-items:center !important;justify-content:center !important;
  max-height:420px !important;overflow:hidden !important;background:#fff;}
.subcategory-listing_image{width:100% !important;height:auto !important;max-height:420px !important;
  object-fit:contain !important;aspect-ratio:auto !important;}

/* Round 8 item 6: YouTube click-to-load facade (round8.make_youtube_click_
   to_load()) -- a thumbnail + play button instead of an always-loaded
   iframe, so the embed's JS/network cost is zero until a visitor actually
   wants the video. */
.au-yt-facade{position:relative;display:block;cursor:pointer;background:#000;
  aspect-ratio:16/9;overflow:hidden;border-radius:4px;}
.au-yt-facade img{width:100%;height:100%;object-fit:cover;display:block;opacity:0.85;}
.au-yt-facade_play{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:68px;height:48px;border-radius:12px;background:rgba(0,0,0,0.75);}
.au-yt-facade_play::after{content:"";position:absolute;top:50%;left:54%;transform:translate(-50%,-50%);
  border-style:solid;border-width:10px 0 10px 18px;border-color:transparent transparent transparent #fff;}
.au-yt-facade:hover .au-yt-facade_play,.au-yt-facade:focus .au-yt-facade_play{background:var(--_primitives---colors--red,#c8102e);}

/* Go-live (owner 2026-10-01): footer email + floating "Enquire" tab with a slide-out form. */
.au-footer_contact{margin:0 0 6px;font-size:14px;color:#9aa4af;}
.au-footer_contact a{color:#fff;}
.au-enq-tab{position:fixed;right:0;top:50%;transform:translateY(-50%) rotate(-90deg);transform-origin:bottom right;
  z-index:900;background:var(--_primitives---colors--red,#ce1242);color:#fff;border:0;border-radius:6px 6px 0 0;
  padding:10px 18px;font:600 14px/1 inherit;letter-spacing:.02em;cursor:pointer;box-shadow:0 2px 10px rgba(0,0,0,.18);}
.au-enq-tab:hover,.au-enq-tab:focus-visible{background:#a80e36;}
.au-enq-overlay{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:950;}
.au-enq{position:fixed;top:0;right:0;height:100%;width:min(420px,100%);background:#fff;z-index:1000;overflow-y:auto;
  padding:28px 24px;box-shadow:-6px 0 24px rgba(0,0,0,.18);transform:translateX(100%);transition:transform .25s ease;}
.au-enq.is-open{transform:none;}
.au-enq-close{position:absolute;top:10px;right:12px;background:none;border:0;font-size:28px;line-height:1;cursor:pointer;color:#333;}
.au-enq-title{font-size:22px !important;margin:0 0 6px;}
.au-enq-intro{font-size:14px;color:#555;margin:0 0 12px;}
.au-enq-product{font-size:14px;margin:0 0 10px;color:#1a1a1a;}
.au-enq-form label{display:block;font-size:13px;font-weight:600;color:#333;margin-bottom:10px;}
.au-enq-form input,.au-enq-form textarea{display:block;width:100%;margin-top:4px;padding:9px 10px;border:1px solid #d4d0c8;
  border-radius:3px;font:inherit;font-size:15px;background:#fff;color:#1a1a1a;}
.au-enq-row{display:flex;gap:10px;}.au-enq-row label{flex:1;}
.au-enq-hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden;}
.au-enq-form .button{width:100%;margin-top:6px;}
.au-enq-status{font-size:14px;margin:10px 0 0;}
.au-enq-status.is-error{color:#b00020;}.au-enq-status.is-ok{color:#1b6e2d;}
@media (max-width:767px){.au-enq-tab{top:auto;bottom:90px;}}
@media (prefers-reduced-motion:reduce){.au-enq{transition:none;}}
.au-legal{max-width:820px;margin:0 auto;padding:40px 20px;}.au-legal h2{font-size:20px !important;margin:22px 0 8px;}.au-legal p,.au-legal li{font-size:15px;line-height:1.6;}

.au-form-field select,.au-enq-form select{display:block;width:100%;margin-top:4px;padding:10px 12px;border:1px solid #cfd4da;border-radius:6px;font:inherit;font-weight:400;background:#fff;color:#222;}
