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>
110 lines
6.9 KiB
Markdown
110 lines
6.9 KiB
Markdown
# 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).
|