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>
7.5 KiB
7.5 KiB
tryst-home-cities.screen
Tryst home-cities management — view + change Quinn's home cities, with cadence-gated change cooldown. Implements surface-tryst.brief.md §7. Replaces the earlier (incorrect) tryst-location-lock.screen.md, which mis-modeled Tryst as a fee-gated monthly lock; the real model is cadence-gated, N cities per tier, Y days between changes. Voice: working; plain on cooldown / tier-limit constraints.
Layout (full-screen sheet)
┌─────────────────────────────────────────────────┐
│ Cancel Tryst home cities Save │ 56pt
├─────────────────────────────────────────────────┤
│ │
│ ─── Your tier ─── │
│ TLC Premium · N home cities · change every Y d │ live tier info
│ Tier supports: 3 home cities · 14-day cadence │ parametric — Quinn confirms │
│ │
│ ─── Current home cities ─── │
│ ┌─────────────────────────────────────────────┐│
│ │ San Francisco · primary · since 2026-04-12 ││ card per city
│ │ [ Drop ] (after cooldown) ││
│ └─────────────────────────────────────────────┘│
│ ┌─────────────────────────────────────────────┐│
│ │ Berkeley · secondary · since 2026-04-12 ││
│ │ [ Drop ] (after cooldown) ││
│ └─────────────────────────────────────────────┘│
│ ⊕ Add a city (1 slot remaining) │ slot count
│ │
│ ─── Change cooldown ─── │
│ Next change available: 7 days (2026-05-25) │ countdown
│ ⓘ Tryst lets you change home cities every │
│ Y days. Cooldown applies to all slots. │
│ │
│ ─── Tours ─── │
│ Active tours don't count against home cities. │
│ • Berlin (Oct 3–7) — declared, doesn't consume │
│ a home-city slot │
│ [ Manage tours → ] │
│ │
└─────────────────────────────────────────────────┘
Components
| Component | Notes |
|---|---|
| Top bar | Cancel + Save (Save disabled until any pending change is valid + within cadence). |
| Tier info | Live tier (basic / TLC / etc.) + the N + Y numbers for that tier. Pulled from Tryst on connect; cached. |
| Home-city card | One per current city: name + role (primary/secondary/…) + since-date + Drop affordance (gated by cooldown). |
| Add-a-city slot | When slots remain, this row appears as the affordance. Opens city picker. |
| Cooldown countdown | Live timer + next-available date. Affects all home-city changes (not per-slot). |
| Tours subsection | Read-only summary that tours are exception-layer; links to tour management. |
States
- At slot count, no change pending — full layout; no Save needed.
- Slot available, no change pending — Add-a-city affordance prominent.
- Change pending, within cooldown — Save disabled; banner: "Cooldown ends in N days. Save & schedule for then?" + opt-in scheduled-change affordance.
- Change pending, cooldown elapsed — Save enabled.
- Saving — banner: "Updating Tryst..."
- Saved — sheet dismisses; receipt: "Home cities updated: SF + Berkeley → SF + Berkeley + Oakland."
- Save failed (Tryst-side) — banner with retry per brief M.
- Tier upgrade detected mid-flow (rare; Quinn upgraded between sheet open + save) — banner: "Your tier now supports {new-N} cities. Refresh." Adjusts slot count.
- Tour conflict (Quinn adds a home city for a date her tour is in that same city) — soft warning: "You're touring {city} that week. The tour declaration already makes you visible there. Use a different home-city slot?"
- Cooldown reset detected (Tryst's policy changed, e.g. promo) — banner: "Tryst opened up changes early. Cooldown waived." Save enabled.
- VoiceOver — tier info first; each city card announces role + since-date + drop-availability.
Interactions
- Tap city card → opens city detail (rare — defer).
- Tap "Drop" → confirms (medium-stakes); if cooldown elapsed, removes the city; if within cooldown, surfaces banner.
- Tap "Add a city" → city picker (autocomplete from Tryst's city list); placeholder if no city matches.
- Tap "Manage tours →" → tour-leg-detail.screen.md.
- Tap Save → commits any pending diffs; writes audit row per brief I.
- Swipe-down with dirty → "Discard pending changes?"
Edge cases
- Tier info not fetched yet (Quinn just connected) — placeholder copy "Loading your tier..." with skeleton.
- Slot count = 0 (basic tier?) — UX collapses to "single home city only at your tier; upgrade to add more."
- Cooldown crossing daylight-savings / TZ boundary — uses Tryst's server time, not Quinn's local; display in both formats.
- Trying to drop the only home city — Save blocked: "Tryst requires at least 1 home city."
- City not in Tryst's autocomplete list — placeholder fallback ("Tryst doesn't have this city. Try a nearby one?").
- Tour declared in a city Quinn already has as home — chip: "{city} is already a home city; tour declaration is redundant but harmless. Skip declaring?"
- Cooldown reset to zero from Tryst-side admin action — banner shows the reset event.
Generalization callout
Home-city / location-lock models vary widely across escort directories:
- TS4Rent: documented in surface-ts4rent (TBD). Different model.
- Slixa: documented in surface-slixa (TBD). Different model.
- Eros: per-city listings (Quinn can list in N cities with separate ads each, no unified "home"). Different model.
- Most content surfaces (OF, X, IG, …): no city model — global presence.
Per-surface brief must flag the exact mechanic. Do NOT reuse Tryst's screen layout assuming the model carries over.
Related
- surface-tryst.brief.md §7 — parent (corrected 2026-05-18).
- tryst-profile-editor.screen.md — sibling profile-level editing.
- tour-leg-detail.screen.md — tour-as-exception layer.
- Brief I — every home-city change = audit row.
- Brief M — save-failure pattern.
Out of scope
- The exact N + Y per Tryst tier — Quinn confirms once apricot is reachable + we've connected.
- Multi-account home-city management (single-account at P0).
- Predictive home-city suggestions based on tour patterns (defer; P3+).