Formula Won Labs

Two-row horizontal testimonial marquee

Two rows scrolling opposite directions with edge fade masks, classic social-proof section. Pure CSS animation, no framer-motion needed. Swap in real client testimonials, never fabricate quotes.

Get a site with blocks like this
import { cn } from "@/lib/utils"
import { Marquee } from "@/components/magicui/marquee"

const reviews = [
  { name: "Person One", username: "@handle1", body: "Placeholder quote about the product experience.", img: "https://avatar.vercel.sh/one" },
  { name: "Person Two", username: "@handle2", body: "Placeholder quote highlighting a specific result.", img: "https://avatar.vercel.sh/two" },
  { name: "Person Three", username: "@handle3", body: "Placeholder quote about ease of use.", img: "https://avatar.vercel.sh/three" },
  { name: "Person Four", username: "@handle4", body: "Placeholder quote about support quality.", img: "https://avatar.vercel.sh/four" },
]

const firstRow = reviews.slice(0, reviews.length / 2)
const secondRow = reviews.slice(reviews.length / 2)

const ReviewCard = ({ img, name, username, body }) => (
  <figure
    className={cn(
      "relative h-full w-64 cursor-pointer overflow-hidden rounded-xl border p-4",
      "border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]",
      "dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]"
    )}
  >
    <div className="flex flex-row items-center gap-2">
      <img className="rounded-full" width="32" height="32" alt="" src={img} />
      <div className="flex flex-col">
        <figcaption className="text-sm font-medium dark:text-white">{name}</figcaption>
        <p className="text-xs font-medium dark:text-white/40">{username}</p>
      </div>
    </div>
    <blockquote className="mt-2 text-sm">{body}</blockquote>
  </figure>
)

export function MarqueeDemo() {
  return (
    <div className="relative flex w-full flex-col items-center justify-center overflow-hidden">
      <Marquee pauseOnHover className="[--duration:20s]">
        {firstRow.map((review) => <ReviewCard key={review.username} {...review} />)}
      </Marquee>
      <Marquee reverse pauseOnHover className="[--duration:20s]">
        {secondRow.map((review) => <ReviewCard key={review.username} {...review} />)}
      </Marquee>
      <div className="from-background pointer-events-none absolute inset-y-0 left-0 w-1/4 bg-gradient-to-r" />
      <div className="from-background pointer-events-none absolute inset-y-0 right-0 w-1/4 bg-gradient-to-l" />
    </div>
  )
}
Block id: magicui-marquee-horizontalreact-tailwind · swap-content
More marquee blocks

Want the whole site, not just the block?

We ship real client sites in 3 weeks — with blocks like this one, wired to your brand.