docs: reflect Phase 20 Theater Mode landing in PLAN, COMPLETED, CLAUDE.md, and spec status

This commit is contained in:
daniel-c-harvey
2026-06-20 22:17:58 -04:00
parent 011dbe8d81
commit a577df88dd
4 changed files with 29 additions and 52 deletions
-48
View File
@@ -443,54 +443,6 @@ not the same work; this phase does not satisfy or depend on that one.
---
## Phase 20 — Theater Mode (public Release Detail views)
A presentation-only feature on the **public listener site** (`DeepDrftPublic` / `DeepDrftPublic.Client`;
**no CMS, no API, no data, no schema change**). On a Release Detail view, a new toggle clears the page
chrome away from the visualizer: hide the release content (`@if`-gated header/meta/track-list/blurb and
the Session/Mix hero overlay) so the lava-lamp + waveform field fills the surface unobstructed, while
the **player bar grows** to carry the release identity the hidden page would otherwise show — cover art,
release title, and a release-mode share. Borrowed namesake: YouTube/Twitch "theater mode" — collapse the
surrounding chrome to let the media (here, the visualizer) take over, one reversible toggle. Full design,
component-by-component placement, the SOLID state seam, theming reuse, acceptance criteria, and open
questions: `product-notes/phase-20-theater-mode.md`.
**Scope — the three detail views (verified):** `Pages/CutDetail.razor` (scaffold `Ambient` visualizer),
`Pages/SessionDetail.razor` (mounts the visualizer directly — **does not** use `ReleaseDetailScaffold`),
`Pages/MixDetail.razor` (scaffold, full-bleed mode-A visualizer). The feature must behave **identically**
across all three; the Session-doesn't-use-the-scaffold asymmetry is the key constraint the state design
works around.
**Architectural spine.** **One boolean, multiple observers** (memory: *one source, multiple views*).
State home (OQ3, resolved): **widen `WaveformVisualizerControlState` with a `TheaterMode` flag** —
the object is already scoped, session-persistent, observed via its `Changed` event, gated on the same
`LavaEnabled || WaveformEnabled` the Theater button reads, and *explicitly designed to widen by adding a
field + default*. The
**detail pages own only the content `@if`** (each page gates the fragments it renders, so the scaffold
stays Theater-unaware and Session is covered the same way); the **player bar owns only the enlargement**
(reads `CurrentTrack.Release` — `Title`/`ImagePath`/`EntryKey`/`Medium`, all already on the DTO — and
renders a small `NowShowingPanel` presentational sub-component); the **toggle button owns only the
mutation**. No page reaches into the bar; the bar reaches into no page.
**Theming (DRY — hard requirement).** The toggle is a `MudIconButton` in `.dd-accent-icon` (green-accent
glyph both themes, zero new CSS — same as the lava-lamp trigger it sits beside); the enlarged bar binds
existing theme-aware aliases (`--deepdrft-page-surface`/`-text`/`-text-muted`), reuses the
`deepdrft-track-detail-cover-art` cover idiom, and wraps the release `SharePopover` in `.dd-accent-icon`.
**No new dark overrides, no new palette `Color`, no new token family.**
**Button placement + gating.** A new right-side icon button immediately **left of the lava-lamp toggle**,
visible only when `LavaEnabled || WaveformEnabled`, disabled until interactive, with an on/off active
state. Material `Theaters` glyph for v1 (bespoke `DDIcons` deferred — Phase 17 OQ7 precedent).
**Open questions — all six resolved (Daniel, 2026-06-20; spec §9).** OQ1: Material `Theaters` glyph for
v1. OQ2: playing-release only — bar stays a pure function of player state. OQ3: Option A — widen
`WaveformVisualizerControlState` with a `TheaterMode` flag. OQ4: top action row (back, lava, theater)
stays visible — it's controls, not content. OQ5: session-scoped, resets to OFF on fresh page load.
OQ6: detail-pages-only for v1; no Theater affordance on the home hero.
**Status: scoped and approved — Phase 20, Wave 1.** Cold-start; no dependency on any in-flight phase
(Phases 11/16/17 — the player bar, queue, and visualizer it builds on — are all complete).
---
## Working with this file