Open demo

CSS code

HTML
<div><span class="lbl">Pipeline chevrons</span>
<ol class="pipe" aria-label="Sales pipeline, October">
<li><span>Leads</span><strong>128</strong></li>
<li><span>Qualified</span><strong>64</strong></li>
<li><span>Proposal</span><strong>23</strong></li>
<li><span>Won</span><strong>9</strong></li>
</ol></div>
<div><span class="lbl">Process cards with arrows</span>
<ol class="flow" aria-label="How publishing works">
<li><b>Upload</b><p>Drop in your manuscript as a Word file or PDF.</p></li>
<li><b>We review</b><p>An editor checks layout and metadata within two days.</p></li>
<li><b>You approve</b><p>Read the proof on any device and sign it off.</p></li>
<li><b>It goes live</b><p>Your book is in 40 stores by the end of the week.</p></li>
</ol></div>
<div><span class="lbl">Before and after</span>
<div class="delta">
<dl><dt>Median page load, before</dt><dd>4.8 <small>seconds</small></dd></dl>
<span class="big" aria-hidden="true"></span>
<dl><dt>Median page load, after</dt><dd>1.6 <small>seconds</small></dd></dl>
</div></div>
CSS
/* Process and flow arrows. The sequence is an ordered list, so the order is announced; every arrow is a
   clip-path or pseudo-element and carries no text. Below 640px the arrows turn to point down. */
