cocottetech/@platform/codebase/@features/ai-copilot/docs/tryst-photo-manager.screen.md
natalie 1b719e1fd7 chore(bootstrap): initial V4 commit
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>
2026-05-18 08:11:41 -07:00

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

  1. Loaded — slots filled from Tryst-fetched state.
  2. Dirty (edits pending) — Save enabled.
  3. Photo uploading — slot pulses with spinner.
  4. Photo upload failed (per brief M) — red slot with retry chip.
  5. Photo rejected by Tryst (face shown, NSFW in hero, etc.) — red slot with explainer: "Tryst rejected this — face shown. Re-upload blurred."
  6. Expiring soon (≤14d to expire) — slot pulses amber; chip "expires in 12d."
  7. Expired — slot red; chip "expired"; surfaces a high-stakes interrupt per brief M §M3a.
  8. Drag in progress — drop zones highlighted.
  9. Cap hit (12 gallery + hero full) — add-tile greyed; explainer: "12-slot max."
  10. 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.

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).