KQ-1766 · CALLBACK/QUEUE
Callback Queue
A live support queue with your place, an honest wait (a likely figure and a range from the line, the average chat and the agents on shift) and the agents on shift. When the queue moves, the person at the front goes into the desk on the exit ease, everyone behind glides one place forward on springs.glide, and your place and the estimate roll down digit by digit, the estimate a beat later. Call me back opens a picker — a number and a radiogroup of times — and booking turns your token into a time chip in its place, one element whose layout glides from circle to pill; your turn, leaving, closed hours and a full queue each say what happens next.
Live chat queue
You're 4th in line, 3 people ahead. About 6 minutes, usually 4 to 8.
Estimated from 3 agents averaging 4.5 min a chat. It updates as the line moves.
3 on shift, all on chats, 1 on a break
4th in line · coldbrook live chat
Install
One command — the source lands in your repo. Or copy it from the Code tab.
$ pnpm dlx shadcn@latest add @kinetiq/callback-queue
Props
- tokenStyle
- "dots" | "tickets" | "lane"
- default "dots"
- How the line is drawn: circles to the desk, numbered ticket stubs, or a lane you ride along.
- density
- "compact" | "cozy" | "roomy"
- default "cozy"
- Token size, type and gaps.
- accent
- "cobalt" | "jade" | "amber" | "mono"
- default "cobalt"
- Your token, the estimate and the primary button.
- queue
- QueueSnapshot
- default defaultQueue
- position (1 is next, 0 your turn), waiting, capacity, avgHandleSeconds, ticket and joinedAt. A lower position moves you forward.
- agents
- QueueAgent[]
- default defaultQueueAgents
- Who is on shift and whether each is free, on a chat or on a break.
- now
- number
- default defaultQueueNow
- The moment times count from, ms. Never read from the clock.
- status
- "open" | "closed" | "full" | "loading"
- default "open"
- Open, closed for the day, full, or loading.
- hours
- { open: number; close: number }
- default { open: 480, close: 1200 }
- Opening hours in minutes after midnight (UTC); they set the closed message and the callback times.
- callbackSlots
- CallbackSlot[]
- default the next three half hours, or tomorrow morning when closed
- The times offered for a callback; at null means as soon as an agent is free.
- defaultPhone
- string
- default "07700 900418"
- The number a callback goes to until it's changed.
- company
- string
- default "Coldbrook"
- Whose queue this is.
- onRequestCallback
- ({ phone, slot }) => void | Promise
- default —
- A callback was booked. A promise holds the button; a rejection keeps the picker open with a message.
- onCancelCallback
- () => void
- default —
- A booked callback was cancelled; you're back in the line.
- onLeave
- () => void
- default —
- Leave queue was pressed.
- onRejoin
- () => void
- default —
- Rejoin was pressed after leaving.
- onJoinChat
- () => void
- default —
- Join chat was pressed when it was your turn.
- maxTokens
- number
- default 5
- The most people drawn ahead of you; the rest fold into a count.
- disabled
- boolean
- default false
- Nothing can be booked, left or joined.
- className
- string
- default —
- Classes for the outer surface.
| Prop | Type | Default | Description |
|---|---|---|---|
| tokenStyle | "dots" | "tickets" | "lane" | "dots" | How the line is drawn: circles to the desk, numbered ticket stubs, or a lane you ride along. |
| density | "compact" | "cozy" | "roomy" | "cozy" | Token size, type and gaps. |
| accent | "cobalt" | "jade" | "amber" | "mono" | "cobalt" | Your token, the estimate and the primary button. |
| queue | QueueSnapshot | defaultQueue | position (1 is next, 0 your turn), waiting, capacity, avgHandleSeconds, ticket and joinedAt. A lower position moves you forward. |
| agents | QueueAgent[] | defaultQueueAgents | Who is on shift and whether each is free, on a chat or on a break. |
| now | number | defaultQueueNow | The moment times count from, ms. Never read from the clock. |
| status | "open" | "closed" | "full" | "loading" | "open" | Open, closed for the day, full, or loading. |
| hours | { open: number; close: number } | { open: 480, close: 1200 } | Opening hours in minutes after midnight (UTC); they set the closed message and the callback times. |
| callbackSlots | CallbackSlot[] | the next three half hours, or tomorrow morning when closed | The times offered for a callback; at null means as soon as an agent is free. |
| defaultPhone | string | "07700 900418" | The number a callback goes to until it's changed. |
| company | string | "Coldbrook" | Whose queue this is. |
| onRequestCallback | ({ phone, slot }) => void | Promise | — | A callback was booked. A promise holds the button; a rejection keeps the picker open with a message. |
| onCancelCallback | () => void | — | A booked callback was cancelled; you're back in the line. |
| onLeave | () => void | — | Leave queue was pressed. |
| onRejoin | () => void | — | Rejoin was pressed after leaving. |
| onJoinChat | () => void | — | Join chat was pressed when it was your turn. |
| maxTokens | number | 5 | The most people drawn ahead of you; the rest fold into a count. |
| disabled | boolean | false | Nothing can be booked, left or joined. |
| className | string | — | Classes for the outer surface. |