`, §3, which removes the `::deep` need for that element entirely*;
- the genre chip on `MudChip` (`::deep .release-overlay-chip.mud-chip`);
- the bottom-row `MudStack` wrap (`::deep .release-hero-bottom-row`);
- the play/share icon-color overrides on `MudIconButton`/`MudProgressCircular`
(`::deep .release-hero-play .mud-icon-button`, etc.).
- **The square/medium aspect for Mix** is a single override scoped to the `mix-hero` class
(`aspect-ratio: 1/1; max-width: ~480px; margin-inline: auto`) — it overrides the component's default
wide aspect. This is the "divergence rides CSS, not structure" realization of the one-source rule.
- **No `MudCard`/`MudPaper` shell for the overlay container** (house rule). The `.release-hero`
positioning context, the shim, and both overlay rows are plain `
`s — as Sessions already does.
The only Mud wrappers that remain are the chip, the icon buttons, and (optionally) the image surface —
each carrying real component behavior, none acting as a layout shell. **If staff-engineer reaches for a
Mud wrapper as a layout shell, stop and flag it** (per the standing constraint).
---
## 7. Acceptance criteria (observable)
1. **Cover-as-background.** On a Mix detail page with a cover image, the cover renders as a
background-image hero (`background-size: cover`), not as a bordered thumbnail; metadata sits overlaid
on top of it.
2. **Square medium region.** The hero is a centered square (`aspect-ratio: 1/1`) capped at a medium
width (~480px), visibly larger than the old 220px cover, with the surrounding canvas left to the
visualizer.
3. **All metadata overlaid.** Title, artist, genre (when present), release date (when present), and the
share affordance all render *over* the cover image — no separate masthead block, no separate meta
divider/row below the cover.
4. **Placeholder path.** A Mix with no cover image shows the placeholder treatment (Album icon over the
soft-secondary gradient) with metadata still legibly overlaid.
5. **Legibility.** The darkening shim keeps overlaid text readable over light and dark cover art, in both
light and dark theme.
6. **Visualizer/controls preserved.** The lava-lamp toggle still opens the in-flow eight-knob controls
container between the back link and the lamp; it still grows in place, still wraps on narrow widths,
and the lava-lamp glyph still swaps filled/outline. No regression to the Phase 10 layout.
7. **More canvas for the visualizer.** The content block below the controls row is shorter than before
(one overlaid hero vs. masthead + cover + meta), leaving more visible visualizer area.
8. **Sessions unchanged (Direction B).** After the shared-component extraction, the Session detail page
renders pixel-identically to before (before/after visual check on a session with a dedicated hero
image, a session with cover-only, and a session with no image).
9. **One source of truth (Direction B).** The overlay markup + cascade exists in exactly one component;
grepping for `.session-hero` / `.release-hero` finds no duplicate structure across the two pages.
10. **No Mud layout shell.** The overlay container, shim, and overlay rows are plain `
`s; no
`MudCard`/`MudPaper` acts as a layout wrapper (image surface excepted only if kept as `MudPaper`).
---
## 8. Open questions for Daniel
1. **DRY decision (the load-bearing one).** Recommended **Direction B** — extract a shared
`ReleaseHeroOverlay` both pages consume (one source of truth; edits the shipped Sessions page).
Fallback **Direction A** — per-page copy in Mix (fast, zero Sessions risk, takes on duplication debt).
**Which do you want?** (B is the "one source, multiple views" call; A is the play-it-safe-on-Sessions
call.)
2. **Drop the `MudPaper` on the image surface** for a plain `
` while we're
in here? It carries no Mud behavior (Elevation=0/Square=true), so it is dead weight and a plain div is
more on-spec with the plain-shell rule. Incidental cleanup — yes/no?
3. **Square hero size.** Recommended ~**480px max-width** square. Crowded vs. roomy is a feel call you'll
tune on screen — is ~480px the right starting point, or do you want it bigger (closer to the Sessions
hero scale) / smaller (more visualizer room)?
4. **Suppressing the duplicate masthead.** Mix's hero now carries title/artist/play, so the scaffold's
default masthead must be suppressed. Recommended: add a small **`ShowHeader` gate** to the scaffold
(slot-consistent with `ShowMeta`/`ShowShareRow`), vs. the hackier empty-`Header`-fragment. OK to add
the `ShowHeader` gate?
5. **Square overlay crowding (deferrable).** If the genre/date/share top row + title/artist/play bottom
row feel cramped on a 480px square, are you fine tuning shim/spacing on screen, or do you want a
different overlay arrangement for the square (e.g. a single bottom-stacked overlay) speced now?
---
## 9. File-change inventory (for staff-engineer, Direction B)
**New:**
- `DeepDrftPublic.Client/Controls/ReleaseHeroOverlay.razor` (+ `.razor.css`) — the shared overlay,
lifted from Sessions' current hero markup + CSS, parameterized per §3.
**Edited:**
- `DeepDrftPublic.Client/Pages/SessionDetail.razor` — replace the inline `.session-hero` block with
``, passing its hero/cover precedence, share, and play slots. Behavior-
preserving (must render identically).
- `DeepDrftPublic.Client/Pages/SessionDetail.razor.css` — remove the overlay cascade now living in the
component; keep only page-specific rules.
- `DeepDrftPublic.Client/Pages/MixDetail.razor` — replace the `.mix-detail-cover` `Hero` slot with
``; drop `MetaContent`; move the share
row into the overlay's `ShareContent` slot; suppress the scaffold masthead (per Q4). **`TopRowCenter` /
`TopRightAction` / the visualizer / `_controlsExpanded` wiring untouched.**
- `DeepDrftPublic.Client/Pages/MixDetail.razor.css` — keep `.mix-detail-foreground`; add the `mix-hero`
square/medium sizing override; remove `.mix-detail-cover`.
- `DeepDrftPublic.Client/Controls/ReleaseDetailScaffold.razor[.cs]` — **only if Q4 = ShowHeader gate:**
add a `bool ShowHeader = true` gate around the default header region.
- `DeepDrftPublic/wwwroot/styles/deepdrft-styles.css` — no change required; `.deepdrft-track-detail-
cover*` stays (Track detail still uses it). The `.mix-detail-container .deepdrft-track-detail-
container` width override stays (the scaffold still hosts the top row).
**For Direction A (fallback):** no new component; the overlay markup is inlined into `MixDetail.razor`
and the `.session-*` cascade is copied + renamed into `MixDetail.razor.css`. Sessions untouched.