KQ-1190 · LENS/SWEEP

Lens Sweep

A status line read over by a loupe: outside the lens the words are soft and faint, under it they are sharp, full ink and magnified about the lens's centre. The lens reads in saccades, gliding from word to word on the glide spring from rest to rest and pausing on each as if checking it, with a small nod and a hairline check drawn under the word that stays as it moves on; a read phrase rests, fades, and the lens sweeps back for the next. The lens follows a finger 1:1 anywhere along the line, ticking as it enters each word, and on release settles onto the word the throw was heading for and reads on from there; a tap on a word sends it there, and as a slider Left, Right, Home and End move it a word at a time.

KQ-1190 · LENS/SWEEP

Fieldline · lease renewal

Drag the lens along the line, or use Left and Right, to read a word; it reads on from there.

Reading the terms

reading · word 1 of 3 · drag the lens

Install

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

$ pnpm dlx shadcn@latest add @kinetiq/lens-sweep

Props

phrases
string[]
default —
The status phrases, read over one after another and cycled in order.
active
boolean
default true
Reading. False puts the lens down beside the line and leaves doneText sharp, full ink and still; every timer stops.
doneText
string
default —
What stays, read, once inactive. Defaults to the last phrase.
speed
number
default 1
How long the lens checks each word and rests on a read phrase, 0.5 to 2; the glide itself stays the house glide.
zoom
number
default 1.5
How much the lens magnifies, 1.2 to 2.
blur
number
default 1.5
How soft the words outside the lens are, 0 to 4 px.
lens
"round" | "bar"
default "round"
A jeweller's loupe, or a reading bar that magnifies a wider span of the line.
sound
boolean
default false
Play the lens under the visitor's hand: a tick for each word it enters while dragged, tapped to or moved by key, pitched along the line. The automatic reading is silent.
disabled
boolean
default false
The lens keeps reading, but it cannot be moved 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.
onWordChange
(word: number) => void
default —
The lens came to rest on a word and checked it: its index in the phrase.
className
string
default —
Classes for the root; it is w-full by default.