Back to Component Explorer
Neo-Brutalist Stacked Card Switcher
testimonialsBold neo-brutalist review switcher with thick offset borders, index navigation, and active quote highlights.
#testimonials#brutalist#stacked#interactive
Live Interactive Preview
NEO-BRUTALIST STACK
WHAT BUILDERS SAY
01 / 04
VERIFIED REVIEW5.0 ★
"Bold design, thick borders, zero BS. Highly customizable components that stand out from generic AI templates."
Alex Rivers
Frontend Lead @ Vercel
Component Source Code
Select language in the dropdownBrutalistMarqueeTestimonial.tsx
1'use client';23import React, { useState } from 'react';4import { ChevronLeft, ChevronRight } from 'lucide-react';56const REVIEWS = [7 { name: 'Alex Rivers', role: 'Frontend Lead @ Vercel', text: 'Bold design, thick borders, zero BS. Highly customizable components that stand out from generic AI templates.' },8 { name: 'Maya Lin', role: 'Product Designer @ Linear', text: 'Neo-brutalist cards with perfect contrast in both dark and light modes. Copy paste worked instantly without setup.' },9 { name: 'Jaxson Reed', role: 'Fullstack Developer @ Supabase', text: 'Saved me 3 days of styling. The hard shadow offset and tactile feel are 10/10.' },10 { name: 'Sofia Al-Mansoor', role: 'VP of Product @ Stripe', text: 'Incredible speed of integration. The layout cards look pixel perfect on mobile and ultra-wide screens.' }11];1213export default function BrutalistMarqueeTestimonial() {14 const [index, setIndex] = useState(0);1516 const prev = () => setIndex((i) => (i === 0 ? REVIEWS.length - 1 : i - 1));17 const next = () => setIndex((i) => (i === REVIEWS.length - 1 ? 0 : i + 1));1819 const item = REVIEWS[index];2021 return (22 <div className="w-full max-w-4xl mx-auto py-8 px-4 font-mono select-none">23 {/* Header */}24 <div className="flex items-center justify-between mb-6">25 <div>26 <span className="rounded-md border-2 border-slate-900 dark:border-slate-100 bg-amber-300 dark:bg-amber-400 px-2 py-0.5 text-[10px] font-black text-slate-900 uppercase">27 NEO-BRUTALIST STACK28 </span>29 <h3 className="text-lg font-black text-slate-900 dark:text-slate-100 mt-1">WHAT BUILDERS SAY</h3>30 </div>31 <div className="flex items-center gap-2">32 <span className="text-xs font-black text-slate-900 dark:text-slate-100">33 0{index + 1} / 0{REVIEWS.length}34 </span>35 <button36 onClick={prev}37 className="flex h-8 w-8 items-center justify-center rounded-lg border-2 border-slate-900 dark:border-slate-100 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 shadow-[2px_2px_0px_0px_#000] dark:shadow-[2px_2px_0px_0px_#fff] active:translate-x-0.5 active:translate-y-0.5 transition"38 >39 <ChevronLeft className="h-4 w-4" />40 </button>41 <button42 onClick={next}43 className="flex h-8 w-8 items-center justify-center rounded-lg border-2 border-slate-900 dark:border-slate-100 bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-100 shadow-[2px_2px_0px_0px_#000] dark:shadow-[2px_2px_0px_0px_#fff] active:translate-x-0.5 active:translate-y-0.5 transition"44 >45 <ChevronRight className="h-4 w-4" />46 </button>47 </div>48 </div>4950 {/* Main Brutalist Stack Card */}51 <div className="rounded-3xl border-3 border-slate-900 dark:border-slate-100 bg-amber-300 dark:bg-slate-900 p-6 sm:p-8 shadow-[8px_8px_0px_0px_#000] dark:shadow-[8px_8px_0px_0px_#fff] text-slate-900 dark:text-slate-100 transition-all">52 <div className="flex items-center justify-between mb-4">53 <span className="rounded-md border-2 border-slate-900 dark:border-slate-100 bg-white dark:bg-slate-800 px-2.5 py-1 text-[11px] font-black uppercase text-slate-900 dark:text-slate-100">54 VERIFIED REVIEW55 </span>56 <span className="text-sm font-black text-slate-900 dark:text-slate-100">5.0 ★</span>57 </div>5859 <p className="text-base sm:text-lg font-bold leading-relaxed text-slate-900 dark:text-slate-100 mt-3">60 "{item.text}"61 </p>6263 <div className="mt-6 pt-4 border-t-2 border-slate-900 dark:border-slate-100 flex items-center justify-between">64 <div>65 <h4 className="text-sm font-black text-slate-900 dark:text-slate-100">{item.name}</h4>66 <p className="text-xs font-bold text-slate-800 dark:text-slate-400">{item.role}</p>67 </div>68 <button69 onClick={next}70 className="rounded-xl border-2 border-slate-900 dark:border-slate-100 bg-white dark:bg-slate-800 px-3 py-1.5 text-xs font-black text-slate-900 dark:text-slate-100 shadow-[3px_3px_0px_0px_#000] dark:shadow-[3px_3px_0px_0px_#fff]"71 >72 NEXT QUOTE →73 </button>74 </div>75 </div>76 </div>77 );78}Installation & Integration Guide
Step 1: Tailwind CSS v4 Setup
Tailwind DocsIf you do not have Tailwind installed yet, run this installation command:
Terminal
npm install tailwindcss @tailwindcss/postcss postcss
Then add the Tailwind directive to your main stylesheet (globals.css):
@import "tailwindcss";
Step 2: Install Icon Dependencies
npm install lucide-react react-icons
Step 3: Add Component File
Create a new file in your project at src/components/testimonials/BrutalistMarqueeTestimonial.tsx and paste the copied code from the source viewer above.
Step 4: Usage Example
ExamplePage.tsx
1import NeoBrutalistStackedCardSwitcher from '@/components/testimonials/BrutalistMarqueeTestimonial';23export default function ExamplePage() {4 return (5 <main className="p-8 flex items-center justify-center min-h-screen">6 <NeoBrutalistStackedCardSwitcher />7 </main>8 );9}