Skip to content

feat: Replace mobile logo grid with infinite scrolling marquee#2875

Merged
felixkrrr merged 16 commits intomainfrom
cursor/mobile-logo-marquee-780c
Apr 29, 2026
Merged

feat: Replace mobile logo grid with infinite scrolling marquee#2875
felixkrrr merged 16 commits intomainfrom
cursor/mobile-logo-marquee-780c

Conversation

@felixkrrr
Copy link
Copy Markdown
Contributor

@felixkrrr felixkrrr commented Apr 27, 2026

Summary

Resolves MKT-2060 — On mobile, the enterprise logo section below the hero now displays as a single-row infinite scrolling marquee (matching the HeroStatsStrip animation pattern above the hero title), instead of a 3-column grid that hid most logos.

Changes

components/shared/EnterpriseLogoGrid.tsx

  • Mobile (below sm): Replaced the 3-column grid with a horizontally scrolling marquee powered by framer-motion. All 12 visible logos now appear in a continuous loop with gradient edge masks for seamless visual wrapping.
  • Desktop (sm and above): The existing 6-column grid layout is preserved unchanged.
  • Logos in the marquee use a slightly compact height (40px vs 56px) for better mobile fit.
  • Reuses the same marquee pattern as HeroStatsStrip (duplicate content, x: ["0%", "-50%"] animation, linear easing, edge gradient mask).

Before / After

  • Before: Mobile showed only 6 logos in a 3×2 grid
  • After: Mobile shows all 12 logos in a continuously scrolling single row

Linear Issue: MKT-2060

Open in Web Open in Cursor 

Disclaimer: Experimental PR review

Greptile Summary

This PR replaces the mobile enterprise logo section from a 3-column grid (showing only 6 logos) with a framer-motion-powered infinite scrolling marquee that shows all 12 visible logos, while preserving the existing 6-column desktop grid. The implementation correctly handles the prefers-reduced-motion preference with a static horizontal-scroll fallback, and properly marks duplicate marquee items with aria-hidden and tabIndex=-1.

Confidence Score: 5/5

Safe to merge — the change is additive and isolated to a single marketing component with no data or auth implications.

Only P2 findings (a brief flash of animation for reduced-motion users on initial render). No P0/P1 issues found. Desktop layout is fully preserved.

No files require special attention.

Important Files Changed

Filename Overview
components/shared/EnterpriseLogoGrid.tsx Replaces the mobile 3-column logo grid with a framer-motion infinite marquee; desktop grid is unchanged. One minor accessibility concern: useReducedMotion() returns null on initial render, so the animated version is briefly shown before the preference is applied.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[EnterpriseLogoGrid] --> B{Viewport}
    B -->|Mobile below sm| C{shouldReduceMotion}
    B -->|Desktop sm and above| D[Static 6-col grid\nall visibleCompanies]
    C -->|true or null| E[Static overflow-x-auto scroll\nLogoMarqueeItems once]
    C -->|false| F[motion.div animated marquee\nx: 0% to -50%]
    F --> G[LogoMarqueeItems primary]
    F --> H[LogoMarqueeItems duplicate\naria-hidden tabIndex=-1]
Loading
Prompt To Fix All With AI
This is a comment left during a code review.
Path: components/shared/EnterpriseLogoGrid.tsx
Line: 183-215

Comment:
**Animated marquee shown on first render for reduced-motion users**

`useReducedMotion()` returns `null` during SSR and before the browser media query resolves on the client. Because `null` is falsy, the ternary defaults to the animated marquee branch on initial render, so users with `prefers-reduced-motion: reduce` briefly see the animation before hydration switches to the static fallback. Changing the condition to `shouldReduceMotion !== false` treats `null` as "reduce motion" (conservative default) and avoids the flash.

```suggestion
  const shouldReduceMotion = useReducedMotion();

  return (
    <>
      {/* Mobile: scrolling marquee or static scroll fallback */}
      {shouldReduceMotion !== false ? (
```

How can I resolve this? If you propose a fix, please make it concise.

Reviews (3): Last reviewed commit: "a11y: fix inert blocking clicks + add re..." | Re-trigger Greptile

On mobile (below sm breakpoint), the enterprise logo grid is now
replaced with a horizontally scrolling marquee that shows all logos
in a continuous loop, matching the HeroStatsStrip animation pattern.

- All logos are visible on mobile (previously only 6 of 12 shown)
- Uses framer-motion for smooth infinite horizontal scroll
- Gradient mask fades edges for seamless visual loop
- Desktop grid layout (sm and above) remains unchanged
- Slightly smaller logos (40px vs 56px) in marquee for better fit

Resolves MKT-2060

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 27, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
langfuse-docs Ready Ready Preview, Comment Apr 29, 2026 4:16pm

Request Review

felixkrrr and others added 3 commits April 28, 2026 10:39
Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
- Increase marquee logo height from 40px to 48px
- Fix padding override so !py-0 !px-1 properly eliminates the
  default LinkBox padding (py-1.25 px-4.5) that was creating
  oversized hit boxes around each logo

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
The SVG logos have large whitespace margins within their 140x40
viewBox. In the marquee, use negative horizontal margin (-mx-[20px])
on the images with overflow-hidden wrapper to visually crop the
side whitespace, making logos appear larger and sit closer together.

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
Render logos at full 56px height (same as desktop) but crop to a
32px visible area with overflow-hidden. Negative margins on all
sides (-mx-22px, -my-12px) trim the whitespace baked into the SVG
viewBoxes, making the actual logo content appear much larger and
tightly packed.

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
Increase image from 56px to 72px, visible container from 32px to
44px, and adjust crop margins (-mx-28px, -my-14px) to keep the
whitespace trimmed while showing logos at a larger size.

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
Replace negative-margin cropping approach with scale-150 transform
which reliably scales up the logo content by 50%. Container is 44px
tall with overflow-hidden and flex items-center to vertically center
the scaled logos.

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
- Scale down from 150% to 125%
- Remove all padding on marquee LinkBoxes (!p-0) for tighter spacing

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
… gaps

