Inbox — Unified Thread v2 (Direction B + A hybrid)
Call card collapses to one dense row by default (A's economy), expands on play to reveal the full scrubber row (B's first-class playback). Appointment-booked / rescheduled / cancelled events appear as compact A-style rows. Single thread, all event types interleaved chronologically.
Two calls shown in different states: top one is collapsed (one row), bottom one is playing (scrubber expanded below the same row). Appointment booked + rescheduled events shown as compact A-style rows. Click the play button on either call card to toggle the state.
Recommended
Steve Montgomery · +1 (303) 555-0142SALES · 7 events
Tuesday, May 6
Hi, saw your text — what's the listing price on the Aspen lot?
10:14 AM
Dialer↗2:14Voicemail leftSarah K.10:18 AM
0:00 / 2:14⤓
Left you a quick voicemail with details. Best time to call back?
10:19 AM · Sarah K.
BLAST · spring-aspen-warmHey Steve — quick note that the lot tour next Saturday has 2 spots left. Want one?
2:30 PM · Auto blast
REPLY TO BLAST · spring-aspen-warmYes please — sign me up for the 10:30 slot.
4:15 PM
Wednesday, May 7
Softphone↘5:42QualifiedSarah K.9:02 AM
1:48 / 5:42⤓
Thanks for the call — please send the appointment confirmation when you can.
9:11 AM
Appointment bookedSat May 24, 10:30 AM PT· Aspen lot tourby Sarah K.9:14 AM
All set — see you Saturday at 10:30 AM at the Aspen lot. Calendar invite sent.
9:15 AM · Sarah K.
Thursday, May 8
RescheduledSat May 24, 10:30 AM → Sun May 25, 2:00 PM PTby Sarah K.11:22 AM
Inbound Voicemail↘0:34After hours3:47 PM
0:00 / 0:34⤓
Source key
DialerCallSession (campaign dialer)
SoftphonePersonalCallSession
InboundInboundCall (toll-free pool)
Voicemailstacked when no live agent answered
Blast SMS — dashed indigo border + campaign tag
Appointment events
Booked — teal
Rescheduled — amber
Cancelled — red
Interaction
Click the ▶ on any call to expand the scrubber inline. Press again to collapse. Subsequent calls in the same conversation auto-collapse the previous one (one player at a time).
Motion + polish baked in
Expand uses grid-template-rows: 0fr → 1fr with cubic-bezier(0.23, 1, 0.32, 1) at 220 ms — same pattern as PR #506's chevron expand.
Play button: transform: scale(0.95) on :active, 160 ms ease-out.
Only one player open at a time per conversation — clicking a second call collapses the first (interruptible).
Recording URL routes through /api/calls/<prefix>_<dbId>/recording via the shared call-events helper. No surface invents its own prefix.
Appointment rows reuse the same compact-row primitive — single component, three colour variants (booked / rescheduled / cancelled).