@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)
{
}