Open demo

CSS code

HTML
<div><span class="lbl">Separate pills</span><div class="stage">
<nav class="pills" aria-label="Breadcrumb">
  <ol>
    <li><a href="#">Recipes</a></li>
    <li><a href="#">Baking</a></li>
    <li><a href="#">Bread</a></li>
    <li aria-current="page"><span>Rye Sourdough</span></li>
  </ol>
</nav>
</div></div>

<div><span class="lbl">Segmented track</span><div class="stage">
<nav class="pills pills-track" aria-label="Breadcrumb">
  <ol>
    <li><a href="#">Help</a></li>
    <li><a href="#">Billing</a></li>
    <li aria-current="page"><span>Refunds</span></li>
  </ol>
</nav>
</div></div>

<div><span class="lbl">Tags</span><div class="stage">
<nav class="tags" aria-label="Breadcrumb">
  <ol>
    <li><a href="#">Garden</a></li>
    <li><a href="#">Houseplants</a></li>
    <li><a href="#">Ferns</a></li>
    <li aria-current="page">Boston Fern</li>
  </ol>
</nav>
</div></div>
CSS
/* Pill breadcrumbs: every level is a rounded chip; the chevron between chips is li + li::before
   painted through a mask, so it has no text for a screen reader to announce. */
.pills{--pl-bg:#ecfdf5;--pl-line:#a7f3d0;--pl-fg:#065f46;--pl-hover:#d1fae5;--pl-cur-bg:#047857;--pl-cur-fg:#fff;--pl-sep:#94a3b8;
  --pl-chevron:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M6 3.5 10.5 8 6 12.5'/></svg>");
  font-size:.875rem;line-height:1.25}
