fix(topbar): the bar carries no action button

Creator ruling 2026-11-12: the action is not part of the output row, and it is not to be placed at all
until they say where. So Start Recording / Private Test Stream / Review & Go Live are out of the bar,
along with the divider that had been separating them.

What the middle of the bar is now: the world segment in Build, and the output line
(Output [YouTube] [Local MP4] One output at a time) in the Record / Go Live world. The view-model
commands (StartRecordingCommand, TestStreamCommand, GoLiveCommand) stay, unused by XAML, because they are
wherever the action lands next.

UiShellTests now asserts the bar contains none of the three action labels, so re-adding one by accident
fails the gate.

Scope justification: Assets/starting-background.jpg is outside this unit — the creator's replacement art,
still awaiting their visual check.
This commit is contained in:
2026-11-12 16:00:50 -08:00
parent 16abb1ddc1
commit 838ba17eaf
2 changed files with 8 additions and 33 deletions
+3 -29
View File
@@ -118,11 +118,9 @@
Stretch="Uniform" Fill="{StaticResource Brush.OnSurface}"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Button>
<!-- THE OUTPUT STAGE (creator ruling 2026-11-12): which single output, and the one action
that starts it. Appears only in the Record / Go Live world and only while nothing is
running — a live session cannot change its output. YouTube and Local MP4 are one axis,
so the two switches are radio-exclusive in the view model, not by luck here. -->
<StackPanel Orientation="Horizontal"
<!-- THE OUTPUT LINE (creator ruling 2026-11-12): which single output. Nothing else
belongs in it — the action is not part of this row. -->
<StackPanel Orientation="Horizontal" VerticalAlignment="Center"
Visibility="{Binding ShowOutputStage, Converter={StaticResource BoolToVis}}">
<TextBlock Text="Output" FontSize="12" FontWeight="Bold" VerticalAlignment="Center"
Foreground="{StaticResource Brush.OnSurfaceVariant}" Margin="0,0,8,0"/>
@@ -154,30 +152,6 @@
</Border>
<TextBlock Text="One output at a time" FontSize="11" VerticalAlignment="Center"
Foreground="{StaticResource Brush.OnSurfaceVariant}" Margin="8,0,0,0"/>
<!-- The action follows the armed output (creator ruling 2026-11-12).
MP4: one button. YouTube: the test run AND the real one, side by side — Test is
something the creator asks for now, not something inferred from EDIT — with
Review & Go Live carrying the primary face because it is the default ask. -->
<Button Content="Start Recording" Style="{StaticResource YtButton}"
Height="32" Margin="10,0,0,0" Command="{Binding StartRecordingCommand}"
Visibility="{Binding ShowStartRecordingAction, Converter={StaticResource BoolToVis}}"/>
<Button Content="Private Test Stream" Style="{StaticResource YtButtonSecondary}"
Height="32" Margin="10,0,0,0" Command="{Binding TestStreamCommand}"
Visibility="{Binding ShowYouTubeStartActions, Converter={StaticResource BoolToVis}}"/>
<Button Content="Review &amp; Go Live" Style="{StaticResource YtButton}"
Height="32" Margin="8,0,0,0" Command="{Binding GoLiveCommand}"
Visibility="{Binding ShowYouTubeStartActions, Converter={StaticResource BoolToVis}}"/>
<!-- TASK 32·3: the drop ended this broadcast. YouTube cannot resume a completed one, so
the only honest action is a new broadcast — one click, saved details, and the title
says it is a resume so the channel shows what happened. -->
<Button x:Name="BackOnAirButton" Content="{Binding BackOnAirLabel}"
Style="{StaticResource YtButton}" Height="32" Margin="10,0,0,0"
Background="{StaticResource Brush.Primary}"
Command="{Binding BackOnAirCommand}"
ToolTip="Start a new broadcast from your saved details — this begins a new video"
Visibility="{Binding IsOffAirAfterDrop, Converter={StaticResource BoolToVis}}"/>
<!-- No separate TEST button (creator ruling 2026-10-30): EDIT decides whether
the ON-AIR start is the real livestream or the test one. -->
</StackPanel>
<!-- RUNNING: one reality line (dot + word + elapsed) and the stop -->
+5 -4
View File
@@ -49,10 +49,11 @@ public class UiShellTests
Assert.Contains("IsChecked=\"{Binding OnAirPillOn}\"", topBar);
Assert.Contains("IsChecked=\"{Binding RecordPillOn}\"", topBar);
// 2d. The action follows the armed output, and Test is an explicit ask again.
Assert.Contains("Content=\"Start Recording\"", topBar);
Assert.Contains("Content=\"Private Test Stream\"", topBar);
Assert.Contains("Content=\"Review &amp; Go Live\"", topBar);
// 2d. The bar carries NO action button: the output line is the bar's whole middle
// (creator ruling 2026-11-12 — the action is placed elsewhere, on instruction).
Assert.DoesNotContain("Content=\"Start Recording\"", topBar);
Assert.DoesNotContain("Content=\"Private Test Stream\"", topBar);
Assert.DoesNotContain("Content=\"Review &amp; Go Live\"", topBar);
// 3. Active scene = orange; live stays red.
Assert.Contains("IsStaged}\" Value=\"True\">\n <Setter Property=\"BorderBrush\" Value=\"{StaticResource Brush.Attention}\"/>", strip);