Pure TailwindMIT licensed

Glassmorphism Tailwind Blockquote Card

Frosted-glass quote over drifting colour orbs. The port turns the original's @supports block into supports-[backdrop-filter:blur(1px)]: variants — so the opaque fallback and the frosted version are both visible in one class list — and adds a specular top-edge highlight that sells the glass.

Live Demo
Plain CSSTailwind v4
Try it

Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time

Untitled UI React · Affiliate link

Get Untitled UI Pro

The code

<section class="tbq-09 relative w-full min-h-svh grid place-items-center overflow-hidden bg-linear-135 from-tbq09-g1 via-tbq09-g2 via-55% to-tbq09-g3 px-5 py-14 font-tbq09-sans text-tbq09-ink" aria-label="Glassmorphism blockquote card demo">
  <div aria-hidden="true" class="absolute top-[14%] left-[12%] size-70 animate-tbq09-drift rounded-full bg-[radial-gradient(circle_at_32%_30%,var(--color-tbq09-o1a),var(--color-tbq09-o1b))] blur-[2px] motion-reduce:animate-none"></div>
  <div aria-hidden="true" class="absolute top-[22%] right-[14%] size-48 animate-tbq09-drift rounded-full bg-[radial-gradient(circle_at_35%_30%,var(--color-tbq09-o2a),var(--color-tbq09-o2b))] blur-[2px] [animation-direction:alternate-reverse] [animation-duration:13s] motion-reduce:animate-none"></div>
  <div aria-hidden="true" class="absolute bottom-[8%] left-[38%] size-58 animate-tbq09-drift rounded-full bg-[radial-gradient(circle_at_30%_30%,var(--color-tbq09-o3a),var(--color-tbq09-o3b))] blur-[2px] [animation-duration:19s] motion-reduce:animate-none"></div>
  <div class="relative grid w-full justify-items-center gap-8">
    <figure class="relative w-full max-w-[520px] rounded-[22px] border border-white/28 bg-tbq09-fallback p-[clamp(26px,4vw,38px)] shadow-[inset_0_1px_0_oklch(1_0_0/0.32),0_24px_50px_oklch(0_0_0/0.35)] before:pointer-events-none before:absolute before:inset-x-8 before:top-0 before:h-px before:bg-linear-to-r before:from-transparent before:via-white/80 before:to-transparent supports-[backdrop-filter:blur(1px)]:bg-white/10 supports-[backdrop-filter:blur(1px)]:backdrop-blur-[18px] supports-[backdrop-filter:blur(1px)]:backdrop-saturate-160">
      <blockquote>
        <p class="text-[clamp(18px,2.4vw,23px)] leading-[1.55] font-semibold tracking-[-0.012em] text-balance [text-shadow:0_1px_2px_oklch(0_0_0/0.2)]">“Good abstractions are like frosted glass — they hide the machinery without pretending it isn't there.”</p>
      </blockquote>
      <figcaption class="mt-6 flex items-center gap-3.5 text-[13.5px] leading-[1.45] text-tbq09-mut">
        <span aria-hidden="true" class="grid size-11 flex-none place-items-center rounded-full border border-white/35 bg-white/20 text-[13px] font-extrabold text-tbq09-ink">LN</span>
        <span><strong class="block text-sm font-bold text-tbq09-ink">Lena Novak</strong>Staff Engineer, Praxis Cloud</span>
      </figcaption>
    </figure>
    <p aria-hidden="true" class="rounded-full border border-white/25 bg-white/14 px-3.5 py-2 font-tbq09-mono text-[11.5px] text-tbq09-ink">supports-[backdrop-filter]: · backdrop-blur-[18px] · backdrop-saturate-160</p>
  </div>
</section>
@import "tailwindcss";

