02 / 25
All 25 in 25 Tailwind CSS Blockquotes
- 01Tailwind Blockquote with Large Decorative Quotation Marks
- 02Tailwind CSS Blockquote Testimonial Component
- 03Tailwind Callout Box / Admonition Blockquote
- 04Responsive Tailwind Center-Aligned Quote Banner
- 05Modern Minimalist Left Border Tailwind Blockquote
- 06Animated Tailwind Gradient Border Blockquote
- 07Classic Left Border Tailwind Blockquote Snippet
- 08Brutalist Tailwind Blockquote Design
- 09Glassmorphism Tailwind Blockquote Card
- 10Glowing Neon Border Tailwind Quote Box
- 11Article Pull Quote Tailwind Design with Wrap Text
- 12Speech Bubble Tailwind Blockquote
- 13Thick Vertical Accent Rail Tailwind Blockquote
- 14Customer Testimonial Blockquote Card in Tailwind CSS
- 15Inline Highlighted Text Tailwind Blockquote
- 16Marker Highlight Underline Tailwind Blockquote
- 17Floating Tailwind Blockquote with Drop Shadow
- 18Aurora Gradient Background Tailwind Blockquote
- 19Twitter / X Post Card Style Tailwind Blockquote
- 20Multi-Column Newspaper Editorial Blockquote in Tailwind
- 21IDE Code Comment Style Blockquote in Tailwind
- 22Markdown Compatible HTML Blockquote in Tailwind
- 23JavaScript Testimonial Quote Slider with Tailwind CSS
- 24Expandable Read More Tailwind Blockquote
- 25Tailwind Blockquote with One-Click Copy Button
Tailwind CSS Blockquote Testimonial Component
The canonical Tailwind testimonial — logo, quote, avatar, name and role on a ringed dark card — now in its native language. The CSS original emulated ring-1 ring-white/10 with box-shadow; here the ring is the ring, the avatar gets ring-offset, and the footer re-stacks with v4's built-in @container / @max-[26rem]: variants instead of a hand-written container query.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="tbq-02 w-full min-h-svh grid place-items-center bg-tbq02-bg bg-[radial-gradient(90%_70%_at_50%_110%,var(--color-tbq02-glow),transparent)] px-5 py-14 font-tbq02-sans text-tbq02-ink" aria-label="Tailwind blockquote testimonial component demo">
<div class="grid w-full justify-items-center gap-7">
<figure class="@container relative w-full max-w-xl rounded-2xl bg-tbq02-card p-8 shadow-[0_24px_60px_-20px_oklch(0_0_0/0.6)] ring-1 ring-white/10">
<span aria-hidden="true" class="pointer-events-none absolute inset-x-10 -top-px h-px bg-linear-to-r from-transparent via-tbq02-acc to-transparent"></span>
<svg class="mb-6 block size-8 text-tbq02-acc" viewBox="0 0 32 32" aria-hidden="true"><path d="M16 4l12 7v10l-12 7L4 21V11z" fill="none" stroke="currentColor" stroke-width="2.4"/><circle cx="16" cy="16" r="4.2" fill="currentColor"/></svg>
<blockquote>
<p class="text-lg/[1.65] font-semibold tracking-[-0.01em] text-pretty">“Utility classes made our design system reviewable. Every visual decision is right there in the diff — no hunting through stylesheets to find who set that margin.”</p>
</blockquote>
<figcaption class="mt-7 flex flex-wrap items-center gap-x-4 gap-y-3">
<img class="size-11 flex-none rounded-full bg-linear-to-br from-tbq02-acc to-tbq02-acc2 object-cover ring-2 ring-tbq02-acc ring-offset-2 ring-offset-tbq02-card" src="https://images.unsplash.com/photo-1494790108377-be9c29b29330?q=80&w=160&auto=format&fit=crop" alt="" width="44" height="44" loading="lazy">
<div>
<div class="text-[15px] font-semibold">Judith Black</div>
<div class="mt-0.5 text-sm text-tbq02-mut">CEO of Workcation</div>
</div>
<span aria-hidden="true" class="ml-auto h-7 w-px bg-white/12 @max-[26rem]:hidden"></span>
<div aria-hidden="true" class="font-tbq02-mono text-[11px] text-tbq02-mut @max-[26rem]:hidden">ring-1 · ring-white/10</div>
</figcaption>
</figure>
<p aria-hidden="true" class="rounded-full px-3.5 py-2 font-tbq02-mono text-[11.5px] text-tbq02-mut ring-1 ring-white/10">@container · ring-offset avatar · text-lg/[1.65]</p>
</div>
</section><section class="tbq-02 w-full min-h-svh grid place-items-center bg-tbq02-bg bg-[radial-gradient(90%_70%_at_50%_110%,var(--color-tbq02-glow),transparent)] px-5 py-14 font-tbq02-sans text-tbq02-ink" aria-label="Tailwind blockquote testimonial component demo">
<div class="grid w-full justify-items-center gap-7">
<figure class="@container relative w-full max-w-xl rounded-2xl bg-tbq02-card p-8 shadow-[0_24px_60px_-20px_oklch(0_0_0/0.6)] ring-1 ring-white/10">
<span aria-hidden="true" class="pointer-events-none absolute inset-x-10 -top-px h-px bg-linear-to-r from-transparent via-tbq02-acc to-transparent"></span>
<svg class="mb-6 block size-8 text-tbq02-acc" viewBox="0 0 32 32" aria-hidden="true"><path d="M16 4l12 7v10l-12 7L4 21V11z" fill="none" stroke="currentColor" stroke-width="2.4"/><circle cx="16" cy="16" r="4.2" fill="currentColor"/></svg>
<blockquote>
<p class="text-lg/[1.65] font-semibold tracking-[-0.01em] text-pretty">“Utility classes made our design system reviewable. Every visual decision is right there in the diff — no hunting through stylesheets to find who set that margin.”</p>
</blockquote>
<figcaption class="mt-7 flex flex-wrap items-center gap-x-4 gap-y-3">
<img class="size-11 flex-none rounded-full bg-linear-to-br from-tbq02-acc to-tbq02-acc2 object-cover ring-2 ring-tbq02-acc ring-offset-2 ring-offset-tbq02-card" src="https://images.unsplash.com/photo-1494790108377-be9c29b29330?q=80&w=160&auto=format&fit=crop" alt="" width="44" height="44" loading="lazy">
<div>
<div class="text-[15px] font-semibold">Judith Black</div>
<div class="mt-0.5 text-sm text-tbq02-mut">CEO of Workcation</div>
</div>
<span aria-hidden="true" class="ml-auto h-7 w-px bg-white/12 @max-[26rem]:hidden"></span>
<div aria-hidden="true" class="font-tbq02-mono text-[11px] text-tbq02-mut @max-[26rem]:hidden">ring-1 · ring-white/10</div>
</figcaption>
</figure>
<p aria-hidden="true" class="rounded-full px-3.5 py-2 font-tbq02-mono text-[11.5px] text-tbq02-mut ring-1 ring-white/10">@container · ring-offset avatar · text-lg/[1.65]</p>
</div>
</section>@import "tailwindcss";
@theme {
--color-tbq02-bg: #06090f;
--color-tbq02-bg: oklch(0.14 0.015 265);
--color-tbq02-glow: #171c3b99;
--color-tbq02-glow: oklch(0.24 0.06 275 / 0.6);
--color-tbq02-card: #141822;
--color-tbq02-card: oklch(0.21 0.02 265);
--color-tbq02-ink: #f3f5f8;
--color-tbq02-ink: oklch(0.97 0.005 250);
--color-tbq02-mut: #b0b8c5;
--color-tbq02-mut: oklch(0.78 0.02 260);
--color-tbq02-acc: #7c8cff;
--color-tbq02-acc: oklch(0.68 0.17 275);
--color-tbq02-acc2: #5e4784;
--color-tbq02-acc2: oklch(0.45 0.1 300);
--font-tbq02-sans: 'Geist', system-ui, sans-serif;
--font-tbq02-mono: 'Geist Mono', ui-monospace, monospace;
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.tbq-02 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tbq02-bg: #06090f;
--color-tbq02-bg: oklch(0.14 0.015 265);
--color-tbq02-glow: #171c3b99;
--color-tbq02-glow: oklch(0.24 0.06 275 / 0.6);
--color-tbq02-card: #141822;
--color-tbq02-card: oklch(0.21 0.02 265);
--color-tbq02-ink: #f3f5f8;
--color-tbq02-ink: oklch(0.97 0.005 250);
--color-tbq02-mut: #b0b8c5;
--color-tbq02-mut: oklch(0.78 0.02 260);
--color-tbq02-acc: #7c8cff;
--color-tbq02-acc: oklch(0.68 0.17 275);
--color-tbq02-acc2: #5e4784;
--color-tbq02-acc2: oklch(0.45 0.1 300);
--font-tbq02-sans: 'Geist', system-ui, sans-serif;
--font-tbq02-mono: 'Geist Mono', ui-monospace, monospace;
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.tbq-02 {
width: 100%;
min-height: 100svh;
}Setup — do this once per project
Skip this if your project already runs Tailwind v4.
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>Compiles in the browser — perfect for a CodePen or a quick test, not for production.
npm install tailwindcss @tailwindcss/vite
npm install tailwindcss @tailwindcss/vite// vite.config.js ("type": "module" in package.json)
import { defineConfig } from 'vite'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [tailwindcss()],
})// vite.config.js ("type": "module" in package.json)
import { defineConfig } from 'vite'
import tailwindcss from '@tailwindcss/vite'
export default defineConfig({
plugins: [tailwindcss()],
})Any v4 setup works — Vite, PostCSS or the CLI. Nothing in this demo is bundler-specific.
@import "tailwindcss";
@theme {
--color-tbq02-bg: #06090f;
--color-tbq02-bg: oklch(0.14 0.015 265);
--color-tbq02-glow: #171c3b99;
--color-tbq02-glow: oklch(0.24 0.06 275 / 0.6);
--color-tbq02-card: #141822;
--color-tbq02-card: oklch(0.21 0.02 265);
--color-tbq02-ink: #f3f5f8;
--color-tbq02-ink: oklch(0.97 0.005 250);
--color-tbq02-mut: #b0b8c5;
--color-tbq02-mut: oklch(0.78 0.02 260);
--color-tbq02-acc: #7c8cff;
--color-tbq02-acc: oklch(0.68 0.17 275);
--color-tbq02-acc2: #5e4784;
--color-tbq02-acc2: oklch(0.45 0.1 300);
--font-tbq02-sans: 'Geist', system-ui, sans-serif;
--font-tbq02-mono: 'Geist Mono', ui-monospace, monospace;
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.tbq-02 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tbq02-bg: #06090f;
--color-tbq02-bg: oklch(0.14 0.015 265);
--color-tbq02-glow: #171c3b99;
--color-tbq02-glow: oklch(0.24 0.06 275 / 0.6);
--color-tbq02-card: #141822;
--color-tbq02-card: oklch(0.21 0.02 265);
--color-tbq02-ink: #f3f5f8;
--color-tbq02-ink: oklch(0.97 0.005 250);
--color-tbq02-mut: #b0b8c5;
--color-tbq02-mut: oklch(0.78 0.02 260);
--color-tbq02-acc: #7c8cff;
--color-tbq02-acc: oklch(0.68 0.17 275);
--color-tbq02-acc2: #5e4784;
--color-tbq02-acc2: oklch(0.45 0.1 300);
--font-tbq02-sans: 'Geist', system-ui, sans-serif;
--font-tbq02-mono: 'Geist Mono', ui-monospace, monospace;
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.tbq-02 {
width: 100%;
min-height: 100svh;
}<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Geist:wght@400..800&family=Geist+Mono:wght@400..600&display=swap">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Geist:wght@400..800&family=Geist+Mono:wght@400..600&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
box-shadow:0 0 0 1px oklch(1 0 0/.1)— the original's hand-rolled ring — is simplyring-1 ring-white/10again.@container (width < 420px)became@max-[26rem]:hiddenon the two elements it hid; the query now lives on the elements it changes.- UI upgrade from the CSS original: muted role copy raised from
oklch(0.67)to0.78(3.9:1 → 6.8:1 on the card), and the avatar's double ring is a realring-offsetinstead of two stacked shadows. - UI upgrade: a gradient accent hairline on the card's top edge gives the dark card a light source, and the shadow now uses a negative spread so it pools beneath the card rather than haloing it.
Here's a working CSS demo 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: Tailwind CSS Blockquote Testimonial Component
Source: https://codefronts.com/snippets/tailwind-css-blockquotes/tailwind-css-blockquote-testimonial-component/
The canonical Tailwind testimonial — logo, quote, avatar, name and role on a ringed dark card — now in its native language. The CSS original emulated ring-1 ring-white/10 with box-shadow; here the ring is the ring, the avatar gets ring-offset, and the footer re-stacks with v4's built-in @container / @max-[26rem]: variants instead of a hand-written container query.
## HTML
```html
<section class="tbq-02 w-full min-h-svh grid place-items-center bg-tbq02-bg bg-[radial-gradient(90%_70%_at_50%_110%,var(--color-tbq02-glow),transparent)] px-5 py-14 font-tbq02-sans text-tbq02-ink" aria-label="Tailwind blockquote testimonial component demo">
<div class="grid w-full justify-items-center gap-7">
<figure class="@container relative w-full max-w-xl rounded-2xl bg-tbq02-card p-8 shadow-[0_24px_60px_-20px_oklch(0_0_0/0.6)] ring-1 ring-white/10">
<span aria-hidden="true" class="pointer-events-none absolute inset-x-10 -top-px h-px bg-linear-to-r from-transparent via-tbq02-acc to-transparent"></span>
<svg class="mb-6 block size-8 text-tbq02-acc" viewBox="0 0 32 32" aria-hidden="true"><path d="M16 4l12 7v10l-12 7L4 21V11z" fill="none" stroke="currentColor" stroke-width="2.4"/><circle cx="16" cy="16" r="4.2" fill="currentColor"/></svg>
<blockquote>
<p class="text-lg/[1.65] font-semibold tracking-[-0.01em] text-pretty">“Utility classes made our design system reviewable. Every visual decision is right there in the diff — no hunting through stylesheets to find who set that margin.”</p>
</blockquote>
<figcaption class="mt-7 flex flex-wrap items-center gap-x-4 gap-y-3">
<img class="size-11 flex-none rounded-full bg-linear-to-br from-tbq02-acc to-tbq02-acc2 object-cover ring-2 ring-tbq02-acc ring-offset-2 ring-offset-tbq02-card" src="https://images.unsplash.com/photo-1494790108377-be9c29b29330?q=80&w=160&auto=format&fit=crop" alt="" width="44" height="44" loading="lazy">
<div>
<div class="text-[15px] font-semibold">Judith Black</div>
<div class="mt-0.5 text-sm text-tbq02-mut">CEO of Workcation</div>
</div>
<span aria-hidden="true" class="ml-auto h-7 w-px bg-white/12 @max-[26rem]:hidden"></span>
<div aria-hidden="true" class="font-tbq02-mono text-[11px] text-tbq02-mut @max-[26rem]:hidden">ring-1 · ring-white/10</div>
</figcaption>
</figure>
<p aria-hidden="true" class="rounded-full px-3.5 py-2 font-tbq02-mono text-[11.5px] text-tbq02-mut ring-1 ring-white/10">@container · ring-offset avatar · text-lg/[1.65]</p>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tbq02-bg: #06090f;
--color-tbq02-bg: oklch(0.14 0.015 265);
--color-tbq02-glow: #171c3b99;
--color-tbq02-glow: oklch(0.24 0.06 275 / 0.6);
--color-tbq02-card: #141822;
--color-tbq02-card: oklch(0.21 0.02 265);
--color-tbq02-ink: #f3f5f8;
--color-tbq02-ink: oklch(0.97 0.005 250);
--color-tbq02-mut: #b0b8c5;
--color-tbq02-mut: oklch(0.78 0.02 260);
--color-tbq02-acc: #7c8cff;
--color-tbq02-acc: oklch(0.68 0.17 275);
--color-tbq02-acc2: #5e4784;
--color-tbq02-acc2: oklch(0.45 0.1 300);
--font-tbq02-sans: 'Geist', system-ui, sans-serif;
--font-tbq02-mono: 'Geist Mono', ui-monospace, monospace;
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.tbq-02 {
width: 100%;
min-height: 100svh;
}
```Here's a working CSS demo 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: Tailwind CSS Blockquote Testimonial Component
Source: https://codefronts.com/snippets/tailwind-css-blockquotes/tailwind-css-blockquote-testimonial-component/
The canonical Tailwind testimonial — logo, quote, avatar, name and role on a ringed dark card — now in its native language. The CSS original emulated ring-1 ring-white/10 with box-shadow; here the ring is the ring, the avatar gets ring-offset, and the footer re-stacks with v4's built-in @container / @max-[26rem]: variants instead of a hand-written container query.
## HTML
```html
<section class="tbq-02 w-full min-h-svh grid place-items-center bg-tbq02-bg bg-[radial-gradient(90%_70%_at_50%_110%,var(--color-tbq02-glow),transparent)] px-5 py-14 font-tbq02-sans text-tbq02-ink" aria-label="Tailwind blockquote testimonial component demo">
<div class="grid w-full justify-items-center gap-7">
<figure class="@container relative w-full max-w-xl rounded-2xl bg-tbq02-card p-8 shadow-[0_24px_60px_-20px_oklch(0_0_0/0.6)] ring-1 ring-white/10">
<span aria-hidden="true" class="pointer-events-none absolute inset-x-10 -top-px h-px bg-linear-to-r from-transparent via-tbq02-acc to-transparent"></span>
<svg class="mb-6 block size-8 text-tbq02-acc" viewBox="0 0 32 32" aria-hidden="true"><path d="M16 4l12 7v10l-12 7L4 21V11z" fill="none" stroke="currentColor" stroke-width="2.4"/><circle cx="16" cy="16" r="4.2" fill="currentColor"/></svg>
<blockquote>
<p class="text-lg/[1.65] font-semibold tracking-[-0.01em] text-pretty">“Utility classes made our design system reviewable. Every visual decision is right there in the diff — no hunting through stylesheets to find who set that margin.”</p>
</blockquote>
<figcaption class="mt-7 flex flex-wrap items-center gap-x-4 gap-y-3">
<img class="size-11 flex-none rounded-full bg-linear-to-br from-tbq02-acc to-tbq02-acc2 object-cover ring-2 ring-tbq02-acc ring-offset-2 ring-offset-tbq02-card" src="https://images.unsplash.com/photo-1494790108377-be9c29b29330?q=80&w=160&auto=format&fit=crop" alt="" width="44" height="44" loading="lazy">
<div>
<div class="text-[15px] font-semibold">Judith Black</div>
<div class="mt-0.5 text-sm text-tbq02-mut">CEO of Workcation</div>
</div>
<span aria-hidden="true" class="ml-auto h-7 w-px bg-white/12 @max-[26rem]:hidden"></span>
<div aria-hidden="true" class="font-tbq02-mono text-[11px] text-tbq02-mut @max-[26rem]:hidden">ring-1 · ring-white/10</div>
</figcaption>
</figure>
<p aria-hidden="true" class="rounded-full px-3.5 py-2 font-tbq02-mono text-[11.5px] text-tbq02-mut ring-1 ring-white/10">@container · ring-offset avatar · text-lg/[1.65]</p>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tbq02-bg: #06090f;
--color-tbq02-bg: oklch(0.14 0.015 265);
--color-tbq02-glow: #171c3b99;
--color-tbq02-glow: oklch(0.24 0.06 275 / 0.6);
--color-tbq02-card: #141822;
--color-tbq02-card: oklch(0.21 0.02 265);
--color-tbq02-ink: #f3f5f8;
--color-tbq02-ink: oklch(0.97 0.005 250);
--color-tbq02-mut: #b0b8c5;
--color-tbq02-mut: oklch(0.78 0.02 260);
--color-tbq02-acc: #7c8cff;
--color-tbq02-acc: oklch(0.68 0.17 275);
--color-tbq02-acc2: #5e4784;
--color-tbq02-acc2: oklch(0.45 0.1 300);
--font-tbq02-sans: 'Geist', system-ui, sans-serif;
--font-tbq02-mono: 'Geist Mono', ui-monospace, monospace;
}
/* Root rule: the full-bleed contract, stated in CSS as well as in the markup's utilities, so the
stage is sized before the browser build compiles. */
.tbq-02 {
width: 100%;
min-height: 100svh;
}
```How this works
This is the demo where the port is a homecoming. Every line of the original's CSS was an imitation of a Tailwind utility, so the port deletes the imitation:
<figure class="@container relative max-w-xl rounded-2xl bg-tbq02-card p-8
ring-1 ring-white/10 shadow-[0_24px_60px_-20px_oklch(0_0_0/0.6)]">Container queries are first-class in v4. @container sets container-type:inline-size; @max-[26rem]:hidden reads the card's width, not the viewport's, so the component re-stacks correctly in a sidebar, a modal or a three-up grid.
The accent hairline is a decorative span — absolute inset-x-10 -top-px h-px bg-linear-to-r from-transparent via-tbq02-acc to-transparent — the kind of detail Tailwind makes cheap to add and trivial to remove.
Make it yours
- Light mode: swap
bg-tbq02-cardforbg-white,ring-white/10forring-slate-900/5and flip the ink tokens. - Bigger quote:
text-xl/[1.6] sm:text-2xl/[1.5]for a hero testimonial. - Drop the logo for a pure quote card, or swap it for an
<img>company mark ath-8 w-auto.
Gotchas — read before shipping
ring-offset-*paints a solid colour, not transparency — always setring-offset-tbq02-cardto the surface the avatar sits on.@containerqueries the nearest container ancestor; nesting cards means nesting containers — name them (@container/card,@max-md/card:) if you nest.- The empty
alt=""is deliberate: the name is right next to the photo, so a described avatar would be announced twice.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
Size container queries are Chrome 105 / Safari 16 / Firefox 110; the floor is Tailwind v4's generated sheet.