01 / 30
All 30 in 30 Tailwind CSS Grid Layouts
- 01Tailwind Full-Bleed Article Layout for Long-Form Editorial
- 02Tailwind Docs Layout with Sticky Table of Contents
- 03Tailwind Photo Gallery Grid with auto-fill and Real Images
- 04Tailwind Holy Grail Page Layout for a News Site
- 05Tailwind Data Table with Subgrid Rows and Status Pills
- 06Tailwind Overlapping Card Hero for a Case Study
- 07Tailwind Help Center Layout with Fixed Sidebars
- 08Tailwind 12 Column Grid System for Marketing Pages
- 09Tailwind Bento Grid for a Product Feature Section
- 10Tailwind Magazine Spread Layout with Overlapping Headline
- 11Tailwind Responsive Card Grid for an Integrations Directory
- 12Tailwind CMS Category Grid that Compacts Itself with has()
- 13Tailwind Masonry Layout for a Saved Ideas Board
- 14Tailwind Hexagon Team Grid with clip-path Avatars
- 15Tailwind Subgrid Cards with Perfectly Aligned Buttons
- 16Tailwind Analytics Dashboard Layout with Grid App Shell
- 17Tailwind Pricing Table with Subgrid and a Featured Plan
- 18Tailwind Kanban Board with Scroll Snap Columns
- 19Tailwind Video Thumbnail Grid with Zero Layout Shift
- 20Tailwind Container Query Card for Reusable Article Teasers
- 21Tailwind Diagonal Section Band with skewY Counter-Skew
- 22Tailwind Asymmetric Poster Hero with Layered Grid Regions
- 23Tailwind Mosaic Photo Wall with a Designed Span Sequence
- 24Tailwind Dense Grid Packing for a Mixed-Size Asset Library
- 25Tailwind Onboarding Stepper with CSS Counters
- 26Tailwind macOS Window Layout with Vibrancy Sidebar
- 27Tailwind Scroll Snap Carousel with Peeking Slides
- 28Tailwind Status Map UI with Grid Coordinate Pins
- 29Tailwind Logo Wall with 1px Gap Hairline Dividers
- 30Tailwind Periodic Table Layout with Grid Coordinates
Tailwind Full-Bleed Article Layout for Long-Form Editorial
A real magazine feature — dateline, drop-in photography, a full-bleed pull quote and a reading measure that never wavers. Body copy locks to 65ch while imagery breaks the gutters, and any element opts into the bleed with one class.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="tgx-01 w-full min-h-svh bg-tgx01-paper text-tgx01-ink font-tgx01-serif">
<article class="grid [grid-template-columns:var(--tgx01-track)] *:[grid-column:content] gap-y-6 pb-16">
<header class="[grid-column:full] grid [grid-template-columns:inherit] bg-tgx01-ink text-tgx01-paper py-10">
<div class="[grid-column:content] flex flex-col gap-4">
<p class="font-tgx01-sans text-[0.7rem] font-semibold tracking-[0.2em] uppercase text-tgx01-accentlight">Atlas Quarterly · Field Report</p>
<h1 class="text-[clamp(2rem,5.5vw,3.2rem)] leading-[1.06] font-semibold tracking-[-0.015em] text-balance">The last ferry to Vestmanna</h1>
<p class="font-tgx01-sans text-[0.95rem] leading-[1.6] text-tgx01-papermut max-w-[52ch]">Three days on the Faroese coast road, where the weather writes the timetable and every village keeps one boat in reserve.</p>
<p class="font-tgx01-sans text-[0.78rem] text-tgx01-papermut">Words & pictures by Marit Solheim · 14 min read · September 2026</p>
</div>
</header>
<figure class="[grid-column:full] flex flex-col gap-2 mt-2">
<div class="w-full aspect-[21/9] overflow-hidden bg-tgx01-shade">
<img src="https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=2000&h=857&q=80&auto=format&fit=crop" alt="Low cloud breaking over a green coastal ridge above dark water" loading="lazy" class="w-full h-full object-cover">
</div>
<figcaption class="font-tgx01-sans text-xs text-tgx01-mut px-6">Sørvágsvatn from the ridge path, 06:40. The figure spans <code class="font-tgx01-mono">grid-column: full</code> — edge to edge, no negative margins.</figcaption>
</figure>
<p class="text-[1.06rem] leading-[1.75] first-letter:float-left first-letter:text-[3.1em] first-letter:leading-[0.84] first-letter:pr-[0.1em] first-letter:font-semibold first-letter:text-tgx01-accent">The bus from Tórshavn leaves at ten past seven and will not wait for anyone photographing the harbour. I learn this on the first morning, from a driver who has clearly had the conversation before, and who accelerates away with the sort of patience reserved for people who will now be walking.</p>
<p class="text-[1.06rem] leading-[1.75]">What replaces the bus is better anyway: a coast road with no shoulder, a tunnel lit like a dance floor, and a run of villages that appear exactly when the fog decides to lift. The measure of a place like this is how long the light holds, and here it holds for about four minutes at a time.</p>
<blockquote class="[grid-column:full] [grid-template-columns:inherit] grid bg-tgx01-accent text-white py-12 my-4">
<p class="[grid-column:content] text-[clamp(1.3rem,3.2vw,1.9rem)] leading-[1.35] font-semibold text-balance">“You do not plan a week here. You plan a morning, and then you ask someone at the shop what the afternoon is doing.”</p>
</blockquote>
<p class="text-[1.06rem] leading-[1.75]">By the third day I have stopped checking the forecast, which is the point at which the coast road starts to make sense. The ferry to Vestmanna runs when the sound is calm. The sound is calm when it is calm.</p>
<figure class="[grid-column:full] grid [grid-template-columns:inherit] gap-y-2 my-2">
<div class="[grid-column:content] grid grid-cols-2 max-sm:grid-cols-1 gap-3">
<div class="aspect-[4/3] overflow-hidden rounded-sm bg-tgx01-shade"><img src="https://images.unsplash.com/photo-1447752875215-b2761acb3c5d?w=800&h=600&q=80&auto=format&fit=crop" alt="Narrow path through low pine woodland in flat morning light" loading="lazy" class="w-full h-full object-cover"></div>
<div class="aspect-[4/3] overflow-hidden rounded-sm bg-tgx01-shade"><img src="https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=800&h=600&q=80&auto=format&fit=crop" alt="Steep green valley falling away toward a river" loading="lazy" class="w-full h-full object-cover"></div>
</div>
<figcaption class="[grid-column:content] font-tgx01-sans text-xs text-tgx01-mut">Inland detours: the pass above Saksun (left) and the valley road south (right).</figcaption>
</figure>
<p class="text-[1.06rem] leading-[1.75]">The last ferry is at 17:20, and it does wait — for the bus, for the two cyclists, for the man carrying a door. Everything on this coast runs late and nothing is actually missed.</p>
</article>
</section><section class="tgx-01 w-full min-h-svh bg-tgx01-paper text-tgx01-ink font-tgx01-serif">
<article class="grid [grid-template-columns:var(--tgx01-track)] *:[grid-column:content] gap-y-6 pb-16">
<header class="[grid-column:full] grid [grid-template-columns:inherit] bg-tgx01-ink text-tgx01-paper py-10">
<div class="[grid-column:content] flex flex-col gap-4">
<p class="font-tgx01-sans text-[0.7rem] font-semibold tracking-[0.2em] uppercase text-tgx01-accentlight">Atlas Quarterly · Field Report</p>
<h1 class="text-[clamp(2rem,5.5vw,3.2rem)] leading-[1.06] font-semibold tracking-[-0.015em] text-balance">The last ferry to Vestmanna</h1>
<p class="font-tgx01-sans text-[0.95rem] leading-[1.6] text-tgx01-papermut max-w-[52ch]">Three days on the Faroese coast road, where the weather writes the timetable and every village keeps one boat in reserve.</p>
<p class="font-tgx01-sans text-[0.78rem] text-tgx01-papermut">Words & pictures by Marit Solheim · 14 min read · September 2026</p>
</div>
</header>
<figure class="[grid-column:full] flex flex-col gap-2 mt-2">
<div class="w-full aspect-[21/9] overflow-hidden bg-tgx01-shade">
<img src="https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=2000&h=857&q=80&auto=format&fit=crop" alt="Low cloud breaking over a green coastal ridge above dark water" loading="lazy" class="w-full h-full object-cover">
</div>
<figcaption class="font-tgx01-sans text-xs text-tgx01-mut px-6">Sørvágsvatn from the ridge path, 06:40. The figure spans <code class="font-tgx01-mono">grid-column: full</code> — edge to edge, no negative margins.</figcaption>
</figure>
<p class="text-[1.06rem] leading-[1.75] first-letter:float-left first-letter:text-[3.1em] first-letter:leading-[0.84] first-letter:pr-[0.1em] first-letter:font-semibold first-letter:text-tgx01-accent">The bus from Tórshavn leaves at ten past seven and will not wait for anyone photographing the harbour. I learn this on the first morning, from a driver who has clearly had the conversation before, and who accelerates away with the sort of patience reserved for people who will now be walking.</p>
<p class="text-[1.06rem] leading-[1.75]">What replaces the bus is better anyway: a coast road with no shoulder, a tunnel lit like a dance floor, and a run of villages that appear exactly when the fog decides to lift. The measure of a place like this is how long the light holds, and here it holds for about four minutes at a time.</p>
<blockquote class="[grid-column:full] [grid-template-columns:inherit] grid bg-tgx01-accent text-white py-12 my-4">
<p class="[grid-column:content] text-[clamp(1.3rem,3.2vw,1.9rem)] leading-[1.35] font-semibold text-balance">“You do not plan a week here. You plan a morning, and then you ask someone at the shop what the afternoon is doing.”</p>
</blockquote>
<p class="text-[1.06rem] leading-[1.75]">By the third day I have stopped checking the forecast, which is the point at which the coast road starts to make sense. The ferry to Vestmanna runs when the sound is calm. The sound is calm when it is calm.</p>
<figure class="[grid-column:full] grid [grid-template-columns:inherit] gap-y-2 my-2">
<div class="[grid-column:content] grid grid-cols-2 max-sm:grid-cols-1 gap-3">
<div class="aspect-[4/3] overflow-hidden rounded-sm bg-tgx01-shade"><img src="https://images.unsplash.com/photo-1447752875215-b2761acb3c5d?w=800&h=600&q=80&auto=format&fit=crop" alt="Narrow path through low pine woodland in flat morning light" loading="lazy" class="w-full h-full object-cover"></div>
<div class="aspect-[4/3] overflow-hidden rounded-sm bg-tgx01-shade"><img src="https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=800&h=600&q=80&auto=format&fit=crop" alt="Steep green valley falling away toward a river" loading="lazy" class="w-full h-full object-cover"></div>
</div>
<figcaption class="[grid-column:content] font-tgx01-sans text-xs text-tgx01-mut">Inland detours: the pass above Saksun (left) and the valley road south (right).</figcaption>
</figure>
<p class="text-[1.06rem] leading-[1.75]">The last ferry is at 17:20, and it does wait — for the bus, for the two cyclists, for the man carrying a door. Everything on this coast runs late and nothing is actually missed.</p>
</article>
</section>@import "tailwindcss";
@theme {
--color-tgx01-paper: #f9f6f0;
--color-tgx01-paper: oklch(0.97 0.012 85);
--color-tgx01-papermut: #cfc7bb;
--color-tgx01-papermut: oklch(0.83 0.012 85);
--color-tgx01-shade: #e7e1d7;
--color-tgx01-shade: oklch(0.91 0.012 85);
--color-tgx01-ink: #2e2822;
--color-tgx01-ink: oklch(0.27 0.015 60);
--color-tgx01-mut: #756b5f;
--color-tgx01-mut: oklch(0.52 0.02 65);
--color-tgx01-accent: #9c4a26;
--color-tgx01-accent: oklch(0.5 0.14 45);
--color-tgx01-accentlight: #e8a077;
--color-tgx01-accentlight: oklch(0.78 0.11 45);
--font-tgx01-serif: 'Fraunces', Georgia, serif;
--font-tgx01-sans: 'Inter Tight', system-ui, sans-serif;
--font-tgx01-mono: ui-monospace, Menlo, monospace;
}
/* Named-line track list: grammar, not design scale — kept in CSS and passed
into the markup through one arbitrary property. */
.tgx-01 {
width: 100%;
min-height: 100svh;
--tgx01-track: [full-start] minmax(1.5rem, 1fr) [content-start] min(65ch, calc(100% - 3rem)) [content-end] minmax(1.5rem, 1fr) [full-end];
}@import "tailwindcss";
@theme {
--color-tgx01-paper: #f9f6f0;
--color-tgx01-paper: oklch(0.97 0.012 85);
--color-tgx01-papermut: #cfc7bb;
--color-tgx01-papermut: oklch(0.83 0.012 85);
--color-tgx01-shade: #e7e1d7;
--color-tgx01-shade: oklch(0.91 0.012 85);
--color-tgx01-ink: #2e2822;
--color-tgx01-ink: oklch(0.27 0.015 60);
--color-tgx01-mut: #756b5f;
--color-tgx01-mut: oklch(0.52 0.02 65);
--color-tgx01-accent: #9c4a26;
--color-tgx01-accent: oklch(0.5 0.14 45);
--color-tgx01-accentlight: #e8a077;
--color-tgx01-accentlight: oklch(0.78 0.11 45);
--font-tgx01-serif: 'Fraunces', Georgia, serif;
--font-tgx01-sans: 'Inter Tight', system-ui, sans-serif;
--font-tgx01-mono: ui-monospace, Menlo, monospace;
}
/* Named-line track list: grammar, not design scale — kept in CSS and passed
into the markup through one arbitrary property. */
.tgx-01 {
width: 100%;
min-height: 100svh;
--tgx01-track: [full-start] minmax(1.5rem, 1fr) [content-start] min(65ch, calc(100% - 3rem)) [content-end] minmax(1.5rem, 1fr) [full-end];
}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-tgx01-paper: #f9f6f0;
--color-tgx01-paper: oklch(0.97 0.012 85);
--color-tgx01-papermut: #cfc7bb;
--color-tgx01-papermut: oklch(0.83 0.012 85);
--color-tgx01-shade: #e7e1d7;
--color-tgx01-shade: oklch(0.91 0.012 85);
--color-tgx01-ink: #2e2822;
--color-tgx01-ink: oklch(0.27 0.015 60);
--color-tgx01-mut: #756b5f;
--color-tgx01-mut: oklch(0.52 0.02 65);
--color-tgx01-accent: #9c4a26;
--color-tgx01-accent: oklch(0.5 0.14 45);
--color-tgx01-accentlight: #e8a077;
--color-tgx01-accentlight: oklch(0.78 0.11 45);
--font-tgx01-serif: 'Fraunces', Georgia, serif;
--font-tgx01-sans: 'Inter Tight', system-ui, sans-serif;
--font-tgx01-mono: ui-monospace, Menlo, monospace;
}
/* Named-line track list: grammar, not design scale — kept in CSS and passed
into the markup through one arbitrary property. */
.tgx-01 {
width: 100%;
min-height: 100svh;
--tgx01-track: [full-start] minmax(1.5rem, 1fr) [content-start] min(65ch, calc(100% - 3rem)) [content-end] minmax(1.5rem, 1fr) [full-end];
}@import "tailwindcss";
@theme {
--color-tgx01-paper: #f9f6f0;
--color-tgx01-paper: oklch(0.97 0.012 85);
--color-tgx01-papermut: #cfc7bb;
--color-tgx01-papermut: oklch(0.83 0.012 85);
--color-tgx01-shade: #e7e1d7;
--color-tgx01-shade: oklch(0.91 0.012 85);
--color-tgx01-ink: #2e2822;
--color-tgx01-ink: oklch(0.27 0.015 60);
--color-tgx01-mut: #756b5f;
--color-tgx01-mut: oklch(0.52 0.02 65);
--color-tgx01-accent: #9c4a26;
--color-tgx01-accent: oklch(0.5 0.14 45);
--color-tgx01-accentlight: #e8a077;
--color-tgx01-accentlight: oklch(0.78 0.11 45);
--font-tgx01-serif: 'Fraunces', Georgia, serif;
--font-tgx01-sans: 'Inter Tight', system-ui, sans-serif;
--font-tgx01-mono: ui-monospace, Menlo, monospace;
}
/* Named-line track list: grammar, not design scale — kept in CSS and passed
into the markup through one arbitrary property. */
.tgx-01 {
width: 100%;
min-height: 100svh;
--tgx01-track: [full-start] minmax(1.5rem, 1fr) [content-start] min(65ch, calc(100% - 3rem)) [content-end] minmax(1.5rem, 1fr) [full-end];
}<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://images.unsplash.com"> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,600;9..144,700&family=Inter+Tight:wght@400;500;600&display=swap">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preconnect" href="https://images.unsplash.com">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,600;9..144,700&family=Inter+Tight:wght@400;500;600&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
- The masthead, the hero, the quote band and the two-up figure all use the SAME bleed mechanism — which is the argument for named lines over one-off breakout hacks: four different components, one rule.
- A bleeding element that needs its content back in the measure just re-inherits the track list. That is why the dark header and the quote band read as typeset rather than as full-width boxes with padding.
- Product upgrade: the diagram became a real feature — dateline, byline, drop cap, captioned photography, an inline two-up and a coloured pull-quote band, so the reader can see what the measure is protecting.
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 Full-Bleed Article Layout for Long-Form Editorial
Source: https://codefronts.com/layouts/tailwind-css-grid-layouts/tailwind-full-bleed-article-layout-long-form-editorial/
A real magazine feature — dateline, drop-in photography, a full-bleed pull quote and a reading measure that never wavers. Body copy locks to 65ch while imagery breaks the gutters, and any element opts into the bleed with one class.
## HTML
```html
<section class="tgx-01 w-full min-h-svh bg-tgx01-paper text-tgx01-ink font-tgx01-serif">
<article class="grid [grid-template-columns:var(--tgx01-track)] *:[grid-column:content] gap-y-6 pb-16">
<header class="[grid-column:full] grid [grid-template-columns:inherit] bg-tgx01-ink text-tgx01-paper py-10">
<div class="[grid-column:content] flex flex-col gap-4">
<p class="font-tgx01-sans text-[0.7rem] font-semibold tracking-[0.2em] uppercase text-tgx01-accentlight">Atlas Quarterly · Field Report</p>
<h1 class="text-[clamp(2rem,5.5vw,3.2rem)] leading-[1.06] font-semibold tracking-[-0.015em] text-balance">The last ferry to Vestmanna</h1>
<p class="font-tgx01-sans text-[0.95rem] leading-[1.6] text-tgx01-papermut max-w-[52ch]">Three days on the Faroese coast road, where the weather writes the timetable and every village keeps one boat in reserve.</p>
<p class="font-tgx01-sans text-[0.78rem] text-tgx01-papermut">Words & pictures by Marit Solheim · 14 min read · September 2026</p>
</div>
</header>
<figure class="[grid-column:full] flex flex-col gap-2 mt-2">
<div class="w-full aspect-[21/9] overflow-hidden bg-tgx01-shade">
<img src="https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=2000&h=857&q=80&auto=format&fit=crop" alt="Low cloud breaking over a green coastal ridge above dark water" loading="lazy" class="w-full h-full object-cover">
</div>
<figcaption class="font-tgx01-sans text-xs text-tgx01-mut px-6">Sørvágsvatn from the ridge path, 06:40. The figure spans <code class="font-tgx01-mono">grid-column: full</code> — edge to edge, no negative margins.</figcaption>
</figure>
<p class="text-[1.06rem] leading-[1.75] first-letter:float-left first-letter:text-[3.1em] first-letter:leading-[0.84] first-letter:pr-[0.1em] first-letter:font-semibold first-letter:text-tgx01-accent">The bus from Tórshavn leaves at ten past seven and will not wait for anyone photographing the harbour. I learn this on the first morning, from a driver who has clearly had the conversation before, and who accelerates away with the sort of patience reserved for people who will now be walking.</p>
<p class="text-[1.06rem] leading-[1.75]">What replaces the bus is better anyway: a coast road with no shoulder, a tunnel lit like a dance floor, and a run of villages that appear exactly when the fog decides to lift. The measure of a place like this is how long the light holds, and here it holds for about four minutes at a time.</p>
<blockquote class="[grid-column:full] [grid-template-columns:inherit] grid bg-tgx01-accent text-white py-12 my-4">
<p class="[grid-column:content] text-[clamp(1.3rem,3.2vw,1.9rem)] leading-[1.35] font-semibold text-balance">“You do not plan a week here. You plan a morning, and then you ask someone at the shop what the afternoon is doing.”</p>
</blockquote>
<p class="text-[1.06rem] leading-[1.75]">By the third day I have stopped checking the forecast, which is the point at which the coast road starts to make sense. The ferry to Vestmanna runs when the sound is calm. The sound is calm when it is calm.</p>
<figure class="[grid-column:full] grid [grid-template-columns:inherit] gap-y-2 my-2">
<div class="[grid-column:content] grid grid-cols-2 max-sm:grid-cols-1 gap-3">
<div class="aspect-[4/3] overflow-hidden rounded-sm bg-tgx01-shade"><img src="https://images.unsplash.com/photo-1447752875215-b2761acb3c5d?w=800&h=600&q=80&auto=format&fit=crop" alt="Narrow path through low pine woodland in flat morning light" loading="lazy" class="w-full h-full object-cover"></div>
<div class="aspect-[4/3] overflow-hidden rounded-sm bg-tgx01-shade"><img src="https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=800&h=600&q=80&auto=format&fit=crop" alt="Steep green valley falling away toward a river" loading="lazy" class="w-full h-full object-cover"></div>
</div>
<figcaption class="[grid-column:content] font-tgx01-sans text-xs text-tgx01-mut">Inland detours: the pass above Saksun (left) and the valley road south (right).</figcaption>
</figure>
<p class="text-[1.06rem] leading-[1.75]">The last ferry is at 17:20, and it does wait — for the bus, for the two cyclists, for the man carrying a door. Everything on this coast runs late and nothing is actually missed.</p>
</article>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tgx01-paper: #f9f6f0;
--color-tgx01-paper: oklch(0.97 0.012 85);
--color-tgx01-papermut: #cfc7bb;
--color-tgx01-papermut: oklch(0.83 0.012 85);
--color-tgx01-shade: #e7e1d7;
--color-tgx01-shade: oklch(0.91 0.012 85);
--color-tgx01-ink: #2e2822;
--color-tgx01-ink: oklch(0.27 0.015 60);
--color-tgx01-mut: #756b5f;
--color-tgx01-mut: oklch(0.52 0.02 65);
--color-tgx01-accent: #9c4a26;
--color-tgx01-accent: oklch(0.5 0.14 45);
--color-tgx01-accentlight: #e8a077;
--color-tgx01-accentlight: oklch(0.78 0.11 45);
--font-tgx01-serif: 'Fraunces', Georgia, serif;
--font-tgx01-sans: 'Inter Tight', system-ui, sans-serif;
--font-tgx01-mono: ui-monospace, Menlo, monospace;
}
/* Named-line track list: grammar, not design scale — kept in CSS and passed
into the markup through one arbitrary property. */
.tgx-01 {
width: 100%;
min-height: 100svh;
--tgx01-track: [full-start] minmax(1.5rem, 1fr) [content-start] min(65ch, calc(100% - 3rem)) [content-end] minmax(1.5rem, 1fr) [full-end];
}
```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 Full-Bleed Article Layout for Long-Form Editorial
Source: https://codefronts.com/layouts/tailwind-css-grid-layouts/tailwind-full-bleed-article-layout-long-form-editorial/
A real magazine feature — dateline, drop-in photography, a full-bleed pull quote and a reading measure that never wavers. Body copy locks to 65ch while imagery breaks the gutters, and any element opts into the bleed with one class.
## HTML
```html
<section class="tgx-01 w-full min-h-svh bg-tgx01-paper text-tgx01-ink font-tgx01-serif">
<article class="grid [grid-template-columns:var(--tgx01-track)] *:[grid-column:content] gap-y-6 pb-16">
<header class="[grid-column:full] grid [grid-template-columns:inherit] bg-tgx01-ink text-tgx01-paper py-10">
<div class="[grid-column:content] flex flex-col gap-4">
<p class="font-tgx01-sans text-[0.7rem] font-semibold tracking-[0.2em] uppercase text-tgx01-accentlight">Atlas Quarterly · Field Report</p>
<h1 class="text-[clamp(2rem,5.5vw,3.2rem)] leading-[1.06] font-semibold tracking-[-0.015em] text-balance">The last ferry to Vestmanna</h1>
<p class="font-tgx01-sans text-[0.95rem] leading-[1.6] text-tgx01-papermut max-w-[52ch]">Three days on the Faroese coast road, where the weather writes the timetable and every village keeps one boat in reserve.</p>
<p class="font-tgx01-sans text-[0.78rem] text-tgx01-papermut">Words & pictures by Marit Solheim · 14 min read · September 2026</p>
</div>
</header>
<figure class="[grid-column:full] flex flex-col gap-2 mt-2">
<div class="w-full aspect-[21/9] overflow-hidden bg-tgx01-shade">
<img src="https://images.unsplash.com/photo-1470071459604-3b5ec3a7fe05?w=2000&h=857&q=80&auto=format&fit=crop" alt="Low cloud breaking over a green coastal ridge above dark water" loading="lazy" class="w-full h-full object-cover">
</div>
<figcaption class="font-tgx01-sans text-xs text-tgx01-mut px-6">Sørvágsvatn from the ridge path, 06:40. The figure spans <code class="font-tgx01-mono">grid-column: full</code> — edge to edge, no negative margins.</figcaption>
</figure>
<p class="text-[1.06rem] leading-[1.75] first-letter:float-left first-letter:text-[3.1em] first-letter:leading-[0.84] first-letter:pr-[0.1em] first-letter:font-semibold first-letter:text-tgx01-accent">The bus from Tórshavn leaves at ten past seven and will not wait for anyone photographing the harbour. I learn this on the first morning, from a driver who has clearly had the conversation before, and who accelerates away with the sort of patience reserved for people who will now be walking.</p>
<p class="text-[1.06rem] leading-[1.75]">What replaces the bus is better anyway: a coast road with no shoulder, a tunnel lit like a dance floor, and a run of villages that appear exactly when the fog decides to lift. The measure of a place like this is how long the light holds, and here it holds for about four minutes at a time.</p>
<blockquote class="[grid-column:full] [grid-template-columns:inherit] grid bg-tgx01-accent text-white py-12 my-4">
<p class="[grid-column:content] text-[clamp(1.3rem,3.2vw,1.9rem)] leading-[1.35] font-semibold text-balance">“You do not plan a week here. You plan a morning, and then you ask someone at the shop what the afternoon is doing.”</p>
</blockquote>
<p class="text-[1.06rem] leading-[1.75]">By the third day I have stopped checking the forecast, which is the point at which the coast road starts to make sense. The ferry to Vestmanna runs when the sound is calm. The sound is calm when it is calm.</p>
<figure class="[grid-column:full] grid [grid-template-columns:inherit] gap-y-2 my-2">
<div class="[grid-column:content] grid grid-cols-2 max-sm:grid-cols-1 gap-3">
<div class="aspect-[4/3] overflow-hidden rounded-sm bg-tgx01-shade"><img src="https://images.unsplash.com/photo-1447752875215-b2761acb3c5d?w=800&h=600&q=80&auto=format&fit=crop" alt="Narrow path through low pine woodland in flat morning light" loading="lazy" class="w-full h-full object-cover"></div>
<div class="aspect-[4/3] overflow-hidden rounded-sm bg-tgx01-shade"><img src="https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=800&h=600&q=80&auto=format&fit=crop" alt="Steep green valley falling away toward a river" loading="lazy" class="w-full h-full object-cover"></div>
</div>
<figcaption class="[grid-column:content] font-tgx01-sans text-xs text-tgx01-mut">Inland detours: the pass above Saksun (left) and the valley road south (right).</figcaption>
</figure>
<p class="text-[1.06rem] leading-[1.75]">The last ferry is at 17:20, and it does wait — for the bus, for the two cyclists, for the man carrying a door. Everything on this coast runs late and nothing is actually missed.</p>
</article>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tgx01-paper: #f9f6f0;
--color-tgx01-paper: oklch(0.97 0.012 85);
--color-tgx01-papermut: #cfc7bb;
--color-tgx01-papermut: oklch(0.83 0.012 85);
--color-tgx01-shade: #e7e1d7;
--color-tgx01-shade: oklch(0.91 0.012 85);
--color-tgx01-ink: #2e2822;
--color-tgx01-ink: oklch(0.27 0.015 60);
--color-tgx01-mut: #756b5f;
--color-tgx01-mut: oklch(0.52 0.02 65);
--color-tgx01-accent: #9c4a26;
--color-tgx01-accent: oklch(0.5 0.14 45);
--color-tgx01-accentlight: #e8a077;
--color-tgx01-accentlight: oklch(0.78 0.11 45);
--font-tgx01-serif: 'Fraunces', Georgia, serif;
--font-tgx01-sans: 'Inter Tight', system-ui, sans-serif;
--font-tgx01-mono: ui-monospace, Menlo, monospace;
}
/* Named-line track list: grammar, not design scale — kept in CSS and passed
into the markup through one arbitrary property. */
.tgx-01 {
width: 100%;
min-height: 100svh;
--tgx01-track: [full-start] minmax(1.5rem, 1fr) [content-start] min(65ch, calc(100% - 3rem)) [content-end] minmax(1.5rem, 1fr) [full-end];
}
```How this works
Two named areas, one track list. [full-start] gutter [content-start] measure [content-end] gutter [full-end] gives you a content area and a full area for free. Children default into content through the *: variant; the hero and the quote say full and span the viewport.
The quote band re-enters the grid. It bleeds edge to edge but re-declares [grid-template-columns:inherit], so the quotation itself lands back in the measure — the trick that makes full-bleed colour bands look typeset rather than pasted on.
Make it yours
- Change the measure inside
--tgx01-track;chunits follow your type. - Add a popout tier (
[popout-start] minmax(0,6rem)) for images that break out only slightly. - Swap the hero for a
<video>— the bleed rule does not care what the media is.
Gotchas — read before shipping
- Without
*:[grid-column:content]every child lands in the first gutter track. - Never put horizontal padding on the article: the gutter tracks ARE the padding.
- Images inside a bleed need
w-full object-coverin a ratio'd wrapper, or they overflow the track.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
Named grid lines and min() are Baseline; the floor is Tailwind v4's generated sheet.