Stat strip
Four headline numbers in one band, each with a plain note under it, and a small bar where a share matters.
5 from the bank feed · $29,409.76
| Select | Customer | Their reference | Amount | Match |
|---|---|---|---|---|
| Penmarrow Bay Hotel | CBH REFIT STAGE 2 | $26,015.33USD | Part payment | |
| Saffrey Coffee Co. | SAFFREY COFFEE | $452.08USD | Suggested | |
| Gullwharf Oyster Bar | BRINE ST OYSTER BAR | $1,029.99USD | Suggested | |
| Kettleby Catering Ltd | — | $1,500.00USD | No match | |
| Pendrick Telecom | BT-0098341 | $412.36USD | Matched |
It is live: hover, focus and its own controls respond. Actions that would change data (approve, send, delete) are for your app to wire. The width is a real 390 px, 768 px or 1280 px box, shrunk to fit your screen.
<style>
.odl-receipts-table { box-sizing: border-box; inline-size: 100%; max-inline-size: 1040px; position: relative; container-type: inline-size; background: var(--ds-color-surface-raised); color: var(--ds-color-text-primary);
border: var(--ds-border-width-default) solid var(--ds-color-border-subtle); border-radius: var(--ds-radius-container); box-shadow: var(--ds-elevation-raised); font: var(--ds-text-body-md); overflow: hidden; text-wrap: pretty; }
.odl-receipts-table .odl-scroll { overflow-x: auto; }
.odl-receipts-table .odl-top { display: grid; gap: var(--ds-space-2);
padding: var(--ds-space-inset-md) var(--ds-space-inset-md) var(--ds-space-inset-sm); }
.odl-receipts-table h3 { margin: 0; font: var(--ds-text-title-sm); }
.odl-receipts-table .odl-top p { margin: 0; color: var(--ds-color-text-secondary); font: var(--ds-text-body-sm); font-variant-numeric: tabular-nums; }
.odl-receipts-table table { inline-size: 100%; min-inline-size: 40rem; border-collapse: collapse; font-variant-numeric: tabular-nums; }
.odl-receipts-table th { text-align: start; padding: 0 var(--ds-space-inset-sm); block-size: var(--ds-size-row-sm); color: var(--ds-color-text-secondary); font: var(--ds-text-label-md);
background: var(--ds-color-surface-sunken); border-block-end: var(--ds-border-width-default) solid var(--ds-color-border-subtle); white-space: nowrap; }
.odl-receipts-table td { padding: 0 var(--ds-space-inset-sm); block-size: var(--ds-size-row-md); border-block-end: var(--ds-border-width-default) solid var(--ds-color-border-separator); white-space: nowrap; }
.odl-receipts-table tr:last-child td { border-block-end: 0; }
.odl-receipts-table th:first-child, .odl-receipts-table td:first-child { inline-size: 1%; padding-inline-start: var(--ds-space-inset-md); }
.odl-receipts-table .odl-num { text-align: end; }
.odl-receipts-table .odl-num small { color: var(--ds-color-text-tertiary); font: var(--ds-text-label-sm); margin-inline-start: var(--ds-space-2); }
.odl-receipts-table .odl-ref { color: var(--ds-color-text-secondary); font: var(--ds-text-code-sm); }
.odl-receipts-table tbody tr { transition: background-color var(--ds-motion-duration-short) var(--ds-motion-easing-standard); }
.odl-receipts-table tbody tr:hover { background: var(--ds-color-bg-neutral-subtle); }
.odl-receipts-table tbody tr:has(input:checked) { background: var(--ds-color-bg-accent-subtle); }
.odl-receipts-table input { inline-size: var(--ds-size-icon-sm); block-size: var(--ds-size-icon-sm); margin: 0; accent-color: var(--ds-color-bg-action-primary); cursor: pointer; vertical-align: middle; }
.odl-receipts-table label { display: inline-grid; place-items: center; min-inline-size: var(--ds-size-target-min); min-block-size: var(--ds-size-target-min); margin: calc(-1 * var(--ds-space-4)) 0; cursor: pointer; }
.odl-receipts-table input:focus-visible, .odl-receipts-table button:focus-visible { outline: var(--ds-focus-ring-width) solid var(--ds-color-border-focus); outline-offset: var(--ds-focus-ring-offset); }
.odl-receipts-table .odl-pill { display: inline-flex; align-items: center; gap: var(--ds-space-4); padding: var(--ds-space-2) var(--ds-space-8); border-radius: var(--ds-radius-control-sm); font: var(--ds-text-label-md); }
.odl-receipts-table .odl-pill::before { content: ""; inline-size: var(--ds-space-6); block-size: var(--ds-space-6); border-radius: var(--ds-radius-full); background: currentColor; }
.odl-receipts-table .is-suggested { background: var(--ds-color-bg-neutral-subtle); color: var(--ds-color-text-secondary); }
.odl-receipts-table .is-short { background: var(--ds-color-bg-warning-subtle); color: var(--ds-color-text-warning); }
.odl-receipts-table .is-none { background: var(--ds-color-bg-danger-subtle); color: var(--ds-color-text-danger); }
.odl-receipts-table .is-matched { background: var(--ds-color-bg-success-subtle); color: var(--ds-color-text-success); }
@container (max-width: 40rem) {
.odl-receipts-table table { min-inline-size: 0; }
.odl-receipts-table thead { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip-path: inset(50%); }
.odl-receipts-table tbody tr { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: var(--ds-space-4) var(--ds-space-inline-sm);
padding: var(--ds-space-inset-xs) var(--ds-space-inset-sm) var(--ds-space-inset-xs) 0; }
.odl-receipts-table tbody tr + tr { border-block-start: var(--ds-border-width-default) solid var(--ds-color-border-separator); }
.odl-receipts-table td { block-size: auto; padding: 0; border: 0; white-space: normal; }
.odl-receipts-table td:first-child { grid-row: span 2; padding-inline-start: var(--ds-space-inset-xs); }
.odl-receipts-table td:nth-child(3) { display: none; }
.odl-receipts-table td:nth-child(5) { grid-column: 2 / 4; }
.odl-receipts-table .odl-bulk { padding: var(--ds-space-inset-xs); }
.odl-receipts-table .odl-bulk output { flex: 1 1 100%; padding-inline: var(--ds-space-inset-xs); }
.odl-receipts-table .odl-bulk span { display: none; }
.odl-receipts-table .odl-bulk button { flex: 1; }
}
.odl-receipts-table .odl-bulk { display: flex; align-items: center; gap: var(--ds-space-inline-sm); margin: var(--ds-space-inset-sm); padding: var(--ds-space-4) var(--ds-space-4) var(--ds-space-4) var(--ds-space-inset-md);
border-radius: var(--ds-radius-container); background: var(--ds-color-bg-inverse); color: var(--ds-color-text-inverse); box-shadow: var(--ds-elevation-floating); flex-wrap: wrap;
transition: opacity var(--ds-motion-duration-short) var(--ds-motion-easing-standard); }
.odl-receipts-table:not(:has(tbody input:checked)) .odl-bulk { opacity: 0; visibility: hidden; }
.odl-receipts-table .odl-bulk output { font: var(--ds-text-label-lg); font-weight: var(--ds-font-weight-label); }
.odl-receipts-table .odl-bulk span { flex: 1; }
.odl-receipts-table .odl-bulk button { min-block-size: max(var(--ds-size-control-sm), var(--ds-size-target-min)); padding: 0 var(--ds-space-inset-sm); border: 0; border-radius: max(0px, calc(var(--ds-radius-container) - var(--ds-space-4))); background: transparent;
color: inherit; font: var(--ds-text-label-lg); cursor: pointer; }
.odl-receipts-table .odl-bulk button:hover { background: var(--ds-color-neutral-alpha-dark-3); }
.odl-receipts-table .odl-bulk .odl-go { background: var(--ds-color-surface-raised); color: var(--ds-color-text-primary); }
.odl-receipts-table .odl-bulk .odl-go:hover { background: var(--ds-color-bg-neutral-subtle); }
@media (prefers-reduced-motion: reduce) { .odl-receipts-table, .odl-receipts-table *, .odl-receipts-table *::before { transition: none !important; animation: none !important; } }
</style>
<div class="odl-receipts-table">
<div class="odl-top"><h3 id="odl-rt-title">Receipts to match</h3><p>5 from the bank feed · $29,409.76</p></div>
<div class="odl-scroll">
<table aria-labelledby="odl-rt-title">
<thead><tr><th scope="col"><span hidden>Select</span></th><th scope="col">Customer</th><th scope="col">Their reference</th><th scope="col" class="odl-num">Amount</th><th scope="col">Match</th></tr></thead>
<tbody>
<tr><td><label><input type="checkbox" aria-label="Select Penmarrow Bay Hotel"></label></td><td>Penmarrow Bay Hotel</td><td class="odl-ref">CBH REFIT STAGE 2</td><td class="odl-num">$26,015.33<small>USD</small></td><td><span class="odl-pill is-short">Part payment</span></td></tr>
<tr><td><label><input type="checkbox" checked aria-label="Select Saffrey Coffee Co."></label></td><td>Saffrey Coffee Co.</td><td class="odl-ref">SAFFREY COFFEE</td><td class="odl-num">$452.08<small>USD</small></td><td><span class="odl-pill is-suggested">Suggested</span></td></tr>
<tr><td><label><input type="checkbox" checked aria-label="Select Gullwharf Oyster Bar"></label></td><td>Gullwharf Oyster Bar</td><td class="odl-ref">BRINE ST OYSTER BAR</td><td class="odl-num">$1,029.99<small>USD</small></td><td><span class="odl-pill is-suggested">Suggested</span></td></tr>
<tr><td><label><input type="checkbox" aria-label="Select Kettleby Catering Ltd"></label></td><td>Kettleby Catering Ltd</td><td class="odl-ref">—</td><td class="odl-num">$1,500.00<small>USD</small></td><td><span class="odl-pill is-none">No match</span></td></tr>
<tr><td><label><input type="checkbox" aria-label="Select Pendrick Telecom"></label></td><td>Pendrick Telecom</td><td class="odl-ref">BT-0098341</td><td class="odl-num">$412.36<small>USD</small></td><td><span class="odl-pill is-matched">Matched</span></td></tr>
</tbody>
</table>
</div>
<div class="odl-bulk" role="toolbar" aria-label="Selected receipts"><output aria-live="polite">2 selected</output><span></span><button type="button">Hold as credit</button><button type="button" class="odl-go">Confirm matches</button></div>
</div>
<script>
document.querySelectorAll(".odl-receipts-table").forEach((root) => {
if (root.dataset.odlReady) return; // wire once, even if the file is pasted twice
root.dataset.odlReady = "1";
const out = root.querySelector(".odl-bulk output");
root.addEventListener("change", () => { out.textContent = root.querySelectorAll("tbody input:checked").length + " selected"; });
});
</script>
Four headline numbers in one band, each with a plain note under it, and a small bar where a share matters.
A record's history: who did what and when, with field changes shown as old value, new value and the difference.
One bill waiting for approval: the amount, the policy that applies, who has approved so far, and what the balance will be after paying.