Scroll edge shadows
An inset shadow shown only on the edge that has more content behind it.
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.
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-caption">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-sub">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-sub">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-sub">no retries</span></div> <div class="hss-tile"><span class="hss-label">Quality score</span><span class="hss-fig hss-none" aria-label="Not rated">—</span><span class="hss-sub">not rated yet</span></div> </div> <p class="hss-caption">Same strip, working as the filter.</p> <div class="hss-strip hss-strip--five" role="group" aria-label="Filter downloads by status"> <button class="hss-tile" aria-pressed="true" data-filter="All"><span class="hss-label">All</span><span class="hss-fig">6</span><span class="hss-sub">downloads</span></button> <button class="hss-tile" aria-pressed="false" data-filter="Queued"><span class="hss-label">Queued</span><span class="hss-fig">2</span><span class="hss-sub">downloads</span></button> <!-- Downloading, Done, Failed follow the same shape --> </div> <ul class="hss-list" aria-live="polite">…</ul>
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; /* the hairline */
background: var(--border); /* shows through the gap */
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, minmax(0, 1fr)); } }
@media (min-width: 42rem) { .hss-strip { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
.hss-tile {
background: var(--surface); /* tiles paint over the container */
padding: .9rem 1rem;
display: grid;
gap: .25rem;
min-width: 0;
}
.hss-label { font: 500 .8125rem/1.25 ui-monospace, monospace; text-transform: uppercase; color: var(--dim); overflow-wrap: anywhere; }
.hss-fig { font-size: 1.6rem; font-weight: 700; font-variant-numeric: tabular-nums; }
.hss-none { color: var(--dim); font-weight: 500; }
button.hss-tile[aria-pressed="true"] {
background: color-mix(in srgb, var(--accent) 14%, var(--surface));
}const tiles = [...document.querySelectorAll('[data-filter]')];
const items = [...document.querySelectorAll('.hss-list li')];
tiles.forEach((tile) => tile.addEventListener('click', () => {
const wasPressed = tile.getAttribute('aria-pressed') === 'true';
const value = wasPressed ? 'All' : tile.dataset.filter;
tiles.forEach((other) => other.setAttribute('aria-pressed', String(other.dataset.filter === value)));
items.forEach((item) => { item.hidden = value !== 'All' && item.dataset.status !== value; });
}));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.
Pinning the column counts (1, then 2 from 21rem, then 4 from 42rem) instead of auto-fit; tile anatomy (mono uppercase label, bold tabular figure, quiet sub-line); two rules of honesty — render a missing value as a dimmed em dash, and keep units with the number; the filter form; computing counts from the unfiltered set; and using aria-pressed rather than tab roles.
An inset shadow shown only on the edge that has more content behind it.
Sticky vertical rail on wide screens, wrapping tab row on narrow ones, from the same markup.
One custom property carries the hue; border, fill, spine and dot derive from it.