1 GitHub star = 1 new component.

Star the repo
Testimonials

Testimonial Wall Glass

Masonry-style customer review wall with frosted glass cards.

testimonialssocial-proofreviewsratingsglassmorphism
Live Preview
Customer Love

Trusted by 10,000+ Developers Worldwide

See how engineering teams ship faster and build beautiful Astro products with our component kit.

4.9 / 5.0
โ˜…โ˜…โ˜…โ˜…โ˜…
Over 1,200 Reviews
99.8%Satisfaction RateBased on 2026 Survey
3.5xFaster ShippingAverage Team Velocity
โ˜…โ˜…โ˜…โ˜…โ˜…

"The UI/UX quality is astounding. We built our entire SaaS marketing site in a weekend and our Lighthouse scores went from 78 to a solid 100."

SK
Sarah KowalskiStaff Frontend Engineer at CloudScale
โ˜…โ˜…โ˜…โ˜…โ˜…

"Strict TypeScript support made integrating these components into our existing React 5 monorepo completely frictionless."

DL
David LinCTO at NexusFintech
โ˜…โ˜…โ˜…โ˜…โ˜…

"The accessible form controls and micro-interactions feel like custom handcrafted components. Our users constantly compliment the new dashboard."

EV
Elena VegaHead of Product at DevMetrics
โ˜…โ˜…โ˜…โ˜…โ˜…

"Finally a component library that doesn't force bloated heavy dependencies. Pure React, pure CSS, ultra clean."

TH
Thomas HuberSenior Systems Architect
โ˜…โ˜…โ˜…โ˜…โ˜…

"The interactive 3D Galaxy hero alone saved our team weeks of WebGL experimentation. Outstanding work!"

AR
Aria RossiCreative Director at OrbitLabs

Usage

Copy and paste this code into your React component:

tsx
import { TestimonialWallGlass } from 'react-component-kit-ui/sections';

<TestimonialWallGlass />

Manual Installation

If you are not using the npm package, create a new file and paste the following code: src/components/sections/TestimonialWallGlass.tsx + TestimonialWallGlass.css:

TestimonialWallGlass.tsx
'use client';

import './TestimonialWallGlass.css';

/**
 * TestimonialWallGlass โ€” Full-page social proof testimonial wall with verified customer cards and stats.
 * 
 * @param {string} badge - Eyebrow badge text.
 * @param {string} title - Section main heading.
 * @param {string} subtitle - Supporting description text.
 */
export interface TestimonialWallGlassProps {
  badge?: string;
  title?: string;
  subtitle?: string;
  className?: string;
}

