Pure CSSMIT licensed

Feature Section with Customer Quote per Feature

Four feature rows where each claim is answered immediately by a customer saying it worked — feature copy on one side, a pull-quote with avatar, name and role on the other. Built as real blockquote and cite markup on an editorial off-white ground with a serif display face, no cards and no shadows, so the quotes read as testimony rather than as widgets.

Live Demo
Plain CSSTailwind v4
Try it

Complete Tailwind CSS landing page templates in HTML, React, Next.js and Vue · from $49

Cruip · Affiliate link

Browse Cruip templates

The code

<section class="fs-11" aria-labelledby="fs-11-heading">
  <div class="fs-11__hero" aria-hidden="true">
    <span class="fs-11__wordmark">Aperture</span>
    <span class="fs-11__heronav">Research operations, end to end</span>
  </div>

  <div class="fs-11__stage">
    <div class="fs-11__head">
      <p class="fs-11__eyebrow">Proof, per feature</p>
      <h2 class="fs-11__heading" id="fs-11-heading">Four claims, and the customers who tested them</h2>
    </div>

    <div class="fs-11__rows">
      <div class="fs-11__row">
        <article class="fs-11__feature">
          <h3 class="fs-11__ftitle">Recruit participants without a spreadsheet</h3>
          <p class="fs-11__fprose">Screeners, scheduling and incentives live in one record per participant. Consent expiry is tracked automatically, so a panel does not quietly go stale between studies.</p>
        </article>
        <blockquote class="fs-11__quote">
          <p class="fs-11__qtext">We cut recruiting from nine days to two, and I stopped being the bottleneck for every study.</p>
          <footer class="fs-11__attrib">
            <span class="fs-11__avatar" aria-hidden="true">AC</span>
            <span class="fs-11__who"><b>Alex Chen</b><span>Research Lead, Sable</span></span>
          </footer>
        </blockquote>
      </div>

      <div class="fs-11__row">
        <article class="fs-11__feature">
          <h3 class="fs-11__ftitle">Transcripts that are searchable across studies</h3>
          <p class="fs-11__fprose">Every session is transcribed, speaker-labelled and indexed with the study it belongs to. Search once and get the four interviews where anyone mentioned pricing.</p>
        </article>
        <blockquote class="fs-11__quote">
          <p class="fs-11__qtext">A designer found six months of pricing objections in an afternoon. That used to be a whole project.</p>
          <footer class="fs-11__attrib">
            <span class="fs-11__avatar" aria-hidden="true">PS</span>
            <span class="fs-11__who"><b>Priya Sharma</b><span>Head of Design, Meridian</span></span>
          </footer>
        </blockquote>
      </div>

      <div class="fs-11__row">
        <article class="fs-11__feature">
          <h3 class="fs-11__ftitle">Findings that ship as a link, not a deck</h3>
          <p class="fs-11__fprose">Clip a moment, attach it to a finding, and the finding keeps the evidence with it. Product managers get the timestamped clip instead of your summary of it.</p>
        </article>
        <blockquote class="fs-11__quote">
          <p class="fs-11__qtext">Nobody asks me to make slides any more. They watch the ninety-second clip and argue about the fix instead.</p>
          <footer class="fs-11__attrib">
            <span class="fs-11__avatar" aria-hidden="true">JL</span>
            <span class="fs-11__who"><b>Jordan Lee</b><span>Staff Researcher, Orbit</span></span>
          </footer>
        </blockquote>
      </div>

      <div class="fs-11__row">
        <article class="fs-11__feature">
          <h3 class="fs-11__ftitle">Governance the legal team signs off once</h3>
          <p class="fs-11__fprose">Regional data residency, per-study retention windows and revocable consent, with an export of everything a participant asked to be forgotten.</p>
        </article>
        <blockquote class="fs-11__quote">
          <p class="fs-11__qtext">Our privacy review took four days. The previous tool took a quarter and we still shipped with caveats.</p>
          <footer class="fs-11__attrib">
            <span class="fs-11__avatar" aria-hidden="true">SR</span>
            <span class="fs-11__who"><b>Sam Rivera</b><span>Ops Manager, Vale</span></span>
          </footer>
        </blockquote>
      </div>
    </div>
  </div>

  <div class="fs-11__below" aria-hidden="true">More customer stories · Plans</div>