.pipe,.flow,.delta{--ink:#17142b;--accent:#4232d8;--line:#e4e2ef;--muted:#4a4660;--tip:16px}
/* 1. Pipeline chevrons */
.pipe{display:flex;gap:4px;margin:0;padding:0;list-style:none}
.pipe li{flex:1;display:flex;flex-direction:column;justify-content:center;gap:2px;min-height:76px;padding:12px calc(var(--tip) + 8px) 12px calc(var(--tip) + 14px);
  clip-path:polygon(0 0,calc(100% - var(--tip)) 0,100% 50%,calc(100% - var(--tip)) 100%,0 100%,var(--tip) 50%)}
.pipe li:first-child{padding-left:18px;border-radius:12px 0 0 12px;clip-path:polygon(0 0,calc(100% - var(--tip)) 0,100% 50%,calc(100% - var(--tip)) 100%,0 100%)}
.pipe span{font-size:.74rem;font-weight:600;letter-spacing:.06em;text-transform:uppercase}
.pipe strong{font-size:1.35rem;font-variant-numeric:tabular-nums}
.pipe li:nth-child(1){background:#e9e6fd;color:var(--ink)}
.pipe li:nth-child(2){background:#c9c2fa;color:var(--ink)}
.pipe li:nth-child(3){background:#5b4cf0;color:#fff}
.pipe li:nth-child(4){background:#2f2496;color:#fff}
/* 2. Process cards joined by line arrows */
.flow{display:flex;gap:44px;margin:0;padding:0;list-style:none;counter-reset:step}
.flow li{position:relative;flex:1;padding:18px 16px;border:1px solid var(--line);border-radius:14px;background:#fff;counter-increment:step}
.flow li::marker{content:none}
.flow b{display:block;margin-bottom:6px;font-size:.98rem}
.flow b::before{content:counter(step,decimal-leading-zero);display:block;margin-bottom:10px;font:700 .74rem ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--accent)}
.flow p{font-size:.84rem;line-height:1.5;color:var(--muted)}
.flow li+li::before{content:"";position:absolute;top:50%;left:-36px;width:28px;height:2px;border-radius:2px;background:var(--accent)}
.flow li+li::after{content:"";position:absolute;top:calc(50% - 4px);left:-17px;width:8px;height:8px;
  border-top:2px solid var(--accent);border-right:2px solid var(--accent);rotate:45deg}
/* 3. Before / after with a block arrow */
.delta{display:flex;align-items:center;gap:18px}
.delta dl{flex:1;margin:0;padding:20px 22px;border:1px solid var(--line);border-radius:14px;background:#fff}
.delta dt{font-size:.74rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.delta dd{margin:6px 0 0;font-size:2rem;font-weight:750;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.delta dd small{font-size:.86rem;font-weight:500;color:var(--muted);letter-spacing:0}
.delta dl:last-child{border-color:#b8f0d0;background:#effcf4}
.delta dl:last-child dd{color:#0b6b3a}
.delta .big{flex:none;width:72px;height:44px;background:linear-gradient(90deg,#c9c2fa,var(--accent));
  clip-path:polygon(0 30%,58% 30%,58% 0,100% 50%,58% 100%,58% 70%,0 70%)}
@media (max-width:640px){
  .pipe{flex-direction:column;gap:3px}
  .pipe li,.pipe li:first-child{min-height:64px;padding:12px 18px calc(var(--tip) + 8px);border-radius:0;align-items:center;text-align:center;
    clip-path:polygon(0 0,50% var(--tip),100% 0,100% calc(100% - var(--tip)),50% 100%,0 calc(100% - var(--tip)))}
  .pipe li:first-child{border-radius:12px 12px 0 0;clip-path:polygon(0 0,100% 0,100% calc(100% - var(--tip)),50% 100%,0 calc(100% - var(--tip)))}
  .pipe li+li{margin-top:calc(var(--tip) * -1 + 3px);padding-top:calc(var(--tip) + 10px)}
  .flow{flex-direction:column;gap:40px}
  .flow li+li::before{top:-34px;left:50%;width:2px;height:28px}
  .flow li+li::after{top:-15px;left:calc(50% - 3px);rotate:135deg}
  .delta{flex-direction:column;align-items:stretch}
  .delta .big{align-self:center;rotate:90deg;width:56px;height:40px}
}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div><span class="lbl">Pipeline chevrons</span>
<ol class="pipe list-unstyled mb-0" aria-label="Sales pipeline, October">
<li><span>Leads</span><strong>128</strong></li>
<li><span>Qualified</span><strong>64</strong></li>
<li><span>Proposal</span><strong>23</strong></li>
<li><span>Won</span><strong>9</strong></li>
</ol></div>
<div><span class="lbl">Process cards with arrows</span>
<ol class="flow list-unstyled mb-0" aria-label="How publishing works">
<li class="card"><b>Upload</b><p class="mb-0">Drop in your manuscript as a Word file or PDF.</p></li>
<li class="card"><b>We review</b><p class="mb-0">An editor checks layout and metadata within two days.</p></li>
<li class="card"><b>You approve</b><p class="mb-0">Read the proof on any device and sign it off.</p></li>
<li class="card"><b>It goes live</b><p class="mb-0">Your book is in 40 stores by the end of the week.</p></li>
</ol></div>
<div><span class="lbl">Before and after</span>
<div class="delta">
<dl class="card mb-0"><dt>Median page load, before</dt><dd>4.8 <small>seconds</small></dd></dl>
<span class="big d-block" aria-hidden="true"></span>
<dl class="card mb-0"><dt>Median page load, after</dt><dd>1.6 <small>seconds</small></dd></dl>
</div></div>
CSS
/* Bootstrap .card and .list-unstyled carry the boxes; the arrows are the same clip-path and pseudo-element CSS.
   Process and flow arrows. The sequence is an ordered list, so the order is announced; every arrow is a
   clip-path or pseudo-element and carries no text. Below 640px the arrows turn to point down. */
.pipe,.flow,.delta{--ink:#17142b;--accent:#4232d8;--line:#e4e2ef;--muted:#4a4660;--tip:16px}
/* 1. Pipeline chevrons */
.pipe{display:flex;gap:4px;margin:0;padding:0;list-style:none}
.pipe li{flex:1;display:flex;flex-direction:column;justify-content:center;gap:2px;min-height:76px;padding:12px calc(var(--tip) + 8px) 12px calc(var(--tip) + 14px);
  clip-path:polygon(0 0,calc(100% - var(--tip)) 0,100% 50%,calc(100% - var(--tip)) 100%,0 100%,var(--tip) 50%)}
.pipe li:first-child{padding-left:18px;border-radius:12px 0 0 12px;clip-path:polygon(0 0,calc(100% - var(--tip)) 0,100% 50%,calc(100% - var(--tip)) 100%,0 100%)}
.pipe span{font-size:.74rem;font-weight:600;letter-spacing:.06em;text-transform:uppercase}
.pipe strong{font-size:1.35rem;font-variant-numeric:tabular-nums}
.pipe li:nth-child(1){background:#e9e6fd;color:var(--ink)}
.pipe li:nth-child(2){background:#c9c2fa;color:var(--ink)}
.pipe li:nth-child(3){background:#5b4cf0;color:#fff}
.pipe li:nth-child(4){background:#2f2496;color:#fff}
/* 2. Process cards joined by line arrows */
.flow{display:flex;gap:44px;margin:0;padding:0;list-style:none;counter-reset:step}
.flow li{--bs-card-border-color:var(--line);--bs-card-border-radius:14px;position:relative;flex:1;padding:18px 16px;counter-increment:step}
.flow li::marker{content:none}
.flow b{display:block;margin-bottom:6px;font-size:.98rem}
.flow b::before{content:counter(step,decimal-leading-zero);display:block;margin-bottom:10px;font:700 .74rem ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--accent)}
.flow p{font-size:.84rem;line-height:1.5;color:var(--muted)}
.flow li+li::before{content:"";position:absolute;top:50%;left:-36px;width:28px;height:2px;border-radius:2px;background:var(--accent)}
.flow li+li::after{content:"";position:absolute;top:calc(50% - 4px);left:-17px;width:8px;height:8px;
  border-top:2px solid var(--accent);border-right:2px solid var(--accent);rotate:45deg}
/* 3. Before / after with a block arrow */
.delta{display:flex;align-items:center;gap:18px}
.delta dl{--bs-card-border-color:var(--line);--bs-card-border-radius:14px;flex:1;padding:20px 22px}
.delta dt{font-size:.74rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.delta dd{margin:6px 0 0;font-size:2rem;font-weight:750;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.delta dd small{font-size:.86rem;font-weight:500;color:var(--muted);letter-spacing:0}
.delta dl:last-child{--bs-card-border-color:#b8f0d0;--bs-card-bg:#effcf4}
.delta dl:last-child dd{color:#0b6b3a}
.delta .big{flex:none;width:72px;height:44px;background:linear-gradient(90deg,#c9c2fa,var(--accent));
  clip-path:polygon(0 30%,58% 30%,58% 0,100% 50%,58% 100%,58% 70%,0 70%)}
@media (max-width:640px){
  .pipe{flex-direction:column;gap:3px}
  .pipe li,.pipe li:first-child{min-height:64px;padding:12px 18px calc(var(--tip) + 8px);border-radius:0;align-items:center;text-align:center;
    clip-path:polygon(0 0,50% var(--tip),100% 0,100% calc(100% - var(--tip)),50% 100%,0 calc(100% - var(--tip)))}
  .pipe li:first-child{border-radius:12px 12px 0 0;clip-path:polygon(0 0,100% 0,100% calc(100% - var(--tip)),50% 100%,0 calc(100% - var(--tip)))}
  .pipe li+li{margin-top:calc(var(--tip) * -1 + 3px);padding-top:calc(var(--tip) + 10px)}
  .flow{flex-direction:column;gap:40px}
  .flow li+li::before{top:-34px;left:50%;width:2px;height:28px}
  .flow li+li::after{top:-15px;left:calc(50% - 3px);rotate:135deg}
  .delta{flex-direction:column;align-items:stretch}
  .delta .big{align-self:center;rotate:90deg;width:56px;height:40px}
}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#5d5a72] uppercase">Pipeline chevrons</span>
<ol class="flex gap-1 max-sm:flex-col max-sm:gap-[3px]" aria-label="Sales pipeline, October">
<li class="chev-first flex min-h-[76px] flex-1 flex-col justify-center gap-0.5 rounded-l-xl bg-[#e9e6fd] py-3 pr-6 pl-[18px] text-ink max-sm:chev-down-first max-sm:min-h-16 max-sm:items-center max-sm:rounded-none max-sm:rounded-t-xl max-sm:px-[18px] max-sm:pb-6 max-sm:text-center"><span class="text-[.74rem] font-semibold tracking-[.06em] uppercase">Leads</span><strong class="text-[1.35rem] tabular-nums">128</strong></li>
<li class="chev flex min-h-[76px] flex-1 flex-col justify-center gap-0.5 bg-[#c9c2fa] py-3 pr-6 pl-[30px] text-ink max-sm:chev-down max-sm:-mt-[13px] max-sm:min-h-16 max-sm:items-center max-sm:px-[18px] max-sm:pt-[26px] max-sm:pb-6 max-sm:text-center"><span class="text-[.74rem] font-semibold tracking-[.06em] uppercase">Qualified</span><strong class="text-[1.35rem] tabular-nums">64</strong></li>
<li class="chev flex min-h-[76px] flex-1 flex-col justify-center gap-0.5 bg-[#5b4cf0] py-3 pr-6 pl-[30px] text-white max-sm:chev-down max-sm:-mt-[13px] max-sm:min-h-16 max-sm:items-center max-sm:px-[18px] max-sm:pt-[26px] max-sm:pb-6 max-sm:text-center"><span class="text-[.74rem] font-semibold tracking-[.06em] uppercase">Proposal</span><strong class="text-[1.35rem] tabular-nums">23</strong></li>
<li class="chev flex min-h-[76px] flex-1 flex-col justify-center gap-0.5 bg-[#2f2496] py-3 pr-6 pl-[30px] text-white max-sm:chev-down max-sm:-mt-[13px] max-sm:min-h-16 max-sm:items-center max-sm:px-[18px] max-sm:pt-[26px] max-sm:pb-6 max-sm:text-center"><span class="text-[.74rem] font-semibold tracking-[.06em] uppercase">Won</span><strong class="text-[1.35rem] tabular-nums">9</strong></li>
</ol></div>
<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#5d5a72] uppercase">Process cards with arrows</span>
<ol class="flex gap-11 max-sm:flex-col max-sm:gap-10" aria-label="How publishing works">
<li class="relative flex-1 rounded-[14px] border border-line bg-white px-4 py-[18px]"><span class="mb-2.5 block font-mono text-[.74rem] font-bold text-accent" aria-hidden="true">01</span><b class="mb-1.5 block text-[.98rem]">Upload</b><p class="text-[.84rem] leading-normal text-muted">Drop in your manuscript as a Word file or PDF.</p></li>
<li class="relative flex-1 rounded-[14px] border border-line bg-white px-4 py-[18px] before:absolute before:top-1/2 before:-left-9 before:h-0.5 before:w-7 before:rounded-sm before:bg-accent before:content-[''] after:absolute after:top-[calc(50%-4px)] after:-left-[17px] after:size-2 after:rotate-45 after:border-t-2 after:border-r-2 after:border-accent after:content-[''] max-sm:before:-top-[34px] max-sm:before:left-1/2 max-sm:before:h-7 max-sm:before:w-0.5 max-sm:after:-top-[15px] max-sm:after:left-[calc(50%-3px)] max-sm:after:rotate-[135deg]"><span class="mb-2.5 block font-mono text-[.74rem] font-bold text-accent" aria-hidden="true">02</span><b class="mb-1.5 block text-[.98rem]">We review</b><p class="text-[.84rem] leading-normal text-muted">An editor checks layout and metadata within two days.</p></li>
<li class="relative flex-1 rounded-[14px] border border-line bg-white px-4 py-[18px] before:absolute before:top-1/2 before:-left-9 before:h-0.5 before:w-7 before:rounded-sm before:bg-accent before:content-[''] after:absolute after:top-[calc(50%-4px)] after:-left-[17px] after:size-2 after:rotate-45 after:border-t-2 after:border-r-2 after:border-accent after:content-[''] max-sm:before:-top-[34px] max-sm:before:left-1/2 max-sm:before:h-7 max-sm:before:w-0.5 max-sm:after:-top-[15px] max-sm:after:left-[calc(50%-3px)] max-sm:after:rotate-[135deg]"><span class="mb-2.5 block font-mono text-[.74rem] font-bold text-accent" aria-hidden="true">03</span><b class="mb-1.5 block text-[.98rem]">You approve</b><p class="text-[.84rem] leading-normal text-muted">Read the proof on any device and sign it off.</p></li>
<li class="relative flex-1 rounded-[14px] border border-line bg-white px-4 py-[18px] before:absolute before:top-1/2 before:-left-9 before:h-0.5 before:w-7 before:rounded-sm before:bg-accent before:content-[''] after:absolute after:top-[calc(50%-4px)] after:-left-[17px] after:size-2 after:rotate-45 after:border-t-2 after:border-r-2 after:border-accent after:content-[''] max-sm:before:-top-[34px] max-sm:before:left-1/2 max-sm:before:h-7 max-sm:before:w-0.5 max-sm:after:-top-[15px] max-sm:after:left-[calc(50%-3px)] max-sm:after:rotate-[135deg]"><span class="mb-2.5 block font-mono text-[.74rem] font-bold text-accent" aria-hidden="true">04</span><b class="mb-1.5 block text-[.98rem]">It goes live</b><p class="text-[.84rem] leading-normal text-muted">Your book is in 40 stores by the end of the week.</p></li>
</ol></div>
<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#5d5a72] uppercase">Before and after</span>
<div class="flex items-center gap-[18px] max-sm:flex-col max-sm:items-stretch">
<dl class="flex-1 rounded-[14px] border border-line bg-white px-[22px] py-5"><dt class="text-[.74rem] font-semibold tracking-[.08em] text-muted uppercase">Median page load, before</dt><dd class="mt-1.5 text-[2rem] font-[750] tracking-[-.02em] tabular-nums">4.8 <small class="text-[.86rem] font-medium tracking-normal text-muted">seconds</small></dd></dl>
<span class="block-arrow block h-11 w-[72px] flex-none bg-linear-to-r from-[#c9c2fa] to-accent max-sm:h-10 max-sm:w-14 max-sm:rotate-90 max-sm:self-center" aria-hidden="true"></span>
<dl class="flex-1 rounded-[14px] border border-[#b8f0d0] bg-[#effcf4] px-[22px] py-5"><dt class="text-[.74rem] font-semibold tracking-[.08em] text-muted uppercase">Median page load, after</dt><dd class="mt-1.5 text-[2rem] font-[750] tracking-[-.02em] text-[#0b6b3a] tabular-nums">1.6 <small class="text-[.86rem] font-medium tracking-normal text-muted">seconds</small></dd></dl>
</div></div>
CSS
/* Palette plus the chevron outlines as utilities (--tip is the depth of the point).
   Below the sm breakpoint the max-sm: utilities turn every arrow to point down. */
@theme {
  --color-ink: #17142b;
  --color-accent: #4232d8;
  --color-line: #e4e2ef;
  --color-muted: #4a4660;
}
@utility chev-first{clip-path:polygon(0 0,calc(100% - 16px) 0,100% 50%,calc(100% - 16px) 100%,0 100%)}
@utility chev{clip-path:polygon(0 0,calc(100% - 16px) 0,100% 50%,calc(100% - 16px) 100%,0 100%,16px 50%)}
@utility chev-down-first{clip-path:polygon(0 0,100% 0,100% calc(100% - 16px),50% 100%,0 calc(100% - 16px))}
@utility chev-down{clip-path:polygon(0 0,50% 16px,100% 0,100% calc(100% - 16px),50% 100%,0 calc(100% - 16px))}
@utility block-arrow{clip-path:polygon(0 30%,58% 30%,58% 0,100% 50%,58% 100%,58% 70%,0 70%)}

About this set

Arrows that show movement from one stage to the next, for dashboards, how it works sections and case studies. The pipeline chevrons are four stages of a sales pipeline cut into notched arrow shapes with clip-path polygon, each with its stage name and count, getting darker toward the last stage. The process cards are four numbered steps of a publishing workflow joined by thin line arrows drawn with ::before and ::after on every card after the first, so you never add arrow markup between steps. The before and after comparison puts a gradient block arrow between two figures, a median page load of 4.8 seconds and 1.6 seconds. Below 640px every arrow turns to point down: the chevrons switch to a downward clip-path and stack, the line arrows rotate, and the block arrow turns 90 degrees, so the flow still reads top to bottom on a phone. The stages are ordered lists with an aria-label, and the figures are description lists, so the sequence and values are announced while the shapes stay silent. This set is a data and process display, not navigation; for clickable trails see the breadcrumbs pack.

What’s included

  • Pipeline chevrons cut with clip-path polygon
  • Process cards joined by pseudo-element line arrows
  • Before and after figures with a gradient block arrow
  • All arrows turn to point down below 640px
  • Ordered lists and description lists for meaningful structure

Accessibility

Stages are ordered lists with an aria-label, so screen readers announce the number of steps and their order, and the comparison uses description lists. The arrows are clip-path shapes, pseudo-elements or aria-hidden spans with no text. Text on every pipeline colour meets 4.5:1. Nothing in this set is interactive or animated.

Customise it

Change the four pipeline backgrounds on .pipe li:nth-child() and the --tip depth of the point. --accent colours the line arrows and step numbers. In Tailwind the shapes are the chev, chev-first, chev-down, chev-down-first and block-arrow utilities.