KQ-1239 · INK/READER
Ink Reader
An e-reader that lays any long text out in pages exactly as wide as its screen, measured, so a narrower reader has more pages; every turn is an e-ink refresh rather than a slide — the new page shows inverted, snaps to white and clears in three grey steps, or with a fast refresh draws at once and leaves the old page as a ghost that clears the same way, and a full flash never repeats within half a second. A swipe, a tap, the chin's keys (which press on flick and return on snap) or the keyboard turn the page, and the front-light slider follows the finger 1:1 and settles on snap, bringing the paper up from the room's own light and tinting it cool to amber while the ink stays black. On the focused page the arrow, Page and Space keys turn and Home and End jump; the slider takes arrows, Page keys, Home and End.
Two · Reading the gauge
The weir at Basin 3 is not much to look at in winter. A grey lip of concrete, a sill of green weed, and the river going over it in one smooth sheet that never seems to hurry. You could stand on the footbridge for an hour and believe nothing was happening at all.
The keeper knows better. Every morning she walks out along the wall with a notebook in her coat and reads the gauge board: a white post marked in tenths, half hidden by the spray. She writes the number down before she looks at anything else, because the number is the only thing the river will not argue with later.
In January the reading barely moves. Snow sits on the hills above Fieldline and the water comes down cold and thin. She clears the trash screen of the leaves that blew in over the autumn, oils the sluice chain, and listens. A weir has a voice, she says, and a change in it is the first sign of anything.
February is the month of small floods. A warm night, a little rain, and by morning the sheet over the lip has thickened into a roll that hides the sill completely. She opens the side gate a turn at a time and watches the gauge between turns. Too fast and the bank below the outfall scours; too slow and the meadow on the far side goes under.
By March the herons are back, standing in the slack water at the foot of the apron as if someone had placed them there. The keeper does not count them, but she notes the day the first one arrives. Over the years the date has crept earlier. She has not decided what to make of that, and she writes it down anyway.
Spring work is mostly mud. The silt trap fills with what the floods brought down, and someone has to dig it out before the summer. Two of them do it with long spades and a barrow, and it takes most of a week. What comes out is grey, then brown, then, at the very bottom, a clean yellow sand that nobody can explain.
Summer is quiet in a different way. The river drops until the sheet over the lip breaks into separate threads, and the threads into drops, and some evenings the weir is almost silent. Children come down to paddle in the pool below it. The keeper tells them where the steps are and where the holes are, and does not tell them to go home.
There is a fish pass at the north end, a staircase of shallow pools for anything that wants to climb. In August she lifts the cover at dusk and shines a torch into the top pool. Most nights there is nothing. Once, years ago, there was a trout as long as her arm, holding still in the current, and she put the cover back very gently.
Autumn brings the leaves again, and the first proper rain, and the sound of the weir finding its voice. She walks the wall with the notebook in her coat and reads the white post through the spray, and writes the number down before she looks at anything else.
People ask her whether it is lonely work. She says it is the opposite. The river is always arriving from somewhere and always leaving for somewhere else, and the weir is the one place where it stops long enough to be measured. Somebody, she says, ought to be there when it does.
page 1 · light 50% · full refresh
Install
One command — the source lands in your repo. Or copy it from the Code tab.
$ pnpm dlx shadcn@latest add @kinetiq/ink-reader
Props
- children
- React.ReactNode
- default —
- The text: any long content, laid out in pages the size of the screen.
- label
- string
- default "E-reader"
- The reader's accessible name.
- title
- string
- default —
- The book or chapter, shown at the top of the screen.
- page / defaultPage
- number
- default 1
- The page shown, from 1.
- onPageChange
- (page: number) => void
- default —
- Fires from a swipe, a tap, a key or a page key with the page asked for.
- onPageCountChange
- (count: number) => void
- default —
- Fires when the text has been laid out, and again whenever a new size changes its page count.
- light
- number
- default 0.5
- The front light, 0 (off) to 1. The slider starts here and follows a new value.
- onLightChange
- (light: number) => void
- default —
- Fires from the slider with the new level.
- warmth
- number
- default 0.3
- The light's colour, 0 (cool white) to 1 (amber).
- refresh
- "full" | "fast"
- default "full"
- A full flash (inverted, then clean) or a fast draw that leaves a ghost of the last page.
- sound
- boolean
- default false
- A page turn's paper crinkle, a little higher going forward. Nothing plays at either end or on its own.
- disabled
- boolean
- default false
- Takes no turns and no light changes.
- className
- string
- default —
- Classes for the 5:7 root; size it by width.
| Prop | Type | Default | Description |
|---|---|---|---|
| children | React.ReactNode | — | The text: any long content, laid out in pages the size of the screen. |
| label | string | "E-reader" | The reader's accessible name. |
| title | string | — | The book or chapter, shown at the top of the screen. |
| page / defaultPage | number | 1 | The page shown, from 1. |
| onPageChange | (page: number) => void | — | Fires from a swipe, a tap, a key or a page key with the page asked for. |
| onPageCountChange | (count: number) => void | — | Fires when the text has been laid out, and again whenever a new size changes its page count. |
| light | number | 0.5 | The front light, 0 (off) to 1. The slider starts here and follows a new value. |
| onLightChange | (light: number) => void | — | Fires from the slider with the new level. |
| warmth | number | 0.3 | The light's colour, 0 (cool white) to 1 (amber). |
| refresh | "full" | "fast" | "full" | A full flash (inverted, then clean) or a fast draw that leaves a ghost of the last page. |
| sound | boolean | false | A page turn's paper crinkle, a little higher going forward. Nothing plays at either end or on its own. |
| disabled | boolean | false | Takes no turns and no light changes. |
| className | string | — | Classes for the 5:7 root; size it by width. |