</section>
.fs-11 {
  width: 100%;
  min-height: 100vh;
  display: block;
  box-sizing: border-box;
  --paper: #f7f6f2;
  --paper: oklch(0.972 0.005 95);
  --ink: #16171b;
  --ink: oklch(0.2 0.008 265);
  --muted: #55575f;
  --muted: oklch(0.46 0.011 265);
  --rule: #dedcd4;
  --rule: oklch(0.89 0.008 95);
  --accent: #33418c;
  --accent: oklch(0.4 0.13 272);
  --rowpad: clamp(28px, 4.5vw, 52px);
  --font-display: Georgia, "Iowan Old Style", "Times New Roman", serif;
  background: var(--paper);
  color: var(--ink);
  font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
}

.fs-11 *,
.fs-11 *::before,
.fs-11 *::after {
  box-sizing: border-box;
}

.fs-11__hero {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 16px;
  justify-content: space-between;
  align-items: baseline;
  padding: 20px 24px;
  border-block-end: 1px solid var(--rule);
}

.fs-11__wordmark {
  font: 400 20px/1 var(--font-display);
  letter-spacing: -0.01em;
}

.fs-11__heronav {
  font-size: 12.5px;
  color: var(--muted);
}

.fs-11__stage {
  display: grid;
  place-items: start center;
  max-inline-size: 100%;
  padding: clamp(32px, 6vw, 72px) 20px;
}

.fs-11__head {
  inline-size: 100%;
  max-inline-size: 62rem;
  min-inline-size: 0;
  margin: 0 0 clamp(20px, 3vw, 34px);
}

.fs-11__eyebrow {
  margin: 0 0 14px;
  font: 700 10.5px/1 system-ui, sans-serif;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--accent);
}

.fs-11__heading {
  margin: 0;
  max-inline-size: 26ch;
  font: 400 clamp(28px, 5.4vw, 46px)/1.1 var(--font-display);
  letter-spacing: -0.015em;
  text-wrap: balance;
}

.fs-11__rows {
  inline-size: 100%;
  max-inline-size: 62rem;
  min-inline-size: 0;
}

.fs-11__row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.9fr);
  gap: clamp(20px, 4vw, 48px);
  align-items: start;
  padding-block: var(--rowpad);
  border-block-start: 1px solid var(--rule);
}

.fs-11__row:last-child {
  border-block-end: 1px solid var(--rule);
}

.fs-11__feature {
  min-inline-size: 0;
}

.fs-11__ftitle {
  margin: 0 0 12px;
  font: 400 clamp(20px, 2.8vw, 27px)/1.2 var(--font-display);
  letter-spacing: -0.01em;
  text-wrap: balance;
}

.fs-11__fprose {
  margin: 0;
  max-inline-size: 44ch;
  font-size: 15px;
  line-height: 1.75;
  color: var(--muted);
  text-wrap: pretty;
}

.fs-11__quote {
  position: relative;
  margin: 0;
  min-inline-size: 0;
  padding-inline-start: 30px;
}

.fs-11__quote::before {
  content: "\201C";
  position: absolute;
  inset-inline-start: -6px;
  inset-block-start: -14px;
  font: 400 62px/1 var(--font-display);
  color: color-mix(in oklab, var(--accent) 35%, var(--paper));
}

.fs-11__qtext {
  margin: 0 0 16px;
  font: 400 clamp(16px, 2.2vw, 20px)/1.55 var(--font-display);
  font-style: italic;
  letter-spacing: -0.005em;
  text-wrap: pretty;
}

.fs-11__attrib {
  display: flex;
  align-items: center;
  gap: 12px;
  min-inline-size: 0;
}

.fs-11__avatar {
  display: grid;
  place-items: center;
  flex: none;
  inline-size: 42px;
  block-size: 42px;
  border-radius: 50%;
  font: 700 13px/1 system-ui, sans-serif;
  letter-spacing: 0.04em;
  color: var(--accent);
  background: color-mix(in oklab, var(--accent) 14%, var(--paper));
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--accent) 30%, transparent);
}

.fs-11__who {
  display: grid;
  gap: 1px;
  min-inline-size: 0;
}

.fs-11__who b {
  font-size: 13.5px;
  font-weight: 650;
}

.fs-11__who span {
  font-size: 12.5px;
  color: var(--muted);
}

