KQ-697 · LIVENESS/DOTS
Liveness Dots
A liveness check where a dot travels on glide to each of N stops and waits; catching it there — the pointer entering it, a press, or Space and Enter while it holds focus — stamps the stop with a ring that lands on recoil and stays, while a stop left uncaught is marked with a still dashed ring. When the last stop resolves, a clean run draws a closed loop through every stop with pathLength on glide and a tick lands at the centre; any miss ends in a plain count and a Try again.
KQ-697 · LIVENESS/DOTS
Basinworks Exchange0 / 6
Follow the dot with your pointer, or press it as it stops.
Withdrawals over 2,000 BSN need a liveness check.
Idle
Install
One command — the source lands in your repo. Or copy it from the Code tab.
$ pnpm dlx shadcn@latest add @kinetiq/liveness-dots
Props
- positions
- { x: number; y: number }[]
- default —
- Where the dot stops, in order, as 0–100 percentages of the stage; six seeded stops by default.
- windowMs
- number
- default 1600
- How long the dot waits at each stop before moving on.
- status / defaultStatus
- "idle" | "running" | "passed" | "failed"
- default "idle"
- Controlled or initial state of the check; setting running starts a fresh run.
- onStatusChange
- (status) => void
- default —
- Fires from the press or the timer that moved the check.
- onResolve
- (index: number, caught: boolean) => void
- default —
- Fires as each stop is caught or missed.
- label
- ReactNode
- default —
- Visible heading; omit it and pass aria-label.
| Prop | Type | Default | Description |
|---|---|---|---|
| positions | { x: number; y: number }[] | — | Where the dot stops, in order, as 0–100 percentages of the stage; six seeded stops by default. |
| windowMs | number | 1600 | How long the dot waits at each stop before moving on. |
| status / defaultStatus | "idle" | "running" | "passed" | "failed" | "idle" | Controlled or initial state of the check; setting running starts a fresh run. |
| onStatusChange | (status) => void | — | Fires from the press or the timer that moved the check. |
| onResolve | (index: number, caught: boolean) => void | — | Fires as each stop is caught or missed. |
| label | ReactNode | — | Visible heading; omit it and pass aria-label. |