KQ-1188 · BRAILLE/RISE

Braille Rise

A status line felt before it is read: each letter first rises as its real six-dot braille cell, the dots coming up out of the paper on the snap spring so each dome brightens as it overshoots, and a moment behind the dots sink back on a tween while the printed letter comes up out of them, so a band of raised cells rides across the line ahead of the print. Moving the pointer along the line lifts the cells under it again like a finger reading, and a press pops one up on the recoil spring. The line is a slider over its letters: Left and Right move a reading caret that raises the cell under it and names the letter and its dots, Space or Enter presses it, and the phrase waits while someone is reading it.

KQ-1188 · BRAILLE/RISE

Basinworks Docs · accessible copy

Move the pointer along the line, or use Left and Right, to raise the cells again; press to feel one.

Reading the scan

embossing · 1 of 3 · run a finger along the line

Install

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

$ pnpm dlx shadcn@latest add @kinetiq/braille-rise

Props

phrases
string[]
default —
The status phrases, embossed and printed one after another, cycled in order.
active
boolean
default true
Printing. False clears the line, prints doneText flat and stops every clock and timer.
doneText
string
default —
What stays printed once inactive. Defaults to the last phrase.
speed
number
default 1
How fast the cells rise and print and how long a printed phrase rests, 0.5 to 2.
emboss
number
default 0.6
How deep the paper is pressed, 0 (flat ink dots, no shadow or swell) to 1 (paper-coloured domes with a long shadow and a bright rim).
cells
boolean
default true
Show each unprinted letter's whole six-dot cell as faint pits, so the blank slate is visible before the dots rise.
sound
boolean
default false
Play the reading: a tick for each cell that comes under the finger or the caret, pitched by its dot count, and a pop for a press. The printing itself is silent.
disabled
boolean
default false
The line keeps printing, but it cannot be read by hand or by key.
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.