v3.2 replaces this sheet (PRESCRIPTIVE, CPO 2026-09-30): Transfer opens as a 424 details panel in the right column and the call card is never part of it — comp-transfer-panel. This page stays CANONICAL until that ships.
Opened by Transfer on the call card. Transfer is disabled while a transfer is in progress and on the colleague's card during an Ask first, and hidden during the rep's own Ask first. Only one sheet can be open at a time.
The canon action sheet: 424 wide, centred on the whole window, anchored to the bottom, 16 outer padding, over the --overlay-trans-64 scrim. Under 424 it takes the full width.
ONE body card (gray-07, 1px gray-06, r7, pad 16) and no title card or button card. The card is 392 wide and its content 358 on desktop.
Inside the card, top to bottom, 16 apart: header — title "Transfer call" in --t-title gray-00, left-aligned; close × = the 32 primary icon button with a 12px gray-00 glyph · search · list (max 320, then it scrolls) · actions.
Loaded with 5+ rows and one selected, the card is 490 tall and sits 16 above the bottom.
The call card stays visible and usable above the scrim.
The whole sheet rides up with the soft keyboard. The search autofocuses, so on phones the keyboard opens at once.
No safe-area inset (the iOS home indicator is UNVERIFIED).
The sheet slides up from the bottom (Cupertino modal popup). Timing UNVERIFIED, not drawn.
2 · Search (CANONICAL — mirrors QA 1395973)
focused · empty
not focused · empty
focused · text
Placeholder "Search people" in gray-04. The field autofocuses.
The 12px gray-04 search icon shows only while the field is NOT focused, so it is hidden when the sheet opens.
Fill gray-06, hover gray-05, focus 1px blue-01.
The clear × appears only with text: gray-04, hover gray-00, pressed blue-01.
Max 250 characters, no counter.
Filter: the query is trimmed, then matched case-insensitively as a substring of the full name. No debounce.
3 · Rows and presence (CANONICAL — mirrors QA 1395973)
KSKarla SellersSales ManagerOn shift
DPDevon ParkBDC RepresentativeOn a call
RARita AlvarezFinance ManagerOff shift
MHMarcus HillSales ConsultantOn shift
JWJen WuN/AOn shift
On shiftOn a callOff shift
A row is 56 tall: 8 inset, 8 gap — the standard user-list row, as every other people list in the app (PRESCRIPTIVE, CPO 2026-09-30). QA's _CandidateRow keeps ListItemView's default 8 on top of UserItemScaffold's 8 (72 tall); passing padding: EdgeInsets.zero, as UserInfoItemView does, fixes it.
Rows are white on the gray-07 card, with square corners.
Row states: hover gray-06, pressed gray-05, selected blue-03 (no blue border).
1px gray-06 bottom line, gone on hover and selected.
Avatar: a 32 slot drawn with .sb-avatar.s32 initials.
Production draws every loaded row's avatar with the online dot (isWorking) and the round-robin ring: both come from the /dealers user store, not the telephony directory, and every loaded user carries them, so the photo shrinks to 24 inside the 32 slot (avatar_view.dart:247-248). The DS draws plain initials here; v3.2 hides both.
Name: --t-tiny-bold gray-00, "First Last", falling back to email or phone.
Subtitle: the job title only, or "N/A", in --t-tiny gray-02.
The presence chip sits on the right.
The signed-in user is not listed.
Order: alphabetical by full name, from the dealership user store (dealership_repository.dart:34-44); the sheet does not re-sort. The directory only supplies presence.
One selection at a time, kept across refreshes. On a call and Off shift rows stay selectable.
Presence colours — On shift: green-02 / green-01 · On a call: orange-02 / orange-01 · Off shift: gray-06 / gray-02.
Chip geometry: 24 min height, r7, pad 0 8, --t-tiny. This is the new .sb-chipitem atom (ChipItemView).
No directory entry → Off shift. On a call beats shift status.
While the sheet is open the list refreshes every 10s silently (no shimmer). Chips update in place, and the query and selection survive.
4 · Ask first · Transfer · Voicemail (CANONICAL — mirrors QA 1395973)
On shift selected
On a call selected
Devon is on a call: voicemail only
Off shift selected
Rita is off shift: voicemail only
Nothing selected
Pick a colleague to transfer the call to
The labels are exactly Ask first · Transfer · Voicemail. QA ships "Transfer", not "Transfer now".
Equal widths, 8 apart: (358 − 16)/3 = 114 on desktop, ~97.7 at 375.
Disabled: gray-04 text on the same fill, no opacity.
Padding 0 8 makes each verb 24 tall (derived from code; UNVERIFIED on device). One line each, with an ellipsis.
Hint: --t-paragraph gray-02, left-aligned, 8 above the verbs.
{First} is the colleague's trimmed first name, or "this colleague".
A verb closes the sheet first, then runs. The call card shows what happens next: Ask first → "Calling {name}..." · Transfer or Voicemail → "Transferring to {name}...".
The background of a disabled verb under hover is UNVERIFIED.
5 · States (CANONICAL — mirrors QA 1395973)
loading
Transfer call
Pick a colleague to transfer the call to
nobody
Transfer call
Nobody to transfer to
Pick a colleague to transfer the call to
no match
Transfer call
No one matches “zed”
Pick a colleague to transfer the call to
Loading shows only on the first load: 4 rows, each 64 tall (pad 8, a 48×48 r5 block + a flexible 48-tall r5 block, gray-07).
These skeleton rows don't match the real 56px rows. That is how QA builds them.
QA's shimmer is a 2.5s back-and-forth sweep from gray-07 through white to gray-07. The DS .sb-skeleton sweep differs and is not changed here.
Empty and no-match: plain centred --t-paragraph gray-02 text in the 320 box (derived; UNVERIFIED on device).
A load error shows "We couldn't complete that request" / "We apologize for the inconvenience. Our development team has been made aware of this issue." with TRY AGAIN.
Offline, it shows "No Network Connection" / "Please connect to a wifi or cellular network to access this content."
Error styling is UNVERIFIED and not drawn.
6 · Closing (CANONICAL — mirrors QA 1395973)
The sheet closes on: the × · any verb · a tap on the scrim · Android back · the call ending (#2080).