# tryst-inbox.screen Tryst-native thread list + thread-detail view. Implements [surface-tryst.brief.md §5](./surface-tryst.brief.md). Sibling to [unified-inbox.screen.md](./unified-inbox.screen.md); Tryst-specific because of metadata (verified-only filter, listing-rank of sender, city). Voice: working. ## Layout (split: thread list + thread detail; iPad/web side-by-side, iPhone stack) ### Thread list (iPhone primary) ``` ┌─────────────────────────────────────────────────┐ │ ◄ Inboxes 🔍 ⚙ filters │ 56pt ├─────────────────────────────────────────────────┤ │ Tryst · 12 unread · 47 threads total │ header │ [ All ] [ Unread ] [ Verified-only ] │ state filters │ [ City: any ▾ ] [ Rank: any ▾ ] │ Tryst-specific filters ├─────────────────────────────────────────────────┤ │ │ │ ✓ @felix · SF · rank #18 · 14:02 │ thread row │ "thinking about Berlin..." │ │ ✓ @marko · Berlin · ✓ verified · 11:08 │ │ "Hi! Are you available next week?" │ │ • @anon · LA · 06:55 │ not-verified │ "rates?" │ │ … │ │ │ └─────────────────────────────────────────────────┘ ``` ### Thread detail (iPhone push view) ``` ┌─────────────────────────────────────────────────┐ │ ◄ Tryst ⋯ menu │ 56pt ├─────────────────────────────────────────────────┤ │ @felix · San Francisco · rank #18 │ prospect header │ [ ✓ verified · since 2024 ] │ │ │ │ ─── thread ─── │ │ felix: thinking about Berlin │ inbound │ cocotte (draft): "Berlin Oct 3-7 — let me…" │ drafted reply │ [ Edit ] [ Send ] [ Set aside ] │ approval row │ │ │ felix: about the rates │ earlier in thread │ you: thanks for asking, rates are on profile │ │ │ └─────────────────────────────────────────────────┘ ``` ## Components | Component | Notes | |---|---| | List header | Tryst inbox name + counts. | | State filters | All / Unread / Verified-only (Tryst-specific: filter by Tryst-side verified clients). | | Tryst-specific filters | City (sender's listed city) + Rank (sender's listing rank — gives Quinn signal that this client is also a Tryst-active member of the audience). | | Thread row | Read state · handle · city · rank · time · 1-line excerpt. | | Thread detail header | Prospect handle, city, Tryst-listing rank, verified-since chip. | | Thread | Native iOS message bubbles (inbound left, outbound right). Drafted replies appear inline with the approval row. | ## States 1. **Default** — list of threads, newest first. 2. **Unread filter** — only unread threads visible. 3. **Verified-only filter** — only Tryst-side verified clients shown. 4. **Empty (after filter)** — "Nothing in this slice." 5. **Empty (truly)** — "No Tryst threads yet. They'll appear here when clients reach out." 6. **Thread with drafted reply** — approval row inline; tap Edit / Send / Set aside. 7. **Thread blocked sender** — banner: "You blocked this sender. Their messages don't trigger Cocotte." Re-enable affordance. 8. **Coop intel on sender** (per [brief N](./N-provider-coop.brief.md)) — chip: "🛡 Berlin coop flagged this handle." Tap → coop-intel-detail. 9. **Tryst session expired** (per surface-tryst §12) — top banner: "Lost connection to Tryst. Inbox may be stale." 10. **Reduced motion / Dynamic Type XXL** — list wraps; filters stack. ## Interactions - **Tap thread row** → thread detail (push). - **Long-press thread row** → "Mark read / Block sender / Mute thread / Counter-action." - **Tap "Edit"** on a drafted reply → compose sheet with the draft pre-filled. - **Tap "Send"** → high-stakes confirmation (per brief M §M3) since outbound to Tryst is hard to retract. - **Tap "Set aside"** → moves to pending-approvals; thread stays in inbox. - **Pull-to-refresh** → re-pull from tryst.link. - **Tap city / rank filter** → cycle. ## Edge cases - **Multi-thread prospect** (same Tryst handle, multiple threads opened over time) — collapses into a single row with chip "+N threads"; tap expands. - **Tryst attachment in thread** (photo from client) — inline thumbnail; tap → full-screen viewer with download. - **Read receipt synced (Tryst marks thread read on Quinn's open)** — chip "marked read on Tryst at {time}." - **Tryst-side block** — when Quinn enables Tryst-side block (per surface-tryst §10), thread becomes hidden from this inbox; chip in audit. - **Reply drafted by triage but sender on K1 blocklist** — shouldn't happen (triage prevents this); if surfaced, error banner: "This sender is blocklisted — draft suppressed." ## *Generalization callout* Per-surface inbox screens (`ts4rent-inbox.screen.md`, `slixa-inbox.screen.md`, `onlyfans-inbox.screen.md`) follow this layout pattern but with surface-specific filters + metadata. unified-inbox.screen.md is the parent feed; per-surface inboxes are the deep-dive views. ## Related - [surface-tryst.brief.md §5](./surface-tryst.brief.md) — parent. - [unified-inbox.screen.md](./unified-inbox.screen.md) — sibling (cross-surface feed). - [Brief P](./P-inboxes.brief.md) — parent for unified inbox. - [Brief K §K1](./K-safety-blocklist.brief.md) — block-sender entry. - [Brief N](./N-provider-coop.brief.md) — coop-intel chip. - [Brief I](./I-audit-trust-replay.brief.md) — every send + every draft = audit row. - [specialist-triage.contract.md](./specialist-triage.contract.md) — drafts source. - [prospect-detail.screen.md](./prospect-detail.screen.md) — long-press route. ## Out of scope - Composing a new outbound thread (Tryst doesn't support unsolicited outbound). - Per-thread analytics (defer). - Multi-attachment compose (single-photo at P0).