Open demo

CSS code

HTML
<article class="inv">
  <div class="inv-head">
    <div class="inv-brand">Papergrain Studio<span>[email protected] · VAT JP-8842107</span></div>
    <div class="inv-meta"><h2 id="inv-title">Invoice INV-1041</h2><p>Issued: Jun 28, 2026<br>Due: Jul 12, 2026</p></div>
  </div>
  <table class="inv-table" aria-labelledby="inv-title">
    <thead><tr><th scope="col">Item</th><th scope="col" class="c">Qty</th><th scope="col" class="r">Rate</th><th scope="col" class="r">Amount</th></tr></thead>
    <tbody>
      <tr><td class="inv-item"><b>Brand identity refresh</b><span>Logo refinement, color system, usage guide</span></td><td class="num c">1</td><td class="num r">$2,800.00</td><td class="num r">$2,800.00</td></tr>
      <tr><td class="inv-item"><b>Landing page design</b><span>Desktop and mobile, two revision rounds</span></td><td class="num c">1</td><td class="num r">$1,400.00</td><td class="num r">$1,400.00</td></tr>
      <tr><td class="inv-item"><b>Icon set</b><span>24 custom icons, SVG + Figma source</span></td><td class="num c">24</td><td class="num r">$35.00</td><td class="num r">$840.00</td></tr>
    </tbody>
    <tbody class="inv-totals">
      <tr><th scope="row" colspan="3">Subtotal</th><td class="num r">$5,040.00</td></tr>
      <tr><th scope="row" colspan="3">Tax (10%)</th><td class="num r">$504.00</td></tr>
      <tr class="inv-due"><th scope="row" colspan="3">Total due</th><td class="num r">$5,544.00</td></tr>
    </tbody>
  </table>
  <p class="inv-note">Payment by bank transfer to the account on file. Late payments accrue 1.5% monthly. Thank you — it's a pleasure working with you.</p>