Apply -mx-5 on each logo's overflow-hidden wrapper to overlap the
SVG's baked-in horizontal whitespace, pulling logos much closer
together in the mobile marquee.

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
@felixkrrr felixkrrr marked this pull request as ready for review April 28, 2026 10:51
@dosubot dosubot Bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Apr 28, 2026
@github-actions
Copy link
Copy Markdown

@claude review

@felixkrrr
Copy link
Copy Markdown
Contributor Author

@greptileai

Comment thread components/shared/EnterpriseLogoGrid.tsx Outdated
Mark the second copy of LogoMarqueeItems with aria-hidden='true'
so assistive technology doesn't announce every logo twice.

Addresses PR review comment from greptile.

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
Comment thread components/shared/EnterpriseLogoGrid.tsx Outdated
Comment thread components/shared/EnterpriseLogoGrid.tsx
Comment thread components/shared/EnterpriseLogoGrid.tsx Outdated
- Replace aria-hidden='true' with inert on the duplicate marquee
  wrapper so focusable links are also removed from tab order (P1)
- Remove dead grid-cols-3 class from desktop grid wrapper
- Remove unused Fragment import

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
Comment thread components/shared/EnterpriseLogoGrid.tsx Outdated
Comment thread components/shared/EnterpriseLogoGrid.tsx Outdated
- Use useReducedMotion() from framer-motion to disable the marquee
  animation when the user has prefers-reduced-motion enabled,
  addressing WCAG 2.2.2 (Pause, Stop, Hide, Level A).
- Remove role='marquee' from the mobile wrapper — the DOM content
  is static (only CSS transforms animate), so the live-region role
  is semantically incorrect. Matches HeroStatsStrip pattern.

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
Comment thread components/shared/EnterpriseLogoGrid.tsx Outdated
Comment thread components/shared/EnterpriseLogoGrid.tsx Outdated
- Replace inert wrapper with per-LinkBox aria-hidden/tabIndex on
  the duplicate copy. The inert attribute blocked all interaction
  (clicks/taps) on the duplicate logos, which are visible ~50% of
  the marquee cycle. Now duplicate links remain clickable but are
  hidden from AT and removed from tab order.

- When prefers-reduced-motion is enabled, render a horizontally
  scrollable row (overflow-x-auto, single copy, hidden scrollbar)
  instead of the animated marquee. Previously the animation was
  just disabled, leaving logos clipped by overflow-hidden with no
  way to reach them.

Co-authored-by: felixkrrr <felixkrrr@users.noreply.github.com>
Copy link
Copy Markdown

@claude claude Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Author iterated through accessibility feedback and the current revision applies the recommended fixes (per-item aria-hidden/tabIndex on the duplicate copy, branched JSX for reduced motion); LGTM.

Extended reasoning...

Overview

This PR replaces the mobile 3-column logo grid with a framer-motion-powered horizontal marquee on components/shared/EnterpriseLogoGrid.tsx, while keeping the desktop 6-column grid unchanged. The current revision is the result of several review iterations addressing accessibility concerns (duplicate-content announcements, keyboard tab order, reduced-motion handling, semantic role usage, dead code).

Security risks

None. This is a presentational marketing component on a public landing page — no auth, no user input, no data flow, no network calls beyond the existing static logo image imports. The framer-motion dependency was already in use elsewhere in the codebase (e.g. HeroStatsStrip, FeatureTabs).

Level of scrutiny

Moderate — the PR is small (~80 lines net) and self-contained, but a11y nuances around marquee patterns warranted careful review. After multiple iterations, the current implementation correctly:

  • Uses per-LinkBox aria-hidden/tabIndex={-1} on the duplicate copy (avoids both aria-hidden-on-focusable-content and inert-blocks-clicks pitfalls)
  • Branches to an overflow-x-auto scrollable fallback when useReducedMotion() is true (avoids clipping content)
  • Drops the misleading role="marquee"
  • Cleans up unused imports and dead Tailwind utilities

Other factors

The author has been highly responsive across multiple review cycles, addressing every previously-raised critical issue with the suggested fix shape. Greptile's open nit on the -mx-5 negative margin in the compact image wrapper is minor (potential adjacent-logo bleed under tight packing) and not blocking. No bug-hunter findings on the current revision.

@felixkrrr
Copy link
Copy Markdown
Contributor Author

@greptileai

@felixkrrr felixkrrr added this pull request to the merge queue Apr 29, 2026
@dosubot dosubot Bot added the auto-merge This PR is set to be merged label Apr 29, 2026
@github-merge-queue github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Apr 29, 2026
@dosubot dosubot Bot removed the auto-merge This PR is set to be merged label Apr 29, 2026
@felixkrrr felixkrrr added this pull request to the merge queue Apr 29, 2026
@dosubot dosubot Bot added the auto-merge This PR is set to be merged label Apr 29, 2026
Merged via the queue into main with commit 558297d Apr 29, 2026
14 checks passed
@felixkrrr felixkrrr deleted the cursor/mobile-logo-marquee-780c branch April 29, 2026 16:47
@dosubot dosubot Bot removed the auto-merge This PR is set to be merged label Apr 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants