Glin UI
Block / Organismbeta

Testimonials Wall

Social proof as masonry columns, vertical marquee columns or a single featured quote.

Edit on GitHub

Loved by teams

What builders say

Placeholder names and quotes for layout only.

Placeholder quote: the setup took an afternoon and the team stopped asking where the buttons came from.

APAlex PlaceholderEngineer, Acme

Placeholder quote: accessible by default, which saved us a long audit.

SESam ExampleDesigner, Nimbus

Placeholder quote: the tokens made dark mode a one line change.

JSJo SampleFounder, Orbit

Placeholder quote: we shipped the marketing site in a week using only the blocks.

KDKai DemoLead, Vertex

Placeholder quote: calm, fast and easy to theme.

MTMina TestPM, Lumen

Placeholder quote: documentation answers the questions before we ask them.

RFRin FakeCTO, Helio

Installation

Install from
pnpm dlx @glinui/cli@latest add testimonials-wall

Prefer the package?

Usage

Own design, no photos: avatars are initials. Demo names and quotes are placeholders, never real people.

marquee-columns scrolls two columns in opposite directions with the Web Animations API. Hovering or focusing a column pauses it. With reduced motion or motion level none the columns render static and complete.

Variants

Marquee columns and a featured quote.

Marquee columns

Placeholder quote: the setup took an afternoon and the team stopped asking where the buttons came from.

APAlex PlaceholderEngineer, Acme

Placeholder quote: the tokens made dark mode a one line change.

JSJo SampleFounder, Orbit

Placeholder quote: accessible by default, which saved us a long audit.

SESam ExampleDesigner, Nimbus

Single quote

Placeholder quote: the setup took an afternoon and the team stopped asking where the buttons came from.

APAlex PlaceholderEngineer, Acme
<TestimonialsWall items={items} layout="marquee-columns" />
<TestimonialsWall items={items} layout="single-quote" />

States

Plain shell.

Plain variant

Placeholder quote: the setup took an afternoon and the team stopped asking where the buttons came from.

APAlex PlaceholderEngineer, Acme

Placeholder quote: accessible by default, which saved us a long audit.

SESam ExampleDesigner, Nimbus

Placeholder quote: the tokens made dark mode a one line change.

JSJo SampleFounder, Orbit
<TestimonialsWall items={items} variant="plain" />

In a layout

Social proof, FAQ, CTA and footer stacked as a page ending.

Trusted by builders

Placeholder quote: the setup took an afternoon and the team stopped asking where the buttons came from.

APAlex PlaceholderEngineer, Acme

Placeholder quote: accessible by default, which saved us a long audit.

SESam ExampleDesigner, Nimbus

Placeholder quote: the tokens made dark mode a one line change.

JSJo SampleFounder, Orbit

FAQ

Start today

<TestimonialsWall items={items} />
<FaqSection items={faq} />
<CtaBand title="Start today" />
<FooterBlock groups={groups} />

Accessibility

  • A `section` labelled by its heading.
  • Each quote is a figure with blockquote and cite.
  • Ratings are `role="img"` with a text label.
  • The marquee copy is aria-hidden and inert, so screen readers read each quote once.

ARIA Attributes

  • `aria-labelledby` on the section
  • `aria-label="Rated N out of 5"` on stars

Reduced Motion

No scrolling and no WAAPI animation. Columns show every quote in normal flow.

Affected properties

marquee scroll

API Reference

PropTypeRequiredDefaultDescription
itemsTestimonialItem[]Yes-quote, name, optional role, rating (0 to 5) and id.
layoutTestimonialsWallLayoutNomasonry-columnsColumn flow, auto-scroll columns, or one featured quote.
variantBlockVariantNoambient (glinr)Shell look. `plain` under the minimal style, `glass` is opt-in and needs a backdrop.
eyebrow / title / descriptionReactNode--Section header. The title labels the section.
durationnumberNo40Seconds per marquee loop.
descriptionReact.ReactNodeNo-Auto-generated from TypeScript source.
eyebrowReact.ReactNodeNo-Auto-generated from TypeScript source.
titleReact.ReactNodeNo-Auto-generated from TypeScript source.

Source

Import directly from the package or browse the source on GitHub. Click any file to view it.

Import

import { TestimonialsWall } from "@glinui/ui"

Dependencies

@glinui/ui@glinui/motion@phosphor-icons/react

Generated API Snapshot

Beta

Auto-extracted from TypeScript source in packages/ui/src/components/testimonials-wall.tsx. This section is in beta and may lag behind hand-curated docs. Regenerate with pnpm --filter @glinui/docs api:generate.

Generated: 2026-10-08T01:41:21.546Z · Full index: /docs/api-metadata

Primary Props Type

TestimonialsWallProps

TestimonialsWallProps

PropTypeRequiredDefaultDescription
descriptionReact.ReactNodeNo--
durationnumberNo40Seconds for one marquee loop.
eyebrowReact.ReactNodeNo--
itemsTestimonialItem[]Yes--
layoutTestimonialsWallLayoutNo"masonry-columns"-
titleReact.ReactNodeNo--
variantBlockVariantNo-Shell look of the cards. Omit to follow the ambient style.