+@* Ambient environment layer (Phase 12 §3c/§3f mode B): an optional full-bleed layer rendered BEHIND
+ the scaffold content. The visualizer mounted here positions itself fixed/inset:0 (its own CSS), so
+ this slot's only job is to render it before the content and put the content into a foreground
+ stacking context above it. Absent slot = no ambient layer and no foreground promotion → today's
+ plain background, byte-for-byte (Liskov). *@
+@if (Ambient is not null)
+{
+ @Ambient
+}
+
+
@* Two-end top row: back link (left) | optional action (right), on one SpaceBetween row. The action
slot stays null for media that don't supply it (Track/Cut/Session), so SpaceBetween collapses to
diff --git a/DeepDrftPublic.Client/Controls/ReleaseDetailScaffold.razor.cs b/DeepDrftPublic.Client/Controls/ReleaseDetailScaffold.razor.cs
index e5dd727..567165f 100644
--- a/DeepDrftPublic.Client/Controls/ReleaseDetailScaffold.razor.cs
+++ b/DeepDrftPublic.Client/Controls/ReleaseDetailScaffold.razor.cs
@@ -51,6 +51,16 @@ public partial class ReleaseDetailScaffold : ComponentBase
///
Medium-specific hero visual (cover art, hero image, or waveform background).
[Parameter] public RenderFragment? Hero { get; set; }
+ ///
+ /// Optional full-bleed ambient layer rendered BEHIND the scaffold content (Phase 12 §3c/§3f mode B).
+ /// A host that wants a living environment behind hero+content — e.g. Cut supplying a
+ /// WaveformVisualizer — places it here. The mounted layer positions itself fixed/inset:0
+ /// (its own CSS), so the scaffold only promotes its content into a foreground stacking context above
+ /// it. Absent = today's plain background, no regression (Liskov). Mode A (Mix) and mode C (the
+ /// NowPlaying card) mount the engine without this slot — see §3f.
+ ///
+ [Parameter] public RenderFragment? Ambient { get; set; }
+
///
/// Optional body region rendered below the meta block — the Cut album's multi-track listing.
/// Single-track media leave it null.
diff --git a/DeepDrftPublic.Client/Controls/ReleaseDetailScaffold.razor.css b/DeepDrftPublic.Client/Controls/ReleaseDetailScaffold.razor.css
index 2c5ff4f..2d93fc4 100644
--- a/DeepDrftPublic.Client/Controls/ReleaseDetailScaffold.razor.css
+++ b/DeepDrftPublic.Client/Controls/ReleaseDetailScaffold.razor.css
@@ -3,3 +3,13 @@
justify-content: center;
margin-top: 1.5rem;
}
+
+/* Foreground stacking context — applied only when an Ambient layer is present. Lifts the scaffold
+ content above the fixed full-bleed visualizer (z-index: 0) so hero + meta + body render over the
+ living waveform field (Phase 12 §3c — promotes the former Mix-bespoke .mix-detail-foreground into
+ the shared scaffold). Without an Ambient slot this class is absent and the container keeps its
+ default flow, so a slot-less host renders exactly as before. */
+.deepdrft-track-detail-foreground {
+ position: relative;
+ z-index: 1;
+}
diff --git a/DeepDrftPublic.Client/Pages/CutDetail.razor b/DeepDrftPublic.Client/Pages/CutDetail.razor
index 0a6fff9..51bb7aa 100644
--- a/DeepDrftPublic.Client/Pages/CutDetail.razor
+++ b/DeepDrftPublic.Client/Pages/CutDetail.razor
@@ -43,6 +43,21 @@ else
BackHref="/cuts"
BackLabel="All cuts"
ShowShareRow="false">
+
+ @* Ambient living waveform behind the album hero + track list (Phase 12 §3c/§3f mode B).
+ Cut is multi-track: anchor to the release's EntryKey and default to the first track by
+ TrackNumber. The bridge follows the live playing track within the release automatically
+ (keys on TrackId match OR shared ReleaseEntryKey), so the field re-renders to whichever
+ track the listener starts; TrackEntryKey is the at-rest datum before playback. *@
+
+
+
+ @* Lava-lamp icon → popover panel (full parity, §3d-revised). Sits top-right across from the
+ back link, clear of the header's own Play/Share affordances below. *@
+
+
@* Header split: meta + Play/Share on the LEFT, bordered cover on the RIGHT (spec §3.1). *@