.pills ol{display:flex;flex-wrap:wrap;align-items:center;gap:8px .4rem;margin:0;padding:0;list-style:none}
.pills li{display:inline-flex;align-items:center;gap:.4rem}
.pills li+li::before{content:"";flex:none;width:14px;height:14px;background:var(--pl-sep);mask:var(--pl-chevron) center/contain no-repeat}
.pills a,.pills [aria-current="page"] span{display:block;padding:.4rem .85rem;border-radius:999px}
.pills a{background:var(--pl-bg);box-shadow:inset 0 0 0 1px var(--pl-line);color:var(--pl-fg);font-weight:500;text-decoration:none;transition:background-color .15s}
.pills a:hover{background:var(--pl-hover)}
.pills a:focus-visible{outline:2px solid var(--pl-cur-bg);outline-offset:2px}
.pills [aria-current="page"] span{background:var(--pl-cur-bg);color:var(--pl-cur-fg);font-weight:600}
/* segmented track: one grey pill holds the path, the current level is a raised white chip */
.pills-track ol{display:inline-flex;gap:4px .1rem;padding:4px;background:#f1f5f9;border-radius:999px}
.pills-track li{gap:.1rem}
.pills-track a{background:none;box-shadow:none;color:#475569}
.pills-track a:hover{background:#e2e8f0;color:#0f172a}
.pills-track [aria-current="page"] span{background:#fff;color:var(--pl-fg);box-shadow:0 1px 2px rgba(15,23,42,.08),0 2px 8px rgba(15,23,42,.06)}
/* tags: pointed chips with a punched hole, drawn on li::before with clip-path and a radial mask */
.tags{--tg-bg:#d1fae5;--tg-fg:#064e3b;--tg-hover:#a7f3d0;--tg-cur-bg:#065f46;--tg-cur-fg:#fff;font-size:.8125rem;font-weight:600;line-height:1.25}
.tags ol{display:flex;flex-wrap:wrap;gap:8px;margin:0;padding:0;list-style:none;isolation:isolate}
.tags li{position:relative;padding:.45rem 1.5rem .45rem .8rem;color:var(--tg-fg)}
.tags li::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--tg-bg);border-radius:6px 0 0 6px;transition:background-color .15s;
  clip-path:polygon(0 0,calc(100% - 11px) 0,100% 50%,calc(100% - 11px) 100%,0 100%);
  mask:radial-gradient(circle at calc(100% - 11px) 50%,transparent 2.5px,#000 3px)}
.tags li:not([aria-current]):hover::before{background:var(--tg-hover)}
.tags [aria-current="page"]{color:var(--tg-cur-fg)}
.tags [aria-current="page"]::before{background:var(--tg-cur-bg)}
.tags a{color:inherit;text-decoration:none;border-radius:3px}
.tags a::after{content:"";position:absolute;inset:0}
.tags a:focus-visible{outline:2px solid currentColor;outline-offset:3px}
@media (prefers-reduced-motion:reduce){.pills a,.tags li::before{transition:none}}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div><span class="lbl">Separate pills</span><div class="stage">
<nav class="pills" aria-label="Breadcrumb">
  <ol class="breadcrumb">
    <li class="breadcrumb-item"><a href="#">Recipes</a></li>
    <li class="breadcrumb-item"><a href="#">Baking</a></li>
    <li class="breadcrumb-item"><a href="#">Bread</a></li>
    <li class="breadcrumb-item active" aria-current="page"><span>Rye Sourdough</span></li>
  </ol>
</nav>
</div></div>

<div><span class="lbl">Segmented track</span><div class="stage">
<nav class="pills pills-track" aria-label="Breadcrumb">
  <ol class="breadcrumb">
    <li class="breadcrumb-item"><a href="#">Help</a></li>
    <li class="breadcrumb-item"><a href="#">Billing</a></li>
    <li class="breadcrumb-item active" aria-current="page"><span>Refunds</span></li>
  </ol>
</nav>
</div></div>

<div><span class="lbl">Tags</span><div class="stage">
<nav class="tags" aria-label="Breadcrumb">
  <ol class="breadcrumb">
    <li class="breadcrumb-item"><a href="#" class="stretched-link">Garden</a></li>
    <li class="breadcrumb-item"><a href="#" class="stretched-link">Houseplants</a></li>
    <li class="breadcrumb-item"><a href="#" class="stretched-link">Ferns</a></li>
    <li class="breadcrumb-item active" aria-current="page">Boston Fern</li>
  </ol>
</nav>
</div></div>
CSS
/* Bootstrap .breadcrumb as pills. The chevron is --bs-breadcrumb-divider (an inline SVG); the @supports rule
   gives it empty alt text so screen readers skip it. */
.pills{--bs-breadcrumb-divider:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 16 16' fill='none' stroke='%2394a3b8' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M6 3.5 10.5 8 6 12.5'/></svg>");
  --pl-bg:#ecfdf5;--pl-line:#a7f3d0;--pl-fg:#065f46;--pl-hover:#d1fae5;--pl-cur-bg:#047857;--pl-cur-fg:#fff}
.pills .breadcrumb{--bs-breadcrumb-margin-bottom:0;--bs-breadcrumb-font-size:.875rem;--bs-breadcrumb-item-padding-x:.4rem;
  align-items:center;row-gap:8px;line-height:1.25}
.pills .breadcrumb-item{display:flex;align-items:center}
.pills .breadcrumb-item+.breadcrumb-item::before{display:block;line-height:0}
@supports (content:"x" / ""){.pills .breadcrumb-item+.breadcrumb-item::before{content:var(--bs-breadcrumb-divider,"/") / ""}}
.pills a,.pills .breadcrumb-item.active span{display:block;padding:.4rem .85rem;border-radius:999px}
.pills a{background:var(--pl-bg);box-shadow:inset 0 0 0 1px var(--pl-line);color:var(--pl-fg);font-weight:500;text-decoration:none;transition:background-color .15s}
.pills a:hover{background:var(--pl-hover)}
.pills a:focus-visible{outline:2px solid var(--pl-cur-bg);outline-offset:2px}
.pills .breadcrumb-item.active span{background:var(--pl-cur-bg);color:var(--pl-cur-fg);font-weight:600}
/* segmented track: Bootstrap's own --bs-breadcrumb-bg / padding / radius variables draw the grey pill */
.pills-track .breadcrumb{--bs-breadcrumb-bg:#f1f5f9;--bs-breadcrumb-padding-x:4px;--bs-breadcrumb-padding-y:4px;
  --bs-breadcrumb-border-radius:999px;--bs-breadcrumb-item-padding-x:.1rem;display:inline-flex;row-gap:4px}
.pills-track a{background:none;box-shadow:none;color:#475569}
.pills-track a:hover{background:#e2e8f0;color:#0f172a}
.pills-track .breadcrumb-item.active span{background:#fff;color:var(--pl-fg);box-shadow:0 1px 2px rgba(15,23,42,.08),0 2px 8px rgba(15,23,42,.06)}
/* tags: the divider is replaced by the tag shape on ::before (clip-path + a radial mask for the hole) */
.tags{--tg-bg:#d1fae5;--tg-fg:#064e3b;--tg-hover:#a7f3d0;--tg-cur-bg:#065f46;--tg-cur-fg:#fff}
.tags .breadcrumb{--bs-breadcrumb-margin-bottom:0;--bs-breadcrumb-font-size:.8125rem;--bs-breadcrumb-item-padding-x:0;
  gap:8px;font-weight:600;line-height:1.25;isolation:isolate}
.tags .breadcrumb-item{position:relative;padding:.45rem 1.5rem .45rem .8rem;color:var(--tg-fg)}
.tags .breadcrumb-item::before{content:"";float:none;padding:0;position:absolute;inset:0;z-index:-1;background:var(--tg-bg);
  border-radius:6px 0 0 6px;transition:background-color .15s;
  clip-path:polygon(0 0,calc(100% - 11px) 0,100% 50%,calc(100% - 11px) 100%,0 100%);
  mask:radial-gradient(circle at calc(100% - 11px) 50%,transparent 2.5px,#000 3px)}
.tags .breadcrumb-item:not(.active):hover::before{background:var(--tg-hover)}
.tags .breadcrumb-item.active{color:var(--tg-cur-fg)}
.tags .breadcrumb-item.active::before{background:var(--tg-cur-bg)}
.tags a{color:inherit;text-decoration:none;border-radius:3px}
.tags a:focus-visible{outline:2px solid currentColor;outline-offset:3px}
@media (prefers-reduced-motion:reduce){.pills a,.tags .breadcrumb-item::before{transition:none}}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div><span class="mb-3 block text-[.72rem] tracking-[.12em] text-[#5b6477] uppercase">Separate pills</span><div class="rounded-[14px] border border-[#e2e7f0] bg-white px-[22px] py-[18px] shadow-[0_1px_2px_rgba(15,23,42,.04)]">
<nav aria-label="Breadcrumb" class="text-sm leading-[1.25]">
  <ol class="flex flex-wrap items-center gap-x-[.4rem] gap-y-2 *:inline-flex *:items-center *:gap-[.4rem] [&>li+li]:before:size-3.5 [&>li+li]:before:flex-none [&>li+li]:before:bg-slate-400 [&>li+li]:before:sep-chevron">
    <li><a href="#" class="block rounded-full bg-[#ecfdf5] px-[.85rem] py-[.4rem] font-medium text-[#065f46] no-underline shadow-[inset_0_0_0_1px_#a7f3d0] transition-[color,background-color,border-color] hover:bg-[#d1fae5] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#047857] motion-reduce:transition-none">Recipes</a></li>
    <li><a href="#" class="block rounded-full bg-[#ecfdf5] px-[.85rem] py-[.4rem] font-medium text-[#065f46] no-underline shadow-[inset_0_0_0_1px_#a7f3d0] transition-[color,background-color,border-color] hover:bg-[#d1fae5] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#047857] motion-reduce:transition-none">Baking</a></li>
    <li><a href="#" class="block rounded-full bg-[#ecfdf5] px-[.85rem] py-[.4rem] font-medium text-[#065f46] no-underline shadow-[inset_0_0_0_1px_#a7f3d0] transition-[color,background-color,border-color] hover:bg-[#d1fae5] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#047857] motion-reduce:transition-none">Bread</a></li>
    <li aria-current="page"><span class="block rounded-full bg-[#047857] px-[.85rem] py-[.4rem] font-semibold text-white">Rye Sourdough</span></li>
  </ol>
</nav>
</div></div>

<div><span class="mb-3 block text-[.72rem] tracking-[.12em] text-[#5b6477] uppercase">Segmented track</span><div class="rounded-[14px] border border-[#e2e7f0] bg-white px-[22px] py-[18px] shadow-[0_1px_2px_rgba(15,23,42,.04)]">
<nav aria-label="Breadcrumb" class="text-sm leading-[1.25]">
  <ol class="inline-flex flex-wrap items-center gap-x-[.1rem] gap-y-1 rounded-full bg-[#f1f5f9] p-1 *:inline-flex *:items-center *:gap-[.1rem] [&>li+li]:before:size-3.5 [&>li+li]:before:flex-none [&>li+li]:before:bg-slate-400 [&>li+li]:before:sep-chevron">
    <li><a href="#" class="block rounded-full px-[.85rem] py-[.4rem] font-medium text-[#475569] no-underline transition-[color,background-color,border-color] hover:bg-[#e2e8f0] hover:text-slate-900 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#047857] motion-reduce:transition-none">Help</a></li>
    <li><a href="#" class="block rounded-full px-[.85rem] py-[.4rem] font-medium text-[#475569] no-underline transition-[color,background-color,border-color] hover:bg-[#e2e8f0] hover:text-slate-900 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[#047857] motion-reduce:transition-none">Billing</a></li>
    <li aria-current="page"><span class="block rounded-full bg-white px-[.85rem] py-[.4rem] font-semibold text-[#065f46] shadow-[0_1px_2px_rgba(15,23,42,.08),0_2px_8px_rgba(15,23,42,.06)]">Refunds</span></li>
  </ol>
</nav>
</div></div>

<div><span class="mb-3 block text-[.72rem] tracking-[.12em] text-[#5b6477] uppercase">Tags</span><div class="rounded-[14px] border border-[#e2e7f0] bg-white px-[22px] py-[18px] shadow-[0_1px_2px_rgba(15,23,42,.04)]">
<nav aria-label="Breadcrumb" class="text-[.8125rem] leading-[1.25] font-semibold">
  <ol class="isolate flex flex-wrap gap-2">
    <li class="relative py-[.45rem] pr-6 pl-[.8rem] before:absolute before:inset-0 before:-z-10 before:rounded-l-md before:tag-shape before:transition-[color,background-color,border-color] motion-reduce:before:transition-none text-[#064e3b] before:bg-[#d1fae5] hover:before:bg-[#a7f3d0]"><a href="#" class="rounded-[3px] text-inherit no-underline after:absolute after:inset-0 focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-current">Garden</a></li>
    <li class="relative py-[.45rem] pr-6 pl-[.8rem] before:absolute before:inset-0 before:-z-10 before:rounded-l-md before:tag-shape before:transition-[color,background-color,border-color] motion-reduce:before:transition-none text-[#064e3b] before:bg-[#d1fae5] hover:before:bg-[#a7f3d0]"><a href="#" class="rounded-[3px] text-inherit no-underline after:absolute after:inset-0 focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-current">Houseplants</a></li>
    <li class="relative py-[.45rem] pr-6 pl-[.8rem] before:absolute before:inset-0 before:-z-10 before:rounded-l-md before:tag-shape before:transition-[color,background-color,border-color] motion-reduce:before:transition-none text-[#064e3b] before:bg-[#d1fae5] hover:before:bg-[#a7f3d0]"><a href="#" class="rounded-[3px] text-inherit no-underline after:absolute after:inset-0 focus-visible:outline-2 focus-visible:outline-offset-3 focus-visible:outline-current">Ferns</a></li>
    <li aria-current="page" class="relative py-[.45rem] pr-6 pl-[.8rem] before:absolute before:inset-0 before:-z-10 before:rounded-l-md before:tag-shape before:transition-[color,background-color,border-color] motion-reduce:before:transition-none text-white before:bg-[#065f46]">Boston Fern</li>
  </ol>
</nav>
</div></div>
CSS
/* Chevron between pills (li + li::before, painted through a mask so nothing is read aloud). */
@utility sep-chevron { mask: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23000' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'><path d='M6 3.5 10.5 8 6 12.5'/></svg>") center / contain no-repeat; }
/* Tag outline: a pointed end plus a punched hole. */
@utility tag-shape {
  clip-path: polygon(0 0, calc(100% - 11px) 0, 100% 50%, calc(100% - 11px) 100%, 0 100%);
  mask: radial-gradient(circle at calc(100% - 11px) 50%, transparent 2.5px, #000 3px);
}

About this set

Breadcrumbs made of chips, for interfaces that already use rounded controls. Separate pills puts each level in a mint chip with a thin outline and chevrons between them, and shows the current page as a solid green pill. Segmented track holds a short path inside one grey pill, with the current level raised on a white chip like a segmented control, which suits help centres and settings with two or three levels. Tags draws every level as a luggage tag with a pointed end and a punched hole, a good match for category and taxonomy paths in shops, recipe sites and blogs. The pills are ordinary links with padding and a large border radius, so their hit area is generous on touch screens. The tag outline is clip-path on li::before and the hole is a radial-gradient mask, so the shape costs no images and no extra markup. The Bootstrap version builds the track from its own –bs-breadcrumb-bg, padding and radius variables, and the Tailwind version keeps the tag shape in a single custom utility.

What’s included

  • Separate pills, segmented track and tag-shaped variants
  • Tag outline and punched hole made with clip-path and a radial mask
  • Large tap targets from padded, fully rounded links
  • Track variant uses Bootstrap's own --bs-breadcrumb-bg and radius variables
  • Chevron separators hidden from screen readers

Accessibility

Every variant is a nav labelled Breadcrumb around an ordered list, with aria-current="page" on the last level. Chip text is dark green on a pale fill or white on a dark green fill, all above 4.5:1. Chevrons and tag shapes are decorative pseudo-elements with no text. Links get a 2px focus outline, and fill transitions stop under prefers-reduced-motion.

Customise it

Edit --pl-bg, --pl-line, --pl-fg and --pl-cur-bg on .pills and --tg-bg, --tg-fg and --tg-cur-bg on .tags (the Bootstrap version uses the same names). In Tailwind change the bg-, text- and shadow- classes on the links, and the before:bg- classes on the tags.