RBS Homepage Hero - Responsive Diagnosis & Fix

2026-05-15 - renuebyscience.com - live theme vs staging branch staging/hero-responsive-fluid-cc (theme id 160836845826)

Two issues identified - jump to either

  1. Hero banner doesn't scale at wide viewports - Hard-capped at 1920px wide. On any monitor wider than 1920px (or a 1920px monitor zoomed out via Ctrl+Minus), the hero stops growing while the rest of the page keeps going. Header font is also hardcoded at 64px and never scales.
  2. The auto-scrolling reviews band - Continuously-scrolling marquee of review snippets. Reading interference, banner blindness, ignores prefers-reduced-motion, no pause control (WCAG 2.2.2 fail).

Both fixes are live in the staging branch staging/hero-responsive-fluid-cc (theme id 160836845826). Side-by-side comparisons below.

Issue 1: Hero banner doesn't scale at wide viewports

The fix (3 changes in sections/rbsv4-sliding-banner.liquid)

  1. Kill the cap, add aspect-ratio. width: 100% + aspect-ratio: 2000/1073 (image's native ratio) so the hero fills the viewport AND reserves layout space while the image decodes (prevents CLS).
  2. Fluid typography. clamp(2rem, 3.2vw + 0.5rem, 4rem) on the header, clamp() on preheader and subheader. Text now scales with viewport between sensible min and max sizes.
  3. Responsive image delivery. Added srcset + sizes="100vw" on both desktop and mobile images plus matching imagesrcset on the <link rel="preload">. Mobile devices now load a 480w/750w/1080w image instead of the 1000w-default file. Performance win on top of the visual fix.

Side-by-side at 7 viewport widths

LEFT = LIVE   RIGHT = STAGING (the fix)

2400 px (the bug case - 4K, or zoomed-out Ctrl+Minus on 1920px)
Live 2400px
Live: hero capped at 1920px - 240px white margins each side, looks small
Staging 2400px
Staging: hero fills viewport, header text grew to fit
1920 px (sweet spot for live)
Live 1920px
Live: hero fills viewport (this is the only width live was designed for)
Staging 1920px
Staging: same fill, header at 64px (hits clamp max), nearly indistinguishable
1200 px (typical laptop)
Live 1200px
Live: image scales but 64px header is too big for the space
Staging 1200px
Staging: header scaled down via clamp, breathes properly
1000 px (just above mobile breakpoint at 991px)
Live 1000px
Live: header still 64px - crowds the subtitle
Staging 1000px
Staging: header proportional to space
768 px (tablet - mobile breakpoint kicks in)
Live 768px
Live: mobile layout, mobile image loaded
Staging 768px
Staging: same layout, smaller image variant loaded via srcset
430 px (phone)
Live 430px
Live: ships the full 1000w mobile image (~138 KB)
Staging 430px
Staging: ships the 480w variant (~50 KB) - faster on cellular

The diff

--- a/sections/rbsv4-sliding-banner.liquid
+++ b/sections/rbsv4-sliding-banner.liquid

# 1. Preload now matches what srcset would have picked
-  <link rel="preload" as="image" href="...width: 2000" fetchpriority="high">
+  <link rel="preload" as="image" href="...width: 1600"
+        imagesrcset="...1000w, ...1400w, ...1800w, ...2400w"
+        imagesizes="100vw" fetchpriority="high">

# 2. Banner sizing
   .rbsv4-sliding-banner-{ID} {
+    width: 100%;
     max-width: 100%;
-    width: min(100vw, 1920px);
-    margin: auto;
+    margin: 0 auto;
   }
   .rbsv4-sliding-banner__image-{ID} {
     width: 100%;
     height: auto;
+    aspect-ratio: 2000 / 1073;
   }

# 3. Fluid typography
-  .preheader  { font-size: 16px; line-height: 24px; letter-spacing: 0.8px; }
+  .preheader  { font-size: clamp(0.75rem, 0.4vw + 0.65rem, 1rem);
+                line-height: 1.5; letter-spacing: 0.05em; }
-  .header     { font-size: 64px; line-height: 72px; }
+  .header     { font-size: clamp(2rem, 3.2vw + 0.5rem, 4rem);
+                line-height: 1.12; }
-  .subheader  { font-size: 20px; line-height: 28px; }
+  .subheader  { font-size: clamp(0.875rem, 0.6vw + 0.7rem, 1.25rem);
+                line-height: 1.45; }

# 4. Image markup with srcset (desktop and mobile both updated)
   <img
-    src="...width: 2000"
+    src="...width: 1600"
+    srcset="...1000w, ...1400w, ...1800w, ...2400w"
+    sizes="100vw"
     loading="eager" fetchpriority="high"
+    decoding="async"
     ...>

Issue 2: the auto-scrolling reviews band

Below the hero is a continuously-scrolling marquee of customer review snippets (JS-driven transform: translateX(), ~80 px/sec). It's a different pattern from a paginated carousel, and the established guidance from the major accessibility and UX research bodies is consistent on this:

Sources backing the recommendation

The fix

Replace with a static row of review snippets + a clear "Read all reviews" CTA linking to the existing reviews page (/pages/renue-by-science-reviews, which renders the full Okendo widget). The Okendo aggregate (4.5 stars, 2,133 reviews) is also wrapped in a link to the same page so users have two affordances to get to the full reviews. Responsive: 4 reviews on wide desktop, 3 around 1100-1400 px, 2 stacked on mobile. JS marquee file is deleted.

Side-by-side

LEFT = LIVE (marquee, mid-frame)   RIGHT = STAGING (static row)

~1920 px viewport
Live marquee at 1920w
Live: text scrolls L-R continuously, only mid-text visible at any frame
Staging static row at 1920w
Staging: rating + 4 review snippets, all static (some text truncated to fit one line)
~1200 px viewport (drops below 991 mobile breakpoint, stacks)
Live marquee at 1200w
Live: same scrolling band, smaller text
Staging static row at 1200w
Staging: rating + 2 reviews stacked + "Read all reviews" link
~768 px viewport
Live marquee at 768w
Live: scrolling, text harder to follow at narrower width
Staging static at 768w
Staging: same stacked layout, comfortable to read
~430 px viewport (mobile)
Live marquee at 430w
Live: marquee continues to scroll - one truncated review visible at any moment
Staging static at 430w
Staging: 2 static review snippets centered, "Read all reviews" CTA below

Reviews-band diff

--- a/sections/home-page-reviews-banner-section.liquid
+++ b/sections/home-page-reviews-banner-section.liquid

# Markup change: marquee container -> static row
-<div class="...slider-container">
-  <div class="...customer-review-items"> ... 5 hardcoded reviews ... </div>
-</div>
+<a href="/pages/renue-by-science-reviews" aria-label="Read all customer reviews">
+  {% render 'okendo-star-reviews' %}     {# rating becomes a link too #}
+</a>
+<div class="...static-row">
+  <div class="...customer-review-items"> ... 4 reviews, no JS ... </div>
+  <a href="/pages/renue-by-science-reviews" class="...read-all-link">
+    Read all reviews ->
+  </a>
+</div>

# CSS: kill the cap (same bug as the hero), responsive hide-by-nth-child
-.home-page-reviews-banner-section { width: min(100vw, 1920px); margin: auto; }
+.home-page-reviews-banner-section { width: 100%; margin: 0 auto; }
+@media (max-width: 1400px) { .review-item:nth-child(n+4) { display:none } }
+@media (max-width: 1100px) { .review-item:nth-child(n+3) { display:none } }

# JS: marquee animation file deleted (37 lines gone)

Branch & connection details

RepoRenueByScienceOrg/RenueByScienceUS
Branchstaging/hero-responsive-fluid-cc
Connected themeRenueByScienceUS/staging/hero-responsive-fluid-cc (id 160836845826)
Reviews page/pages/renue-by-science-reviews (already exists, renders the full Okendo widget)
PR (when ready)github.com/RenueByScienceOrg/RenueByScienceUS/pull/new/staging/hero-responsive-fluid-cc