KQ-745 · SPEED/SCRUB
Speed Scrub
A finished answer whose arrival can be replayed at a chosen pace. The thumb sits inline at the replay position, so it rides the text through every line wrap; play advances by characters from a fixed-step interval, pause holds mid-word with the thumb swelling on snap, and the speed row's indicator glides between stops on snap. Pressing or dragging on the text scrubs to the character under the pointer; on the slider Left and Right step a word, Up and Down five, Home and End jump, and Space toggles play.
Renew the crane lease, but for one year rather than three. The yard's own crane returns from repair in the spring, and the north site closes in the autumn, so the second and third years would pay for a machine that mostly stands idle. A single year covers the busy season at the current rate, and the supplier has already agreed to hold it. Review again in March once the repair estimate is final.
Paused · word 0 of 74 · 1×
Install
One command — the source lands in your repo. Or copy it from the Code tab.
$ pnpm dlx shadcn@latest add @kinetiq/speed-scrub
Props
- text
- string
- default —
- The finished answer.
- position / defaultPosition
- number
- default 0
- Controlled or initial replay position in characters.
- onPositionChange
- (position: number) => void
- default —
- Fires from the interval, a key press, or a pointer scrub.
- playing / defaultPlaying
- boolean
- default false
- Controlled or initial play state.
- onPlayingChange
- (playing: boolean) => void
- default —
- Fires from the play control, Space, a press on the text, or reaching the end.
- speed / defaultSpeed
- number
- default 1
- Controlled or initial multiplier.
- onSpeedChange
- (speed: number) => void
- default —
- Fires from the speed row.
- speeds
- number[]
- default [0.5, 1, 2, 4]
- The multipliers offered.
- charsPerSecond
- number
- default 40
- Characters per second at 1×.
- label
- string
- default —
- Names the answer and the scrubber for assistive technology.
- model
- string
- default —
- The model's name for the header chip.
| Prop | Type | Default | Description |
|---|---|---|---|
| text | string | — | The finished answer. |
| position / defaultPosition | number | 0 | Controlled or initial replay position in characters. |
| onPositionChange | (position: number) => void | — | Fires from the interval, a key press, or a pointer scrub. |
| playing / defaultPlaying | boolean | false | Controlled or initial play state. |
| onPlayingChange | (playing: boolean) => void | — | Fires from the play control, Space, a press on the text, or reaching the end. |
| speed / defaultSpeed | number | 1 | Controlled or initial multiplier. |
| onSpeedChange | (speed: number) => void | — | Fires from the speed row. |
| speeds | number[] | [0.5, 1, 2, 4] | The multipliers offered. |
| charsPerSecond | number | 40 | Characters per second at 1×. |
| label | string | — | Names the answer and the scrubber for assistive technology. |
| model | string | — | The model's name for the header chip. |