Progress
Progress bars show how far a task, a goal or a quota has come. Below are the basic bars with labels, heights, colours, stripes and stacked segments, followed by practical widgets such as uploads, goals, storage meters, wizards, rating breakdowns and a circular ring.
1Basic bars
The width of <code>.progress-bar</code> shows the value; ARIA attributes describe it for screen readers.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Basic example 0" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 0%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Basic example 25" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 25%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Basic example 50" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 50%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Basic example 75" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 75%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Basic example 100" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 100%">
</div>
</div>
</div>2Labels
Put text inside the bar; <code>.overflow-visible</code> keeps a long label readable on a short bar.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Label example" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width: 60%">
60%
</div>
</div>
</div>
<div class="progress" role="progressbar" aria-label="Long label example" aria-valuenow="12" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar overflow-visible text-dark" style="width: 12%">
Only 12% of the upload is done
</div>
</div>3Height
Set the height on <code>.progress</code>; the bar follows.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Thin" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="height: 2px">
<div class="progress-bar" style="width: 40%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Medium" aria-valuenow="55" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar" style="width: 55%">
</div>
</div>
</div>
<div class="progress" role="progressbar" aria-label="Tall" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100" style="height: 24px">
<div class="progress-bar" style="width: 70%">
</div>
</div>4Backgrounds
Background utilities colour the bar.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="bg-success bar" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-success" style="width: 25%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="bg-info bar" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-info" style="width: 50%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="bg-warning bar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-warning" style="width: 75%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="bg-danger bar" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-danger" style="width: 100%">
</div>
</div>
</div>5Striped
<code>.progress-bar-striped</code> adds a diagonal stripe pattern.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Striped 0" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped bg-success" style="width: 20%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Striped 1" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped bg-info" style="width: 40%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Striped 2" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped bg-warning" style="width: 60%">
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Striped 3" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped bg-danger" style="width: 80%">
</div>
</div>
</div>6Animated stripes
Add <code>.progress-bar-animated</code> so the stripes move - a clear sign that work is ongoing.
<div class="progress" role="progressbar" aria-label="Animated" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 75%">
</div>
</div>7Multiple bars
<code>.progress-stacked</code> puts several segments side by side in one track.
<div class="progress-stacked">
<div class="progress" role="progressbar" aria-label="Segment one" aria-valuenow="15" aria-valuemin="0" aria-valuemax="100" style="width: 15%">
<div class="progress-bar">
</div>
</div>
<div class="progress" role="progressbar" aria-label="Segment two" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100" style="width: 30%">
<div class="progress-bar bg-success">
</div>
</div>
<div class="progress" role="progressbar" aria-label="Segment three" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%">
<div class="progress-bar bg-info">
</div>
</div>
</div>8Contrasting labels
<code>.text-bg-*</code> sets a matching background and readable text colour in one class.
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Done" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar text-bg-success" style="width: 90%">
Done 90%
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Almost" aria-valuenow="65" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar text-bg-warning" style="width: 65%">
Almost 65%
</div>
</div>
</div>
<div class="mb-2">
<div class="progress" role="progressbar" aria-label="Late" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar text-bg-danger" style="width: 40%">
Late 40%
</div>
</div>
</div>9Label row
Name on the left, percentage on the right, thin bar below.
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>Tax receipts</span><span class="font-semibold">70%</span>
</div>
<div class="progress" role="progressbar" aria-label="Tax receipts" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100" style="height: 6px">
<div class="progress-bar" style="width: 70%">
</div>
</div>
</div>
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>Impact tracking</span><span class="font-semibold">85%</span>
</div>
<div class="progress" role="progressbar" aria-label="Impact tracking" aria-valuenow="85" aria-valuemin="0" aria-valuemax="100" style="height: 6px">
<div class="progress-bar" style="width: 85%">
</div>
</div>
</div>
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>Local partners</span><span class="font-semibold">41%</span>
</div>
<div class="progress" role="progressbar" aria-label="Local partners" aria-valuenow="41" aria-valuemin="0" aria-valuemax="100" style="height: 6px">
<div class="progress-bar" style="width: 41%">
</div>
</div>
</div>10Skill bars
A compact grid of labelled skill or score bars.
<div class="row items-center g-2 mb-2">
<div class="col-4 col-sm-3 small">
Planning
</div>
<div class="col">
<div class="progress" role="progressbar" aria-label="Planning" aria-valuenow="85" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-primary" style="width: 85%">
</div>
</div>
</div>
<div class="col-2 col-sm-1 small text-end">
85
</div>
</div>
<div class="row items-center g-2 mb-2">
<div class="col-4 col-sm-3 small">
Design
</div>
<div class="col">
<div class="progress" role="progressbar" aria-label="Design" aria-valuenow="91" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-primary" style="width: 91%">
</div>
</div>
</div>
<div class="col-2 col-sm-1 small text-end">
91
</div>
</div>
<div class="row items-center g-2 mb-2">
<div class="col-4 col-sm-3 small">
Writing
</div>
<div class="col">
<div class="progress" role="progressbar" aria-label="Writing" aria-valuenow="67" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-primary" style="width: 67%">
</div>
</div>
</div>
<div class="col-2 col-sm-1 small text-end">
67
</div>
</div>
<div class="row items-center g-2 mb-2">
<div class="col-4 col-sm-3 small">
Support
</div>
<div class="col">
<div class="progress" role="progressbar" aria-label="Support" aria-valuenow="57" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar bg-primary" style="width: 57%">
</div>
</div>
</div>
<div class="col-2 col-sm-1 small text-end">
57
</div>
</div>11File uploads
Per-file upload rows with type icon, status text, a thin bar and a remove button.
- report.pdfComplete
- cover.png27% - 3 MB
- assets.zip63% - 3 MB
<ul class="list-group">
<li class="list-group-item"><div class="flex items-center gap-4"><span class="text-xl text-primary"><i class="bi bi-file-earmark-pdf" aria-hidden="true"></i></span><div class="grow"><div class="flex justify-between small"><span class="font-semibold">report.pdf</span><span class="text-muted">Complete</span></div><div class="progress mt-1" role="progressbar" aria-label="report.pdf upload" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100" style="height:5px"><div class="progress-bar bg-success" style="width: 100%"></div></div></div><button type="button" class="btn btn-sm btn-link link-secondary" aria-label="Remove report.pdf"><i class="bi bi-x-lg" aria-hidden="true"></i></button></div></li>
<li class="list-group-item"><div class="flex items-center gap-4"><span class="text-xl text-primary"><i class="bi bi-file-earmark-image" aria-hidden="true"></i></span><div class="grow"><div class="flex justify-between small"><span class="font-semibold">cover.png</span><span class="text-muted">27% - 3 MB</span></div><div class="progress mt-1" role="progressbar" aria-label="cover.png upload" aria-valuenow="27" aria-valuemin="0" aria-valuemax="100" style="height:5px"><div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 27%"></div></div></div><button type="button" class="btn btn-sm btn-link link-secondary" aria-label="Remove cover.png"><i class="bi bi-x-lg" aria-hidden="true"></i></button></div></li>
<li class="list-group-item"><div class="flex items-center gap-4"><span class="text-xl text-primary"><i class="bi bi-file-earmark-zip" aria-hidden="true"></i></span><div class="grow"><div class="flex justify-between small"><span class="font-semibold">assets.zip</span><span class="text-muted">63% - 3 MB</span></div><div class="progress mt-1" role="progressbar" aria-label="assets.zip upload" aria-valuenow="63" aria-valuemin="0" aria-valuemax="100" style="height:5px"><div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 63%"></div></div></div><button type="button" class="btn btn-sm btn-link link-secondary" aria-label="Remove assets.zip"><i class="bi bi-x-lg" aria-hidden="true"></i></button></div></li>
</ul>12Goal card
A fundraising or sales goal with the amount reached and the target.
Every donation makes a difference
$18,000.00
raised of $45,000.00 goal
<div class="card" style="max-width:360px">
<div class="card-body">
<h3 class="h6 card-title">Every donation makes a difference</h3>
<p class="text-2xl font-bold mb-0">$18,000.00</p>
<p class="small text-muted">raised of $45,000.00 goal</p>
<div class="progress" role="progressbar" aria-label="Goal" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="height: 10px">
<div class="progress-bar bg-success" style="width: 40%">
</div>
</div>
<div class="flex justify-between small mt-2">
<span>40% funded</span><span>3 days left</span>
</div>
</div>
</div>13Storage usage
A stacked bar with a legend shows how space is split.
<div style="max-width:460px">
<div class="flex justify-between small mb-1">
<span class="font-semibold">Storage</span><span>56 GB of 100 GB</span>
</div>
<div class="progress-stacked mb-2" style="height:12px">
<div class="progress" role="progressbar" aria-label="Documents" aria-valuenow="29" aria-valuemin="0" aria-valuemax="100" style="width: 29%; height:12px">
<div class="progress-bar">
</div>
</div>
<div class="progress" role="progressbar" aria-label="Photos" aria-valuenow="12" aria-valuemin="0" aria-valuemax="100" style="width: 12%; height:12px">
<div class="progress-bar bg-warning">
</div>
</div>
<div class="progress" role="progressbar" aria-label="Backups" aria-valuenow="15" aria-valuemin="0" aria-valuemax="100" style="width: 15%; height:12px">
<div class="progress-bar bg-info">
</div>
</div>
</div>
<div class="flex flex-wrap gap-4 small">
<span><span class="inline-block rounded-full bg-primary me-1" style="width:.6rem;height:.6rem"></span>Documents</span><span><span class="inline-block rounded-full bg-warning me-1" style="width:.6rem;height:.6rem"></span>Photos</span><span><span class="inline-block rounded-full bg-info me-1" style="width:.6rem;height:.6rem"></span>Backups</span>
</div>
</div>14Wizard steps
A progress track with step labels under it for multi-step forms.
<div>
<div class="progress" role="progressbar" aria-label="Step 2 of 4" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100" style="height: 6px">
<div class="progress-bar" style="width: 50%">
</div>
</div>
<div class="flex justify-between small mt-2">
<span class="text-primary font-semibold"><i class="bi bi-check-circle-fill" aria-hidden="true"></i> Account</span><span class="text-primary font-semibold"><i class="bi bi-record-circle" aria-hidden="true"></i> Details</span><span class="text-muted"><i class="bi bi-circle" aria-hidden="true"></i> Payment</span><span class="text-muted"><i class="bi bi-circle" aria-hidden="true"></i> Done</span>
</div>
</div>15Card top bar
A borderless thin bar across the top edge of a card shows that it is refreshing.
Disaster response
The new impact tracking lets decisions quicker and clearer from the very first day.
<div class="card overflow-hidden" style="max-width:380px">
<div class="progress" role="progressbar" aria-label="Refreshing" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="height: 3px; border-radius: 0">
<div class="progress-bar progress-bar-striped progress-bar-animated" style="width: 60%">
</div>
</div>
<div class="card-body">
<h3 class="h6 card-title">Disaster response</h3>
<p class="card-text small mb-0">The new impact tracking lets decisions quicker and clearer from the very first day.</p>
</div>
</div>16In a table
Project rows with a bar per row; colour reflects the state.
| Project | Progress | Done |
|---|---|---|
| 6 lessons from our journey | 68% | |
| 5 lessons from our launch | 89% | |
| Project notes for donors | 30% | |
| Practical ways to improve your project | 25% |
<div class="table-responsive">
<table class="table align-middle mb-0">
<thead>
<tr>
<th scope="col">Project</th>
<th scope="col">Progress</th>
<th scope="col" class="text-end">Done</th>
</tr>
</thead>
<tbody>
<tr>
<td class="small">6 lessons from our journey</td>
<td style="min-width:120px"><div class="progress" role="progressbar" aria-label="Task progress" aria-valuenow="68" aria-valuemin="0" aria-valuemax="100" style="height: 6px"><div class="progress-bar" style="width: 68%"></div></div></td>
<td class="small text-end">68%</td>
</tr>
<tr>
<td class="small">5 lessons from our launch</td>
<td style="min-width:120px"><div class="progress" role="progressbar" aria-label="Task progress" aria-valuenow="89" aria-valuemin="0" aria-valuemax="100" style="height: 6px"><div class="progress-bar" style="width: 89%"></div></div></td>
<td class="small text-end">89%</td>
</tr>
<tr>
<td class="small">Project notes for donors</td>
<td style="min-width:120px"><div class="progress" role="progressbar" aria-label="Task progress" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100" style="height: 6px"><div class="progress-bar" style="width: 30%"></div></div></td>
<td class="small text-end">30%</td>
</tr>
<tr>
<td class="small">Practical ways to improve your project</td>
<td style="min-width:120px"><div class="progress" role="progressbar" aria-label="Task progress" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100" style="height: 6px"><div class="progress-bar bg-danger" style="width: 25%"></div></div></td>
<td class="small text-end">25%</td>
</tr>
</tbody>
</table>
</div>17Rating breakdown
Star rating distribution, as used on review pages.
4.2 from 376 reviews
<div style="max-width:380px">
<p class="mb-2"><span class="text-2xl font-bold">4.2</span> <span class="text-muted small">from 376 reviews</span></p>
<div class="flex items-center gap-2 mb-1 small">
<span style="width:2.5rem">5 <i class="bi bi-star-fill" aria-hidden="true"></i></span>
<div class="grow">
<div class="progress" role="progressbar" aria-label="5 star ratings" aria-valuenow="66" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 66%">
</div>
</div>
</div>
<span class="text-muted text-end" style="width:2.5rem">66%</span>
</div>
<div class="flex items-center gap-2 mb-1 small">
<span style="width:2.5rem">4 <i class="bi bi-star-fill" aria-hidden="true"></i></span>
<div class="grow">
<div class="progress" role="progressbar" aria-label="4 star ratings" aria-valuenow="13" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 13%">
</div>
</div>
</div>
<span class="text-muted text-end" style="width:2.5rem">13%</span>
</div>
<div class="flex items-center gap-2 mb-1 small">
<span style="width:2.5rem">3 <i class="bi bi-star-fill" aria-hidden="true"></i></span>
<div class="grow">
<div class="progress" role="progressbar" aria-label="3 star ratings" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 10%">
</div>
</div>
</div>
<span class="text-muted text-end" style="width:2.5rem">10%</span>
</div>
<div class="flex items-center gap-2 mb-1 small">
<span style="width:2.5rem">2 <i class="bi bi-star-fill" aria-hidden="true"></i></span>
<div class="grow">
<div class="progress" role="progressbar" aria-label="2 star ratings" aria-valuenow="2" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 2%">
</div>
</div>
</div>
<span class="text-muted text-end" style="width:2.5rem">2%</span>
</div>
<div class="flex items-center gap-2 mb-1 small">
<span style="width:2.5rem">1 <i class="bi bi-star-fill" aria-hidden="true"></i></span>
<div class="grow">
<div class="progress" role="progressbar" aria-label="1 star ratings" aria-valuenow="2" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 2%">
</div>
</div>
</div>
<span class="text-muted text-end" style="width:2.5rem">2%</span>
</div>
</div>18Checklist progress
A card that shows how many tasks of a checklist are complete.
Launch checklist
2 / 4<div class="card" style="max-width:360px">
<div class="card-body">
<div class="flex justify-between items-center mb-2">
<h3 class="h6 mb-0">Launch checklist</h3>
<span class="badge text-bg-primary">2 / 4</span>
</div>
<div class="progress" role="progressbar" aria-label="Checklist" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100" style="height: 6px">
<div class="progress-bar bg-success" style="width: 50%">
</div>
</div>
<div class="mt-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="pt-1117" checked>
<label class="form-check-label line-through text-muted" for="pt-1117">Write the brief</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="pt-1118" checked>
<label class="form-check-label line-through text-muted" for="pt-1118">Collect feedback</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="pt-1119">
<label class="form-check-label" for="pt-1119">Prepare the files</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="pt-1120">
<label class="form-check-label" for="pt-1120">Publish</label>
</div>
</div>
</div>
</div>19Circular progress
A ring drawn with a conic gradient; set the value with the <code>--cb-p</code> variable.
<div class="flex flex-wrap gap-6">
<div class="text-center">
<div class="cb-ring" role="progressbar" aria-label="Visits" aria-valuenow="56" aria-valuemin="0" aria-valuemax="100" style="--cb-p:56;--cb-c:var(--ui-primary)">
<span>56%</span>
</div>
<div class="small mt-2">
Visits
</div>
</div>
<div class="text-center">
<div class="cb-ring" role="progressbar" aria-label="Sales" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100" style="--cb-p:70;--cb-c:var(--ui-success)">
<span>70%</span>
</div>
<div class="small mt-2">
Sales
</div>
</div>
<div class="text-center">
<div class="cb-ring" role="progressbar" aria-label="Tickets" aria-valuenow="54" aria-valuemin="0" aria-valuemax="100" style="--cb-p:54;--cb-c:var(--ui-warning)">
<span>54%</span>
</div>
<div class="small mt-2">
Tickets
</div>
</div>
</div>20Plan limits
Usage meters that turn yellow and red as a limit gets close, with an upgrade link.
<div class="border rounded-md p-4" style="max-width:400px">
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>Projects</span><span>4 / 10</span>
</div>
<div class="progress" role="progressbar" aria-label="Projects used" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar" style="width: 40%">
</div>
</div>
</div>
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>Team seats</span><span>8 / 10</span>
</div>
<div class="progress" role="progressbar" aria-label="Team seats used" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-warning" style="width: 80%">
</div>
</div>
</div>
<div class="mb-4">
<div class="flex justify-between small mb-1">
<span>API calls</span><span>98 / 100k</span>
</div>
<div class="progress" role="progressbar" aria-label="API calls used" aria-valuenow="98" aria-valuemin="0" aria-valuemax="100" style="height: 8px">
<div class="progress-bar bg-danger" style="width: 98%">
</div>
</div>
</div>
<a href="#" class="btn btn-sm btn-outline-primary"><i class="bi bi-rocket-takeoff" aria-hidden="true"></i> Upgrade plan</a>
</div>