03 / 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 Callout Box / Admonition Blockquote
Docs-style Note / Tip / Warning admonitions. The CSS original drove all three from one --tone token and [data-kind] selectors; the Tailwind port makes each variant an explicit class list (border-l-tbq03-tip bg-tbq03-tip/8) — more characters, but every variant is greppable and a reviewer can see exactly what "warning" looks like without reading a stylesheet.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="tbq-03 w-full min-h-svh grid place-items-center bg-tbq03-bg px-5 py-14 font-tbq03-sans text-tbq03-ink" aria-label="Callout box admonition blockquote demo">
<div class="grid w-full justify-items-center gap-6">
<div class="flex w-full max-w-[600px] flex-col gap-3.5">
<p aria-hidden="true" class="mb-0.5 font-tbq03-mono text-xs text-tbq03-mut">docs / deploying / <b class="font-semibold text-tbq03-ink">zero-downtime.md</b></p>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-note/25 border-l-tbq03-note bg-tbq03-note/8 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-note-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-note/15"><svg viewBox="0 0 16 16" width="15" height="15"><circle cx="8" cy="8" r="6.6" fill="none" stroke="currentColor" stroke-width="1.6"/><path d="M8 7.2v4" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/><circle cx="8" cy="4.9" r=".9" fill="currentColor"/></svg></span>Note</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Deploys are atomic. The new release only receives traffic after every health check passes — a failed boot never reaches users.</p>
</blockquote>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-tip/25 border-l-tbq03-tip bg-tbq03-tip/8 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-tip-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-tip/15"><svg viewBox="0 0 16 16" width="15" height="15"><path d="M8 1.6a4.6 4.6 0 0 0-2.6 8.4c.5.4.8.9.8 1.5h3.6c0-.6.3-1.1.8-1.5A4.6 4.6 0 0 0 8 1.6z" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M6.4 13.6h3.2" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg></span>Tip</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Set <code class="rounded-md bg-tbq03-tip/14 px-1.5 py-px font-tbq03-mono text-[0.86em]">--grace-period=30s</code> so in-flight requests drain before the old release is retired. Your p99 will thank you.</p>
</blockquote>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-warn/35 border-l-tbq03-warn bg-tbq03-warn/10 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-warn-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-warn/20"><svg viewBox="0 0 16 16" width="15" height="15"><path d="M8 2 14.6 13.4H1.4z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M8 6.4v3" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/><circle cx="8" cy="11.4" r=".85" fill="currentColor"/></svg></span>Warning</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Skipping migrations with <code class="rounded-md bg-tbq03-warn/18 px-1.5 py-px font-tbq03-mono text-[0.86em]">--no-migrate</code> leaves the schema behind the code. Only do this when the release is verified backwards-compatible.</p>
</blockquote>
</div>
<p aria-hidden="true" class="rounded-full border border-black/10 bg-white px-3.5 py-2 font-tbq03-mono text-[11.5px] text-tbq03-mut">border-l-4 · bg-tone/8 wash · -ink label tokens</p>
</div>
</section><section class="tbq-03 w-full min-h-svh grid place-items-center bg-tbq03-bg px-5 py-14 font-tbq03-sans text-tbq03-ink" aria-label="Callout box admonition blockquote demo">
<div class="grid w-full justify-items-center gap-6">
<div class="flex w-full max-w-[600px] flex-col gap-3.5">
<p aria-hidden="true" class="mb-0.5 font-tbq03-mono text-xs text-tbq03-mut">docs / deploying / <b class="font-semibold text-tbq03-ink">zero-downtime.md</b></p>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-note/25 border-l-tbq03-note bg-tbq03-note/8 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-note-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-note/15"><svg viewBox="0 0 16 16" width="15" height="15"><circle cx="8" cy="8" r="6.6" fill="none" stroke="currentColor" stroke-width="1.6"/><path d="M8 7.2v4" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/><circle cx="8" cy="4.9" r=".9" fill="currentColor"/></svg></span>Note</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Deploys are atomic. The new release only receives traffic after every health check passes — a failed boot never reaches users.</p>
</blockquote>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-tip/25 border-l-tbq03-tip bg-tbq03-tip/8 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-tip-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-tip/15"><svg viewBox="0 0 16 16" width="15" height="15"><path d="M8 1.6a4.6 4.6 0 0 0-2.6 8.4c.5.4.8.9.8 1.5h3.6c0-.6.3-1.1.8-1.5A4.6 4.6 0 0 0 8 1.6z" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M6.4 13.6h3.2" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg></span>Tip</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Set <code class="rounded-md bg-tbq03-tip/14 px-1.5 py-px font-tbq03-mono text-[0.86em]">--grace-period=30s</code> so in-flight requests drain before the old release is retired. Your p99 will thank you.</p>
</blockquote>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-warn/35 border-l-tbq03-warn bg-tbq03-warn/10 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-warn-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-warn/20"><svg viewBox="0 0 16 16" width="15" height="15"><path d="M8 2 14.6 13.4H1.4z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M8 6.4v3" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/><circle cx="8" cy="11.4" r=".85" fill="currentColor"/></svg></span>Warning</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Skipping migrations with <code class="rounded-md bg-tbq03-warn/18 px-1.5 py-px font-tbq03-mono text-[0.86em]">--no-migrate</code> leaves the schema behind the code. Only do this when the release is verified backwards-compatible.</p>
</blockquote>
</div>
<p aria-hidden="true" class="rounded-full border border-black/10 bg-white px-3.5 py-2 font-tbq03-mono text-[11.5px] text-tbq03-mut">border-l-4 · bg-tone/8 wash · -ink label tokens</p>
</div>
</section>@import "tailwindcss";
@theme {
--color-tbq03-bg: #f5f7f9;
--color-tbq03-bg: oklch(0.975 0.004 250);
--color-tbq03-card: #ffffff;
--color-tbq03-card: oklch(1 0 0);
--color-tbq03-ink: #22272e;
--color-tbq03-ink: oklch(0.27 0.015 260);
--color-tbq03-mut: #5e646c;
--color-tbq03-mut: oklch(0.5 0.015 260);
--color-tbq03-note: #398ad6;
--color-tbq03-note: oklch(0.62 0.14 250);
--color-tbq03-note-ink: #155aa7;
--color-tbq03-note-ink: oklch(0.47 0.14 255);
--color-tbq03-tip: #2fa465;
--color-tbq03-tip: oklch(0.64 0.14 155);
--color-tbq03-tip-ink: #036639;
--color-tbq03-tip-ink: oklch(0.45 0.11 155);
--color-tbq03-warn: #e8a127;
--color-tbq03-warn: oklch(0.76 0.15 75);
--color-tbq03-warn-ink: #915200;
--color-tbq03-warn-ink: oklch(0.5 0.12 65);
--font-tbq03-sans: 'Plus Jakarta Sans', system-ui, sans-serif;
--font-tbq03-mono: 'JetBrains 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-03 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tbq03-bg: #f5f7f9;
--color-tbq03-bg: oklch(0.975 0.004 250);
--color-tbq03-card: #ffffff;
--color-tbq03-card: oklch(1 0 0);
--color-tbq03-ink: #22272e;
--color-tbq03-ink: oklch(0.27 0.015 260);
--color-tbq03-mut: #5e646c;
--color-tbq03-mut: oklch(0.5 0.015 260);
--color-tbq03-note: #398ad6;
--color-tbq03-note: oklch(0.62 0.14 250);
--color-tbq03-note-ink: #155aa7;
--color-tbq03-note-ink: oklch(0.47 0.14 255);
--color-tbq03-tip: #2fa465;
--color-tbq03-tip: oklch(0.64 0.14 155);
--color-tbq03-tip-ink: #036639;
--color-tbq03-tip-ink: oklch(0.45 0.11 155);
--color-tbq03-warn: #e8a127;
--color-tbq03-warn: oklch(0.76 0.15 75);
--color-tbq03-warn-ink: #915200;
--color-tbq03-warn-ink: oklch(0.5 0.12 65);
--font-tbq03-sans: 'Plus Jakarta Sans', system-ui, sans-serif;
--font-tbq03-mono: 'JetBrains 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-03 {
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-tbq03-bg: #f5f7f9;
--color-tbq03-bg: oklch(0.975 0.004 250);
--color-tbq03-card: #ffffff;
--color-tbq03-card: oklch(1 0 0);
--color-tbq03-ink: #22272e;
--color-tbq03-ink: oklch(0.27 0.015 260);
--color-tbq03-mut: #5e646c;
--color-tbq03-mut: oklch(0.5 0.015 260);
--color-tbq03-note: #398ad6;
--color-tbq03-note: oklch(0.62 0.14 250);
--color-tbq03-note-ink: #155aa7;
--color-tbq03-note-ink: oklch(0.47 0.14 255);
--color-tbq03-tip: #2fa465;
--color-tbq03-tip: oklch(0.64 0.14 155);
--color-tbq03-tip-ink: #036639;
--color-tbq03-tip-ink: oklch(0.45 0.11 155);
--color-tbq03-warn: #e8a127;
--color-tbq03-warn: oklch(0.76 0.15 75);
--color-tbq03-warn-ink: #915200;
--color-tbq03-warn-ink: oklch(0.5 0.12 65);
--font-tbq03-sans: 'Plus Jakarta Sans', system-ui, sans-serif;
--font-tbq03-mono: 'JetBrains 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-03 {
width: 100%;
min-height: 100svh;
}@import "tailwindcss";
@theme {
--color-tbq03-bg: #f5f7f9;
--color-tbq03-bg: oklch(0.975 0.004 250);
--color-tbq03-card: #ffffff;
--color-tbq03-card: oklch(1 0 0);
--color-tbq03-ink: #22272e;
--color-tbq03-ink: oklch(0.27 0.015 260);
--color-tbq03-mut: #5e646c;
--color-tbq03-mut: oklch(0.5 0.015 260);
--color-tbq03-note: #398ad6;
--color-tbq03-note: oklch(0.62 0.14 250);
--color-tbq03-note-ink: #155aa7;
--color-tbq03-note-ink: oklch(0.47 0.14 255);
--color-tbq03-tip: #2fa465;
--color-tbq03-tip: oklch(0.64 0.14 155);
--color-tbq03-tip-ink: #036639;
--color-tbq03-tip-ink: oklch(0.45 0.11 155);
--color-tbq03-warn: #e8a127;
--color-tbq03-warn: oklch(0.76 0.15 75);
--color-tbq03-warn-ink: #915200;
--color-tbq03-warn-ink: oklch(0.5 0.12 65);
--font-tbq03-sans: 'Plus Jakarta Sans', system-ui, sans-serif;
--font-tbq03-mono: 'JetBrains 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-03 {
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=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600;700&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=Plus+Jakarta+Sans:wght@400;500;600;700;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
--tonere-pointing and three[data-kind]rules became three explicit class lists — the idiomatic Tailwind trade: more characters, zero indirection. color-mix(in oklch, var(--tone) 9%, var(--card))→bg-tbq03-note/8.- UI upgrade from the CSS original: the amber Warning label was 1.9:1 on its wash; separate
-inktokens now put all three labels above 4.5:1 while the rules keep their brighter tones. - UI upgrade: icons sit in tinted 24px tiles, and each callout gained a tone-tinted hairline on its open edges so the box reads as a shape, not just a stripe.
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 Callout Box / Admonition Blockquote
Source: https://codefronts.com/snippets/tailwind-css-blockquotes/tailwind-callout-box-admonition-blockquote/
Docs-style Note / Tip / Warning admonitions. The CSS original drove all three from one --tone token and [data-kind] selectors; the Tailwind port makes each variant an explicit class list (border-l-tbq03-tip bg-tbq03-tip/8) — more characters, but every variant is greppable and a reviewer can see exactly what "warning" looks like without reading a stylesheet.
## HTML
```html
<section class="tbq-03 w-full min-h-svh grid place-items-center bg-tbq03-bg px-5 py-14 font-tbq03-sans text-tbq03-ink" aria-label="Callout box admonition blockquote demo">
<div class="grid w-full justify-items-center gap-6">
<div class="flex w-full max-w-[600px] flex-col gap-3.5">
<p aria-hidden="true" class="mb-0.5 font-tbq03-mono text-xs text-tbq03-mut">docs / deploying / <b class="font-semibold text-tbq03-ink">zero-downtime.md</b></p>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-note/25 border-l-tbq03-note bg-tbq03-note/8 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-note-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-note/15"><svg viewBox="0 0 16 16" width="15" height="15"><circle cx="8" cy="8" r="6.6" fill="none" stroke="currentColor" stroke-width="1.6"/><path d="M8 7.2v4" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/><circle cx="8" cy="4.9" r=".9" fill="currentColor"/></svg></span>Note</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Deploys are atomic. The new release only receives traffic after every health check passes — a failed boot never reaches users.</p>
</blockquote>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-tip/25 border-l-tbq03-tip bg-tbq03-tip/8 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-tip-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-tip/15"><svg viewBox="0 0 16 16" width="15" height="15"><path d="M8 1.6a4.6 4.6 0 0 0-2.6 8.4c.5.4.8.9.8 1.5h3.6c0-.6.3-1.1.8-1.5A4.6 4.6 0 0 0 8 1.6z" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M6.4 13.6h3.2" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg></span>Tip</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Set <code class="rounded-md bg-tbq03-tip/14 px-1.5 py-px font-tbq03-mono text-[0.86em]">--grace-period=30s</code> so in-flight requests drain before the old release is retired. Your p99 will thank you.</p>
</blockquote>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-warn/35 border-l-tbq03-warn bg-tbq03-warn/10 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-warn-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-warn/20"><svg viewBox="0 0 16 16" width="15" height="15"><path d="M8 2 14.6 13.4H1.4z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M8 6.4v3" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/><circle cx="8" cy="11.4" r=".85" fill="currentColor"/></svg></span>Warning</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Skipping migrations with <code class="rounded-md bg-tbq03-warn/18 px-1.5 py-px font-tbq03-mono text-[0.86em]">--no-migrate</code> leaves the schema behind the code. Only do this when the release is verified backwards-compatible.</p>
</blockquote>
</div>
<p aria-hidden="true" class="rounded-full border border-black/10 bg-white px-3.5 py-2 font-tbq03-mono text-[11.5px] text-tbq03-mut">border-l-4 · bg-tone/8 wash · -ink label tokens</p>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tbq03-bg: #f5f7f9;
--color-tbq03-bg: oklch(0.975 0.004 250);
--color-tbq03-card: #ffffff;
--color-tbq03-card: oklch(1 0 0);
--color-tbq03-ink: #22272e;
--color-tbq03-ink: oklch(0.27 0.015 260);
--color-tbq03-mut: #5e646c;
--color-tbq03-mut: oklch(0.5 0.015 260);
--color-tbq03-note: #398ad6;
--color-tbq03-note: oklch(0.62 0.14 250);
--color-tbq03-note-ink: #155aa7;
--color-tbq03-note-ink: oklch(0.47 0.14 255);
--color-tbq03-tip: #2fa465;
--color-tbq03-tip: oklch(0.64 0.14 155);
--color-tbq03-tip-ink: #036639;
--color-tbq03-tip-ink: oklch(0.45 0.11 155);
--color-tbq03-warn: #e8a127;
--color-tbq03-warn: oklch(0.76 0.15 75);
--color-tbq03-warn-ink: #915200;
--color-tbq03-warn-ink: oklch(0.5 0.12 65);
--font-tbq03-sans: 'Plus Jakarta Sans', system-ui, sans-serif;
--font-tbq03-mono: 'JetBrains 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-03 {
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 Callout Box / Admonition Blockquote
Source: https://codefronts.com/snippets/tailwind-css-blockquotes/tailwind-callout-box-admonition-blockquote/
Docs-style Note / Tip / Warning admonitions. The CSS original drove all three from one --tone token and [data-kind] selectors; the Tailwind port makes each variant an explicit class list (border-l-tbq03-tip bg-tbq03-tip/8) — more characters, but every variant is greppable and a reviewer can see exactly what "warning" looks like without reading a stylesheet.
## HTML
```html
<section class="tbq-03 w-full min-h-svh grid place-items-center bg-tbq03-bg px-5 py-14 font-tbq03-sans text-tbq03-ink" aria-label="Callout box admonition blockquote demo">
<div class="grid w-full justify-items-center gap-6">
<div class="flex w-full max-w-[600px] flex-col gap-3.5">
<p aria-hidden="true" class="mb-0.5 font-tbq03-mono text-xs text-tbq03-mut">docs / deploying / <b class="font-semibold text-tbq03-ink">zero-downtime.md</b></p>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-note/25 border-l-tbq03-note bg-tbq03-note/8 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-note-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-note/15"><svg viewBox="0 0 16 16" width="15" height="15"><circle cx="8" cy="8" r="6.6" fill="none" stroke="currentColor" stroke-width="1.6"/><path d="M8 7.2v4" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/><circle cx="8" cy="4.9" r=".9" fill="currentColor"/></svg></span>Note</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Deploys are atomic. The new release only receives traffic after every health check passes — a failed boot never reaches users.</p>
</blockquote>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-tip/25 border-l-tbq03-tip bg-tbq03-tip/8 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-tip-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-tip/15"><svg viewBox="0 0 16 16" width="15" height="15"><path d="M8 1.6a4.6 4.6 0 0 0-2.6 8.4c.5.4.8.9.8 1.5h3.6c0-.6.3-1.1.8-1.5A4.6 4.6 0 0 0 8 1.6z" fill="none" stroke="currentColor" stroke-width="1.5"/><path d="M6.4 13.6h3.2" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg></span>Tip</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Set <code class="rounded-md bg-tbq03-tip/14 px-1.5 py-px font-tbq03-mono text-[0.86em]">--grace-period=30s</code> so in-flight requests drain before the old release is retired. Your p99 will thank you.</p>
</blockquote>
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-warn/35 border-l-tbq03-warn bg-tbq03-warn/10 px-4.5 py-4 shadow-[0_1px_2px_oklch(0_0_0/0.04)]">
<p class="mb-1.5 flex items-center gap-2 text-[13px] font-bold tracking-[0.02em] text-tbq03-warn-ink"><span aria-hidden="true" class="grid size-6 place-items-center rounded-md bg-tbq03-warn/20"><svg viewBox="0 0 16 16" width="15" height="15"><path d="M8 2 14.6 13.4H1.4z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M8 6.4v3" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/><circle cx="8" cy="11.4" r=".85" fill="currentColor"/></svg></span>Warning</p>
<p class="text-[14.5px] leading-[1.62] text-tbq03-ink/90 text-pretty">Skipping migrations with <code class="rounded-md bg-tbq03-warn/18 px-1.5 py-px font-tbq03-mono text-[0.86em]">--no-migrate</code> leaves the schema behind the code. Only do this when the release is verified backwards-compatible.</p>
</blockquote>
</div>
<p aria-hidden="true" class="rounded-full border border-black/10 bg-white px-3.5 py-2 font-tbq03-mono text-[11.5px] text-tbq03-mut">border-l-4 · bg-tone/8 wash · -ink label tokens</p>
</div>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tbq03-bg: #f5f7f9;
--color-tbq03-bg: oklch(0.975 0.004 250);
--color-tbq03-card: #ffffff;
--color-tbq03-card: oklch(1 0 0);
--color-tbq03-ink: #22272e;
--color-tbq03-ink: oklch(0.27 0.015 260);
--color-tbq03-mut: #5e646c;
--color-tbq03-mut: oklch(0.5 0.015 260);
--color-tbq03-note: #398ad6;
--color-tbq03-note: oklch(0.62 0.14 250);
--color-tbq03-note-ink: #155aa7;
--color-tbq03-note-ink: oklch(0.47 0.14 255);
--color-tbq03-tip: #2fa465;
--color-tbq03-tip: oklch(0.64 0.14 155);
--color-tbq03-tip-ink: #036639;
--color-tbq03-tip-ink: oklch(0.45 0.11 155);
--color-tbq03-warn: #e8a127;
--color-tbq03-warn: oklch(0.76 0.15 75);
--color-tbq03-warn-ink: #915200;
--color-tbq03-warn-ink: oklch(0.5 0.12 65);
--font-tbq03-sans: 'Plus Jakarta Sans', system-ui, sans-serif;
--font-tbq03-mono: 'JetBrains 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-03 {
width: 100%;
min-height: 100svh;
}
```How this works
Variants as class lists, not selectors. The original's one-token design was elegant but invisible: you had to find [data-kind="warn"] to know what a warning looked like. In utilities each callout says what it is:
<blockquote class="rounded-r-xl border border-l-4 border-tbq03-warn/30
border-l-tbq03-warn bg-tbq03-warn/10 px-4.5 py-4">Two tokens per tone. A tone bright enough to read as a rule (amber at L 0.75) is far too light for text on a pale wash. Each tone now has a darker -ink partner used only for the label and icon.
In a component framework you would collapse the three class lists into a variants map (cva, tailwind-variants) — see the customization notes.
Make it yours
- Add a Danger tone: mint
--color-tbq03-dangerand--color-tbq03-danger-inkand copy any callout's class list. - Component frameworks: move the three class strings into a
{ note, tip, warn }object and pick by prop. - Heavier look: replace the
/8wash with/14and drop the hairline border.
Gotchas — read before shipping
border-l-4must followborder— later width utilities win, but only for the side they name.- Semantics: an admonition is authorial, not quoted; if your content isn't a quotation,
<aside role="note">is more accurate than<blockquote>(Markdown renderers emit blockquote, which is why it's used here). - Never rely on colour alone — the icon and the word "Warning" carry the meaning for colour-blind readers.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
The opacity modifier compiles to color-mix(), which sets the floor alongside cascade layers.