@namespace DeepDrftPublic.Client.Controls @* Invariant trio shared by every medium's detail page: a back link, a masthead (title + artist), a play/share affordance row wired to the streaming player, and slots for the medium-specific hero visual and metadata block. The Cut/Session/Mix detail pages all compose this; per-medium variance rides the Hero and MetaContent render fragments. *@
@* Three-zone top row: back link (left) | optional center affordance | optional action (right), on one SpaceBetween row. Both the center and action slots stay null for media that don't supply them (Track/Cut/Session), so SpaceBetween collapses to the back link alone at the left edge. The Mix detail page fills the center with its in-flow visualizer-controls container (§7b). The native wrapper lets the row flex-wrap the center zone to its own line on narrow widths, keeping the controls in-flow rather than clipping. *@
← @BackLabel @TopRowCenter @TopRightAction
@TopContent @* The header region. A composer that wants the default masthead+play row supplies nothing; one that needs a different arrangement (e.g. the Cut album's left-meta / right-cover split) supplies its own Header fragment. Layout variance rides this slot, never a boolean flag (Phase 9 §5.3). *@ @if (Header is not null) { @Header } else {
@Title @Artist
@* Play only makes sense once a playable track is resolved. *@ @if (Track is not null) { }
} @Hero @if (MetaContent is not null && ShowMeta) {
@MetaContent
} @* Multi-track body region (the Cut album's track list). Single-track media leave it null. *@ @BodyContent @* The default share row is bound to the single resolved track. A composer that owns its own share affordance (the Cut header carries Play + Share inline) suppresses it via ShowShareRow. *@ @if (Track is not null && ShowShareRow) {
}