@theme {
  --color-tbq09-g1: #583da6;
  --color-tbq09-g1: oklch(0.45 0.16 290);
  --color-tbq09-g2: #b43694;
  --color-tbq09-g2: oklch(0.55 0.19 340);
  --color-tbq09-g3: #eb883b;
  --color-tbq09-g3: oklch(0.72 0.15 55);
  --color-tbq09-fallback: #3f3355;
  --color-tbq09-fallback: oklch(0.35 0.06 300);
  --color-tbq09-ink: #fafcff;
  --color-tbq09-ink: oklch(0.99 0.004 260);
  --color-tbq09-mut: #eef3fb;
  --color-tbq09-mut: oklch(0.96 0.015 260);
  --color-tbq09-o1a: #58e5ed;
  --color-tbq09-o1a: oklch(0.85 0.12 200);
  --color-tbq09-o1b: #0082e6;
  --color-tbq09-o1b: oklch(0.6 0.18 250);
  --color-tbq09-o2a: #f9dd73;
  --color-tbq09-o2a: oklch(0.9 0.13 95);
  --color-tbq09-o2b: #fe6652;
  --color-tbq09-o2b: oklch(0.7 0.19 30);
  --color-tbq09-o3a: #fec0f7;
  --color-tbq09-o3a: oklch(0.88 0.1 330);
  --color-tbq09-o3b: #9543c6;
  --color-tbq09-o3b: oklch(0.55 0.2 310);
  --font-tbq09-sans: 'Geist', system-ui, sans-serif;
  --font-tbq09-mono: 'JetBrains Mono', ui-monospace, monospace;
  --animate-tbq09-drift: tbq09-drift 16s ease-in-out infinite alternate;

  @keyframes tbq09-drift {
    from {
      translate: 0 0;
    }

    to {
      translate: 60px -40px;
    }
  }
}
/* 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-09 {
  width: 100%;
  min-height: 100svh;
}

Setup — do this once per project

Skip this if your project already runs Tailwind v4.

1Load Tailwind
<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.

2Add the stylesheetRequiredthe @theme block is what makes the custom utilities exist
@import "tailwindcss";

@theme {
  --color-tbq09-g1: #583da6;
  --color-tbq09-g1: oklch(0.45 0.16 290);
  --color-tbq09-g2: #b43694;
  --color-tbq09-g2: oklch(0.55 0.19 340);
  --color-tbq09-g3: #eb883b;
  --color-tbq09-g3: oklch(0.72 0.15 55);
  --color-tbq09-fallback: #3f3355;
  --color-tbq09-fallback: oklch(0.35 0.06 300);
  --color-tbq09-ink: #fafcff;
  --color-tbq09-ink: oklch(0.99 0.004 260);
  --color-tbq09-mut: #eef3fb;
  --color-tbq09-mut: oklch(0.96 0.015 260);
  --color-tbq09-o1a: #58e5ed;
  --color-tbq09-o1a: oklch(0.85 0.12 200);
  --color-tbq09-o1b: #0082e6;
  --color-tbq09-o1b: oklch(0.6 0.18 250);
  --color-tbq09-o2a: #f9dd73;
  --color-tbq09-o2a: oklch(0.9 0.13 95);
  --color-tbq09-o2b: #fe6652;
  --color-tbq09-o2b: oklch(0.7 0.19 30);
  --color-tbq09-o3a: #fec0f7;
  --color-tbq09-o3a: oklch(0.88 0.1 330);
  --color-tbq09-o3b: #9543c6;
  --color-tbq09-o3b: oklch(0.55 0.2 310);
  --font-tbq09-sans: 'Geist', system-ui, sans-serif;
  --font-tbq09-mono: 'JetBrains Mono', ui-monospace, monospace;
  --animate-tbq09-drift: tbq09-drift 16s ease-in-out infinite alternate;

  @keyframes tbq09-drift {
    from {
      translate: 0 0;
    }

    to {
      translate: 60px -40px;
    }
  }
}
/* 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-09 {
  width: 100%;
  min-height: 100svh;
}
3Fonts used by this demooptional — skip if you have your own type stack
<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=JetBrains+Mono:wght@400;500;600;700&display=swap">

What changed in the port

Which parts became utilities, which stayed CSS, and why.

  • The original's @supports (backdrop-filter:blur(1px)) block became three supports-[…]: utilities — the fallback and the enhancement now sit side by side in the markup.
  • @keyframes bq09-drift moved into @theme; per-orb timing uses arbitrary animation properties rather than three keyframe copies.
  • UI upgrade from the CSS original: a white specular hairline (before:via-white/80) across the glass's top edge — the single cue that makes frosted glass read as glass rather than a translucent box.
  • UI upgrade: role copy raised from 0.87 to 0.92 with a stronger text shadow on the quote, keeping 4.5:1 even where the card passes over the yellow orb; the role is no longer set in a fake <em>.
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 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: Glassmorphism Tailwind Blockquote Card
Source: https://codefronts.com/snippets/tailwind-css-blockquotes/glassmorphism-tailwind-blockquote-card/

Frosted-glass quote over drifting colour orbs. The port turns the original's @supports block into supports-[backdrop-filter:blur(1px)]: variants — so the opaque fallback and the frosted version are both visible in one class list — and adds a specular top-edge highlight that sells the glass.
## HTML
```html
<section class="tbq-09 relative w-full min-h-svh grid place-items-center overflow-hidden bg-linear-135 from-tbq09-g1 via-tbq09-g2 via-55% to-tbq09-g3 px-5 py-14 font-tbq09-sans text-tbq09-ink" aria-label="Glassmorphism blockquote card demo">
  <div aria-hidden="true" class="absolute top-[14%] left-[12%] size-70 animate-tbq09-drift rounded-full bg-[radial-gradient(circle_at_32%_30%,var(--color-tbq09-o1a),var(--color-tbq09-o1b))] blur-[2px] motion-reduce:animate-none"></div>
  <div aria-hidden="true" class="absolute top-[22%] right-[14%] size-48 animate-tbq09-drift rounded-full bg-[radial-gradient(circle_at_35%_30%,var(--color-tbq09-o2a),var(--color-tbq09-o2b))] blur-[2px] [animation-direction:alternate-reverse] [animation-duration:13s] motion-reduce:animate-none"></div>
  <div aria-hidden="true" class="absolute bottom-[8%] left-[38%] size-58 animate-tbq09-drift rounded-full bg-[radial-gradient(circle_at_30%_30%,var(--color-tbq09-o3a),var(--color-tbq09-o3b))] blur-[2px] [animation-duration:19s] motion-reduce:animate-none"></div>
  <div class="relative grid w-full justify-items-center gap-8">
    <figure class="relative w-full max-w-[520px] rounded-[22px] border border-white/28 bg-tbq09-fallback p-[clamp(26px,4vw,38px)] shadow-[inset_0_1px_0_oklch(1_0_0/0.32),0_24px_50px_oklch(0_0_0/0.35)] before:pointer-events-none before:absolute before:inset-x-8 before:top-0 before:h-px before:bg-linear-to-r before:from-transparent before:via-white/80 before:to-transparent supports-[backdrop-filter:blur(1px)]:bg-white/10 supports-[backdrop-filter:blur(1px)]:backdrop-blur-[18px] supports-[backdrop-filter:blur(1px)]:backdrop-saturate-160">
      <blockquote>
        <p class="text-[clamp(18px,2.4vw,23px)] leading-[1.55] font-semibold tracking-[-0.012em] text-balance [text-shadow:0_1px_2px_oklch(0_0_0/0.2)]">“Good abstractions are like frosted glass — they hide the machinery without pretending it isn't there.”</p>
      </blockquote>
      <figcaption class="mt-6 flex items-center gap-3.5 text-[13.5px] leading-[1.45] text-tbq09-mut">
        <span aria-hidden="true" class="grid size-11 flex-none place-items-center rounded-full border border-white/35 bg-white/20 text-[13px] font-extrabold text-tbq09-ink">LN</span>
        <span><strong class="block text-sm font-bold text-tbq09-ink">Lena Novak</strong>Staff Engineer, Praxis Cloud</span>
      </figcaption>
    </figure>
    <p aria-hidden="true" class="rounded-full border border-white/25 bg-white/14 px-3.5 py-2 font-tbq09-mono text-[11.5px] text-tbq09-ink">supports-[backdrop-filter]: · backdrop-blur-[18px] · backdrop-saturate-160</p>
  </div>
</section>
```
## CSS
```css
@import "tailwindcss";

@theme {
  --color-tbq09-g1: #583da6;
  --color-tbq09-g1: oklch(0.45 0.16 290);
  --color-tbq09-g2: #b43694;
  --color-tbq09-g2: oklch(0.55 0.19 340);
  --color-tbq09-g3: #eb883b;
  --color-tbq09-g3: oklch(0.72 0.15 55);
  --color-tbq09-fallback: #3f3355;
  --color-tbq09-fallback: oklch(0.35 0.06 300);
  --color-tbq09-ink: #fafcff;
  --color-tbq09-ink: oklch(0.99 0.004 260);
  --color-tbq09-mut: #eef3fb;
  --color-tbq09-mut: oklch(0.96 0.015 260);
  --color-tbq09-o1a: #58e5ed;
  --color-tbq09-o1a: oklch(0.85 0.12 200);
  --color-tbq09-o1b: #0082e6;
  --color-tbq09-o1b: oklch(0.6 0.18 250);
  --color-tbq09-o2a: #f9dd73;
  --color-tbq09-o2a: oklch(0.9 0.13 95);
  --color-tbq09-o2b: #fe6652;
  --color-tbq09-o2b: oklch(0.7 0.19 30);
  --color-tbq09-o3a: #fec0f7;
  --color-tbq09-o3a: oklch(0.88 0.1 330);
  --color-tbq09-o3b: #9543c6;
  --color-tbq09-o3b: oklch(0.55 0.2 310);
  --font-tbq09-sans: 'Geist', system-ui, sans-serif;
  --font-tbq09-mono: 'JetBrains Mono', ui-monospace, monospace;
  --animate-tbq09-drift: tbq09-drift 16s ease-in-out infinite alternate;

  @keyframes tbq09-drift {
    from {
      translate: 0 0;
    }

    to {
      translate: 60px -40px;
    }
  }
}
/* 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-09 {
  width: 100%;
  min-height: 100svh;
}
```

How this works

Fallback first, frost second. The base class list paints an opaque purple card. The supports-[…]: variants only apply where the browser can actually blur:

bg-tbq09-fallback
supports-[backdrop-filter:blur(1px)]:bg-white/10
supports-[backdrop-filter:blur(1px)]:backdrop-blur-[18px]
supports-[backdrop-filter:blur(1px)]:backdrop-saturate-160

Saturation is the secret. Blur alone greys the colours behind; backdrop-saturate-160 restores the vivid orbs so the glass looks lit, not dirty.

One keyframe, three motions. The orbs share animate-tbq09-drift; arbitrary [animation-duration:13s] and [animation-direction:alternate-reverse] desynchronise them without extra keyframes.

Make it yours

  • More frost: backdrop-blur-[28px] and bg-white/15.
  • Dark glass: bg-black/25 with border-white/15.
  • Static background: remove animate-tbq09-drift from the orbs.

Gotchas — read before shipping

  • Backdrop blur is expensive on large areas — keep glass cards modest in size, and avoid stacking several.
  • Text on glass needs a guaranteed contrast floor: a faint [text-shadow:0_1px_2px_…] keeps white text legible over the yellow orb.
  • The orbs are absolute; the card and chip need relative to sit above them.

Browser support

ChromeSafariFirefoxEdge
111+16.4+128+111+

backdrop-filter is Chrome 76 / Safari 18 unprefixed (9+ prefixed) / Firefox 103; Tailwind emits the -webkit- form too.

Techniques used in this demo

Plain CSSno Tailwind surface

Search CodeFronts

Loading…