.fs-11__below {
  padding: 18px 24px;
  border-block-start: 1px solid var(--rule);
  font-size: 12.5px;
  color: var(--muted);
}

@media (max-width: 780px) {
  .fs-11__row {
    grid-template-columns: minmax(0, 1fr);
  }
}

@media (prefers-color-scheme: dark) {
  .fs-11 {
    --paper: #14151a;
    --ink: #f1f1ee;
    --muted: #a2a3ac;
    --rule: #282a31;
    --accent: #a5b0ef;
  }
}

[data-theme="dark"] .fs-11 {
  --paper: #14151a;
  --ink: #f1f1ee;
  --muted: #a2a3ac;
  --rule: #282a31;
  --accent: #a5b0ef;
}
Paste this into ChatGPT, Claude, Cursor, or any coding assistant. The block below is pre-framed with everything the AI needs to integrate this demo into your project — markup, styles, scoping notes, and the source URL. Hit Copy and paste straight into your chat.
Here's a working CSS Feature Section from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Feature Section with Customer Quote per Feature
Source: https://codefronts.com/layouts/css-feature-sections/feature-section-with-customer-quote-per-feature/

Four feature rows where each claim is answered immediately by a customer saying it worked — feature copy on one side, a pull-quote with avatar, name and role on the other. Built as real blockquote and cite markup on an editorial off-white ground with a serif display face, no cards and no shadows, so the quotes read as testimony rather than as widgets.
## HTML
```html
<section class="fs-11" aria-labelledby="fs-11-heading">
  <div class="fs-11__hero" aria-hidden="true">
    <span class="fs-11__wordmark">Aperture</span>
    <span class="fs-11__heronav">Research operations, end to end</span>
  </div>

  <div class="fs-11__stage">
    <div class="fs-11__head">
      <p class="fs-11__eyebrow">Proof, per feature</p>
      <h2 class="fs-11__heading" id="fs-11-heading">Four claims, and the customers who tested them</h2>
    </div>

    <div class="fs-11__rows">
      <div class="fs-11__row">
        <article class="fs-11__feature">
          <h3 class="fs-11__ftitle">Recruit participants without a spreadsheet</h3>
          <p class="fs-11__fprose">Screeners, scheduling and incentives live in one record per participant. Consent expiry is tracked automatically, so a panel does not quietly go stale between studies.</p>
        </article>
        <blockquote class="fs-11__quote">
          <p class="fs-11__qtext">We cut recruiting from nine days to two, and I stopped being the bottleneck for every study.</p>
          <footer class="fs-11__attrib">
            <span class="fs-11__avatar" aria-hidden="true">AC</span>
            <span class="fs-11__who"><b>Alex Chen</b><span>Research Lead, Sable</span></span>
          </footer>
        </blockquote>
      </div>

      <div class="fs-11__row">
        <article class="fs-11__feature">
          <h3 class="fs-11__ftitle">Transcripts that are searchable across studies</h3>
          <p class="fs-11__fprose">Every session is transcribed, speaker-labelled and indexed with the study it belongs to. Search once and get the four interviews where anyone mentioned pricing.</p>
        </article>
        <blockquote class="fs-11__quote">
          <p class="fs-11__qtext">A designer found six months of pricing objections in an afternoon. That used to be a whole project.</p>
          <footer class="fs-11__attrib">
            <span class="fs-11__avatar" aria-hidden="true">PS</span>
            <span class="fs-11__who"><b>Priya Sharma</b><span>Head of Design, Meridian</span></span>
          </footer>
        </blockquote>
      </div>

      <div class="fs-11__row">
        <article class="fs-11__feature">
          <h3 class="fs-11__ftitle">Findings that ship as a link, not a deck</h3>
          <p class="fs-11__fprose">Clip a moment, attach it to a finding, and the finding keeps the evidence with it. Product managers get the timestamped clip instead of your summary of it.</p>
        </article>
        <blockquote class="fs-11__quote">
          <p class="fs-11__qtext">Nobody asks me to make slides any more. They watch the ninety-second clip and argue about the fix instead.</p>
          <footer class="fs-11__attrib">
            <span class="fs-11__avatar" aria-hidden="true">JL</span>
            <span class="fs-11__who"><b>Jordan Lee</b><span>Staff Researcher, Orbit</span></span>
          </footer>
        </blockquote>
      </div>

      <div class="fs-11__row">
        <article class="fs-11__feature">
          <h3 class="fs-11__ftitle">Governance the legal team signs off once</h3>
          <p class="fs-11__fprose">Regional data residency, per-study retention windows and revocable consent, with an export of everything a participant asked to be forgotten.</p>
        </article>
        <blockquote class="fs-11__quote">
          <p class="fs-11__qtext">Our privacy review took four days. The previous tool took a quarter and we still shipped with caveats.</p>
          <footer class="fs-11__attrib">
            <span class="fs-11__avatar" aria-hidden="true">SR</span>
            <span class="fs-11__who"><b>Sam Rivera</b><span>Ops Manager, Vale</span></span>
          </footer>
        </blockquote>
      </div>
    </div>
  </div>

  <div class="fs-11__below" aria-hidden="true">More customer stories · Plans</div>
</section>
```
## CSS
```css
.fs-11 {
  width: 100%;
  min-height: 100vh;
  display: block;
  box-sizing: border-box;
  --paper: #f7f6f2;
  --paper: oklch(0.972 0.005 95);
  --ink: #16171b;
  --ink: oklch(0.2 0.008 265);
  --muted: #55575f;
  --muted: oklch(0.46 0.011 265);
  --rule: #dedcd4;
  --rule: oklch(0.89 0.008 95);
  --accent: #33418c;
  --accent: oklch(0.4 0.13 272);
  --rowpad: clamp(28px, 4.5vw, 52px);
  --font-display: Georgia, "Iowan Old Style", "Times New Roman", serif;
  background: var(--paper);
  color: var(--ink);
  font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
}

.fs-11 *,
.fs-11 *::before,
.fs-11 *::after {
  box-sizing: border-box;
}

.fs-11__hero {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 16px;
  justify-content: space-between;
  align-items: baseline;
  padding: 20px 24px;
  border-block-end: 1px solid var(--rule);
}

.fs-11__wordmark {
  font: 400 20px/1 var(--font-display);
  letter-spacing: -0.01em;
}

.fs-11__heronav {
  font-size: 12.5px;
  color: var(--muted);
}

.fs-11__stage {
  display: grid;
  place-items: start center;
  max-inline-size: 100%;
  padding: clamp(32px, 6vw, 72px) 20px;
}

.fs-11__head {
  inline-size: 100%;
  max-inline-size: 62rem;
  min-inline-size: 0;
  margin: 0 0 clamp(20px, 3vw, 34px);
}

.fs-11__eyebrow {
  margin: 0 0 14px;
  font: 700 10.5px/1 system-ui, sans-serif;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--accent);
}

.fs-11__heading {
  margin: 0;
  max-inline-size: 26ch;
  font: 400 clamp(28px, 5.4vw, 46px)/1.1 var(--font-display);
  letter-spacing: -0.015em;
  text-wrap: balance;
}

.fs-11__rows {
  inline-size: 100%;
  max-inline-size: 62rem;
  min-inline-size: 0;
}

.fs-11__row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.9fr);
  gap: clamp(20px, 4vw, 48px);
  align-items: start;
  padding-block: var(--rowpad);
  border-block-start: 1px solid var(--rule);
}

.fs-11__row:last-child {
  border-block-end: 1px solid var(--rule);
}

.fs-11__feature {
  min-inline-size: 0;
}

.fs-11__ftitle {
  margin: 0 0 12px;
  font: 400 clamp(20px, 2.8vw, 27px)/1.2 var(--font-display);
  letter-spacing: -0.01em;
  text-wrap: balance;
}

.fs-11__fprose {
  margin: 0;
  max-inline-size: 44ch;
  font-size: 15px;
  line-height: 1.75;
  color: var(--muted);
  text-wrap: pretty;
}

.fs-11__quote {
  position: relative;
  margin: 0;
  min-inline-size: 0;
  padding-inline-start: 30px;
}

.fs-11__quote::before {
  content: "\201C";
  position: absolute;
  inset-inline-start: -6px;
  inset-block-start: -14px;
  font: 400 62px/1 var(--font-display);
  color: color-mix(in oklab, var(--accent) 35%, var(--paper));
}

.fs-11__qtext {
  margin: 0 0 16px;
  font: 400 clamp(16px, 2.2vw, 20px)/1.55 var(--font-display);
  font-style: italic;
  letter-spacing: -0.005em;
  text-wrap: pretty;
}

.fs-11__attrib {
  display: flex;
  align-items: center;
  gap: 12px;
  min-inline-size: 0;
}

.fs-11__avatar {
  display: grid;
  place-items: center;
  flex: none;
  inline-size: 42px;
  block-size: 42px;
  border-radius: 50%;
  font: 700 13px/1 system-ui, sans-serif;
  letter-spacing: 0.04em;
  color: var(--accent);
  background: color-mix(in oklab, var(--accent) 14%, var(--paper));
  box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--accent) 30%, transparent);
}

.fs-11__who {
  display: grid;
  gap: 1px;
  min-inline-size: 0;
}

.fs-11__who b {
  font-size: 13.5px;
  font-weight: 650;
}

.fs-11__who span {
  font-size: 12.5px;
  color: var(--muted);
}

.fs-11__below {
  padding: 18px 24px;
  border-block-start: 1px solid var(--rule);
  font-size: 12.5px;
  color: var(--muted);
}

@media (max-width: 780px) {
  .fs-11__row {
    grid-template-columns: minmax(0, 1fr);
  }
}

@media (prefers-color-scheme: dark) {
  .fs-11 {
    --paper: #14151a;
    --ink: #f1f1ee;
    --muted: #a2a3ac;
    --rule: #282a31;
    --accent: #a5b0ef;
  }
}

[data-theme="dark"] .fs-11 {
  --paper: #14151a;
  --ink: #f1f1ee;
  --muted: #a2a3ac;
  --rule: #282a31;
  --accent: #a5b0ef;
}
```

