refactor(settings): a pull-out drawer, with Zoom as a category — and the menu moves to the wordmark

Creator directive, 2026-11-01. Settings stopped being a centred modal.

- **Drawer** (Controls/SettingsDrawer): hosted in PreviewPane's pull-out stack, 320px, the same
  animated-width pattern as Stream Settings / YPP / Socials / TEST, opened by the gear rail tab
  on a single left click. SettingsDrawerOpen is exclusive with the other four, both directions.
  This also removes the modal's MaxHeight-700 scroll problem for good: the drawer is the height
  of the preview.
- **Categories**: headings with controls indented beneath them. Zoom now owns *Zoom view shape*
  (Circle / Phone / Tablet) and *Zoom box follows*; Recordings, Brand logo and Scene transition
  are their own categories.
- **The app menu moved to the LlamaCasty wordmark** (right-click → Report Bug / Feature Request /
  About). Left-click still opens About. The gear tab no longer carries a menu at all, so clicking
  it does exactly one thing.

OverlayHost keeps only the Bug / Feature / About panels; its brand-logo handlers and the dev-panel
injection moved with the settings block. BrandLogoPreviewTests follows the control (same assertions,
new path). Release 0 warnings; 15 tests pass across brand logo, zoom, entitlement and preview
history.
This commit is contained in:
2026-11-01 09:16:27 -08:00
parent c418288215
commit a35ec0c5f8
14 changed files with 310 additions and 173 deletions
+2 -2
View File
@@ -21,7 +21,7 @@ public class BrandLogoPreviewTests
{
// 1. Wiring: the thumbnail is image-bound and hidden when no image is set, the enlarged
// popup shows the same source at a readable size, and every gesture reaches a handler.
var xaml = SourceAssert.Text("Controls", "OverlayHost.xaml");
var xaml = SourceAssert.Text("Controls", "SettingsDrawer.xaml");
Assert.Contains("x:Name=\"BrandLogoThumbImage\"", xaml);
Assert.Contains("{Binding BrandLogoPreviewImage}", xaml);
Assert.Contains("NotNullToVis", xaml);
@@ -41,7 +41,7 @@ public class BrandLogoPreviewTests
{
// A Popup refuses to open until its placement target is in a live visual tree, so the
// control is hosted in a real window — the same condition the app provides.
var host = new ytLive.Controls.OverlayHost();
var host = new ytLive.Controls.SettingsDrawer();
var window = new System.Windows.Window { Content = host, Width = 420, Height = 420 };
window.Show();
try