my-sea spectator Phase B: seat-2C occupancy + visitor token gate + one-shot seated glow + gear BYE — TDD
Phase B of the my-sea invite → spectator → voice blueprint. An ACCEPTED invitee can watch the owner's my-sea read-only, deposit a token to occupy seat 2C (opening a 24h voice window for Phase C), and BYE out. Owner's my_sea.html is left structurally intact — the spectator gets a dedicated, simpler my_sea_visit.html; the read-only draw reuses the existing `latest_draw_slots` payload (no picker surgery). - B1: my_sea_visit(owner_id) spectator view — 403 unless an ACCEPTED SeaInvite(owner, request.user); owner bounced to their own my_sea. Context forces owner-only controls off (sea_btn_active=False, read_only=True); renders the table hex (1C owner / 2C visitor) + owner draw read-only. - B2: visitor gate — my_sea_visit_gate reuses my_sea_gate.html w. a spectator branch (titles the OWNER's Sea, INSERT posts to the visitor endpoint, bud-panel suppressed, gear NVM→visit + BYE). Single-step my_sea_visit_insert_token selects+debits the visitor's token (same priority chain) and records token_deposited_at + a 24h voice_until on the SeaInvite → seat 2C present. Center btn flips GATE VIEW → VIEW DRAW. - B3: spectator gear BYE — my_sea_visit_leave sets status=LEFT, left_at, clears voice_until (frees 2C, ends voice), redirects /gameboard/. _my_sea_gear.html gains a `leave_url`-gated BYE below NVM (owner pages pass no leave_url, so unchanged). - B-seat: one-shot "seated" glow per user-spec 2026-05-27 — new shared apps/gameboard/my-sea-seats.js: on first view (localStorage-gated by a per-occupancy data-seat-token) an occupied seat flares --terUser + --ninUser glow ~1.5s then settles to full-opacity --secUser (.fa-ban already swapped to .fa-circle-check). _room.scss adds .seated / .seat-just-seated + the my-sea-seat-flare keyframes (mirrors the room's .active→.role-confirmed handoff). Wired on BOTH the spectator page (load) and the owner page (load + on the FREE DRAW seat-1 transition). MySeaSeatsSpec.js Jasmine spec covers the gating + timed class removal. - B5: MySeaSpectatorFlowTest FT — accept → visit → GATE VIEW → deposit → VIEW DRAW + seat 2C seated. URLs: my-sea/visit/<uuid:owner_id>/ (+ /gate/, /insert, /leave). 470 IT/UT green; spectator FT + full Jasmine suite green. Phase C (WebRTC mesh voice + coturn droplet) next — the 24h voice_until window set here drives it. Code architected by Disco DeDisco <discodedisco@outlook.com> Git commit message Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -551,6 +551,13 @@ html:has(.gate-backdrop) .position-strip .gate-slot button { pointer-events: aut
|
||||
50% { opacity: 0.3; }
|
||||
}
|
||||
|
||||
// my-sea seat one-shot "just seated" flare — see `.table-seat.seat-just-seated`.
|
||||
@keyframes my-sea-seat-flare {
|
||||
0% { color: rgba(var(--terUser), 1); filter: drop-shadow(0 0 6px rgba(var(--ninUser), 1)); }
|
||||
70% { color: rgba(var(--terUser), 1); filter: drop-shadow(0 0 6px rgba(var(--ninUser), 0.85)); }
|
||||
100% { color: rgba(var(--secUser), 1); filter: none; }
|
||||
}
|
||||
|
||||
.table-seat {
|
||||
position: absolute;
|
||||
display: grid;
|
||||
@@ -616,6 +623,23 @@ html:has(.gate-backdrop) .position-strip .gate-slot button { pointer-events: aut
|
||||
filter: none;
|
||||
}
|
||||
|
||||
// ── my-sea "seated" occupancy (seat 1C owner, 2C visitor) ──────────────
|
||||
// Steady state once a seat is taken: chair settles to full-opacity
|
||||
// --secUser (mirrors .role-confirmed); the status icon is already
|
||||
// .fa-circle-check (green) from the server / JS swap.
|
||||
&.seated .fa-chair {
|
||||
color: rgba(var(--secUser), 1);
|
||||
filter: none;
|
||||
}
|
||||
// One-shot "just seated" flare (~1.5s) played the FIRST time a viewer
|
||||
// sees the occupancy (my-sea-seats.js adds/removes `.seat-just-seated`,
|
||||
// localStorage-gated). Chair flares --terUser + a --ninUser glow, then
|
||||
// eases back into the steady --secUser .seated look above (user-spec
|
||||
// 2026-05-27). Mirrors the room's .active → .role-confirmed handoff.
|
||||
&.seat-just-seated .fa-chair {
|
||||
animation: my-sea-seat-flare 1.5s ease forwards;
|
||||
}
|
||||
|
||||
.seat-portrait {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
|
||||
Reference in New Issue
Block a user