docs(phase-12): fold popover-hosted controls into spec + plan
Controls move from an inline per-page knob bar to a single popover-hosted panel triggered by the lava-lamp icon, placed identically on every host (Mix, Cut, Session, NowPlaying card). Dissolves the NowPlaying-controls question — full parity via the popover. Adds the popover panel wave, panel styling from theme tokens, and a popover-anchor open item.
This commit is contained in:
@@ -278,13 +278,27 @@ endpoint" — it is a content + upload + CMS + backfill + fetch slice (split int
|
||||
**Three hosting modes of the one engine (Daniel corrected "backdrop").** *"backdrop?? MIXES doesn't really
|
||||
have a backdrop?"* — right: on Mix the visualizer is the full-bleed **centerpiece that IS the page**, not
|
||||
something behind content. The one engine is hosted three ways (spec §3f): **mode A — visualizer-is-the-page**
|
||||
(Mix detail, full-bleed, seven-knob bar); **mode B — ambient environment** (Cut/Session detail, living
|
||||
(Mix detail, full-bleed centerpiece); **mode B — ambient environment** (Cut/Session detail, living
|
||||
texture *behind* the hero+content — this is the only mode that is genuinely a "backdrop"); **mode C —
|
||||
contained live element** (NowPlaying card, a bounded live readout, `Fill`-sized to the card). Same engine,
|
||||
same datum contract — variance is entirely in hosting composition. **Controls (Daniel, full parity, §8b):**
|
||||
the seven-knob bar + lava-lamp toggle ride **every Release Detail host** — Mix, Cut, **and** Session (modes
|
||||
A and B both carry the controls, not Mix-only); only the contained NowPlaying card (mode C) suppresses them
|
||||
by default (one open sub-question — §8b-followup).
|
||||
the lava controls ride **every host** — Mix, Cut, Session, **and** the NowPlaying card — via the single
|
||||
popover-hosted panel (below); controls are no longer a per-mode discriminator.
|
||||
|
||||
**Controls-hosting revision (Daniel, 2026-06-17 — supersedes the inline knob-bar model).** *"We have enough
|
||||
[controls] now that I want to design a panel to be hosted in a popover for the visualizer controls. The
|
||||
lava-lamp toggle should be wired to this popover, so anywhere we can put one Icon we can put the control
|
||||
surface."* The eight knobs no longer ride an inline *bar* per page — they move into a **single
|
||||
popover-hosted panel** triggered by the **lava-lamp icon** (click icon → panel pops over). This is **more
|
||||
DRY than the per-page bar** (one `<icon → popover → panel>` composition reused verbatim, not three-to-four
|
||||
per-host bar layouts) and it **dissolves §8b-followup**: with a popover, the small NowPlaying card places
|
||||
the *same* icon as every other host and the panel floats on demand, so the "is the card too small for the
|
||||
bar?" question evaporates — **full parity on all four surfaces, the popover way**. The SOLID seam: **one
|
||||
panel component (`WaveformVisualizerControls` becomes the panel content), one popover host
|
||||
(`WaveformVisualizerControlPopover`), placed by an icon anywhere.** Panel styled to the **NowPlaying Hero
|
||||
look** — dark-navy ground, green-accent knobs, light icons, muted-navy filler — pulled from the
|
||||
`deepdrft-tokens.css` source of truth (no hardcoded hex; spec §3g). New open item the popover creates: its
|
||||
anchor/positioning per host (§8e) — a layout detail, not a presence decision.
|
||||
|
||||
**Deliverable 2 — NowPlayingHero overhaul (mode C).** `NowPlayingCard.razor` today animates **20 hardcoded
|
||||
CSS-bounce bars** with no audio coupling (the "stochastic" visualizer). Replace them with the *same*
|
||||
@@ -299,13 +313,15 @@ etc.) — a `Mix`-named component on a Cut page is a lie that cements the wrong
|
||||
**composition** (a new optional `Ambient` slot on `ReleaseDetailScaffold` for mode B; Mix keeps its own
|
||||
mode-A mount; the card is a mode-C contained mount; per-host control suppression), never a `switch (medium)`
|
||||
in the engine (memory *One source, multiple views*; scaffold's "variance rides a slot, never a flag" idiom,
|
||||
Phase 9 §5.3). The slot is named `Ambient` not `Backdrop` precisely because Mix doesn't use it. The lava
|
||||
controls ride **every Release Detail host** (Mix, Cut, Session — full parity, Daniel's §8b call); only the
|
||||
contained NowPlaying card mounts controls-suppressed by default. The seam still supports flipping the card
|
||||
to controls-on later with no engine change (memory *Design for adaptability up front*).
|
||||
Phase 9 §5.3). The slot is named `Ambient` not `Backdrop` precisely because Mix doesn't use it. **The lava
|
||||
controls are now one popover-hosted panel placed by the lava-lamp icon on every host** (Mix, Cut, Session,
|
||||
NowPlaying card — full parity, the popover dissolving the old card-suppression sub-question); the panel and
|
||||
its NowPlaying-Hero styling are built once and reused (memory *Design for adaptability up front* — the
|
||||
popover seam makes "place the controls anywhere there's an icon" a zero-cost composition).
|
||||
|
||||
Sequenced as **five waves**: `12.A → 12.B2 → (12.C ‖ 12.D)`, with **12.B1 a parallel server-side track**
|
||||
(`12.B1 → 12.B2`) that can start cold day one.
|
||||
Sequenced as **six waves**: `12.A → {12.B1 → 12.B2, 12.E}`, then `(12.B2 ∧ 12.E) → (12.C ‖ 12.D)` —
|
||||
**12.B1 a parallel server-side track** and **12.E (the popover controls panel) a third parallel track**,
|
||||
both startable cold day one off the rename.
|
||||
|
||||
- **12.A — Rename to the abstraction (mechanical, no behavior change).** `Mix*` → `Waveform*` across the
|
||||
five C#/Razor files + the TS module + its import path + the DI registration. **Load-bearing
|
||||
@@ -323,30 +339,43 @@ Sequenced as **five waves**: `12.A → 12.B2 → (12.C ‖ 12.D)`, with **12.B1
|
||||
`EntryKey` and re-fetches on **track** change (not release change). **Depends on 12.A + 12.B1.**
|
||||
Acceptance: Mix renders the same high-res lava via the track-cardinal fetch; a non-Mix track returns
|
||||
high-res.
|
||||
- **12.E — Popover-hosted control panel (the controls revision).** Turn the renamed
|
||||
`WaveformVisualizerControls` into the **panel content** and build `WaveformVisualizerControlPopover`
|
||||
pairing the lava-lamp trigger icon with that panel as overlay content (`MudPopover`). Style the panel to
|
||||
the **NowPlaying Hero look** from `deepdrft-tokens.css` (no hardcoded hex; spec §3g). Make the
|
||||
state-scoping call (one shared `WaveformVisualizerControlState`). **Depends on 12.A only** — no per-track
|
||||
datum needed, so runs **parallel to 12.B**. The unit every host then places. Acceptance: lava-lamp icon
|
||||
opens a Hero-styled popover with all eight knobs; turning a knob drives the visualizer via the unchanged
|
||||
`Changed` seam; one panel reused everywhere.
|
||||
- **12.C — `Ambient` slot on `ReleaseDetailScaffold` + mount on detail pages (mode B, full parity).**
|
||||
Promote the full-bleed / foreground-stacking / dynamic-footer-clip pattern into the scaffold as an optional
|
||||
`Ambient` slot; Cut mounts the ambient layer **with the full seven-knob bar + lava-lamp toggle** (full
|
||||
parity); Session mounts directly **also full-parity** (it doesn't compose the scaffold — spec §3e). Mix is
|
||||
**unchanged** (mode A keeps its own mount + controls). Also makes the state-scoping call (recommend one
|
||||
shared `WaveformVisualizerControlState`). **Depends on 12.B2.** **§8b resolved (full parity) — no longer
|
||||
gated**; Cut and Session ship with both the ambient layer and the controls.
|
||||
- **12.D — NowPlayingHero rewire (mode C).** Replace the synthetic bars with a contained,
|
||||
controls-suppressed `<WaveformVisualizer>` driven by the live cascaded player, pointed at the current
|
||||
track; add the `Fill`/container-sizing mode (spec §6c). **Depends on 12.A + 12.B2; independent of 12.C**
|
||||
`Ambient` slot; Cut mounts the ambient layer **and places the lava-lamp icon → popover** (full parity);
|
||||
Session mounts directly **also full-parity** (it doesn't compose the scaffold — spec §3e). Mix is
|
||||
**unchanged as a layer** (mode A keeps its own full-bleed mount); its only controls change is swapping the
|
||||
inline `TopRowCenter` bar for the lava-lamp icon → popover (12.E's affordance). **Depends on 12.B2 + 12.E.**
|
||||
**§8b resolved (full parity) — no longer gated**; Cut and Session ship with both the ambient layer and the
|
||||
popover controls.
|
||||
- **12.D — NowPlayingHero rewire (mode C).** Replace the synthetic bars with a contained
|
||||
`<WaveformVisualizer>` driven by the live cascaded player, pointed at the current track; add the
|
||||
`Fill`/container-sizing mode (spec §6c); **place the lava-lamp icon → popover on the card** (full parity —
|
||||
the popover dissolves the old suppression). **Depends on 12.A + 12.B2 + 12.E; independent of 12.C**
|
||||
(different host). Acceptance: home card shows the real playing-track high-res waveform, at-rest when
|
||||
nothing plays; no synthetic bars remain.
|
||||
nothing plays, and carries the lava-lamp icon → popover like every other host; no synthetic bars remain.
|
||||
|
||||
**Resolved by Daniel (2026-06-17), kept visible per file convention:** datum resolution → **Direction B**
|
||||
(high-res all media; 512-bucket-fallback "Direction A" declined); multi-track-Cut datum → **dissolved by
|
||||
the per-track model** (renders the current track's datum, no album-representative choice); Cut/Session
|
||||
hosting + controls → **full parity (option 3)**: all three hosting modes ship **and** the seven-knob bar +
|
||||
lava-lamp toggle ride every Release Detail host (Mix, Cut, Session), not Mix-only — the three-mode *layout*
|
||||
framing is retained, the change is that controls are no longer Mix-suppressed on Cut/Session (the old "mode
|
||||
1 Mix-only" and "controls Mix-only" alternatives are both closed). **Newly open (created by the full-parity
|
||||
flip + Direction B + per-track):** (a) **§8b-followup — do full-parity controls extend onto the NowPlaying
|
||||
home card (mode C)?** Full parity was answered against the *detail* pages; the small contained home card
|
||||
stays **controls-suppressed by default** (a seven-knob bar on a compact now-playing card may be awkward) —
|
||||
recommend keeping it suppressed, but flag for Daniel; one-line composition flip in 12.D either way.
|
||||
hosting + controls → **full parity (option 3)**: all three hosting modes ship **and** the lava controls ride
|
||||
every host — the three-mode *layout* framing is retained, the change is that controls are no longer
|
||||
Mix-suppressed (the old "mode 1 Mix-only" and "controls Mix-only" alternatives are both closed);
|
||||
**controls hosting → popover-hosted panel** (2026-06-17 revision): the controls move from an inline knob bar
|
||||
to a single popover-hosted panel triggered by the lava-lamp icon, placed identically on every host;
|
||||
**§8b-followup is dissolved by this** — the NowPlaying card gets the icon → popover like everywhere else, so
|
||||
full parity now spans all four surfaces (Mix, Cut, Session, NowPlaying card). **Open (created by the popover
|
||||
revision + Direction B + per-track):** (a) **§8e — popover anchor/positioning per host**: where the
|
||||
lava-lamp icon sits and the panel anchors on each host (Mix's `TopRightAction` corner is cleanest; the small
|
||||
NowPlaying card is the tightest case and may look cramped) — recommend one popover with a per-host
|
||||
`AnchorOrigin` parameter, not a fork; staff-engineer-owned layout call, flagged for a glance in review.
|
||||
(b) **§8a-new — backfill shape + gate**: one-shot migration/script vs. a CMS
|
||||
batch action over the generalized generate action (recommend the CMS action; Daniel-gated to *run* either
|
||||
way; the fetch 404s gracefully for not-yet-backfilled tracks so it can ship before the backfill completes).
|
||||
|
||||
Reference in New Issue
Block a user