Pro / Invoice detail An issued invoice as the customer reads it: parties with tax ids, lines, discount, VAT or reverse charge, payments made and the balance, with copy link, email, download and pay.
Installs components/ui/invoice-detail.tsx Depends on @radix-ui/react-slot, lucide-react Motion none in component source
$ pnpm dlx shadcn@latest add @caliper/invoice-detailCopy
Preview When to use Installation Usage API reference Accessibility Motion Related 0 container fluid →
Open€184.41 due 15 October 2026
Copy link Copied Email Download PDFPay €184.41
Issued 1 October 2026
Due 15 October 2026 From Halden Software, Lda. Rua do Alecrim 12 1200-018 Lisboa, Portugal VAT PT514298311 Bill to Northwind GmbH Accounts payable Torstraße 140 10119 Berlin, Germany VAT DE298431107 Lines on invoice INV-2026-0931 Description Qty Unit price Amount Team plan 8 seats · 1 Oct – 31 Oct 2026 8 €18.00 €144.00 Additional seats, prorated 2 seats from 14 Oct 2 €10.45 €20.90 Data residency add-on EU region 1 €40.00 €40.00
Subtotal €204.90
Annual partner discount 10% −€20.49
VAT (reverse charge) €0.00
Total €184.41
Amount due €184.41 Reverse charge: the customer accounts for VAT under Article 196 of Council Directive 2006/112/EC.
Payment terms: 14 days. Bank transfer to PT50 0035 0123 0000 0123 4567 8.
Reset demo
When to use # Use it for Billing history in an app. A hosted invoice page. Skip it when Writing an invoice; use the invoice editor. Installation # CLI Copy the source
pnpm npm yarn bun
terminal Copy
pnpm dlx shadcn@latest add @caliper/invoice-detail Adds its 5 files to components/ui/, each with its own stylesheet, and installs their packages. Pro installs with your access token, set up once per project. See Pro access . The first part also adds Caliper UI’s tokens; import them once as in Installation .
Usage # Import it from your copy of the source. The example behind the preview comes with the source. It is built from invoiceBalance and InvoiceDetail .
example.tsx Copy
import { invoiceBalance, InvoiceDetail } from "@/components/ui/invoice-detail"
The worked example comes with Pro The 37-line example behind the preview opens here with a Pro or Team licence.
Checking your licence…
API reference # invoiceBalance component No props of its own; it accepts the native props of its root element.
InvoiceDetail component Prop Type Default Description
number * string —
status * InvoiceStatus —
issued * string —
due * string —
from * InvoiceParty —
to * InvoiceParty —
lines * readonly InvoiceDetailLine[] —
taxRate * number — e.g. 0.23 for 23% VAT. Ignored with `reverseCharge`.
reverseCharge boolean false EU B2B: the customer accounts for VAT.
discount { label: string; amount: number; } —
payments readonly InvoicePayment[] []
currency string "EUR"
notes string —
link string — A shareable link to this invoice.
onPay (() => void) —
onDownload (() => void) — Defaults to printing, which can save a PDF.
onEmail (() => void) —
className string —
Accessibility # It exposes region semantics, with aria-labelledby, aria-hidden and aria-label kept in step with state.
No custom key handling; Tab and the native activation keys do the work.
Motion # It declares no animation in its component source. Any transition comes from its stylesheet, which uses the duration tokens that collapse to instant under prefers-reduced-motion.
Previous Payment recovery Next Model picker