</article>
CSS
/* Invoice sheet: line items, a second <tbody> for the totals, and print styles that drop the card look. */
.inv{width:100%;max-width:640px;background:#fff;color:#191d24;border-radius:14px;padding:38px 40px;box-shadow:0 20px 46px -22px rgba(15,20,30,.25)}
.inv-head{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:16px;margin-bottom:32px}
.inv-brand{font-weight:800;font-size:1.15rem;letter-spacing:-.02em}
.inv-brand span{display:block;font-size:.78rem;font-weight:500;color:#636b7a;margin-top:4px;letter-spacing:0}
.inv-meta{text-align:right;font-size:.82rem;color:#636b7a;line-height:1.7}
.inv-meta h2{color:#191d24;font-size:1rem;font-weight:700;margin:0}
.inv-meta p{margin:0}
.inv-table{width:100%;border-collapse:collapse;font-size:.88rem}
.inv-table th,.inv-table td{text-align:left;vertical-align:top}
.inv-table thead th{font-size:.72rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:#636b7a;padding:10px 0;border-bottom:2px solid #191d24}
.inv-table .c{text-align:center}
.inv-table .r{text-align:right}
.inv-table tbody td{padding:13px 0;border-bottom:1px solid #eceef2}
.inv-item b{display:block;color:#191d24}
.inv-item span{font-size:.8rem;color:#636b7a}
.inv-table .num{font-variant-numeric:tabular-nums}
.inv-table .inv-totals th,.inv-table .inv-totals td{border-bottom:0;padding:7px 0}
.inv-table .inv-totals tr:first-child>*{padding-top:18px}
.inv-table .inv-totals th{text-align:right;color:#636b7a;font-size:.85rem;font-weight:400;padding-right:16px}
.inv-table .inv-due>*{border-top:2px solid #191d24;font-weight:800;font-size:1.05rem;padding-top:12px}
.inv-table .inv-totals .inv-due th{color:#191d24;font-weight:800;font-size:1.05rem}
.inv-note{margin-top:30px;padding-top:18px;border-top:1px dashed #dfe3ea;font-size:.8rem;color:#636b7a;line-height:1.6}
@media (max-width:480px){.inv{padding:26px 22px}.inv-meta{text-align:left}}
@media print{.inv{box-shadow:none;border-radius:0;max-width:100%}}

Bootstrap 5 code

Requires: Bootstrap 5.3.8 CSS

HTML
<article class="inv bg-white w-100">
  <div class="d-flex justify-content-between align-items-start flex-wrap gap-3 mb-4 pb-2">
    <div class="inv-brand">Papergrain Studio<span>[email protected] · VAT JP-8842107</span></div>
    <div class="inv-meta text-end"><h2 id="inv-title">Invoice INV-1041</h2><p class="mb-0">Issued: Jun 28, 2026<br>Due: Jul 12, 2026</p></div>
  </div>
  <table class="table inv-table mb-0" aria-labelledby="inv-title">
    <thead><tr><th scope="col">Item</th><th scope="col" class="text-center">Qty</th><th scope="col" class="text-end">Rate</th><th scope="col" class="text-end">Amount</th></tr></thead>
    <tbody>
      <tr><td class="inv-item"><b>Brand identity refresh</b><span>Logo refinement, color system, usage guide</span></td><td class="num text-center">1</td><td class="num text-end">$2,800.00</td><td class="num text-end">$2,800.00</td></tr>
      <tr><td class="inv-item"><b>Landing page design</b><span>Desktop and mobile, two revision rounds</span></td><td class="num text-center">1</td><td class="num text-end">$1,400.00</td><td class="num text-end">$1,400.00</td></tr>
      <tr><td class="inv-item"><b>Icon set</b><span>24 custom icons, SVG + Figma source</span></td><td class="num text-center">24</td><td class="num text-end">$35.00</td><td class="num text-end">$840.00</td></tr>
    </tbody>
    <tbody class="inv-totals">
      <tr><th scope="row" colspan="3" class="text-end">Subtotal</th><td class="num text-end">$5,040.00</td></tr>
      <tr><th scope="row" colspan="3" class="text-end">Tax (10%)</th><td class="num text-end">$504.00</td></tr>
      <tr class="inv-due"><th scope="row" colspan="3" class="text-end">Total due</th><td class="num text-end">$5,544.00</td></tr>
    </tbody>
  </table>
  <p class="inv-note mt-4 pt-3 mb-0">Payment by bank transfer to the account on file. Late payments accrue 1.5% monthly. Thank you — it's a pleasure working with you.</p>
</article>
CSS
/* Bootstrap .table for the line items, a second <tbody> for the totals, and print styles that drop the card look. */
.inv{max-width:640px;color:#191d24;border-radius:14px;padding:38px 40px;box-shadow:0 20px 46px -22px rgba(15,20,30,.25)}
.inv-brand{font-weight:800;font-size:1.15rem;letter-spacing:-.02em}
.inv-brand span{display:block;font-size:.78rem;font-weight:500;color:#636b7a;margin-top:4px;letter-spacing:0}
.inv-meta{font-size:.82rem;color:#636b7a;line-height:1.7}
.inv-meta h2{color:#191d24;font-size:1rem;font-weight:700;line-height:1.7;margin:0}
.inv-table{--bs-table-bg:transparent;--bs-table-color:#191d24;--bs-table-border-color:#eceef2;font-size:.88rem}
.inv-table>:not(caption)>*>*{padding:13px 0}
.inv-table>thead>tr>th{font-size:.72rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;--bs-table-color:#636b7a;padding:10px 0;border-bottom:2px solid #191d24}
.inv-item b{display:block}
.inv-item span{font-size:.8rem;color:#636b7a}
.inv-table .num{font-variant-numeric:tabular-nums}
.inv-totals>tr>*{border-bottom:0;padding:7px 0}
.inv-totals>tr:first-child>*{padding-top:18px}
.inv-totals th{--bs-table-color:#636b7a;font-size:.85rem;font-weight:400;padding-right:16px}
.inv-table>.inv-totals>.inv-due>*{border-top:2px solid #191d24;font-weight:800;font-size:1.05rem;padding-top:12px;--bs-table-color:#191d24}
.inv-note{border-top:1px dashed #dfe3ea;font-size:.8rem;color:#636b7a;line-height:1.6}
@media (max-width:480px){.inv{padding:26px 22px}.inv .inv-meta{text-align:left!important}}
@media print{.inv{box-shadow:none;border-radius:0;max-width:100%}}

Tailwind 4 code

Requires: Tailwind CSS 4

HTML
<article class="w-full max-w-[640px] rounded-[14px] bg-white px-10 py-[38px] text-[#191d24] shadow-[0_20px_46px_-22px_rgba(15,20,30,.25)] max-[480px]:px-[22px] max-[480px]:py-[26px] print:max-w-full print:rounded-none print:shadow-none">
  <div class="mb-8 flex flex-wrap items-start justify-between gap-4">
    <div class="text-[1.15rem] font-extrabold tracking-[-.02em]">Papergrain Studio<span class="mt-1 block text-[.78rem] font-medium tracking-normal text-[#636b7a]">[email protected] · VAT JP-8842107</span></div>
    <div class="text-right text-[.82rem] leading-[1.7] text-[#636b7a] max-[480px]:text-left"><h2 id="inv-title" class="text-base font-bold text-[#191d24]">Invoice INV-1041</h2><p>Issued: Jun 28, 2026<br>Due: Jul 12, 2026</p></div>
  </div>
  <table aria-labelledby="inv-title" class="w-full border-collapse text-[.88rem] [&_td]:align-top [&_th]:align-top">
    <thead class="text-[.72rem] font-bold tracking-[.07em] text-[#636b7a] uppercase [&_th]:border-b-2 [&_th]:border-[#191d24] [&_th]:py-2.5"><tr><th scope="col" class="text-left">Item</th><th scope="col" class="text-center">Qty</th><th scope="col" class="text-right">Rate</th><th scope="col" class="text-right">Amount</th></tr></thead>
    <tbody class="[&_td]:border-b [&_td]:border-[#eceef2] [&_td]:py-[13px]">
      <tr><td><b class="block">Brand identity refresh</b><span class="text-[.8rem] text-[#636b7a]">Logo refinement, color system, usage guide</span></td><td class="text-center tabular-nums">1</td><td class="text-right tabular-nums">$2,800.00</td><td class="text-right tabular-nums">$2,800.00</td></tr>
      <tr><td><b class="block">Landing page design</b><span class="text-[.8rem] text-[#636b7a]">Desktop and mobile, two revision rounds</span></td><td class="text-center tabular-nums">1</td><td class="text-right tabular-nums">$1,400.00</td><td class="text-right tabular-nums">$1,400.00</td></tr>
      <tr><td><b class="block">Icon set</b><span class="text-[.8rem] text-[#636b7a]">24 custom icons, SVG + Figma source</span></td><td class="text-center tabular-nums">24</td><td class="text-right tabular-nums">$35.00</td><td class="text-right tabular-nums">$840.00</td></tr>
    </tbody>
    <tbody class="[&_td]:py-[7px] [&_td]:text-right [&_td]:tabular-nums [&_th]:py-[7px] [&_th]:pr-4 [&_th]:text-right [&_th]:text-[.85rem] [&_th]:font-normal [&_th]:text-[#636b7a] [&>tr:first-child>*]:pt-[18px]">
      <tr><th scope="row" colspan="3">Subtotal</th><td>$5,040.00</td></tr>
      <tr><th scope="row" colspan="3">Tax (10%)</th><td>$504.00</td></tr>
      <tr class="text-[1.05rem] font-extrabold [&>*]:border-t-2 [&>*]:border-[#191d24] [&>*]:pt-3! [&>th]:text-[1.05rem]! [&>th]:font-extrabold! [&>th]:text-[#191d24]!"><th scope="row" colspan="3">Total due</th><td>$5,544.00</td></tr>
    </tbody>
  </table>
  <p class="mt-[30px] border-t border-dashed border-[#dfe3ea] pt-[18px] text-[.8rem] leading-[1.6] text-[#636b7a]">Payment by bank transfer to the account on file. Late payments accrue 1.5% monthly. Thank you — it's a pleasure working with you.</p>
</article>

About this set

A printable invoice sheet built around a line items table. The header shows the studio name and contact line on the left and the invoice number, issue date and due date on the right; below it the table lists items with a bold name and a grey description, a centred quantity, a right-aligned rate and amount, all in tabular figures. The totals are a second tbody under the items: Subtotal and Tax rows with right-aligned labels, and a Total due row with a heavy rule above it. Using row headers with colspan for those labels keeps the totals inside the same table, so columns stay aligned and screen readers announce each amount with its label. A dashed note at the bottom holds payment terms. Print styles remove the page background, the shadow and the rounded corners, so the sheet prints as a clean page. On narrow screens the padding shrinks and the invoice details move under the studio name. Use it for invoice, receipt and quote pages in billing tools. There is no JavaScript. The Bootstrap version uses .table with .text-end and .text-center utilities, and the Tailwind version uses print: variants.

What’s included

  • Line items with name, description, quantity, rate and amount
  • Totals in a second tbody with row-header labels
  • Tabular numerals and right-aligned money columns
  • Print styles that drop the card look
  • Narrow-screen layout with tighter padding

Accessibility

The table is labelled by the Invoice INV-1041 heading, column headers use scope="col" and the Subtotal, Tax and Total due labels are row headers, so every amount is announced with its label. Grey text is darkened to #636b7a for 4.5:1 contrast. Nothing on the sheet is interactive.

Customise it

Colours are in the .inv rules: ink #191d24, muted #636b7a, rules #eceef2 and #dfe3ea; change padding on .inv for sheet margins. Bootstrap uses --bs-table-* variables on .inv-table; in Tailwind edit the text-, border- and print: utilities.