KQ-630 · MARKET/CLOCK
Market Clock
A twenty-four hour face that draws a venue's sessions as arcs where they actually sit. The hand sweeps from a minute the host supplies, its rotation accumulated across midnight so it never unwinds a full turn, on a linear tween matched to the step. The arc between the hand and the next change shrinks as the hand eats it and breathes on drift once the change is close; the state pill snaps between Open and Closed, and each legend row is a button that pins the countdown to its session, with Escape to unpin.
KQ-630 · MARKET/CLOCK
Basinworks Exchange
Venue timeCloses in 16m
12:14 · next 12:30
Basinworks Exchange open
Basinworks · 12:14 · open
Install
One command — the source lands in your repo. Or copy it from the Code tab.
$ pnpm dlx shadcn@latest add @kinetiq/market-clock
Props
- minute
- number
- default —
- Minutes since midnight, possibly fractional. The host owns the clock, so the face stays deterministic on the server.
- sessions
- MarketSession[]
- default 09:00–12:30, 13:30–16:30
- Open stretches as { label, from, to } in minutes; everything outside them is closed.
- label
- string
- default "Market"
- Venue name; the group's accessible name.
- zone
- string
- default —
- Small caption under the venue name.
- soonMinutes
- number
- default 30
- How close the next change must be before the arc ahead breathes.
- selected / defaultSelected
- string | null
- default null
- Controlled or initial pinned session label.
- onSelectedChange
- (label: string | null) => void
- default —
- Fires from the press or key that pinned or cleared a session.
- onStateChange
- (open: boolean) => void
- default —
- Fires from the effect that observed the flip, once per flip.
- formatTime
- (minute: number) => string
- default 24h HH:MM
- Formats every time on the face and in the legend.
| Prop | Type | Default | Description |
|---|---|---|---|
| minute | number | — | Minutes since midnight, possibly fractional. The host owns the clock, so the face stays deterministic on the server. |
| sessions | MarketSession[] | 09:00–12:30, 13:30–16:30 | Open stretches as { label, from, to } in minutes; everything outside them is closed. |
| label | string | "Market" | Venue name; the group's accessible name. |
| zone | string | — | Small caption under the venue name. |
| soonMinutes | number | 30 | How close the next change must be before the arc ahead breathes. |
| selected / defaultSelected | string | null | null | Controlled or initial pinned session label. |
| onSelectedChange | (label: string | null) => void | — | Fires from the press or key that pinned or cleared a session. |
| onStateChange | (open: boolean) => void | — | Fires from the effect that observed the flip, once per flip. |
| formatTime | (minute: number) => string | 24h HH:MM | Formats every time on the face and in the legend. |