KQ-1181 · INK/BLEED

Ink Bleed

A status line written in ink: each phrase soaks into the paper letter by letter on a seeded pen rhythm, landing as a drop on the baseline and wicking up through the glyph behind a feathered front, glossy while wet and drying to a lighter matte, and when it has rested a pad of blotting paper sweeps across and lifts it for the next phrase. Pressing the paper brings the blotter down under the pointer on springs.flick and dragging rubs it along 1:1, blotting every letter still wet under it lighter (and smeared when the pass was fast); the paper's height follows a wrapping phrase on springs.glide. The paper is a real button — Enter or Space runs the same pad along the whole line — and each phrase is announced once.

KQ-1181 · INK/BLEED

Coldbrook Bank · letter of credit 0412

Drag across wet ink to blot it, or press Enter to blot the whole line.

Drafting your letter

writing · 1 of 3 · drag across wet ink to blot

Install

One command — the source lands in your repo. Or copy it from the Code tab.

$ pnpm dlx shadcn@latest add @kinetiq/ink-bleed

Props

phrases
string[]
default —
The status phrases, written one after another and cycled in order.
active
boolean
default true
Writing. False lifts the line, writes doneText in dry ink and stops every loop.
doneText
string
default —
What stays written once inactive. Defaults to the last phrase.
speed
number
default 1
How fast the pen, the drying, the rest and the blotter run, 0.5 to 2.
spread
number
default 0.5
How far the ink feathers into the paper, 0 (a crisp nib) to 1 (blotting paper): the soak front's softness, the halo, the drop and the smear.
paper
"plain" | "laid" | "kraft"
default "laid"
The stock and how ink behaves on it: plain is coated and dries slowly with a long gloss, laid is cream with laid and chain lines, kraft is brown and thirsty — fast, matte and feathered.
sound
boolean
default false
Play the blotter: a soft rustle as the pad comes down, a paper rustle for each letter it blots and a swish for the keyboard's pass or a flicked release. Writing and lifting are silent.
disabled
boolean
default false
The line keeps writing but cannot be blotted.
onPhraseChange
(index: number) => void
default —
A phrase began: its index in phrases, or -1 for doneText. Also reported on the first commit.
className
string
default —
Classes for the root; it is w-full by default.