Web InnoventixFreeCode

Logo Wall Marquee

Original · free

A pair of infinitely scrolling, pause-on-hover marquees pairing a customer logo wall with compact quote cards, with reduced-motion support.

byWeb InnoventixReact + Tailwind
marqueelogo-wallanimatedsocial-proof
Open

Copy prompt gives Claude Code, Cursor or v0 a ready-to-paste prompt that recreates this exact component.

npx shadcn@latest add https://webinnoventix.com/r/testimonial-logo-marquee.json
testimonial-logo-marquee.tsx
const logos = [
  "Northwind",
  "Loomly",
  "Cadence",
  "Meridian",
  "Brightfold",
  "Palisade",
  "Everly",
  "Kestrel",
];

const quips = [
  { text: "Best tooling decision we made this decade.", who: "Ops Lead, Cadence" },
  { text: "Cut our onboarding time by two thirds.", who: "COO, Brightfold" },
  { text: "The support alone is worth the price.", who: "Founder, Loomly" },
  { text: "Reporting our board finally trusts.", who: "CFO, Meridian" },
  { text: "It just quietly works, every single day.", who: "CTO, Palisade" },
];

export default function TestimonialLogoMarquee() {
  return (
    <section className="overflow-hidden bg-white px-6 py-16 dark:bg-zinc-950 md:py-24">
      <style>{`
        @keyframes tm-scroll-left { from { transform: translateX(0); } to { transform: translateX(-50%); } }
        @keyframes tm-scroll-right { from { transform: translateX(-50%); } to { transform: translateX(0); } }
        .tm-track { display: flex; width: max-content; }
        .tm-left { animation: tm-scroll-left 32s linear infinite; }
        .tm-right { animation: tm-scroll-right 40s linear infinite; }
        .tm-marquee:hover .tm-track { animation-play-state: paused; }
        @media (prefers-reduced-motion: reduce) {
          .tm-track { animation: none; }
        }
      `}</style>

      <div className="mx-auto max-w-2xl text-center">
        <h2 className="text-3xl font-bold tracking-tight text-balance text-zinc-900 sm:text-4xl dark:text-white">
          Trusted by teams everywhere
        </h2>
        <p className="mt-4 text-lg text-zinc-600 dark:text-zinc-400">
          From lean startups to established groups, thousands of teams build on us.
        </p>
      </div>

      <div
        className="tm-marquee relative mt-12 [mask-image:linear-gradient(to_right,transparent,black_12%,black_88%,transparent)]"
        aria-label="Logos of companies that trust us"
      >
        <div className="tm-track tm-left gap-4">
          {[...logos, ...logos].map((name, i) => (
            <span
              key={`logo-${i}`}
              className="flex items-center gap-2 rounded-xl border border-zinc-200 bg-zinc-50 px-6 py-4 dark:border-zinc-800 dark:bg-zinc-900"
              aria-hidden={i >= logos.length ? "true" : undefined}
            >
              <svg viewBox="0 0 24 24" className="h-5 w-5 fill-indigo-500" aria-hidden="true">
                <path d="M12 2l2.5 6.5L21 11l-6.5 2.5L12 20l-2.5-6.5L3 11l6.5-2.5L12 2z" />
              </svg>
              <span className="text-base font-semibold tracking-tight text-zinc-700 dark:text-zinc-200">
                {name}
              </span>
            </span>
          ))}
        </div>
      </div>

      <div
        className="tm-marquee relative mt-4 [mask-image:linear-gradient(to_right,transparent,black_12%,black_88%,transparent)]"
        aria-label="Short quotes from customers"
      >
        <div className="tm-track tm-right gap-4">
          {[...quips, ...quips].map((q, i) => (
            <figure
              key={`quip-${i}`}
              className="w-72 shrink-0 rounded-xl border border-zinc-200 bg-white p-5 shadow-sm dark:border-zinc-800 dark:bg-zinc-900"
              aria-hidden={i >= quips.length ? "true" : undefined}
            >
              <div className="flex items-center gap-0.5" aria-label="Rated 5 out of 5 stars">
                {[0, 1, 2, 3, 4].map((s) => (
                  <svg key={s} viewBox="0 0 24 24" className="h-4 w-4 fill-amber-400" aria-hidden="true">
                    <path d="M11.48 3.5a.56.56 0 011.04 0l2.12 5.11a.56.56 0 00.48.35l5.52.44c.5.04.7.66.32.99l-4.2 3.6a.56.56 0 00-.19.56l1.29 5.38a.56.56 0 01-.84.61l-4.73-2.88a.56.56 0 00-.58 0l-4.73 2.88a.56.56 0 01-.84-.61l1.29-5.38a.56.56 0 00-.19-.56l-4.2-3.6a.56.56 0 01.32-.99l5.52-.44a.56.56 0 00.48-.35L11.48 3.5z" />
                  </svg>
                ))}
              </div>
              <blockquote className="mt-3 text-sm font-medium text-zinc-800 dark:text-zinc-200">
                "{q.text}"
              </blockquote>
              <figcaption className="mt-2 text-xs text-zinc-500 dark:text-zinc-400">
                {q.who}
              </figcaption>
            </figure>
          ))}
        </div>
      </div>
    </section>
  );
}

Dependencies

None — React + Tailwind only.

Licence

Built by Web Innoventix. Free for personal and commercial use, no attribution required.

Built by Web Innoventix

Need a custom interface, a full website, or SEO that gets you cited by AI? We design, build and rank it end to end.

Get a free quote

Similar components

Browse all →
Three Card Testimonial Grid

Three Card Testimonial Grid

Original

A clean three-column grid of testimonial cards, each with a star rating, quote and an initial avatar with name and role.

Single Featured Quote

Single Featured Quote

Original

A large centred pull quote with a decorative quotation mark, five-star rating and a prominent author avatar for a single standout testimonial.

Masonry Testimonial Wall

Masonry Testimonial Wall

Original

A CSS-columns masonry wall of testimonial cards in varied lengths, each with a star rating and initial avatar for a natural, organic layout.

Aggregate Rating Spotlight

Aggregate Rating Spotlight

Original

A split layout pairing a large aggregate rating score, star row and overlapping avatar stack with two featured review cards.

Auto-Rotating Quote Carousel

Auto-Rotating Quote Carousel

Original

An auto-advancing testimonial carousel that slides and crossfades between quotes with a live progress bar, pause-on-hover, and dot plus arrow navigation.

Staggered Reveal Testimonial Grid

Staggered Reveal Testimonial Grid

Original

A testimonial grid whose cards spring in with a staggered scroll reveal and light up with an animated gradient border on hover.

Infinite Marquee Testimonial Wall

Infinite Marquee Testimonial Wall

Original

A three-row marquee wall of review cards scrolling in alternating directions that pause on hover, with a shimmering gradient headline and faded edges.

Spotlight Hero

Spotlight Hero

Original

A centred hero with a soft radial spotlight, badge and dual call-to-action.

Split Hero

Split Hero

Original

A two-column hero pairing a headline and CTAs with a product mock and social proof.

Gradient Spotlight Hero

Gradient Spotlight Hero

Original

A minimal centred hero with a soft gradient-mesh backdrop, announcement pill and dual call-to-action buttons.

App Preview Hero

App Preview Hero

Original

A centred hero that pairs headline copy with a realistic product dashboard mock built entirely from markup, complete with browser chrome and a floating notification card.

Waitlist Capture Hero

Waitlist Capture Hero

Original

A dark, focused hero with an inline email capture form and avatar social proof, ready for pre-launch waitlists.