Open demo

CSS code

HTML
<div><span class="lbl">Three numbered steps joined by a line</span>
<section class="hw" aria-labelledby="hw-steps">
  <div class="hw-center">
    <p class="hw-eyebrow">How Tandem works</p>
    <h2 class="hw-title" id="hw-steps">From sign-up to paid in three steps</h2>
    <p class="hw-lead">Tandem is invoicing for freelancers. Most people send their first invoice within ten minutes of signing up.</p>
  </div>
  <ol class="hw-steps">
    <li><span class="hw-num" aria-hidden="true">01</span><h3>Connect your bank</h3><p>Read-only access through Open Banking. We see transactions, never your login.</p><span class="hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>About 2 minutes</span></li>
    <li><span class="hw-num" aria-hidden="true">02</span><h3>Send your first invoice</h3><p>Pick a client, pull in hours from your timer and send. Tandem chases late payers for you.</p><span class="hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>About 5 minutes</span></li>
    <li><span class="hw-num" aria-hidden="true">03</span><h3>Get paid and stay ready for tax</h3><p>Payments are matched to invoices automatically and your tax estimate updates every night.</p><span class="hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>Automatic</span></li>
  </ol>
</section></div>

<div><span class="lbl">Sticky heading beside a numbered list</span>
<section class="hw hw-split" aria-labelledby="hw-move">
  <div class="hw-sticky">
    <p class="hw-eyebrow">Harbor Removals</p>
    <h2 class="hw-title" id="hw-move">How a Harbor move works</h2>
    <p class="hw-lead">One crew from survey to the last box, and a price that does not change on the day.</p>
    <a class="hw-btn" href="#">Get a fixed quote <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h14M13 5l7 7-7 7"/></svg></a>
  </div>
  <ol class="hw-list">
    <li><span class="hw-big" aria-hidden="true">1</span><h3>A video survey, not a home visit</h3><p>Walk us round your home on a 20-minute video call. We list every item as you go and email you the inventory.</p><span class="hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Week 1</span></li>
    <li><span class="hw-big" aria-hidden="true">2</span><h3>A fixed quote within a day</h3><p>The price is based on the inventory and the access at both ends, and it is the price you pay.</p><span class="hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Week 1</span></li>
    <li><span class="hw-big" aria-hidden="true">3</span><h3>Packing the day before</h3><p>Two packers wrap the furniture, box the kitchen and label every box with the room it goes to.</p><span class="hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Day before</span></li>
    <li><span class="hw-big" aria-hidden="true">4</span><h3>Moving day, tracked</h3><p>Follow the van on a live map. The crew unpacks the kitchen and makes the beds before they leave.</p><span class="hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Moving day</span></li>
  </ol>
</section></div>

<div><span class="lbl">Comparison table with ticks, crosses and text</span>
<section class="hw" aria-labelledby="hw-compare">
  <p class="hw-eyebrow">Compare</p>
  <h2 class="hw-title" id="hw-compare">Tandem or a spreadsheet?</h2>
  <p class="hw-lead">A spreadsheet is free and flexible. Here is what you get for £9 a month.</p>
  <div class="hw-table-wrap" role="region" aria-label="Comparison table" tabindex="0">
    <table class="hw-table">
      <caption class="hw-sr">What a spreadsheet and Tandem each do for your invoicing</caption>
      <thead><tr><th scope="col">Feature</th><th scope="col">Spreadsheet</th><th scope="col" class="hw-us">Tandem</th></tr></thead>
      <tbody>
        <tr><th scope="row">Invoices numbered and dated</th><td><span class="hw-no"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M18 6 6 18M6 6l12 12"/></svg></span><span class="hw-sr">Not included</span></td><td class="hw-us"><span class="hw-yes"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M20 6 9 17l-5-5"/></svg></span><span class="hw-sr">Included</span></td></tr>
        <tr><th scope="row">Late payment reminders</th><td>You write them</td><td class="hw-us">Sent on day 1, 7 and 14</td></tr>
        <tr><th scope="row">Bank payments matched to invoices</th><td><span class="hw-no"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M18 6 6 18M6 6l12 12"/></svg></span><span class="hw-sr">Not included</span></td><td class="hw-us"><span class="hw-yes"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M20 6 9 17l-5-5"/></svg></span><span class="hw-sr">Included</span></td></tr>
        <tr><th scope="row">Tax estimate</th><td>A formula you maintain</td><td class="hw-us">Updated every night</td></tr>
        <tr><th scope="row">Works on your phone</th><td>Read only</td><td class="hw-us"><span class="hw-yes"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M20 6 9 17l-5-5"/></svg></span><span class="hw-sr">Included</span></td></tr>
        <tr><th scope="row">Price</th><td>Free</td><td class="hw-us">£9 a month</td></tr>
      </tbody>
    </table>
  </div>
  <div class="hw-foot"><p>Free for the first month. Cancel from the settings page at any time.</p><a class="hw-btn" href="#">Start a free month <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h14M13 5l7 7-7 7"/></svg></a></div>
</section></div>
CSS
/* How it works steps and a comparison table. Steps are an <ol>, so screen readers announce "1 of 3"; the big
   drawn numbers are aria-hidden. The comparison is a real <table> with row and column headers; ticks and crosses
   are different shapes and carry visually hidden text, so nothing relies on colour. */
