1 · The header becomes the keypad (PRESCRIPTIVE — call card v3.2, CPO 2026-09-30)
Closed · the key trails the header
Shane Dusang02:41
Connected
Open by pointer · the pad hangs under the card
Shane Dusang02:41
Connected
Type digits, * or #
Shane Dusang · 02:41
2 · The Keypad key · .c3-hkey · every call state (PRESCRIPTIVE — call card v3.2, CPO 2026-09-30)
Rest
Hover · gray-00 8%
Pressed · gray-00 16%
Open · blue-02 / blue-01
Focus-visible
Focus + pressed
Can't act · .4
S1 · Incoming · dimmed
Shane Dusang
Incoming Call
Tooltip “Keypad available when connected”. Answering only recolours the header and swaps the bar; the name column doesn't change.
S2 · Calling · dimmed
Shane Dusang
Calling...
No timer yet, so line 2 starts at the left edge. Reconnecting and ending look the same.
S4 · Connected v2 · live
Shane Dusang02:41
Connected
Live when canUseKeypad. Also S3 legacy/v1 and the 409 card (SDK DTMF works there), S5 muted, S6 speaker, S13 returned.
S7 · On hold · dimmed
Shane Dusang02:41
On hold
Tooltip “Resume the call to use the keypad”. If the keypad was already open, it stays open and dims in place (KP11).
S10 · Transferring · dimmed
Shane Dusang03:12
Transferring to Karla Sellers...
Also S8/S9 Ask first, S12 the colleague's side, 3+ people and v2 unsafe: “Keypad unavailable for this call right now”.
v3.1 stateKeypad keyTooltip when dimmed
S1 Incoming (desktop and mobile web; native mobile hides the card)dimmedKeypad available when connected
S2 Calling · reconnecting · endingdimmedKeypad available when connected
Probe window (≤ 3 s after connect)dimmedChecking keypad availability…
S3 legacy/v1 and the 409 card (Hold and Transfer dimmed)live (SDK DTMF works)—
S4 v2 · S5 muted · S6 speaker · S13 returnedlive when canUseKeypad—
S7 On hold (keypad closed)dimmedResume the call to use the keypad
S8/S9 Ask first · S10 transferring · S12 colleague's side · 3+ people · v2 unsafedimmedKeypad unavailable for this call right now
3 · KP2 · The entry line · opened by pointer and by keyboard (PRESCRIPTIVE — call card v3.2, CPO 2026-09-30)
KP2 · Opened by pointer · pad shown · light
Shane Dusang02:41
Connected
Type digits, * or #
Shane Dusang · 02:41
The name fades out (100 ms), then the entry line fades in (100 ms); nothing moves. Caret + “Type digits, * or #”; line B shows the name and timer.
KP2 · Opened by keyboard · no pad · light
Shane Dusang02:41
Connected
Type digits, * or #
Shane Dusang · 02:41
Enter or Space on the key opens the keypad without the pad; a click on the entry line shows it.
KP2 · Pointer · dark
Shane Dusang02:41
Connected
Type digits, * or #
Shane Dusang · 02:41
KP2 · Keyboard · dark
Shane Dusang02:41
Connected
Type digits, * or #
Shane Dusang · 02:41
Digits #DEE6F2 on #202D31 · pad #272727, keys #383838 · lit key #68666A with a #BCC4D0 inset.
Sent
5
Sending
5
Queued
5
Not sent
5
Unconfirmed
5
Digit stateMeaningLook
Sent .is-sentv1: the SDK accepted it · v2: own sequence completed and availablegray-00
Sending .is-sendingIn flight, shown after 150 msgray-00 + a 2px gray-00 underline at y 36–38, glyph width − 2, pulsing opacity 1 → .4 → 1 over 1 s (steady with reduced motion)
Queued .is-queuedWaiting more than 150 msgray-00 at opacity .4 (opacity, because dark gray-02/03/04 are all near-white)
Not sent .is-notsentCleared by a failure, hold or reconnectopacity .4 + a 1px gray-00 strike at y ≈ 25
Unconfirmed .is-unconfirmedv2 unknown: Twilio was called, delivery not confirmedgray-00 + a 2px dotted gray-02 underline (2 on / 2 off), no pulse
4 · KP5 typing on v2 · a lit pad key (PRESCRIPTIVE — call card v3.2, CPO 2026-09-30)
KP5 · “140” sent · “2” sending · “887” queued · light
Shane Dusang02:41
Connected
1402887
Sending · 3 waiting
Hold and Transfer dim in the bar while v2 digits send (the existing isBusy); their tooltips read “Available when digits finish sending”.
KP5 · Dark
Shane Dusang02:41
Connected
1402887
Sending · 3 waiting
Pad key lit · “5” just pressed (v1)
Shane Dusang02:41
Connected
0125
Shane Dusang · 02:41
A click, or the matching physical key, lights the pad key: gray-05 + inset 2px gray-03, held while down (≥ 120 ms), then an 80 ms fade.
#Line B · first match winsCopy
1On hold (the keypad stays open and dimmed)“On hold · {n} digits not sent” if digits were dropped, else “Resume the call to use the keypad”
2Reconnecting“Keypad available when connected”
3Stopped (failed or canceled), until the next press or close“Stopped · {n} not sent” in --t-tiny-bold gray-00
4Unconfirmed, same lifetime“Last digit may not have played” in --t-tiny-bold gray-00
5Probe re-running / v2 briefly unsafe ≥ 600 ms“Checking the keypad…” / “Keypad paused · checking the call”
6Hint (2.5 s)“Only 0–9, * and # are sent” · “Enter isn't sent · press # if asked” · “Sent digits can't be taken back” · “Pasted {n} digits” · “Paste has letters · nothing sent” · “Paste up to 32 digits” · “32 waiting · let these send first” · “Not sent · try again”
7Desktop, not armed, with digits“Click to keep typing”
8Sending (v2 only; in flight ≥ 400 ms, or digits queued)“Sending…” / “Sending · {n} waiting”
9Otherwise“{Name} · {mm:ss}”
5 · KP6 · KP9 · KP10 · KP11 · KP12 · KP15 (PRESCRIPTIVE — call card v3.2, CPO 2026-09-30)
KP6 · Not armed, with digits
Shane Dusang02:41
Connected
0012
Click to keep typing
A pointer-down outside the card and pad removes focus: capture pauses, the caret goes, queued digits keep sending. A click on the entry line or a pad key re-arms it.
KP9 · Stopped (failure)
Shane Dusang02:41
Connected
1402887
Stopped · 4 not sent
Queued digits become Not sent. No toast while open. The next press starts a new run.
KP10 · Unconfirmed (v2 unknown)
Shane Dusang02:41
Connected
1402887
Last digit may not have played
That digit Unconfirmed, the rest Not sent. Announced assertively.
KP11 · On hold while open
Shane Dusang02:41
On hold
1402887
On hold · 4 digits not sent
Dims in place: line A and pad at .4 (line B keeps its reason at full strength); the queue is cleared and shown as Not sent; card WAITING orange. Resume re-enables it; the keypad stays open.
KP12 · Overflow
Shane Dusang02:41
Connected
001234567890123456
Shane Dusang · 02:41
Right-anchored: the newest digit and the caret at the right edge; older digits fade under a 16px left fade from --c3-hd.
KP15 · Closed with v2 digits pending
Shane Dusang02:41
Sending digits · 3 left
Header back to the name. Line 2 “Sending digits · {n} left”; Hold and Transfer stay dimmed until the queue drains. A failure now fires the existing toast “Keypad input stopped. Check the call before trying again.”
#StateDesktopMobile
KP0Closed, availableKey neutralSame
KP1UnavailableKey dimmed; tooltip gives the reasonSame (long-press)
KP2Open, empty, armedCaret + “Type digits, * or #”; pad only if opened by pointerCaret + “Tap digits below”; dock up
KP3Open, empty, not armed“Click to type digits”n/a
KP4Typing, v1Digits show as sent (queued only faster than 4 a second)Same
KP5Typing, v2Sent / sending / queued; “Sending · 3 waiting”; Hold and Transfer dimmedSame
KP6Not armed, with digitsNo caret; “Click to keep typing”; sending continuesn/a
KP7Checking (probe re-runs)“Checking the keypad…”; pad at .4; presses refusedDock at .4
KP8Briefly unsafe, v2Under 600 ms: no dimming, presses refused with “Not sent · try again”. 600 ms or more: line A and pad at .4 (line B keeps its reason at full strength), “Keypad paused · checking the call”Same
KP9Stopped (failure)Queued → Not sent; “Stopped · {n} not sent”; no toast while openSame
KP10UnconfirmedThat digit Unconfirmed, the rest Not sent; “Last digit may not have played”Same
KP11On hold while openDims in place; queue cleared as Not sent; line B per #1Dock keys at .4
KP12OverflowRight-anchored with the left fadeSame
KP13Queue cap (32 pending)Further presses refused; hintSame
KP14HintLine B for 2.5 sSame
KP15Closed, v2 digits pendingLine 2 “Sending digits · {n} left”; Hold and Transfer dimmed until drainedSame
KP16Idle 2 minThe echo clears (the keypad stays open)Same
6 · The desktop pad · .c3-pad · placement (PRESCRIPTIVE — call card v3.2, CPO 2026-09-30)
Below (default) · 1440 × 900 · card at x 1048, y 98 → pad y 234–454
Shane Dusang02:41
Connected
14
Shane Dusang · 02:41
Flipped above · card at y 720 → pad y 492–712
Shane Dusang02:41
Connected
14
Shane Dusang · 02:41
To the left · 1440 × 600 · card at y 236 → pad x 848–1040, y 144–364
Shane Dusang02:41
Connected
14
Shane Dusang · 02:41
7 · Desktop input · arming · paste (PRESCRIPTIVE — call card v3.2, CPO 2026-09-30)
Input (armed)Result
A key-down whose character is 0–9, * or # (numpad too; Shift+3 and Shift+8 on any layout)Queued and sent; the matching pad key lights
Key repeatIgnored: one physical press is one digit
BackspaceRemoves the last queued (unsent) digit. Nothing queued: hint “Sent digits can't be taken back”
EscDigits queued: clears them (Not sent, “Stopped · {n} not sent”). Nothing queued: closes the keypad
Enter (entry line focused)Swallowed, with the Enter hint. On a focused card key it activates that key
SpaceSwallowed on the entry line; activates a focused card key
Letters and other charactersSwallowed, with the letters hint (at most once per 2.5 s)
Cmd/Ctrl+VPaste
Other Cmd/Ctrl/Alt chordsPassed through to the app
Tabentry line → Keypad key → Mute → Hold → Transfer → End; capture stays live inside the card
8 · Mobile · the dial-pad dock · .c3-dock (PRESCRIPTIVE — call card v3.2, CPO 2026-09-30)
KP2 · 390 × 844 · dock + Paste · light
Shane Dusang02:41
Connected
Tap digits below
Shane Dusang · 02:41
The centred card (y 358–486) doesn't move: its bottom is above dock top − 16 (530).
KP2 · Dark
Shane Dusang02:41
Connected
Tap digits below
Shane Dusang · 02:41
KP5 · typing on v2
Shane Dusang02:41
Connected
1402887
Sending · 3 waiting
Same as desktop: Hold and Transfer dim in the bar while v2 digits send.
375 × 667 · the card nudges up
Shane Dusang02:41
Connected
Tap digits below
Shane Dusang · 02:41
Dock top 403; the card moves from y 269 to 259–387 (dock top − 16 − 128), in step with the dock. Never saved; it returns on close.
320 × 568
Shane Dusang02:41
Connected
Tap digits below
Shane Dusang · 02:41
Card 288; name column 148; keys 91 wide. No Paste when the clipboard has no text.
9 · Engineering handoff (PRESCRIPTIVE — call card v3.2, CPO 2026-09-30)