export function TestimonialWallGlass({
  badge = "Customer Love",
  title = "Trusted by 10,000+ Developers Worldwide",
  subtitle = "See how engineering teams ship faster and build beautiful Astro products with our component kit.",
  className = ""
}: TestimonialWallGlassProps) {
  return (
    <>
      <div className="cq-testimonial-wall-glass-cq" data-rk-3eb70b="">
      <section className={`testimonials-section ${className}`} aria-labelledby="testimonials-title" data-rk-3eb70b="">
        <div className="testimonials-bg" aria-hidden="true" data-rk-3eb70b="">
          <div className="test-glow test-glow--1" data-rk-3eb70b=""></div>
          <div className="test-glow test-glow--2" data-rk-3eb70b=""></div>
        </div>
      
        <div className="container" data-rk-3eb70b="">
          {/* Header */}
          <div className="section-header" data-rk-3eb70b="">
            {badge && <span className="section-badge" data-rk-3eb70b="">{badge}</span>}
            <h2 id="testimonials-title" className="section-title" data-rk-3eb70b="">{title}</h2>
            <p className="section-subtitle" data-rk-3eb70b="">{subtitle}</p>
      
            {/* Trust Metrics Bar */}
            <div className="trust-bar" data-rk-3eb70b="">
              <div className="trust-stat" data-rk-3eb70b="">
                <span className="trust-stat__num" data-rk-3eb70b="">4.9 / 5.0</span>
                <div className="trust-stars" data-rk-3eb70b="">โ˜…โ˜…โ˜…โ˜…โ˜…</div>
                <span className="trust-stat__label" data-rk-3eb70b="">Over 1,200 Reviews</span>
              </div>
              <div className="trust-sep" data-rk-3eb70b=""></div>
              <div className="trust-stat" data-rk-3eb70b="">
                <span className="trust-stat__num" data-rk-3eb70b="">99.8%</span>
                <span className="trust-stat__sub" data-rk-3eb70b="">Satisfaction Rate</span>
                <span className="trust-stat__label" data-rk-3eb70b="">Based on 2026 Survey</span>
              </div>
              <div className="trust-sep" data-rk-3eb70b=""></div>
              <div className="trust-stat" data-rk-3eb70b="">
                <span className="trust-stat__num" data-rk-3eb70b="">3.5x</span>
                <span className="trust-stat__sub" data-rk-3eb70b="">Faster Shipping</span>
                <span className="trust-stat__label" data-rk-3eb70b="">Average Team Velocity</span>
              </div>
            </div>
          </div>
      
          {/* Testimonials Grid / Wall */}
          <div className="testimonial-wall" data-rk-3eb70b="">
            {/* Card 1 */}
            <article className="test-card" data-rk-3eb70b="">
              <div className="test-card__stars" data-rk-3eb70b="">โ˜…โ˜…โ˜…โ˜…โ˜…</div>
              <p className="test-card__quote" data-rk-3eb70b="">
                "The UI/UX quality is astounding. We built our entire SaaS marketing site in a weekend and our Lighthouse scores went from 78 to a solid 100."
              </p>
              <div className="test-card__author" data-rk-3eb70b="">
                <div className="author-avatar author-avatar--1" data-rk-3eb70b="">SK</div>
                <div className="author-info" data-rk-3eb70b="">
                  <span className="author-name" data-rk-3eb70b="">Sarah Kowalski</span>
                  <span className="author-role" data-rk-3eb70b="">Staff Frontend Engineer at CloudScale</span>
                </div>
              </div>
            </article>
      
            {/* Card 2 (Featured Highlight) */}
            <article className="test-card test-card--featured" data-rk-3eb70b="">
              <span className="featured-badge" data-rk-3eb70b="">Featured Case Study</span>
              <div className="test-card__stars" data-rk-3eb70b="">โ˜…โ˜…โ˜…โ˜…โ˜…</div>
              <p className="test-card__quote" data-rk-3eb70b="">
                "Zero client runtime JS combined with modern glassmorphic aesthetics is exactly what our agency needed. It cut our design-to-production turnaround by 70%."
              </p>
              <div className="test-card__author" data-rk-3eb70b="">
                <div className="author-avatar author-avatar--2" data-rk-3eb70b="">MA</div>
                <div className="author-info" data-rk-3eb70b="">
                  <span className="author-name" data-rk-3eb70b="">Marc Andersson</span>
                  <span className="author-role" data-rk-3eb70b="">Founder & Design Lead at HyperStudio</span>
                </div>
              </div>
            </article>
      
            {/* Card 3 */}
            <article className="test-card" data-rk-3eb70b="">
              <div className="test-card__stars" data-rk-3eb70b="">โ˜…โ˜…โ˜…โ˜…โ˜…</div>
              <p className="test-card__quote" data-rk-3eb70b="">
                "Strict TypeScript support made integrating these components into our existing React 5 monorepo completely frictionless."
              </p>
              <div className="test-card__author" data-rk-3eb70b="">
                <div className="author-avatar author-avatar--3" data-rk-3eb70b="">DL</div>
                <div className="author-info" data-rk-3eb70b="">
                  <span className="author-name" data-rk-3eb70b="">David Lin</span>
                  <span className="author-role" data-rk-3eb70b="">CTO at NexusFintech</span>
                </div>
              </div>
            </article>
      
            {/* Card 4 */}
            <article className="test-card" data-rk-3eb70b="">
              <div className="test-card__stars" data-rk-3eb70b="">โ˜…โ˜…โ˜…โ˜…โ˜…</div>
              <p className="test-card__quote" data-rk-3eb70b="">
                "The accessible form controls and micro-interactions feel like custom handcrafted components. Our users constantly compliment the new dashboard."
              </p>
              <div className="test-card__author" data-rk-3eb70b="">
                <div className="author-avatar author-avatar--4" data-rk-3eb70b="">EV</div>
                <div className="author-info" data-rk-3eb70b="">
                  <span className="author-name" data-rk-3eb70b="">Elena Vega</span>
                  <span className="author-role" data-rk-3eb70b="">Head of Product at DevMetrics</span>
                </div>
              </div>
            </article>
      
            {/* Card 5 */}
            <article className="test-card" data-rk-3eb70b="">
              <div className="test-card__stars" data-rk-3eb70b="">โ˜…โ˜…โ˜…โ˜…โ˜…</div>
              <p className="test-card__quote" data-rk-3eb70b="">
                "Finally a component library that doesn't force bloated heavy dependencies. Pure React, pure CSS, ultra clean."
              </p>
              <div className="test-card__author" data-rk-3eb70b="">
                <div className="author-avatar author-avatar--5" data-rk-3eb70b="">TH</div>
                <div className="author-info" data-rk-3eb70b="">
                  <span className="author-name" data-rk-3eb70b="">Thomas Huber</span>
                  <span className="author-role" data-rk-3eb70b="">Senior Systems Architect</span>
                </div>
              </div>
            </article>
      
            {/* Card 6 */}
            <article className="test-card" data-rk-3eb70b="">
              <div className="test-card__stars" data-rk-3eb70b="">โ˜…โ˜…โ˜…โ˜…โ˜…</div>
              <p className="test-card__quote" data-rk-3eb70b="">
                "The interactive 3D Galaxy hero alone saved our team weeks of WebGL experimentation. Outstanding work!"
              </p>
              <div className="test-card__author" data-rk-3eb70b="">
                <div className="author-avatar author-avatar--6" data-rk-3eb70b="">AR</div>
                <div className="author-info" data-rk-3eb70b="">
                  <span className="author-name" data-rk-3eb70b="">Aria Rossi</span>
                  <span className="author-role" data-rk-3eb70b="">Creative Director at OrbitLabs</span>
                </div>
              </div>
            </article>
          </div>
        </div>
      </section>
      </div>
    </>
  );
}

