Kodza

Testimonial Wall

A testimonials section: three columns of cards drift slowly in opposite directions, with no end and no jump, faded top and bottom. A column under the mouse slows to a stop; a pause button stops the wall.

Testimonials & logos No dependencies testimonialsreviewssocial proofcustomerssectionwallmasonryinfinite scrolllanding Added Nov 2026
/anim/testimonial-wall/ GitHub Fullscreen

With your AI

Just ask.

Say it to your AI. It gets the exact code below, not its best guess, and knows where it goes.

Add the Kodza Testimonial Wall to my page.

Not plugged in yet?
claude mcp add -t http kodza https://kodza.dev/api/mcp
Also in Codex, Cursor and VS Code.
kodza-testimonial-wall.html
<section class="kodza-testimonial-wall" data-kodza-testimonial-wall>
  <div class="kodza-testimonial-wall__inner">
    <div class="kodza-testimonial-wall__head">
      <div class="kodza-testimonial-wall__heading">
        <p class="kodza-testimonial-wall__eyebrow">Customers</p>
        <h2 class="kodza-testimonial-wall__title">Sent. Paid. Forgotten.</h2>
      </div>
      <button class="kodza-testimonial-wall__pause" type="button" aria-pressed="false" aria-label="Pause the testimonials"><svg class="kodza-testimonial-wall__ring" viewBox="0 0 40 40" aria-hidden="true"><circle cx="20" cy="20" r="19.25" /></svg><svg class="kodza-testimonial-wall__icon" viewBox="0 0 16 16" aria-hidden="true"><path class="kodza-testimonial-wall__bars" d="M5.5 4v8M10.5 4v8" /><path class="kodza-testimonial-wall__play" d="M5.5 3.8v8.4L12 8z" /></svg></button>
    </div>
    <div class="kodza-testimonial-wall__wall">
      <div class="kodza-testimonial-wall__cards">
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>I send invoices from my phone between two fittings. Most clients have paid before I'm back at the counter.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">CL</span><span class="kodza-testimonial-wall__name">Claire Lebrun</span><span class="kodza-testimonial-wall__role">Owner, Atelier Lebrun · Le Havre</span></figcaption>
        </figure>
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>The API docs open on a curl that works. We took our first payment the same afternoon.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">TF</span><span class="kodza-testimonial-wall__name">Tomás Ferreira</span><span class="kodza-testimonial-wall__role">Developer, Ondula · Porto</span></figcaption>
        </figure>
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>We moved 4,000 customers off our old billing in one weekend. Nobody noticed, which was the whole point.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">JW</span><span class="kodza-testimonial-wall__name">Jonas Weber</span><span class="kodza-testimonial-wall__role">CTO, Kollektiv Nord · Berlin</span></figcaption>
        </figure>
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>Reminders go out on their own, politely. I used to write those at midnight, less politely.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">AB</span><span class="kodza-testimonial-wall__name">Aïcha Benali</span><span class="kodza-testimonial-wall__role">Illustrator · Montréal</span></figcaption>
        </figure>
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>My accountant asked what changed. The exports: clean CSV, the right columns, nothing to retype.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">CD</span><span class="kodza-testimonial-wall__name">Camille Dubreuil</span><span class="kodza-testimonial-wall__role">Manager, Maison Ternes · Nantes</span></figcaption>
        </figure>
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>No sales call to get an API key. I signed up during stand-up and it was live before stand-up ended.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">LH</span><span class="kodza-testimonial-wall__name">Lucas Hartmann</span><span class="kodza-testimonial-wall__role">Lead developer, Studio Rapp · Ghent</span></figcaption>
        </figure>
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>VAT in four countries, done right, and no more spreadsheet called FINAL_v7.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">SM</span><span class="kodza-testimonial-wall__name">Sofia Marques</span><span class="kodza-testimonial-wall__role">Finance, Lume Ceramics · Lisbon</span></figcaption>
        </figure>
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>It does three things and does them properly. I've paid for tools that did forty things badly.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">PV</span><span class="kodza-testimonial-wall__name">Pieter de Vries</span><span class="kodza-testimonial-wall__role">Founder, Kade Studio · Rotterdam</span></figcaption>
        </figure>
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>Support answered with a fix and a link to the changelog. Not a ticket number.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">HL</span><span class="kodza-testimonial-wall__name">Hugo Lemaire</span><span class="kodza-testimonial-wall__role">Freelance developer · Marseille</span></figcaption>
        </figure>
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>We switched the bakery's card reader and invoices on a Monday. By Friday I'd stopped thinking about it.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">AR</span><span class="kodza-testimonial-wall__name">Ana Ruiz</span><span class="kodza-testimonial-wall__role">Owner, Forn Ruiz · Bilbao</span></figcaption>
        </figure>
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>Webhooks retry, sign their payload and show you the response. Basic, apparently rare.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">MC</span><span class="kodza-testimonial-wall__name">Matteo Conti</span><span class="kodza-testimonial-wall__role">Back-end developer, Officina 14 · Turin</span></figcaption>
        </figure>
        <figure class="kodza-testimonial-wall__card">
          <blockquote class="kodza-testimonial-wall__quote"><p>Payouts land on day two, every time. Cash flow stopped being a weekly guessing game.</p></blockquote>
          <figcaption class="kodza-testimonial-wall__who"><span class="kodza-testimonial-wall__face" aria-hidden="true">FL</span><span class="kodza-testimonial-wall__name">Freya Lindqvist</span><span class="kodza-testimonial-wall__role">Co-founder, Halvø Coffee · Copenhagen</span></figcaption>
        </figure>
      </div>
    </div>
  </div>
</section>

Checked

Checked before you paste.

Robots poked at it before you did. Every component goes through the same checks, and again each time it changes.

What ranLast run
Accessibilityaxe-core 4.10.2: the WCAG 2.1 A and AA rules, plus best practices. 0 issues
KeyboardThe Tab key gets there, and the focus ring shows when it does. Passed
Reduced motionTurn on reduced motion and what moved just appears. Nothing loops. Passed
Light and darkThe same checks on both themes, contrast included. Passed
WordPressPasted into Twenty Twenty-Five, Twenty Twenty-One, Astra, Blocksy, GeneratePress, Hello Elementor, Kadence and OceanWP. Nothing to flag. 8 / 8 themes
Robots checked this. A human with VoiceOver hasn't yet.
KeyboardPress them in the preview
On the pause button
  • Stops the wall, or starts it againEnter/Space

More like this

More in Testimonials & logos