Dual-Row Counter Scrolling Marquee
testimonialsHeader double-row marquee with top row scrolling left and bottom row scrolling right simultaneously.
Empowering high-growth products worldwide
Marcus Vance
@marcus_v
"Game-changer for our team. Deploying UI components has never been this smooth."
Elena Rostova
@elena_design
"The attention to typography and spatial hierarchy is 10/10."
David Kim
@dkim_dev
"Zero hydration errors and instant Tailwind v4 compatibility."
Marcus Vance
@marcus_v
"Game-changer for our team. Deploying UI components has never been this smooth."
Elena Rostova
@elena_design
"The attention to typography and spatial hierarchy is 10/10."
David Kim
@dkim_dev
"Zero hydration errors and instant Tailwind v4 compatibility."
Marcus Vance
@marcus_v
"Game-changer for our team. Deploying UI components has never been this smooth."
Elena Rostova
@elena_design
"The attention to typography and spatial hierarchy is 10/10."
David Kim
@dkim_dev
"Zero hydration errors and instant Tailwind v4 compatibility."
Sophia Sterling
@sophias
"Extremely clean copy-paste source code. Matches live preview 100%."
Liam Croft
@liam_croft
"The dual-row marquee counter scrolling is visually spectacular."
Amara Okafor
@amara_ux
"Beautiful dark and light mode adaptation for production apps."
Sophia Sterling
@sophias
"Extremely clean copy-paste source code. Matches live preview 100%."
Liam Croft
@liam_croft
"The dual-row marquee counter scrolling is visually spectacular."
Amara Okafor
@amara_ux
"Beautiful dark and light mode adaptation for production apps."
Sophia Sterling
@sophias
"Extremely clean copy-paste source code. Matches live preview 100%."
Liam Croft
@liam_croft
"The dual-row marquee counter scrolling is visually spectacular."
Amara Okafor
@amara_ux
"Beautiful dark and light mode adaptation for production apps."
Component Source Code
Select language in the dropdown1'use client';23import React from 'react';4import { MessageSquare, Star } from 'lucide-react';56const TOP_REVIEWS = [7 { name: 'Marcus Vance', role: '@marcus_v', text: 'Game-changer for our team. Deploying UI components has never been this smooth.', rating: 5 },8 { name: 'Elena Rostova', role: '@elena_design', text: 'The attention to typography and spatial hierarchy is 10/10.', rating: 5 },9 { name: 'David Kim', role: '@dkim_dev', text: 'Zero hydration errors and instant Tailwind v4 compatibility.', rating: 5 }10];1112const BOTTOM_REVIEWS = [13 { name: 'Sophia Sterling', role: '@sophias', text: 'Extremely clean copy-paste source code. Matches live preview 100%.', rating: 5 },14 { name: 'Liam Croft', role: '@liam_croft', text: 'The dual-row marquee counter scrolling is visually spectacular.', rating: 5 },15 { name: 'Amara Okafor', role: '@amara_ux', text: 'Beautiful dark and light mode adaptation for production apps.', rating: 5 }16];1718export default function DualRowCounterMarquee() {19 return (20 <div className="w-full max-w-7xl mx-auto py-8 select-none">21 {/* Header */}22 <div className="flex flex-col items-center text-center mb-6 px-4">23 <span className="rounded-full bg-indigo-50 dark:bg-indigo-950/60 border border-indigo-200 dark:border-indigo-800 px-3.5 py-1 text-[11px] font-bold text-indigo-600 dark:text-indigo-400 uppercase tracking-widest">24 DUAL MOTION25 </span>26 <h2 className="text-2xl sm:text-3xl font-extrabold text-slate-900 dark:text-slate-100 mt-2 tracking-tight">27 Empowering high-growth products worldwide28 </h2>29 </div>3031 <div className="w-full overflow-hidden space-y-4 py-2">32 <div className="group flex w-max gap-4 hover:[animation-play-state:paused] animate-[marquee_25s_linear_infinite]">33 {[...TOP_REVIEWS, ...TOP_REVIEWS, ...TOP_REVIEWS].map((item, idx) => (34 <div35 key={idx}36 className="w-72 sm:w-80 shrink-0 rounded-2xl border border-slate-200 dark:border-slate-800 bg-white dark:bg-slate-900 p-4 shadow-md transition-colors"37 >38 <div className="flex items-center justify-between mb-2">39 <div className="flex items-center gap-2">40 <div className="h-7 w-7 rounded-full bg-blue-600 flex items-center justify-center font-bold text-white text-[11px]">41 {item.name.charAt(0)}42 </div>43 <div>44 <h4 className="text-xs font-bold text-slate-900 dark:text-slate-100">{item.name}</h4>45 <p className="text-[10px] text-slate-400 font-mono">{item.role}</p>46 </div>47 </div>48 <MessageSquare className="h-3.5 w-3.5 text-blue-500" />49 </div>50 <p className="text-xs text-slate-600 dark:text-slate-300 font-medium leading-relaxed">51 "{item.text}"52 </p>53 </div>54 ))}55 </div>5657 <div className="group flex w-max gap-4 hover:[animation-play-state:paused] animate-[marquee-reverse_25s_linear_infinite]">58 {[...BOTTOM_REVIEWS, ...BOTTOM_REVIEWS, ...BOTTOM_REVIEWS].map((item, idx) => (59 <div60 key={idx}61 className="w-72 sm:w-80 shrink-0 rounded-2xl border border-slate-200 dark:border-slate-800 bg-slate-50 dark:bg-slate-900/80 p-4 shadow-md transition-colors"62 >63 <div className="flex items-center justify-between mb-2">64 <div className="flex items-center gap-2">65 <div className="h-7 w-7 rounded-full bg-indigo-600 flex items-center justify-center font-bold text-white text-[11px]">66 {item.name.charAt(0)}67 </div>68 <div>69 <h4 className="text-xs font-bold text-slate-900 dark:text-slate-100">{item.name}</h4>70 <p className="text-[10px] text-slate-400 font-mono">{item.role}</p>71 </div>72 </div>73 <div className="flex items-center text-amber-400">74 <Star className="h-3 w-3 fill-amber-400" />75 <span className="text-[10px] font-bold text-slate-500 ml-1">5.0</span>76 </div>77 </div>78 <p className="text-xs text-slate-600 dark:text-slate-300 font-medium leading-relaxed">79 "{item.text}"80 </p>81 </div>82 ))}83 </div>84 </div>85 </div>86 );87}Installation & Integration Guide
If you do not have Tailwind installed yet, run this installation command:
Then add the Tailwind directive to your main stylesheet (globals.css):
Step 2: Install Icon Dependencies
Step 3: Add Component File
Create a new file in your project at src/components/testimonials/DualRowCounterMarquee.tsx and paste the copied code from the source viewer above.
Step 4: Usage Example
1import DualRowCounterScrollingMarquee from '@/components/testimonials/DualRowCounterMarquee';23export default function ExamplePage() {4 return (5 <main className="p-8 flex items-center justify-center min-h-screen">6 <DualRowCounterScrollingMarquee />7 </main>8 );9}