export default TestimonialWallGlass;
TestimonialWallGlass.css
/* TestimonialWallGlass โ€” ported from astro-component-kit (sections/TestimonialWallGlass.astro) */

.cq-testimonial-wall-glass-cq:where([data-rk-3eb70b]) { container-type: inline-size; }
.testimonials-section:where([data-rk-3eb70b]) {
  position: relative;
  padding: var(--sp-20, 5rem) var(--sp-6, 1.5rem);
  background: var(--c-bg-primary, #030712);
  overflow: hidden;
}

.testimonials-bg:where([data-rk-3eb70b]) {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 0;
}

.test-glow:where([data-rk-3eb70b]) {
  position: absolute;
  border-radius: 50%;
  filter: blur(120px);
  opacity: 0.2;
}

.test-glow--1:where([data-rk-3eb70b]) {
  top: 20%;
  left: 10%;
  width: 450px;
  height: 450px;
  background: radial-gradient(circle, #6366f1, transparent 70%);
}

.test-glow--2:where([data-rk-3eb70b]) {
  bottom: 20%;
  right: 10%;
  width: 450px;
  height: 450px;
  background: radial-gradient(circle, #eab308, transparent 70%);
}

.container:where([data-rk-3eb70b]) {
  position: relative;
  z-index: 1;
  max-width: 1200px;
  margin: 0 auto;
}

.section-header:where([data-rk-3eb70b]) {
  text-align: center;
  max-width: 800px;
  margin: 0 auto var(--sp-12, 3rem);
}

.section-badge:where([data-rk-3eb70b]) {
  display: inline-flex;
  padding: 0.35rem 0.9rem;
  border-radius: 9999px;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  background: color-mix(in srgb, var(--c-primary, #b8860b) 12%, transparent);
  color: #eab308;
  border: 1px solid rgba(234, 179, 8, 0.25);
  margin-bottom: var(--sp-4, 1rem);
}

.section-title:where([data-rk-3eb70b]) {
  font-size: clamp(2rem, 4vw, 3rem);
  font-weight: 900;
  color: #fff;
  line-height: 1.15;
  letter-spacing: -0.02em;
  margin: 0 0 var(--sp-4, 1rem);
}

.section-subtitle:where([data-rk-3eb70b]) {
  font-size: 1.1rem;
  color: #94a3b8;
  line-height: 1.6;
  margin: 0 0 2rem;
}

/* Trust Bar */
.trust-bar:where([data-rk-3eb70b]) {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 2rem;
  padding: 1.25rem 2rem;
  background: rgba(15, 23, 42, 0.7);
  border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
  border-radius: 16px;
  backdrop-filter: blur(12px);
  max-width: 750px;
  margin: 0 auto;
}

.trust-stat:where([data-rk-3eb70b]) {
  text-align: center;
}

.trust-stat__num:where([data-rk-3eb70b]) {
  display: block;
  font-size: 1.5rem;
  font-weight: 900;
  color: #fff;
  line-height: 1.2;
}

.trust-stars:where([data-rk-3eb70b]) {
  color: #eab308;
  font-size: 0.9rem;
  letter-spacing: 2px;
  margin: 0.1rem 0;
}

.trust-stat__sub:where([data-rk-3eb70b]) {
  display: block;
  font-size: 0.85rem;
  font-weight: 700;
  color: #10b981;
}

.trust-stat__label:where([data-rk-3eb70b]) {
  display: block;
  font-size: 0.72rem;
  color: #64748b;
  font-weight: 500;
}

.trust-sep:where([data-rk-3eb70b]) {
  width: 1px;
  height: 40px;
  background: rgb(var(--ink-rgb, 255 255 255) / 0.1);
}

/* Wall Grid */
.testimonial-wall:where([data-rk-3eb70b]) {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1.5rem;
}

.test-card:where([data-rk-3eb70b]) {
  position: relative;
  background: rgba(15, 23, 42, 0.55);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
  border-radius: var(--r-xl, 18px);
  padding: 1.75rem;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  transition: transform 0.3s ease, border-color 0.3s ease;
}

.test-card:hover:where([data-rk-3eb70b]) {
  transform: translateY(-4px);
  border-color: rgb(var(--ink-rgb, 255 255 255) / 0.2);
}

.test-card--featured:where([data-rk-3eb70b]) {
  background: rgba(25, 30, 60, 0.75);
  border-color: rgba(99, 102, 241, 0.4);
  box-shadow: 0 10px 30px -10px rgba(99, 102, 241, 0.25);
}

.featured-badge:where([data-rk-3eb70b]) {
  position: absolute;
  top: -10px;
  right: 20px;
  padding: 0.2rem 0.65rem;
  background: #6366f1;
  color: #fff;
  font-size: 0.7rem;
  font-weight: 700;
  text-transform: uppercase;
  border-radius: 9999px;
}

.test-card__stars:where([data-rk-3eb70b]) {
  color: #eab308;
  font-size: 0.95rem;
  letter-spacing: 2px;
  margin-bottom: 0.75rem;
}

.test-card__quote:where([data-rk-3eb70b]) {
  font-size: 0.95rem;
  color: #cbd5e1;
  line-height: 1.6;
  margin: 0 0 1.5rem;
  font-style: italic;
}

.test-card__author:where([data-rk-3eb70b]) {
  display: flex;
  align-items: center;
  gap: 0.85rem;
  padding-top: 1rem;
  border-top: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06);
}

.author-avatar:where([data-rk-3eb70b]) {
  width: 42px;
  height: 42px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  font-weight: 800;
  font-size: 0.85rem;
  color: #fff;
  border: 2px solid rgb(var(--ink-rgb, 255 255 255) / 0.15);
}

.author-avatar--1:where([data-rk-3eb70b]) { background: linear-gradient(135deg, #6366f1, #a855f7); }
.author-avatar--2:where([data-rk-3eb70b]) { background: linear-gradient(135deg, #eab308, #f97316); }
.author-avatar--3:where([data-rk-3eb70b]) { background: linear-gradient(135deg, #06b6d4, #3b82f6); }
.author-avatar--4:where([data-rk-3eb70b]) { background: linear-gradient(135deg, #ec4899, #8b5cf6); }
.author-avatar--5:where([data-rk-3eb70b]) { background: linear-gradient(135deg, #10b981, #059669); }
.author-avatar--6:where([data-rk-3eb70b]) { background: linear-gradient(135deg, #f43f5e, #be123c); }

.author-info:where([data-rk-3eb70b]) {
  display: flex;
  flex-direction: column;
}

.author-name:where([data-rk-3eb70b]) {
  font-size: 0.92rem;
  font-weight: 700;
  color: #fff;
}

.author-role:where([data-rk-3eb70b]) {
  font-size: 0.75rem;
  color: #64748b;
}

@container (max-width: 960px) {
  .trust-bar:where([data-rk-3eb70b]) {
    flex-direction: column;
    gap: 1rem;
  }
  .trust-sep:where([data-rk-3eb70b]) {
    width: 80%;
    height: 1px;
  }
  .testimonial-wall:where([data-rk-3eb70b]) {
    grid-template-columns: 1fr;
  }
}