fix(topbar): the output line REPLACES the segment, it does not sit beside it

Creator correction: choosing Record / Go Live must take the [ Build Scenes ][ Record / Go Live ] dual
button away and put the Output line in its place. It was rendering both, segment first, which read as one
long toolbar instead of two worlds.

The segment is now Build-world only. That also retires the padlock glyph added in 6c5cd2f — with the
segment gone in the Output world there is no state left for it to describe, so the branch is removed
rather than left unreachable.

Because the segment was the only route back to the layers, the Output world gains a left chevron
("Back to Build Scenes"), present for the whole world including while a session runs — otherwise
editing during a show (unit 1) would have had no entry point and the bar would have dead-ended.

680 pass, 0 warnings. 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 15:48:34 -08:00
parent 4bc41c488c
commit 16abb1ddc1
3 changed files with 22 additions and 10 deletions
+14 -5
View File
@@ -67,7 +67,8 @@
highlighted half re-enters it, which is how a creator gets back to the layers
during a session. -->
<Border Background="{StaticResource Brush.SurfaceContainerLowest}" CornerRadius="4"
Padding="2" Height="32" VerticalAlignment="Center" Margin="0,0,12,0">
Padding="2" Height="32" VerticalAlignment="Center" Margin="0,0,12,0"
Visibility="{Binding IsBuildWorld, Converter={StaticResource BoolToVis}}">
<StackPanel Orientation="Horizontal">
<!-- Build Scenes carries a LAYOUT glyph while it is the active world and a PADLOCK
once Record / Go Live is: the door is still there, it is just behind the
@@ -81,10 +82,7 @@
Fill="{Binding Foreground, RelativeSource={RelativeSource AncestorType=Button}}"
Visibility="{Binding IsBuildWorld, Converter={StaticResource BoolToVis}}"
Data="M3,4h8v6H3V4zM13,4h8v6h-8V4zM3,12h8v8H3V12zM13,12h8v8h-8V12z"/>
<Path Width="14" Height="14" Stretch="Uniform" VerticalAlignment="Center"
Fill="{Binding Foreground, RelativeSource={RelativeSource AncestorType=Button}}"
Visibility="{Binding IsOutputWorld, Converter={StaticResource BoolToVis}}"
Data="M7,10V7a5,5 0 0,1 10,0v3h1a1,1 0 0,1 1,1v9a1,1 0 0,1 -1,1H6a1,1 0 0,1 -1,-1v-9a1,1 0 0,1 1,-1h1zM9,10h6V7a3,3 0 0,0 -6,0v3z"/>
<TextBlock Text="Build Scenes" FontSize="12" FontWeight="Bold" Margin="6,0,0,0"
VerticalAlignment="Center"
Foreground="{Binding Foreground, RelativeSource={RelativeSource AncestorType=Button}}"/>
@@ -109,6 +107,17 @@
<!-- IDLE: the mode switch + the action(s) of the armed world. The three
controls share one height (build 77 feedback) so they read as one
family — segments host, Start/Go Live, and Test all sit at 32. -->
<!-- The Output world REPLACES the segment (creator ruling 2026-11-12): choosing Record / Go
Live takes the dual button away and puts the output line in its place. This chevron is
the way back to Build Scenes — present for the whole world, running or not, so editing
during a show (unit 1) still has an entry point and the bar has no dead end. -->
<Button Style="{StaticResource IconButton}" Width="28" Height="32" Margin="0,0,6,0"
Command="{Binding EnterBuildWorldCommand}" ToolTip="Back to Build Scenes"
Visibility="{Binding IsOutputWorld, Converter={StaticResource BoolToVis}}">
<Path Data="M15.41,7.41L14,6l-6,6 6,6 1.41,-1.41L10.83,12z" Width="14" Height="14"
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,
+4 -1
View File
@@ -151,7 +151,10 @@ Placement math itself is covered by `WindowPlacementTests` (pure function, no HW
leads the centre cluster and stays present in every state; clicking the highlighted half re-enters it,
which is how a creator gets back to the layers during a session. `WorldSegmentButton`
(`Themes/Controls.xaml`) is a Button, not a ToggleButton — the highlight follows the view model, and a
click must never be what sets it.
click must never be what sets it. The segment exists **only** in the Build world: choosing Record / Go
Live **replaces** it with the output line, and a left chevron (`Back to Build Scenes`) is present for
the whole Output world, running included — the way back to the layers, and the reason the bar has no
dead end.
- **The output stage** (`ShowOutputStage`) is the idle cluster and lives only in the Record / Go Live
world while nothing runs: `Output [▶ YouTube] [● Local MP4] One output at a time`, each switch carrying
its glyph, with **Local MP4 armed at launch** (`RecordPillOn` starts true — it did not before). The two
+4 -4
View File
@@ -35,11 +35,11 @@ public class UiShellTests
Assert.Contains("Tag=\"{Binding IsOutputWorld}\"", topBar);
Assert.DoesNotContain("x:Name=\"EditBody\"", topBar);
// 2b. Build Scenes carries a layout glyph while it is the active world, and a padlock once
// Record / Go Live is — each lit by its own world flag (creator ruling 2026-11-12).
// 2b. The segment is Build-world only: choosing Record / Go Live REPLACES it with the output
// line (creator ruling 2026-11-12), and a chevron is the way back.
Assert.Contains("Data=\"M3,4h8v6H3V4zM13,4h8v6h-8V4zM3,12h8v8H3V12zM13,12h8v8h-8V12z\"", topBar);
Assert.Contains("Data=\"M7,10V7a5,5 0 0,1 10,0v3h1", topBar);
Assert.Contains("Visibility=\"{Binding IsOutputWorld, Converter={StaticResource BoolToVis}}\"", topBar);
Assert.Contains("Visibility=\"{Binding IsBuildWorld, Converter={StaticResource BoolToVis}}\"", topBar);
Assert.Contains("ToolTip=\"Back to Build Scenes\"", topBar);
// 2c. The output stage: two labelled switches and the exclusivity promise beside them.
Assert.Contains("Text=\"Output\"", topBar);