.hw{--hw-ink:#102a26;--hw-muted:#44564f;--hw-accent:#0f766e;--hw-accent-hover:#115e59;--hw-tint:#ccfbf1;--hw-line:#d5e3df;--hw-bg:#fff;--hw-radius:26px;
  background:var(--hw-bg);color:var(--hw-ink);border-radius:var(--hw-radius);padding:clamp(40px,6vw,80px) clamp(20px,5vw,64px);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;line-height:1.55}
.hw :where(h2,h3,p,ol,table){margin:0;padding:0}
.hw ol{list-style:none}
.hw a{color:var(--hw-accent);font-weight:650;text-decoration:none}
.hw a:focus-visible{outline:3px solid var(--hw-accent);outline-offset:3px;border-radius:8px}
.hw-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.hw-eyebrow{font-size:.8rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--hw-accent)}
.hw-title{margin-top:12px!important;font-size:clamp(1.8rem,1.2rem + 2.2vw,2.7rem);line-height:1.1;letter-spacing:-.025em;font-weight:800}
.hw-lead{margin-top:14px!important;font-size:1.06rem;color:var(--hw-muted);max-width:58ch}
.hw-center{max-width:660px;margin:0 auto;text-align:center}
.hw-center .hw-lead{margin-inline:auto}
.hw h3{font-size:1.14rem;line-height:1.3;font-weight:750}
.hw h3+p{margin-top:8px;color:var(--hw-muted)}
.hw-time{display:inline-flex;align-items:center;gap:6px;margin-top:14px;padding:4px 10px;border-radius:999px;background:#fef3c7;color:#854d0e;font-size:.8rem;font-weight:700}
.hw-time svg{width:14px;height:14px}
/* 1. three steps joined by a dashed line */
.hw-steps{position:relative;display:grid;grid-template-columns:repeat(3,1fr);gap:40px;margin-top:56px!important;text-align:center}
.hw-steps::before{content:"";position:absolute;top:28px;left:16.66%;right:16.66%;border-top:2px dashed #5eaaa0}
.hw-steps li{position:relative;display:flex;flex-direction:column;align-items:center}
.hw-num{position:relative;display:grid;place-items:center;width:56px;height:56px;margin-bottom:20px;border-radius:50%;background:var(--hw-accent);color:#fff;
  font-weight:800;font-size:1.1rem;box-shadow:0 0 0 8px var(--hw-bg),0 12px 24px -10px rgba(15,118,110,.7)}
.hw-steps p{max-width:32ch}
/* 2. sticky heading beside a numbered list */
.hw-split{display:grid;grid-template-columns:5fr 7fr;gap:clamp(36px,6vw,88px);align-items:start}
.hw-sticky{position:sticky;top:24px}
.hw-btn{display:inline-flex;align-items:center;gap:8px;margin-top:26px;min-height:48px;padding:0 22px;border-radius:999px;background:var(--hw-ink);color:#fff!important;transition:background .2s}
.hw-btn:hover{background:var(--hw-accent)}
.hw-btn svg{width:18px;height:18px}
.hw-list li{position:relative;display:grid;grid-template-columns:64px 1fr;gap:0 20px;padding-bottom:36px}
.hw-list li:last-child{padding-bottom:0}
.hw-list li:not(:last-child)::before{content:"";position:absolute;left:31px;top:64px;bottom:8px;width:2px;background:var(--hw-line)}
.hw-big{grid-row:span 3;display:grid;place-items:center;width:64px;height:64px;border-radius:20px;background:var(--hw-tint);color:var(--hw-accent);font-size:1.6rem;font-weight:800}
.hw-list h3{padding-top:6px}
.hw-list .hw-time{justify-self:start;background:#f0f5f4;color:var(--hw-muted)}
/* 3. comparison table */
.hw-table-wrap{margin-top:40px;overflow-x:auto;border-radius:16px}
.hw-table-wrap:focus-visible{outline:3px solid var(--hw-accent);outline-offset:3px}
.hw-table{width:100%;border-collapse:separate;border-spacing:0;font-size:.98rem}
.hw-table th,.hw-table td{padding:16px 18px;text-align:left;border-bottom:1px solid var(--hw-line);vertical-align:middle}
.hw-table thead th{font-size:.82rem;letter-spacing:.08em;text-transform:uppercase;color:var(--hw-muted);border-bottom-width:2px}
.hw-table tbody th{font-weight:600}
.hw-table .hw-us{background:#f0fdfa;color:var(--hw-ink)}
.hw-table thead .hw-us{border-radius:16px 16px 0 0;color:var(--hw-accent);font-size:.95rem;letter-spacing:0;text-transform:none;font-weight:800}
.hw-table tr:last-child th,.hw-table tr:last-child td{border-bottom:0}
.hw-table tr:last-child .hw-us{border-radius:0 0 16px 16px;font-weight:800}
.hw-yes,.hw-no{display:inline-grid;place-items:center;width:28px;height:28px;border-radius:50%}
.hw-yes{background:var(--hw-accent);color:#fff}
.hw-no{border:2px solid #94a3a0;color:#5b6b67}
.hw-yes svg,.hw-no svg{width:16px;height:16px}
.hw-foot{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:16px;margin-top:28px}
.hw-foot p{color:var(--hw-muted);font-size:.92rem}
.hw-foot .hw-btn{margin-top:0;background:var(--hw-accent)}
.hw-foot .hw-btn:hover{background:var(--hw-accent-hover)}
@media (max-width:991px){
  .hw-split{grid-template-columns:1fr}
  .hw-sticky{position:static}
}
@media (max-width:767px){
  .hw-steps{grid-template-columns:1fr;gap:32px;text-align:left}
  .hw-steps::before{top:28px;bottom:28px;left:27px;right:auto;border-top:0;border-left:2px dashed #5eaaa0}
  .hw-steps li{display:grid;grid-template-columns:56px 1fr;column-gap:20px;align-items:start}
  .hw-num{grid-row:span 3;margin-bottom:0}
  .hw-steps h3{padding-top:14px}
  .hw-steps .hw-time{justify-self:start}
  .hw-table th,.hw-table td{padding:12px 10px;font-size:.9rem}
}
@media (max-width:480px){
  .hw-list li{grid-template-columns:48px 1fr;gap:0 16px}
  .hw-big{width:48px;height:48px;border-radius:14px;font-size:1.25rem}
  .hw-list li:not(:last-child)::before{left:23px;top:48px}
  .hw-list h3{padding-top:10px}
}
@media (prefers-reduced-motion:reduce){.hw *{transition:none!important}}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<div><span class="lbl">Three numbered steps joined by a line</span>
<section class="hw" aria-labelledby="b-hw-steps">
  <div class="mx-auto text-center" style="max-width:660px">
    <p class="hw-eyebrow">How Tandem works</p>
    <h2 class="hw-title" id="b-hw-steps">From sign-up to paid in three steps</h2>
    <p class="hw-lead mx-auto">Tandem is invoicing for freelancers. Most people send their first invoice within ten minutes of signing up.</p>
  </div>
  <ol class="hw-steps row row-cols-1 row-cols-md-3 list-unstyled mt-5 mb-0 text-md-center">
    <li class="col d-flex flex-md-column align-items-start align-items-md-center column-gap-3"><span class="hw-num flex-none position-relative" aria-hidden="true">01</span><div class="d-flex flex-column align-items-start align-items-md-center"><h3>Connect your bank</h3><p>Read-only access through Open Banking. We see transactions, never your login.</p><span class="badge rounded-pill hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>About 2 minutes</span></div></li>
    <li class="col d-flex flex-md-column align-items-start align-items-md-center column-gap-3"><span class="hw-num flex-none position-relative" aria-hidden="true">02</span><div class="d-flex flex-column align-items-start align-items-md-center"><h3>Send your first invoice</h3><p>Pick a client, pull in hours from your timer and send. Tandem chases late payers for you.</p><span class="badge rounded-pill hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>About 5 minutes</span></div></li>
    <li class="col d-flex flex-md-column align-items-start align-items-md-center column-gap-3"><span class="hw-num flex-none position-relative" aria-hidden="true">03</span><div class="d-flex flex-column align-items-start align-items-md-center"><h3>Get paid and stay ready for tax</h3><p>Payments are matched to invoices automatically and your tax estimate updates every night.</p><span class="badge rounded-pill hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>Automatic</span></div></li>
  </ol>
</section></div>

<div><span class="lbl">Sticky heading beside a numbered list</span>
<section class="hw" aria-labelledby="b-hw-move">
  <div class="row gx-5 gy-5 align-items-start">
    <div class="col-lg-5 hw-sticky">
      <p class="hw-eyebrow">Harbor Removals</p>
      <h2 class="hw-title" id="b-hw-move">How a Harbor move works</h2>
      <p class="hw-lead">One crew from survey to the last box, and a price that does not change on the day.</p>
      <a class="btn rounded-pill hw-btn mt-4" href="#">Get a fixed quote <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h14M13 5l7 7-7 7"/></svg></a>
    </div>
    <div class="col-lg-7">
      <ol class="hw-list list-unstyled mb-0">
        <li class="d-flex gap-3 gap-sm-4"><span class="hw-big" aria-hidden="true">1</span><div><h3>A video survey, not a home visit</h3><p>Walk us round your home on a 20-minute video call. We list every item as you go and email you the inventory.</p><span class="badge rounded-pill hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Week 1</span></div></li>
        <li class="d-flex gap-3 gap-sm-4"><span class="hw-big" aria-hidden="true">2</span><div><h3>A fixed quote within a day</h3><p>The price is based on the inventory and the access at both ends, and it is the price you pay.</p><span class="badge rounded-pill hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Week 1</span></div></li>
        <li class="d-flex gap-3 gap-sm-4"><span class="hw-big" aria-hidden="true">3</span><div><h3>Packing the day before</h3><p>Two packers wrap the furniture, box the kitchen and label every box with the room it goes to.</p><span class="badge rounded-pill hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Day before</span></div></li>
        <li class="d-flex gap-3 gap-sm-4"><span class="hw-big" aria-hidden="true">4</span><div><h3>Moving day, tracked</h3><p>Follow the van on a live map. The crew unpacks the kitchen and makes the beds before they leave.</p><span class="badge rounded-pill hw-time"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Moving day</span></div></li>
      </ol>
    </div>
  </div>
</section></div>

<div><span class="lbl">Comparison table with ticks, crosses and text</span>
<section class="hw" aria-labelledby="b-hw-compare">
  <p class="hw-eyebrow">Compare</p>
  <h2 class="hw-title" id="b-hw-compare">Tandem or a spreadsheet?</h2>
  <p class="hw-lead">A spreadsheet is free and flexible. Here is what you get for £9 a month.</p>
  <div class="table-responsive hw-table-wrap mt-5" role="region" aria-label="Comparison table" tabindex="0">
    <table class="table hw-table align-middle mb-0">
      <caption class="visually-hidden">What a spreadsheet and Tandem each do for your invoicing</caption>
      <thead><tr><th scope="col">Feature</th><th scope="col">Spreadsheet</th><th scope="col" class="hw-us">Tandem</th></tr></thead>
      <tbody>
        <tr><th scope="row">Invoices numbered and dated</th><td><span class="hw-no"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M18 6 6 18M6 6l12 12"/></svg></span><span class="visually-hidden">Not included</span></td><td class="hw-us"><span class="hw-yes"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M20 6 9 17l-5-5"/></svg></span><span class="visually-hidden">Included</span></td></tr>
        <tr><th scope="row">Late payment reminders</th><td>You write them</td><td class="hw-us">Sent on day 1, 7 and 14</td></tr>
        <tr><th scope="row">Bank payments matched to invoices</th><td><span class="hw-no"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M18 6 6 18M6 6l12 12"/></svg></span><span class="visually-hidden">Not included</span></td><td class="hw-us"><span class="hw-yes"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M20 6 9 17l-5-5"/></svg></span><span class="visually-hidden">Included</span></td></tr>
        <tr><th scope="row">Tax estimate</th><td>A formula you maintain</td><td class="hw-us">Updated every night</td></tr>
        <tr><th scope="row">Works on your phone</th><td>Read only</td><td class="hw-us"><span class="hw-yes"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M20 6 9 17l-5-5"/></svg></span><span class="visually-hidden">Included</span></td></tr>
        <tr><th scope="row">Price</th><td>Free</td><td class="hw-us">£9 a month</td></tr>
      </tbody>
    </table>
  </div>
  <div class="hw-foot d-flex flex-wrap align-items-center justify-content-between gap-3 mt-4"><p>Free for the first month. Cancel from the settings page at any time.</p><a class="btn rounded-pill hw-btn hw-btn-accent" href="#">Start a free month <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h14M13 5l7 7-7 7"/></svg></a></div>
</section></div>
CSS
/* How it works steps and a comparison table in Bootstrap 5: .row / .col-* grids, .badge for the time chips, .btn
   for actions and .table (restyled through --bs-table-* variables) for the comparison. Steps are an <ol> and the
   drawn numbers are aria-hidden; ticks and crosses carry .visually-hidden text, so nothing relies on colour. */
.hw{--hw-ink:#102a26;--hw-muted:#44564f;--hw-accent:#0f766e;--hw-accent-hover:#115e59;--hw-tint:#ccfbf1;--hw-line:#d5e3df;--hw-radius:26px;
  background:#fff;color:var(--hw-ink);border-radius:var(--hw-radius);padding:clamp(40px,6vw,80px) clamp(20px,5vw,64px);line-height:1.55}
.hw :where(h2,h3,p){margin:0}
.hw a:focus-visible{outline:3px solid var(--hw-accent);outline-offset:3px;box-shadow:none}
.hw-eyebrow{font-size:.8rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--hw-accent)}
.hw-title{margin-top:12px!important;font-size:clamp(1.8rem,1.2rem + 2.2vw,2.7rem);line-height:1.1;letter-spacing:-.025em;font-weight:800}
.hw-lead{margin-top:14px!important;font-size:1.06rem;color:var(--hw-muted);max-width:58ch}
.hw h3{font-size:1.14rem;line-height:1.3;font-weight:750}
.hw h3+p{margin-top:8px;color:var(--hw-muted)}
.hw-time{--bs-badge-padding-x:10px;--bs-badge-padding-y:4px;--bs-badge-font-size:.8rem;--bs-badge-font-weight:700;--bs-badge-color:#854d0e;
  display:inline-flex;align-items:center;gap:6px;margin-top:14px;background:#fef3c7}
.hw-time svg{width:14px;height:14px}
.hw-steps{position:relative;--bs-gutter-x:40px}
.hw-steps::before{content:"";position:absolute;top:28px;left:16.66%;right:16.66%;width:auto;border-top:2px dashed #5eaaa0;padding:0}
.hw-num{display:grid;place-items:center;width:56px;height:56px;margin-bottom:20px;border-radius:50%;background:var(--hw-accent);color:#fff;
  font-weight:800;font-size:1.1rem;box-shadow:0 0 0 8px #fff,0 12px 24px -10px rgba(15,118,110,.7)}
.hw-steps p{max-width:32ch}
.hw-btn{--bs-btn-color:#fff;--bs-btn-hover-color:#fff;--bs-btn-active-color:#fff;--bs-btn-bg:var(--hw-ink);--bs-btn-border-color:var(--hw-ink);--bs-btn-hover-bg:var(--hw-accent);--bs-btn-hover-border-color:var(--hw-accent);
  --bs-btn-active-bg:var(--hw-accent);--bs-btn-active-border-color:var(--hw-accent);--bs-btn-padding-x:22px;--bs-btn-font-weight:650;
  display:inline-flex;align-items:center;gap:8px;min-height:48px}
.hw-btn svg{width:18px;height:18px}
.hw-btn-accent{--bs-btn-bg:var(--hw-accent);--bs-btn-border-color:var(--hw-accent);--bs-btn-hover-bg:var(--hw-accent-hover);--bs-btn-hover-border-color:var(--hw-accent-hover)}
.hw-list li{position:relative;padding-bottom:36px}
.hw-list li:last-child{padding-bottom:0}
.hw-list li:not(:last-child)::before{content:"";position:absolute;left:31px;top:64px;bottom:8px;width:2px;background:var(--hw-line)}
.hw-big{display:grid;place-items:center;flex:none;width:64px;height:64px;border-radius:20px;background:var(--hw-tint);color:var(--hw-accent);font-size:1.6rem;font-weight:800}
.hw-list h3{padding-top:6px}
.hw-list .hw-time{background:#f0f5f4;--bs-badge-color:var(--hw-muted)}
.hw-table-wrap{border-radius:16px}
.hw-table-wrap:focus-visible{outline:3px solid var(--hw-accent);outline-offset:3px}
.hw-table{--bs-table-border-color:var(--hw-line);--bs-table-color:var(--hw-ink);font-size:.98rem}
.hw-table> :not(caption)>*>*{padding:16px 18px}
.hw-table thead th{font-size:.82rem;letter-spacing:.08em;text-transform:uppercase;color:var(--hw-muted);border-bottom-width:2px}
.hw-table tbody th{font-weight:600}
.hw-table .hw-us{--bs-table-bg:#f0fdfa}
.hw-table thead .hw-us{border-radius:16px 16px 0 0;color:var(--hw-accent);font-size:.95rem;letter-spacing:0;text-transform:none;font-weight:800}
.hw-table tr:last-child>*{border-bottom:0}
.hw-table tr:last-child .hw-us{border-radius:0 0 16px 16px;font-weight:800}
.hw-yes,.hw-no{display:inline-grid;place-items:center;width:28px;height:28px;border-radius:50%}
.hw-yes{background:var(--hw-accent);color:#fff}
.hw-no{border:2px solid #94a3a0;color:#5b6b67}
.hw-yes svg,.hw-no svg{width:16px;height:16px}
.hw-foot p{color:var(--hw-muted);font-size:.92rem}
@media (min-width:992px){.hw-sticky{position:sticky;top:24px}}
@media (max-width:767px){
  .hw-steps{--bs-gutter-y:32px}
  .hw-steps::before{top:28px;bottom:28px;left:calc(var(--bs-gutter-x)*.5 + 27px);right:auto;border-top:0;border-left:2px dashed #5eaaa0}
  .hw-steps h3{padding-top:14px}
  .hw-table> :not(caption)>*>*{padding:12px 10px;font-size:.9rem}
}
@media (max-width:480px){
  .hw-big{width:48px;height:48px;border-radius:14px;font-size:1.25rem}
  .hw-list li:not(:last-child)::before{left:23px;top:48px}
  .hw-list h3{padding-top:10px}
}
@media (prefers-reduced-motion:reduce){.hw *{transition:none!important}}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#44564f] uppercase">Three numbered steps joined by a line</span>
<section class="rounded-[26px] bg-white px-[clamp(20px,5vw,64px)] py-[clamp(40px,6vw,80px)] leading-[1.55] text-[#102a26]" aria-labelledby="t-hw-steps">
  <div class="mx-auto max-w-[660px] text-center">
    <p class="text-[.8rem] font-bold tracking-[.12em] text-[#0f766e] uppercase">How Tandem works</p>
    <h2 class="mt-3 text-[clamp(1.8rem,1.2rem+2.2vw,2.7rem)] leading-[1.1] font-extrabold tracking-[-.025em]" id="t-hw-steps">From sign-up to paid in three steps</h2>
    <p class="mt-3.5 max-w-[58ch] text-[1.06rem] text-[#44564f] mx-auto">Tandem is invoicing for freelancers. Most people send their first invoice within ten minutes of signing up.</p>
  </div>
  <ol class="relative mt-14 grid grid-cols-1 gap-8 before:absolute before:top-7 before:bottom-7 before:left-[27px] before:border-l-2 before:border-dashed before:border-[#5eaaa0] before:content-[''] md:grid-cols-3 md:gap-10 md:text-center md:before:right-[16.66%] md:before:bottom-auto md:before:left-[16.66%] md:before:border-t-2 md:before:border-l-0">
    <li class="relative grid grid-cols-[56px_1fr] items-start gap-x-5 md:flex md:flex-col md:items-center"><span class="row-span-3 grid size-14 place-items-center rounded-full bg-[#0f766e] text-[1.1rem] font-extrabold text-white shadow-[0_0_0_8px_#fff,0_12px_24px_-10px_rgba(15,118,110,.7)] md:mb-5" aria-hidden="true">01</span><h3 class="text-[1.14rem] leading-[1.3] font-[750] pt-3.5 md:pt-0">Connect your bank</h3><p class="mt-2 text-[#44564f] max-w-[32ch]">Read-only access through Open Banking. We see transactions, never your login.</p><span class="mt-3.5 inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[.8rem] font-bold justify-self-start bg-[#fef3c7] text-[#854d0e]"><svg class="size-3.5" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>About 2 minutes</span></li>
    <li class="relative grid grid-cols-[56px_1fr] items-start gap-x-5 md:flex md:flex-col md:items-center"><span class="row-span-3 grid size-14 place-items-center rounded-full bg-[#0f766e] text-[1.1rem] font-extrabold text-white shadow-[0_0_0_8px_#fff,0_12px_24px_-10px_rgba(15,118,110,.7)] md:mb-5" aria-hidden="true">02</span><h3 class="text-[1.14rem] leading-[1.3] font-[750] pt-3.5 md:pt-0">Send your first invoice</h3><p class="mt-2 text-[#44564f] max-w-[32ch]">Pick a client, pull in hours from your timer and send. Tandem chases late payers for you.</p><span class="mt-3.5 inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[.8rem] font-bold justify-self-start bg-[#fef3c7] text-[#854d0e]"><svg class="size-3.5" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>About 5 minutes</span></li>
    <li class="relative grid grid-cols-[56px_1fr] items-start gap-x-5 md:flex md:flex-col md:items-center"><span class="row-span-3 grid size-14 place-items-center rounded-full bg-[#0f766e] text-[1.1rem] font-extrabold text-white shadow-[0_0_0_8px_#fff,0_12px_24px_-10px_rgba(15,118,110,.7)] md:mb-5" aria-hidden="true">03</span><h3 class="text-[1.14rem] leading-[1.3] font-[750] pt-3.5 md:pt-0">Get paid and stay ready for tax</h3><p class="mt-2 text-[#44564f] max-w-[32ch]">Payments are matched to invoices automatically and your tax estimate updates every night.</p><span class="mt-3.5 inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[.8rem] font-bold justify-self-start bg-[#fef3c7] text-[#854d0e]"><svg class="size-3.5" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>Automatic</span></li>
  </ol>
</section></div>

<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#44564f] uppercase">Sticky heading beside a numbered list</span>
<section class="rounded-[26px] bg-white px-[clamp(20px,5vw,64px)] py-[clamp(40px,6vw,80px)] leading-[1.55] text-[#102a26] grid grid-cols-1 items-start gap-[clamp(36px,6vw,88px)] lg:grid-cols-[5fr_7fr]" aria-labelledby="t-hw-move">
  <div class="lg:sticky lg:top-6">
    <p class="text-[.8rem] font-bold tracking-[.12em] text-[#0f766e] uppercase">Harbor Removals</p>
    <h2 class="mt-3 text-[clamp(1.8rem,1.2rem+2.2vw,2.7rem)] leading-[1.1] font-extrabold tracking-[-.025em]" id="t-hw-move">How a Harbor move works</h2>
    <p class="mt-3.5 max-w-[58ch] text-[1.06rem] text-[#44564f]">One crew from survey to the last box, and a price that does not change on the day.</p>
    <a class="inline-flex min-h-12 items-center gap-2 rounded-full px-[22px] font-[650] text-white transition-colors duration-200 focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#0f766e] motion-reduce:transition-none mt-[26px] bg-[#102a26] hover:bg-[#0f766e]" href="#">Get a fixed quote <svg class="size-[18px]" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h14M13 5l7 7-7 7"/></svg></a>
  </div>
  <ol>
    <li class="relative grid grid-cols-[48px_1fr] gap-x-4 pb-9 last:pb-0 min-[481px]:grid-cols-[64px_1fr] min-[481px]:gap-x-5 [&:not(:last-child)]:before:absolute [&:not(:last-child)]:before:top-12 [&:not(:last-child)]:before:bottom-2 [&:not(:last-child)]:before:left-[23px] [&:not(:last-child)]:before:w-0.5 [&:not(:last-child)]:before:bg-[#d5e3df] [&:not(:last-child)]:before:content-[''] min-[481px]:[&:not(:last-child)]:before:top-16 min-[481px]:[&:not(:last-child)]:before:left-[31px]"><span class="row-span-3 grid size-12 place-items-center rounded-[14px] bg-[#ccfbf1] text-[1.25rem] font-extrabold text-[#0f766e] min-[481px]:size-16 min-[481px]:rounded-[20px] min-[481px]:text-[1.6rem]" aria-hidden="true">1</span><h3 class="text-[1.14rem] leading-[1.3] font-[750] pt-2.5 min-[481px]:pt-1.5">A video survey, not a home visit</h3><p class="mt-2 text-[#44564f]">Walk us round your home on a 20-minute video call. We list every item as you go and email you the inventory.</p><span class="mt-3.5 inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[.8rem] font-bold justify-self-start bg-[#f0f5f4] text-[#44564f]"><svg class="size-3.5" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Week 1</span></li>
    <li class="relative grid grid-cols-[48px_1fr] gap-x-4 pb-9 last:pb-0 min-[481px]:grid-cols-[64px_1fr] min-[481px]:gap-x-5 [&:not(:last-child)]:before:absolute [&:not(:last-child)]:before:top-12 [&:not(:last-child)]:before:bottom-2 [&:not(:last-child)]:before:left-[23px] [&:not(:last-child)]:before:w-0.5 [&:not(:last-child)]:before:bg-[#d5e3df] [&:not(:last-child)]:before:content-[''] min-[481px]:[&:not(:last-child)]:before:top-16 min-[481px]:[&:not(:last-child)]:before:left-[31px]"><span class="row-span-3 grid size-12 place-items-center rounded-[14px] bg-[#ccfbf1] text-[1.25rem] font-extrabold text-[#0f766e] min-[481px]:size-16 min-[481px]:rounded-[20px] min-[481px]:text-[1.6rem]" aria-hidden="true">2</span><h3 class="text-[1.14rem] leading-[1.3] font-[750] pt-2.5 min-[481px]:pt-1.5">A fixed quote within a day</h3><p class="mt-2 text-[#44564f]">The price is based on the inventory and the access at both ends, and it is the price you pay.</p><span class="mt-3.5 inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[.8rem] font-bold justify-self-start bg-[#f0f5f4] text-[#44564f]"><svg class="size-3.5" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Week 1</span></li>
    <li class="relative grid grid-cols-[48px_1fr] gap-x-4 pb-9 last:pb-0 min-[481px]:grid-cols-[64px_1fr] min-[481px]:gap-x-5 [&:not(:last-child)]:before:absolute [&:not(:last-child)]:before:top-12 [&:not(:last-child)]:before:bottom-2 [&:not(:last-child)]:before:left-[23px] [&:not(:last-child)]:before:w-0.5 [&:not(:last-child)]:before:bg-[#d5e3df] [&:not(:last-child)]:before:content-[''] min-[481px]:[&:not(:last-child)]:before:top-16 min-[481px]:[&:not(:last-child)]:before:left-[31px]"><span class="row-span-3 grid size-12 place-items-center rounded-[14px] bg-[#ccfbf1] text-[1.25rem] font-extrabold text-[#0f766e] min-[481px]:size-16 min-[481px]:rounded-[20px] min-[481px]:text-[1.6rem]" aria-hidden="true">3</span><h3 class="text-[1.14rem] leading-[1.3] font-[750] pt-2.5 min-[481px]:pt-1.5">Packing the day before</h3><p class="mt-2 text-[#44564f]">Two packers wrap the furniture, box the kitchen and label every box with the room it goes to.</p><span class="mt-3.5 inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[.8rem] font-bold justify-self-start bg-[#f0f5f4] text-[#44564f]"><svg class="size-3.5" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Day before</span></li>
    <li class="relative grid grid-cols-[48px_1fr] gap-x-4 pb-9 last:pb-0 min-[481px]:grid-cols-[64px_1fr] min-[481px]:gap-x-5 [&:not(:last-child)]:before:absolute [&:not(:last-child)]:before:top-12 [&:not(:last-child)]:before:bottom-2 [&:not(:last-child)]:before:left-[23px] [&:not(:last-child)]:before:w-0.5 [&:not(:last-child)]:before:bg-[#d5e3df] [&:not(:last-child)]:before:content-[''] min-[481px]:[&:not(:last-child)]:before:top-16 min-[481px]:[&:not(:last-child)]:before:left-[31px]"><span class="row-span-3 grid size-12 place-items-center rounded-[14px] bg-[#ccfbf1] text-[1.25rem] font-extrabold text-[#0f766e] min-[481px]:size-16 min-[481px]:rounded-[20px] min-[481px]:text-[1.6rem]" aria-hidden="true">4</span><h3 class="text-[1.14rem] leading-[1.3] font-[750] pt-2.5 min-[481px]:pt-1.5">Moving day, tracked</h3><p class="mt-2 text-[#44564f]">Follow the van on a live map. The crew unpacks the kitchen and makes the beds before they leave.</p><span class="mt-3.5 inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[.8rem] font-bold justify-self-start bg-[#f0f5f4] text-[#44564f]"><svg class="size-3.5" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Moving day</span></li>
  </ol>
</section></div>

<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#44564f] uppercase">Comparison table with ticks, crosses and text</span>
<section class="rounded-[26px] bg-white px-[clamp(20px,5vw,64px)] py-[clamp(40px,6vw,80px)] leading-[1.55] text-[#102a26]" aria-labelledby="t-hw-compare">
  <p class="text-[.8rem] font-bold tracking-[.12em] text-[#0f766e] uppercase">Compare</p>
  <h2 class="mt-3 text-[clamp(1.8rem,1.2rem+2.2vw,2.7rem)] leading-[1.1] font-extrabold tracking-[-.025em]" id="t-hw-compare">Tandem or a spreadsheet?</h2>
  <p class="mt-3.5 max-w-[58ch] text-[1.06rem] text-[#44564f]">A spreadsheet is free and flexible. Here is what you get for £9 a month.</p>
  <div class="mt-10 overflow-x-auto rounded-2xl focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#0f766e]" role="region" aria-label="Comparison table" tabindex="0">
    <table class="w-full border-separate border-spacing-0">
      <caption class="sr-only">What a spreadsheet and Tandem each do for your invoicing</caption>
      <thead><tr><th scope="col" class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] border-b-2 text-[.82rem]! tracking-[.08em] text-[#44564f] uppercase">Feature</th><th scope="col" class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] border-b-2 text-[.82rem]! tracking-[.08em] text-[#44564f] uppercase">Spreadsheet</th><th scope="col" class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] rounded-t-2xl border-b-2 bg-[#f0fdfa] font-extrabold text-[#0f766e]">Tandem</th></tr></thead>
      <tbody>
        <tr><th scope="row" class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] font-semibold">Invoices numbered and dated</th><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem]"><span class="inline-grid size-7 place-items-center rounded-full border-2 border-[#94a3a0] text-[#5b6b67]"><svg class="size-4" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M18 6 6 18M6 6l12 12"/></svg></span><span class="sr-only">Not included</span></td><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] bg-[#f0fdfa]"><span class="inline-grid size-7 place-items-center rounded-full bg-[#0f766e] text-white"><svg class="size-4" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M20 6 9 17l-5-5"/></svg></span><span class="sr-only">Included</span></td></tr>
        <tr><th scope="row" class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] font-semibold">Late payment reminders</th><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem]">You write them</td><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] bg-[#f0fdfa]">Sent on day 1, 7 and 14</td></tr>
        <tr><th scope="row" class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] font-semibold">Bank payments matched to invoices</th><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem]"><span class="inline-grid size-7 place-items-center rounded-full border-2 border-[#94a3a0] text-[#5b6b67]"><svg class="size-4" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M18 6 6 18M6 6l12 12"/></svg></span><span class="sr-only">Not included</span></td><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] bg-[#f0fdfa]"><span class="inline-grid size-7 place-items-center rounded-full bg-[#0f766e] text-white"><svg class="size-4" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M20 6 9 17l-5-5"/></svg></span><span class="sr-only">Included</span></td></tr>
        <tr><th scope="row" class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] font-semibold">Tax estimate</th><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem]">A formula you maintain</td><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] bg-[#f0fdfa]">Updated every night</td></tr>
        <tr><th scope="row" class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] font-semibold">Works on your phone</th><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem]">Read only</td><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] bg-[#f0fdfa]"><span class="inline-grid size-7 place-items-center rounded-full bg-[#0f766e] text-white"><svg class="size-4" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M20 6 9 17l-5-5"/></svg></span><span class="sr-only">Included</span></td></tr>
        <tr><th scope="row" class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] border-b-0 font-semibold">Price</th><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] border-b-0">Free</td><td class="border-b border-[#d5e3df] px-2.5 py-3 text-left align-middle text-[.9rem] md:px-[18px] md:py-4 md:text-[.98rem] border-b-0 bg-[#f0fdfa] rounded-b-2xl font-extrabold">£9 a month</td></tr>
      </tbody>
    </table>
  </div>
  <div class="mt-7 flex flex-wrap items-center justify-between gap-4"><p class="text-[.92rem] text-[#44564f]">Free for the first month. Cancel from the settings page at any time.</p><a class="inline-flex min-h-12 items-center gap-2 rounded-full px-[22px] font-[650] text-white transition-colors duration-200 focus-visible:outline-3 focus-visible:outline-offset-3 focus-visible:outline-[#0f766e] motion-reduce:transition-none bg-[#0f766e] hover:bg-[#115e59]" href="#">Start a free month <svg class="size-[18px]" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M5 12h14M13 5l7 7-7 7"/></svg></a></div>
</section></div>

About this set

Three sections that explain how a product works and why it beats the alternative. Three numbered steps joined by a line shows the path from sign-up to first payment, with a large numbered circle, a heading, a sentence and a time chip such as About 2 minutes for each step; the dashed line runs across on desktop and down the left side on phones. Sticky heading beside a numbered list keeps the headline and a call to action in view while four numbered steps of a home removal scroll past, each with a timing chip and a connecting line. Comparison table sets a spreadsheet against the product across six rows, mixing ticks, crosses and short text answers, with the product column tinted and a call to action underneath. The steps are an ordered list, so screen readers announce the step number and count, and the drawn numbers are hidden to avoid reading them twice. The comparison is a real table with a caption, column headers and row headers, wrapped in a focusable, labelled region that scrolls sideways if it ever needs to. Ticks and crosses are different shapes and carry hidden Included and Not included text.

What’s included

  • Numbered steps with a dashed connector that turns vertical on phones
  • Sticky heading column beside a four-step list with timing chips
  • Comparison table with ticks, crosses and text answers in one column
  • Steps marked up as an ordered list and the comparison as a real table
  • Ticks and crosses use different shapes and hidden text, not only colour
  • No JavaScript

Accessibility

Steps are an ol with h3 headings and the drawn numbers are aria-hidden. The comparison table has a caption, scope on its column and row headers, and Included or Not included text behind every icon, and its scroll wrapper is a labelled region that can take keyboard focus. Buttons and the table region show a 3px focus outline, and colour transitions stop under prefers-reduced-motion.

Customise it

Change --hw-accent, --hw-tint, --hw-line and --hw-radius on .hw; the time chip colours sit on .hw-time. In Bootstrap the table reads --bs-table-* variables and the buttons --bs-btn-*; in Tailwind swap the #0f766e and #ccfbf1 values.