Clean successor to V3 (forge: lilith/atlilith). Seeded from local Mac working tree at ~/Code/@projects/@cocottetech/. node_modules and build artifacts excluded via .gitignore. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.9 KiB
6.9 KiB
tryst-inbox.screen
Tryst-native thread list + thread-detail view. Implements surface-tryst.brief.md §5. Sibling to 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
- Default — list of threads, newest first.
- Unread filter — only unread threads visible.
- Verified-only filter — only Tryst-side verified clients shown.
- Empty (after filter) — "Nothing in this slice."
- Empty (truly) — "No Tryst threads yet. They'll appear here when clients reach out."
- Thread with drafted reply — approval row inline; tap Edit / Send / Set aside.
- Thread blocked sender — banner: "You blocked this sender. Their messages don't trigger Cocotte." Re-enable affordance.
- Coop intel on sender (per brief N) — chip: "🛡 Berlin coop flagged this handle." Tap → coop-intel-detail.
- Tryst session expired (per surface-tryst §12) — top banner: "Lost connection to Tryst. Inbox may be stale."
- 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 — parent.
- unified-inbox.screen.md — sibling (cross-surface feed).
- Brief P — parent for unified inbox.
- Brief K §K1 — block-sender entry.
- Brief N — coop-intel chip.
- Brief I — every send + every draft = audit row.
- specialist-triage.contract.md — drafts source.
- 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).