Adaptive tile mosaic
A container with no artwork draws one from up to four member tiles, grid tracks following tile count.
Layout Updated
A row of stat tiles joined by hairlines that are grid gap, not borders — the container paints the border color and the tiles paint the surface, so separators never double up or break when the row wraps — in a reporting form and in a second form where each tile is the filter for the list beneath it.
Hairline stat strip
Reach for it when building
Reporting only — the figures are the whole job.
Same strip, working as the filter. Press a tile to narrow the list; press it again to clear.
Showing all 6 downloads.
<p class="hss-cap">Reporting only — the figures are the whole job.</p> <div class="hss-strip"> <div class="hss-tile"><span class="hss-label">Documents</span><span class="hss-fig">1,482</span><span class="hss-unit">this period</span></div> <div class="hss-tile"><span class="hss-label">Median time</span><span class="hss-fig">3.2s</span><span class="hss-unit">last 24h</span></div> <div class="hss-tile"><span class="hss-label">Clean runs</span><span class="hss-fig">98.4%</span><span class="hss-unit">no retries</span></div> <div class="hss-tile"><span class="hss-label">Quality score</span><span class="hss-fig is-missing">—</span><span class="hss-unit">not rated yet</span></div> </div>
Colors come from shared theme tokens — --surface, --ink, --border, --accent and friends — so this CSS carries no palette of its own. Use Runnable file to copy the tokens along with it.
.hss-strip {
display: grid;
gap: 1px;
background: var(--border);
border: 1px solid var(--border);
border-radius: var(--radius);
overflow: hidden;
grid-template-columns: 1fr;
}
@media (min-width: 21rem) { .hss-strip { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 42rem) { .hss-strip { grid-template-columns: repeat(4, 1fr); } }
.hss-tile { background: var(--surface); padding: 0.9rem 1rem; }
.hss-label { font: 0.8125rem ui-monospace, monospace; text-transform: uppercase; color: var(--dim); }
.hss-fig { font-size: 1.6rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.hss-fig.is-missing { color: var(--dim); }
.hss-tile[aria-pressed="true"] {
background: color-mix(in srgb, var(--accent) 14%, var(--surface));
}strip.addEventListener('click', (event) => {
const tile = event.target.closest('button.hss-tile');
if (!tile) return;
const wasOn = tile.getAttribute('aria-pressed') === 'true';
const state = wasOn ? 'All' : tile.dataset.state;
for (const other of strip.querySelectorAll('button.hss-tile')) {
other.setAttribute('aria-pressed', String(other.dataset.state === state));
}
for (const row of list.children) {
row.hidden = state !== 'All' && row.dataset.state !== state;
}
status.textContent = state === 'All'
? 'Showing all 6 downloads.'
: `Filtered to ${state}: ${visibleCount()} of 6. Press the lit tile again to clear.`;
});Build a strip of statistic tiles that reads as one joined instrument panel rather than a row of floating cards.
The separators between tiles must not be borders. Make the container a CSS grid with gap: 1px and give the container itself the border color as its background; each tile then paints the surface color on top. The 1px of container showing through the gap is the hairline. This is the entire pattern: real borders double where two tiles meet and leave a stray edge when auto-fit wraps the row, and a gap physically cannot do either.
Pin the column counts rather than letting auto-fit choose: one column, then two from 21rem, then four from 42rem, so a row never strands a single tile.
Two rules of honesty. Render a missing value as a dimmed em dash, never a zero. Keep the unit with the number, in the tile, not in a legend.
In the filter form, each tile is a button with aria-pressed, not a tab. Compute every count from the unfiltered set, so pressing a tile never changes the numbers printed on the others.
:root{--ground:#eef0f3;--surface:#fff;--border:#d2d8e0;--ink:#161b22;--dim:#56606e;--accent:#364f6a;--radius:10px}
.hss-strip {
display: grid;
gap: 1px;
background: var(--border);
border: 1px solid var(--border);
border-radius: var(--radius);
overflow: hidden;
grid-template-columns: 1fr;
}
@media (min-width: 21rem) { .hss-strip { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 42rem) { .hss-strip { grid-template-columns: repeat(4, 1fr); } }
.hss-tile { background: var(--surface); padding: 0.9rem 1rem; }
.hss-label { font: 0.8125rem ui-monospace, monospace; text-transform: uppercase; color: var(--dim); }
.hss-fig { font-size: 1.6rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.hss-fig.is-missing { color: var(--dim); }
.hss-tile[aria-pressed="true"] {
background: color-mix(in srgb, var(--accent) 14%, var(--surface));
}
<p class="hss-cap">Reporting only — the figures are the whole job.</p>
<div class="hss-strip">
<div class="hss-tile"><span class="hss-label">Documents</span><span class="hss-fig">1,482</span><span class="hss-unit">this period</span></div>
<div class="hss-tile"><span class="hss-label">Median time</span><span class="hss-fig">3.2s</span><span class="hss-unit">last 24h</span></div>
<div class="hss-tile"><span class="hss-label">Clean runs</span><span class="hss-fig">98.4%</span><span class="hss-unit">no retries</span></div>
<div class="hss-tile"><span class="hss-label">Quality score</span><span class="hss-fig is-missing">—</span><span class="hss-unit">not rated yet</span></div>
</div>
A container with no artwork draws one from up to four member tiles, grid tracks following tile count.
Text printed over unreviewed artwork, scrimmed to an alpha that can be written down rather than guessed.
Conversation bubbles with a speaker-colored spine and a fixed metadata gutter.