Components
Stat tiles
Big-number KPI tiles for dashboards — a felt-css extra, not part of Bootstrap.
View page source on GitHubOn this page
Example#
A stat tile is a card whose body carries .stat: a small uppercase .stat-label above a big .stat-value. Values use tabular figures, so numbers that update in place don't jitter. Color the card with a .text-bg-* helper and lay the tiles out with the grid.
<div class="row row-cols-2 row-cols-lg-4 g-3">
<div class="col">
<div class="card text-bg-warning">
<div class="card-body stat">
<span class="stat-label">Solar</span>
<span class="stat-value">1.2 kW</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-primary">
<div class="card-body stat">
<span class="stat-label">Consumption</span>
<span class="stat-value">380 W</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-success">
<div class="card-body stat">
<span class="stat-label">Battery</span>
<span class="stat-value">82 %</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-danger">
<div class="card-body stat">
<span class="stat-label">Outside</span>
<span class="stat-value">14 °C</span>
</div>
</div>
</div>
</div>In felt, a colored tile is a patch: saturated felt with a soft cut edge and a cast shadow, sewn on with thread a shade lighter than the patch.
Colors#
Every .text-bg-* color works, and so does a plain card for a quieter tile.
<div class="row row-cols-2 row-cols-md-3 g-3">
<div class="col">
<div class="card">
<div class="card-body stat">
<span class="stat-label">Default</span>
<span class="stat-value">42</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-primary">
<div class="card-body stat">
<span class="stat-label">Primary</span>
<span class="stat-value">42</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-secondary">
<div class="card-body stat">
<span class="stat-label">Secondary</span>
<span class="stat-value">42</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-success">
<div class="card-body stat">
<span class="stat-label">Success</span>
<span class="stat-value">42</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-danger">
<div class="card-body stat">
<span class="stat-label">Danger</span>
<span class="stat-value">42</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-warning">
<div class="card-body stat">
<span class="stat-label">Warning</span>
<span class="stat-value">42</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-info">
<div class="card-body stat">
<span class="stat-label">Info</span>
<span class="stat-value">42</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-light">
<div class="card-body stat">
<span class="stat-label">Light</span>
<span class="stat-value">42</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-dark">
<div class="card-body stat">
<span class="stat-label">Dark</span>
<span class="stat-value">42</span>
</div>
</div>
</div>
</div>Sizing#
The value is 1.75rem by default. On small tiles, such as two to a row on a phone, scale it down with a font size utility like .fs-4.
<div class="row row-cols-2 g-2" style="max-width: 22rem">
<div class="col">
<div class="card text-bg-warning">
<div class="card-body stat">
<span class="stat-label">Solar</span>
<span class="stat-value fs-4">1,240 W</span>
</div>
</div>
</div>
<div class="col">
<div class="card text-bg-primary">
<div class="card-body stat">
<span class="stat-label">Consumption</span>
<span class="stat-value fs-4">380 W</span>
</div>
</div>
</div>
</div>Semantic markup#
.stat, .stat-label and .stat-value reset their margins, so they work on any element. A description list ties each label to its value for assistive technologies, and extra lines like a trend fit underneath.
- Balance
- +42.10 €
- since last settlement
<div class="card text-bg-success" style="max-width: 16rem">
<dl class="card-body stat">
<dt class="stat-label">Balance</dt>
<dd class="stat-value">+42.10 €</dd>
<dd class="small mb-0">since last settlement</dd>
</dl>
</div>