1 · One call, two homes — the lifecycleThe composer starts a call; the pill carries it. While you are on the conversation the live call lives in the composer's Call channel exactly as drawn (section 4 of comp-inbox-composer-states.html, which owns the composer-side spec). Navigate away and that live body condenses into the Call Pill and flies to its saved position (~220ms; the waveform never stops — under reduced-motion it fades instead). Come back to the conversation and it docks into the composer again. Outbound calls are born docked in the composer; inbound are born floating on desktop, and on mobile the native OS call UI owns ringing. The pill never places a call — it only carries one. Ending a call, in either home, simply ends it: the phone system posts the call and its recording to the activity timeline automatically, so there is no wrap-up step. Log stays the manual backup for calls that happened off the system ("someone called my personal line").
2 · The Call Pill — desktop states
Live
Shane Dusang02:41
Dialing
Shane DusangCalling…
Reconnecting
Shane DusangReconnecting…
Incoming (desktop only)
Marisol VegaIncoming Call
The pill is 327×72 — the shipped footprint — reusing the composer's call atoms verbatim (.cp-wave bars, .cp-tool, .cp-call-end). It free-drags, clamped to the viewport, and its position persists across sessions (the shipped phone-call-card-position preference carries over); it floats above every screen and defaults to bottom-right on desktop. The customer name is a tap target that deep-links to the conversation. Dialing breathes the bars in unison — signaling breathes, connected ripples. Reconnecting freezes them gray and mutes the state text. Incoming frames in orange, drops the waveform, and pairs a green accept with the red end.
3 · Mobile — the floating pill
Shane Dusang02:41
Mobile keeps the free-floating draggable pill at its full 327 width — drag it anywhere, clamped to the screen. Incoming never renders in-app on mobile: the native OS call UI owns ringing, and the pill appears once the call connects. Speaker is a mobile-only .cp-tool (the engine's speakerphone toggle does not exist on desktop), so it joins the actions here.
4 · Desktop audio devices
Shane Dusang02:41
Desktop has no speakerphone toggle — the engine's speaker is mobile-only — so the second tool becomes a device picker (fa-headphones) opening the standard popover: input devices, a divider, output devices, each with a .ck check on the active one. Like a Meet call. Mobile keeps the simple speaker toggle instead.
5 · Busy — one call at a time
Compose a message or use a Template
The engine cannot hold two calls, so while any call is live every place-call affordance app-wide disables with the tooltip "On a call with <name>" — documented once here as a global rule rather than redrawn on every surface. Opt-out disable and busy disable share the same visual grammar and differ only in their tooltip.