37 / 39
All 39 in 39 Tailwind CSS Breadcrumbs
- 01Tailwind Accessible Breadcrumb with Schema.org Microdata & ARIA
- 02Tailwind Responsive Collapsing Breadcrumb Bar with Container Queries
- 03Tailwind Adaptive Light & Dark Mode Breadcrumb Bar with Theme Tokens
- 04Tailwind E-Commerce Filter & Facet Breadcrumb with Removable Chips
- 05Tailwind Glassmorphism Floating Breadcrumb Pill with Shimmer Sweep
- 06Tailwind Neumorphic Soft UI Breadcrumb with Dual Box Shadows
- 07Tailwind Sticky Scroll-Shrink Breadcrumb Header with Scroll-Driven Animation
- 08Tailwind Material Design Flat Breadcrumb Bar with Ink Ripple
- 09Tailwind Isometric 3D Layered Breadcrumb with Extruded Tiles
- 10Tailwind Breadcrumb Bar with Built-In Dropdown Sibling Menus
- 11Tailwind Full-Width Block-Style Segmented Breadcrumb Bar
- 12Tailwind Accent-Colour Toggle Breadcrumb with Persisted Theme
- 13Tailwind Seamless Arrow-Cutout Breadcrumb Trail with clip-path
- 14Tailwind Compact Icon-Only Home Node Breadcrumb Bar
- 15Tailwind Segmented Rounded-Outline Pill Breadcrumb
- 16Tailwind Neumorphic Soft Inset-Shadow Breadcrumb Channel
- 17Tailwind CSS Grid Auto-Fitting Responsive Breadcrumb Trail
- 18Tailwind Holographic Shimmer Web3 Breadcrumb with Animated @property
- 19Tailwind SaaS Gradient-Text Breadcrumb Bar with Animated Clip
- 20Tailwind Marketplace Filter-Chip Breadcrumb with Icon Chips
- 21Tailwind Editorial Breadcrumb with Animated SVG Wave Underline
- 22Tailwind Developer Docs Breadcrumb with One-Click Path Copy
- 23Tailwind Modern Arrow Breadcrumb Bar using clip-path Polygons
- 24Tailwind Multi-Line Aligned Breadcrumb Layout with CSS Subgrid
- 25Tailwind Breadcrumb Links with Animated Underline Glow
- 26Tailwind Minimalist Breadcrumb with Swappable Masked SVG Separators
- 27Tailwind Multi-Step Checkout & Wizard Breadcrumb Indicator
- 28Tailwind Ribbon-Style Chevron Breadcrumb Trail
- 29Tailwind Pill-Shape Badge Breadcrumb Bar
- 30Tailwind Clean Line-Separator Minimalist Breadcrumbs
- 31Tailwind Gradient Background Glow Breadcrumb Bar
- 32Tailwind Floating Card Shadow Breadcrumb Navigation
- 33Tailwind Truncated Ellipsis Compact Mobile Breadcrumb
- 34Tailwind Inline Bullet-Dot Separator Breadcrumb
- 35Tailwind Skewed Parallelogram Breadcrumb Bar
- 36Tailwind Outline Border-Only Geometric Breadcrumbs
- 37Tailwind Circular Icon & Numbered Step Breadcrumbs
- 38Tailwind Frosted Glass Dark UI Breadcrumb Component
- 39Tailwind Micro-Interaction Animated Hover Breadcrumbs
Tailwind Circular Icon & Numbered Step Breadcrumbs
Stepper meets breadcrumb: every crumb leads with a circular badge holding an icon or an auto-incremented number, joined by short connector rules. The counter stays in CSS (it must), while the badge states, the connectors and the responsive icon-only mode are all utilities.
Untitled UI Pro: 5,000+ React + Tailwind CSS v4 components · from $349 one-time
Untitled UI React · Affiliate link
The code
<section class="tbc-37 w-full min-h-svh grid place-items-center bg-tbc37-bg font-tbc37-sans px-8 py-8">
<nav aria-label="Breadcrumb">
<ol class="flex flex-wrap items-center gap-4.5 list-none m-0 p-0 [counter-reset:tbc37step]">
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line first:before:hidden"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"><svg viewBox="0 0 24 24" class="w-3.75 h-3.75 fill-none stroke-current [stroke-width:1.9] [stroke-linecap:round] [stroke-linejoin:round]"><path d="M3 10.5 12 3l9 7.5M5.5 9.5V21h13V9.5"/></svg></span>Home</a></li>
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc [counter-increment:tbc37step] group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"></span>Account</a></li>
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc [counter-increment:tbc37step] group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"></span>Profile</a></li>
<li aria-current="page" class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" aria-current="page" class="inline-flex items-center gap-2.25 text-[13.5px] font-bold text-tbc37-strong no-underline focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-acc text-white [counter-increment:tbc37step]"></span>Preferences</a></li>
</ol>
</nav>
</section><section class="tbc-37 w-full min-h-svh grid place-items-center bg-tbc37-bg font-tbc37-sans px-8 py-8">
<nav aria-label="Breadcrumb">
<ol class="flex flex-wrap items-center gap-4.5 list-none m-0 p-0 [counter-reset:tbc37step]">
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line first:before:hidden"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"><svg viewBox="0 0 24 24" class="w-3.75 h-3.75 fill-none stroke-current [stroke-width:1.9] [stroke-linecap:round] [stroke-linejoin:round]"><path d="M3 10.5 12 3l9 7.5M5.5 9.5V21h13V9.5"/></svg></span>Home</a></li>
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc [counter-increment:tbc37step] group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"></span>Account</a></li>
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc [counter-increment:tbc37step] group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"></span>Profile</a></li>
<li aria-current="page" class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" aria-current="page" class="inline-flex items-center gap-2.25 text-[13.5px] font-bold text-tbc37-strong no-underline focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-acc text-white [counter-increment:tbc37step]"></span>Preferences</a></li>
</ol>
</nav>
</section>@import "tailwindcss";
@theme {
--color-tbc37-bg: #fbfbfd;
--color-tbc37-bg: oklch(0.98 0.004 260);
--color-tbc37-tint: #dfe2f6;
--color-tbc37-tint: oklch(0.91 0.03 265);
--color-tbc37-acc: #4a5ac4;
--color-tbc37-acc: oklch(0.5 0.16 265);
--color-tbc37-link: #61656f;
--color-tbc37-link: oklch(0.46 0.03 260);
--color-tbc37-linkhover: #3a3f8c;
--color-tbc37-linkhover: oklch(0.36 0.13 265);
--color-tbc37-strong: #33363f;
--color-tbc37-strong: oklch(0.28 0.02 260);
--color-tbc37-line: #d5d8e2;
--color-tbc37-line: oklch(0.86 0.01 260);
--font-tbc37-sans: 'Space Grotesk', system-ui, sans-serif;
}
.tbc-37 {
width: 100%;
min-height: 100svh;
}
/* content:counter() has no utility form. One rule, and the badges number themselves. */
.tbc-37 .tbc37-num::after {
content: counter(tbc37step);
}
/* The compact mode restates the badge's own size, because the link's text-[0] would
otherwise cascade into it. */
@media (max-width: 40rem) {
.tbc-37 span[aria-hidden] {
font-size: 0.75rem;
}
}@import "tailwindcss";
@theme {
--color-tbc37-bg: #fbfbfd;
--color-tbc37-bg: oklch(0.98 0.004 260);
--color-tbc37-tint: #dfe2f6;
--color-tbc37-tint: oklch(0.91 0.03 265);
--color-tbc37-acc: #4a5ac4;
--color-tbc37-acc: oklch(0.5 0.16 265);
--color-tbc37-link: #61656f;
--color-tbc37-link: oklch(0.46 0.03 260);
--color-tbc37-linkhover: #3a3f8c;
--color-tbc37-linkhover: oklch(0.36 0.13 265);
--color-tbc37-strong: #33363f;
--color-tbc37-strong: oklch(0.28 0.02 260);
--color-tbc37-line: #d5d8e2;
--color-tbc37-line: oklch(0.86 0.01 260);
--font-tbc37-sans: 'Space Grotesk', system-ui, sans-serif;
}
.tbc-37 {
width: 100%;
min-height: 100svh;
}
/* content:counter() has no utility form. One rule, and the badges number themselves. */
.tbc-37 .tbc37-num::after {
content: counter(tbc37step);
}
/* The compact mode restates the badge's own size, because the link's text-[0] would
otherwise cascade into it. */
@media (max-width: 40rem) {
.tbc-37 span[aria-hidden] {
font-size: 0.75rem;
}
}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-tbc37-bg: #fbfbfd;
--color-tbc37-bg: oklch(0.98 0.004 260);
--color-tbc37-tint: #dfe2f6;
--color-tbc37-tint: oklch(0.91 0.03 265);
--color-tbc37-acc: #4a5ac4;
--color-tbc37-acc: oklch(0.5 0.16 265);
--color-tbc37-link: #61656f;
--color-tbc37-link: oklch(0.46 0.03 260);
--color-tbc37-linkhover: #3a3f8c;
--color-tbc37-linkhover: oklch(0.36 0.13 265);
--color-tbc37-strong: #33363f;
--color-tbc37-strong: oklch(0.28 0.02 260);
--color-tbc37-line: #d5d8e2;
--color-tbc37-line: oklch(0.86 0.01 260);
--font-tbc37-sans: 'Space Grotesk', system-ui, sans-serif;
}
.tbc-37 {
width: 100%;
min-height: 100svh;
}
/* content:counter() has no utility form. One rule, and the badges number themselves. */
.tbc-37 .tbc37-num::after {
content: counter(tbc37step);
}
/* The compact mode restates the badge's own size, because the link's text-[0] would
otherwise cascade into it. */
@media (max-width: 40rem) {
.tbc-37 span[aria-hidden] {
font-size: 0.75rem;
}
}@import "tailwindcss";
@theme {
--color-tbc37-bg: #fbfbfd;
--color-tbc37-bg: oklch(0.98 0.004 260);
--color-tbc37-tint: #dfe2f6;
--color-tbc37-tint: oklch(0.91 0.03 265);
--color-tbc37-acc: #4a5ac4;
--color-tbc37-acc: oklch(0.5 0.16 265);
--color-tbc37-link: #61656f;
--color-tbc37-link: oklch(0.46 0.03 260);
--color-tbc37-linkhover: #3a3f8c;
--color-tbc37-linkhover: oklch(0.36 0.13 265);
--color-tbc37-strong: #33363f;
--color-tbc37-strong: oklch(0.28 0.02 260);
--color-tbc37-line: #d5d8e2;
--color-tbc37-line: oklch(0.86 0.01 260);
--font-tbc37-sans: 'Space Grotesk', system-ui, sans-serif;
}
.tbc-37 {
width: 100%;
min-height: 100svh;
}
/* content:counter() has no utility form. One rule, and the badges number themselves. */
.tbc-37 .tbc37-num::after {
content: counter(tbc37step);
}
/* The compact mode restates the badge's own size, because the link's text-[0] would
otherwise cascade into it. */
@media (max-width: 40rem) {
.tbc-37 span[aria-hidden] {
font-size: 0.75rem;
}
}<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=Space+Grotesk: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=Space+Grotesk:wght@400;500;600;700&display=swap">What changed in the port
Which parts became utilities, which stayed CSS, and why.
- Two CSS rules survive the port and both are load-bearing: the counter's
content, and the badge font-size restatement that thetext-[0]compact mode requires. Everything else — badge tint, accent inversion, connectors — is a utility. group-aria-[current=page]:on the badge means the accent inversion reads the same attribute the screen reader does, instead of a mirrored class.- UI change from the CSS original: the accent darkened for AA on the tinted badge, and the current crumb now carries
aria-currenton BOTH the<li>and the<a>so the badge inversion and the link weight can each read it locally.
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 Circular Icon & Numbered Step Breadcrumbs
Source: https://codefronts.com/navigation/tailwind-css-breadcrumbs/tailwind-circular-icon-numbered-step-breadcrumbs/
Stepper meets breadcrumb: every crumb leads with a circular badge holding an icon or an auto-incremented number, joined by short connector rules. The counter stays in CSS (it must), while the badge states, the connectors and the responsive icon-only mode are all utilities.
## HTML
```html
<section class="tbc-37 w-full min-h-svh grid place-items-center bg-tbc37-bg font-tbc37-sans px-8 py-8">
<nav aria-label="Breadcrumb">
<ol class="flex flex-wrap items-center gap-4.5 list-none m-0 p-0 [counter-reset:tbc37step]">
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line first:before:hidden"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"><svg viewBox="0 0 24 24" class="w-3.75 h-3.75 fill-none stroke-current [stroke-width:1.9] [stroke-linecap:round] [stroke-linejoin:round]"><path d="M3 10.5 12 3l9 7.5M5.5 9.5V21h13V9.5"/></svg></span>Home</a></li>
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc [counter-increment:tbc37step] group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"></span>Account</a></li>
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc [counter-increment:tbc37step] group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"></span>Profile</a></li>
<li aria-current="page" class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" aria-current="page" class="inline-flex items-center gap-2.25 text-[13.5px] font-bold text-tbc37-strong no-underline focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-acc text-white [counter-increment:tbc37step]"></span>Preferences</a></li>
</ol>
</nav>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tbc37-bg: #fbfbfd;
--color-tbc37-bg: oklch(0.98 0.004 260);
--color-tbc37-tint: #dfe2f6;
--color-tbc37-tint: oklch(0.91 0.03 265);
--color-tbc37-acc: #4a5ac4;
--color-tbc37-acc: oklch(0.5 0.16 265);
--color-tbc37-link: #61656f;
--color-tbc37-link: oklch(0.46 0.03 260);
--color-tbc37-linkhover: #3a3f8c;
--color-tbc37-linkhover: oklch(0.36 0.13 265);
--color-tbc37-strong: #33363f;
--color-tbc37-strong: oklch(0.28 0.02 260);
--color-tbc37-line: #d5d8e2;
--color-tbc37-line: oklch(0.86 0.01 260);
--font-tbc37-sans: 'Space Grotesk', system-ui, sans-serif;
}
.tbc-37 {
width: 100%;
min-height: 100svh;
}
/* content:counter() has no utility form. One rule, and the badges number themselves. */
.tbc-37 .tbc37-num::after {
content: counter(tbc37step);
}
/* The compact mode restates the badge's own size, because the link's text-[0] would
otherwise cascade into it. */
@media (max-width: 40rem) {
.tbc-37 span[aria-hidden] {
font-size: 0.75rem;
}
}
```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 Circular Icon & Numbered Step Breadcrumbs
Source: https://codefronts.com/navigation/tailwind-css-breadcrumbs/tailwind-circular-icon-numbered-step-breadcrumbs/
Stepper meets breadcrumb: every crumb leads with a circular badge holding an icon or an auto-incremented number, joined by short connector rules. The counter stays in CSS (it must), while the badge states, the connectors and the responsive icon-only mode are all utilities.
## HTML
```html
<section class="tbc-37 w-full min-h-svh grid place-items-center bg-tbc37-bg font-tbc37-sans px-8 py-8">
<nav aria-label="Breadcrumb">
<ol class="flex flex-wrap items-center gap-4.5 list-none m-0 p-0 [counter-reset:tbc37step]">
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line first:before:hidden"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"><svg viewBox="0 0 24 24" class="w-3.75 h-3.75 fill-none stroke-current [stroke-width:1.9] [stroke-linecap:round] [stroke-linejoin:round]"><path d="M3 10.5 12 3l9 7.5M5.5 9.5V21h13V9.5"/></svg></span>Home</a></li>
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc [counter-increment:tbc37step] group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"></span>Account</a></li>
<li class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" class="inline-flex items-center gap-2.25 text-[13.5px] font-semibold text-tbc37-link no-underline transition-colors duration-150 hover:text-tbc37-linkhover focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-tint text-tbc37-acc [counter-increment:tbc37step] group-aria-[current=page]:bg-tbc37-acc group-aria-[current=page]:text-white"></span>Profile</a></li>
<li aria-current="page" class="group relative flex items-center before:content-[''] before:absolute before:-left-4.5 before:w-4.5 before:border-t-2 before:border-tbc37-line"><a href="#" aria-current="page" class="inline-flex items-center gap-2.25 text-[13.5px] font-bold text-tbc37-strong no-underline focus-visible:outline-2 focus-visible:outline-tbc37-acc focus-visible:outline-offset-3 focus-visible:rounded-md max-sm:gap-0 max-sm:text-[0]"><span aria-hidden="true" class="tbc37-num grid place-items-center flex-none w-7 h-7 rounded-full text-xs font-bold bg-tbc37-acc text-white [counter-increment:tbc37step]"></span>Preferences</a></li>
</ol>
</nav>
</section>
```
## CSS
```css
@import "tailwindcss";
@theme {
--color-tbc37-bg: #fbfbfd;
--color-tbc37-bg: oklch(0.98 0.004 260);
--color-tbc37-tint: #dfe2f6;
--color-tbc37-tint: oklch(0.91 0.03 265);
--color-tbc37-acc: #4a5ac4;
--color-tbc37-acc: oklch(0.5 0.16 265);
--color-tbc37-link: #61656f;
--color-tbc37-link: oklch(0.46 0.03 260);
--color-tbc37-linkhover: #3a3f8c;
--color-tbc37-linkhover: oklch(0.36 0.13 265);
--color-tbc37-strong: #33363f;
--color-tbc37-strong: oklch(0.28 0.02 260);
--color-tbc37-line: #d5d8e2;
--color-tbc37-line: oklch(0.86 0.01 260);
--font-tbc37-sans: 'Space Grotesk', system-ui, sans-serif;
}
.tbc-37 {
width: 100%;
min-height: 100svh;
}
/* content:counter() has no utility form. One rule, and the badges number themselves. */
.tbc-37 .tbc37-num::after {
content: counter(tbc37step);
}
/* The compact mode restates the badge's own size, because the link's text-[0] would
otherwise cascade into it. */
@media (max-width: 40rem) {
.tbc-37 span[aria-hidden] {
font-size: 0.75rem;
}
}
```How this works
Counters cannot be utilities, badges can. counter-increment lands as an arbitrary property on the badge, and the single content:counter(...) rule stays in the stylesheet. Everything else — tint, size, accent inversion — is a utility on the element.
Icon or number, same badge. The first crumb's badge holds an SVG; the rest hold counters. Same 28px circle, same tint, so the trail reads as one system.
The compact mode is honest about its cost. text-[0] hides labels below the breakpoint, leaving badges only — which is why the links keep full text in the DOM and the current step keeps aria-current: the screen-reader experience is unchanged at every width.
Make it yours
- Badge:
w-7 h-7plus--color-tbc37-tintand--color-tbc37-acc. - Connector:
before:-left-4.5 before:w-4.5, matched to the list gap. - Compact breakpoint:
max-sm:→max-md:for long labels.
Gotchas — read before shipping
text-[0]is a visual trick, not a hiding technique — it works here only because the badge's font size is restated. Never use it to hide something a screen reader should skip.- Counter scope lives on the list; nesting two trails on one page without separate counter names makes the numbers continue across both.
- Connector width and list gap are the same number in two places.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.4+ | 128+ | 111+ |
CSS counters are universal; the floor is Tailwind v4's own generated sheet.