The paper is CSS.
There is no image.
what the look is made of
A receipt is one of the few UI looks that is entirely reachable with plain CSS, because everything that makes a receipt look like a receipt is a property that already exists. Narrow measure, monospace, small type on loose leading, dashed rules, tracked capitals. There is no illustration, no sprite and no font to license.
Four layers, in the order they matter. The paper is a background colour and a wide, uneven linear-gradient across the width — a warm falloff at both edges and a soft crease off-centre, which is what stops a flat rectangle reading as a card. The fibre is a single SVG feTurbulence as a data URI, laid over the whole element at mix-blend-mode: multiply and about a third opacity: it is grain, not texture, and at full strength it looks like a filter. The rules are ordinary <hr> elements with a dashed top border. The type does the rest, and it has its own section below.
the torn edge
The tear is a clip-path polygon, generated once. Fifty-eight steps across the top and the same across the bottom; each point sits a few pixels in, with roughly a one-in-six chance of a deeper nick. That ratio is the whole trick — paper ripped off a printer is mostly straight with occasional ragged bites, so an even zigzag reads as a decorative border rather than a tear.
Generate it from a seeded PRNG rather than from randomness. A receipt that reshuffles its own edge on every render is unsettling on screen, and — more practically — an export taken a frame later will not match the shape the reader was looking at.
receipt.css
These are the shipped values, read out of the component served at /tearline.js on 1 August 2026 — not illustrative ones. One line is an addition rather than a quote: font-variant-numeric is not currently set by the component and should be. Copy the block above and you have the look without loading anything.