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-photo-manager.screen
Tryst photo slot manager — hero photo + gallery slots + per-photo flags + age-verify chip. Implements surface-tryst.brief.md §3 photos. Reached from tryst-profile-editor.screen.md "Manage photos →" or directly via surfaces-settings.screen.md. Voice: working; plain on rejection.
Layout (full-screen sheet, scrollable)
┌─────────────────────────────────────────────────┐
│ Cancel Photos Save │ 56pt
├─────────────────────────────────────────────────┤
│ │
│ ─── Hero ─── │
│ ┌──────────────┐ │
│ │ [ photo 1 ] │ ✓ public · ✓ face-blurred │ hero slot
│ │ │ expires 2026-11-04 │
│ │ │ [ Replace ] [ Edit flags ] │
│ └──────────────┘ │
│ │
│ ─── Gallery (7 of 12 slots used) ─── │
│ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ gallery thumbnails
│ │ G1 │ │ G2 │ │ G3 │ │ G4 │ │
│ └────┘ └────┘ └────┘ └────┘ │
│ ┌────┐ ┌────┐ ┌────┐ ┌ ⊕ ┐ │
│ │ G5 │ │ G6 │ │ G7 │ │ ⊕ │ ← add │
│ └────┘ └────┘ └────┘ └───┘ │
│ │
│ Drag to reorder · long-press for flags │
│ │
│ ─── Asset library ─── │
│ [ Pick from library → ] │ routes to asset-library
│ [ Upload new ] │
│ │
│ ─── Tryst's photo rules ─── │ surface-specific reminders
│ • Max 12 gallery slots + 1 hero │
│ • Each photo expires 12mo from upload │
│ • Face must be blurred or absent in any photo │
│ of identifying ID │
│ • NSFW photos go in gallery; never hero │
│ │
└─────────────────────────────────────────────────┘
Components
| Component | Notes |
|---|---|
| Hero slot | Single primary photo. Tap to swap; long-press for flag edits. |
| Gallery grid | N slots (Tryst-specific cap of 12); drag-to-reorder; add via "+" tile. |
| Asset library link | Routes to asset-library.screen.md filtered to photos. |
| Upload | Native iOS photo picker; auto-upload to Tryst on Save. |
| Rules reminder | Surface-specific text; surface-tryst §3 documents. |
Per-photo flag sheet (long-press on a slot)
| Flag | Tryst meaning |
|---|---|
| Public | visible on profile (vs only in gallery sub-view) |
| Face-blurred | required for some photos; Cocotte verifies |
| Expires | auto-renew reminder N days before |
| NSFW-allowed | gallery-only; hero forbidden |
States
- Loaded — slots filled from Tryst-fetched state.
- Dirty (edits pending) — Save enabled.
- Photo uploading — slot pulses with spinner.
- Photo upload failed (per brief M) — red slot with retry chip.
- Photo rejected by Tryst (face shown, NSFW in hero, etc.) — red slot with explainer: "Tryst rejected this — face shown. Re-upload blurred."
- Expiring soon (≤14d to expire) — slot pulses amber; chip "expires in 12d."
- Expired — slot red; chip "expired"; surfaces a high-stakes interrupt per brief M §M3a.
- Drag in progress — drop zones highlighted.
- Cap hit (12 gallery + hero full) — add-tile greyed; explainer: "12-slot max."
- VoiceOver — slots announced as "photo 1 hero, photo 2 gallery, …" with flag states.
Interactions
- Tap a slot → preview full-screen.
- Long-press a slot → flag-edit sheet.
- Drag a slot → reorder within gallery; hero is its own slot (can't be reordered into gallery without swap).
- Tap "Replace" → photo picker.
- Tap "Edit flags" → flag sheet.
- Tap "Pick from library →" → asset-library filtered to photos; multi-select supported.
- Tap "Upload new" → iOS photo picker; multi-select for batch upload.
- Swipe-down with dirty → "Discard?" prompt.
Edge cases
- Photo larger than Tryst limit (size or dimensions) — Cocotte client-side downscales; chip notes.
- Photo previously uploaded to Tryst, now removed (Quinn deleted) — chip on the slot showing it's a Cocotte-only reference; needs re-upload to live on Tryst.
- Face-blur required but Cocotte can't detect face — banner: "I can't auto-check this photo. Confirm it's face-blurred?"
- Photo from coop-blocked source (e.g. Quinn uploaded a photo that contains a client face) — banner: "This photo shows another person — confirm consent?"
- Photo expiring during a tour — chip on tour-leg-detail.screen.md surfaces this.
- Multi-photo upload exceeds rate limit — Cocotte queues + uploads at Tryst's cadence; chip "uploading {N} of {M}."
Generalization callout
Per-surface photo managers differ by:
- TS4Rent: similar slot model + Sumsub-attached photo requirements.
- Slixa: fewer slots; no face-blur requirement.
- Eros: per-city photo galleries (location-specific).
- OnlyFans: completely different (videos + image sets per post, not slot-based profile).
This screen pattern (hero + gallery + per-photo flags + library link) is the reusable shape; surface-specific caps + rules + flag taxonomy override.
Related
- surface-tryst.brief.md §3 — parent.
- tryst-profile-editor.screen.md — entry.
- asset-library.screen.md — library link.
- Brief K §K2 — image content rules (e.g. third-party face).
- Brief M §M3a — expired-photo high-stakes interrupt.
- Brief I — every photo edit = audit row.
Out of scope
- Photo editor (cropping, blur, filter) — defer to standalone editor or system tools.
- AI-generated photos for Tryst (defer; brand quality risk).
- Per-photo analytics (which photo gets most clicks — defer).