How this works

Proof has to sit next to the claim. A testimonial carousel three sections below is generic social proof; the same sentence placed beside the feature it validates is evidence. Structurally that means each row is a two-column grid holding a feature <article> and a <blockquote>, aligned at the top so the reader's eye moves across, not down. The pairing is the pattern — break it and you have two lists again.

Use the elements the browser already has. <blockquote> with a <footer> containing <cite> gives assistive tech the quote boundaries and the attribution for free, and it is what a copy-paste into a CMS will preserve. A div with a quotation mark in the text does neither. Keep the attribution outside the quoted text itself — a name inside the <blockquote> reads as part of what the person said.

Avatars can be typography. Four small photographs are four requests, four layout shifts and four things to art-direct. Initials in a circle — display: grid; place-items: center with a tinted background derived from the accent — carry the same 'a real person said this' signal at a fraction of the cost, and they never load late. When you do have photographs, the same box takes an <img> with no other change.

The trap is a quote that says nothing. 'Great product, highly recommend' actively weakens the feature above it. A usable quote names the outcome and a number — hours saved, incidents avoided, days shortened — and reads like a person, not marketing. If the real quote is thin, cut the quote rather than the feature; an unproven claim beats a hollow endorsement.

Make it yours

  • Swap the monogram for a photo by replacing .fs-11__avatar contents with an <img> at the same size.
  • Change --accent to retint the quote mark, the avatars and the rules.
  • Reverse a row by moving the blockquote before the article in the DOM for a varied rhythm.
  • Set --rowpad to tighten the vertical rhythm between rows.
  • Drop the oversized quote glyph by removing the ::before for a plainer editorial look.
  • Add a company logotype under the cite line if your quotes come with brand permission.

Gotchas — read before shipping

  • Putting the person's name inside the <blockquote> makes assistive tech read the attribution as part of the quotation — keep it in the footer.
  • A quote with no specific outcome weakens the feature it sits beside; cut it rather than ship filler praise.
  • Photo avatars without explicit width, height and aspect-ratio cause a visible shift on slow connections.
  • <cite> is for the work or source, not the speaker's name — some validators and style guides will flag it; a plain span for the name is safer if that matters to you.
  • Long role strings in a narrow column push the layout unless the attribution row has min-inline-size: 0 and wraps.

Browser support

ChromeSafariFirefoxEdge
114+17.5+121+114+

Floor set by oklch(), color-mix(), text-wrap as this demo is written. The core technique itself goes back further — Chrome 111+.

oklch() dictates the floor (Chromium 111, Safari 15.4, Firefox 113) with an sRGB hex before each value. text-wrap: balance on the headings is progressive enhancement only (Chromium 114, Safari 17.5, Firefox 121) — older engines wrap naturally with no visual regression and no layout shift.

Techniques used in this demo

Search CodeFronts

Loading…