diff --git a/Controls/OverlayHost.xaml b/Controls/OverlayHost.xaml
index 604a23d..762fc51 100644
--- a/Controls/OverlayHost.xaml
+++ b/Controls/OverlayHost.xaml
@@ -35,106 +35,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Controls/OverlayHost.xaml.cs b/Controls/OverlayHost.xaml.cs
index 2be1a65..6400916 100644
--- a/Controls/OverlayHost.xaml.cs
+++ b/Controls/OverlayHost.xaml.cs
@@ -9,44 +9,8 @@ public partial class OverlayHost : UserControl
public OverlayHost()
{
InitializeComponent();
-#if DEBUG
- // Development affordances are added at runtime, never declared in XAML: the panel is
- // excluded from the Release compile (ytLive.csproj), so this line is the only
- // reference to it and a Release build has none.
- DeveloperPanelHost.Children.Add(new DeveloperPanel());
-#endif
}
- /// Is the enlarged brand-logo preview showing? Test seam — a Popup is a separate
- /// window, so nothing else can observe it.
- internal bool IsBrandLogoPreviewOpen => BrandLogoPreviewPopup.IsOpen;
-
- /// Hover opens the enlargement. Nothing to show when no image is set, so the
- /// thumbnail simply does nothing in that case.
- private void BrandLogoThumb_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
- => OpenBrandLogoPreview();
-
- /// Leaving the thumbnail closes it — unless the pointer walked onto the popup
- /// itself (which sits beside it), where it stays put so the creator can look closely.
- private void BrandLogoThumb_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
- {
- if (BrandLogoPreviewPopup.Child?.IsMouseOver == true) return;
- CloseBrandLogoPreview();
- }
-
- /// A click collapses the enlargement — the explicit "enough, thanks" gesture.
- private void BrandLogoThumb_Click(object sender, System.Windows.Input.MouseButtonEventArgs e)
- => CloseBrandLogoPreview();
-
- private void BrandLogoPreviewPopup_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
- => CloseBrandLogoPreview();
-
- /// The thumbnail is hidden when no image is set (see the XAML), so there is nothing
- /// to open in that case — no empty frame can appear.
- internal void OpenBrandLogoPreview() => BrandLogoPreviewPopup.IsOpen = true;
-
- internal void CloseBrandLogoPreview() => BrandLogoPreviewPopup.IsOpen = false;
-
private void BackToAbout_Click(object sender, RoutedEventArgs e)
{
if (DataContext is MainViewModel vm)
diff --git a/Controls/PreviewPane.xaml b/Controls/PreviewPane.xaml
index 87880bc..ce8f431 100644
--- a/Controls/PreviewPane.xaml
+++ b/Controls/PreviewPane.xaml
@@ -2,7 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Helpers="clr-namespace:ytLive.Helpers"
- xmlns:local="clr-namespace:ytLive">
+ xmlns:local="clr-namespace:ytLive" xmlns:controls="clr-namespace:ytLive.Controls">
@@ -881,26 +881,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
+ ToolTip="Settings"
+ MouseLeftButtonUp="SettingsTab_Click">
diff --git a/Controls/PreviewPane.xaml.cs b/Controls/PreviewPane.xaml.cs
index ad53974..a8a480c 100644
--- a/Controls/PreviewPane.xaml.cs
+++ b/Controls/PreviewPane.xaml.cs
@@ -730,22 +730,11 @@ public partial class PreviewPane : UserControl
}
}
- /// Rail settings tab (creator ruling 2026-11-01): left-click opens the same app menu
- /// the top-bar gear used to own, so Bug / Feature / About keep their only entry point.
+ /// Rail settings tab (creator ruling 2026-11-01): a left click opens the Settings
+ /// DRAWER immediately, exactly like the other rail tabs — no menu, no modal.
private void SettingsTab_Click(object sender, MouseButtonEventArgs e)
{
- if (sender is not FrameworkElement { ContextMenu: { } menu } anchor) return;
- menu.PlacementTarget = anchor;
- menu.Placement = System.Windows.Controls.Primitives.PlacementMode.Left;
- menu.IsOpen = true;
+ if (DataContext is MainViewModel vm) vm.ToggleSettingsDrawer();
e.Handled = true;
}
-
- /// Right-click goes straight to App Settings — the same shortcut the old gear had.
- private void SettingsTab_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
- {
- e.Handled = true;
- if (DataContext is MainViewModel { OpenSettingsCommand: { } open } && open.CanExecute(null))
- open.Execute(null);
- }
}
diff --git a/Controls/SettingsDrawer.xaml b/Controls/SettingsDrawer.xaml
new file mode 100644
index 0000000..da8e96c
--- /dev/null
+++ b/Controls/SettingsDrawer.xaml
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Controls/SettingsDrawer.xaml.cs b/Controls/SettingsDrawer.xaml.cs
new file mode 100644
index 0000000..7f5c1af
--- /dev/null
+++ b/Controls/SettingsDrawer.xaml.cs
@@ -0,0 +1,58 @@
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+
+namespace ytLive.Controls;
+
+///
+/// App Settings as a right-edge pull-out (creator ruling 2026-11-01). Hosted by
+/// 's drawer stack and opened by the gear rail tab, exactly like Stream
+/// Settings / YPP / Socials / TEST.
+///
+/// Born from the modal overlay: that shell was MaxHeight 700, so once the section list grew
+/// the bottom options were clipped and unreachable — including the zoom shape the creator was
+/// looking for. A drawer is the height of the preview, so the list can grow without a second
+/// scroll decision to get wrong.
+///
+public partial class SettingsDrawer : UserControl
+{
+ public SettingsDrawer()
+ {
+ InitializeComponent();
+#if DEBUG
+ // Development affordances are added at runtime, never declared in XAML: the panel is
+ // excluded from the Release compile (ytLive.csproj), so this line is the only reference.
+ DeveloperPanelHost.Children.Add(new DeveloperPanel());
+#endif
+ }
+
+ /// Is the enlarged brand-logo preview showing? Test seam — a Popup is a separate
+ /// window, so nothing else can observe it.
+ internal bool IsBrandLogoPreviewOpen => BrandLogoPreviewPopup.IsOpen;
+
+ /// The thumbnail is hidden when no image is set (see the XAML), so there is nothing to
+ /// open in that case — no empty frame can appear.
+ internal void OpenBrandLogoPreview() => BrandLogoPreviewPopup.IsOpen = true;
+
+ internal void CloseBrandLogoPreview() => BrandLogoPreviewPopup.IsOpen = false;
+
+ /// Hover opens the enlargement. Nothing to show when no image is set, so the
+ /// thumbnail simply does nothing in that case.
+ private void BrandLogoThumb_MouseEnter(object sender, MouseEventArgs e)
+ => BrandLogoPreviewPopup.IsOpen = true;
+
+ /// Leaving the thumbnail closes it — unless the pointer walked onto the popup
+ /// itself, where it stays put so the creator can look closely.
+ private void BrandLogoThumb_MouseLeave(object sender, MouseEventArgs e)
+ {
+ if (BrandLogoPreviewPopup.Child?.IsMouseOver == true) return;
+ BrandLogoPreviewPopup.IsOpen = false;
+ }
+
+ /// A click collapses the enlargement — the explicit "enough, thanks" gesture.
+ private void BrandLogoThumb_Click(object sender, MouseButtonEventArgs e)
+ => BrandLogoPreviewPopup.IsOpen = false;
+
+ private void BrandLogoPreviewPopup_MouseLeave(object sender, MouseEventArgs e)
+ => BrandLogoPreviewPopup.IsOpen = false;
+}
diff --git a/Controls/TopBar.xaml b/Controls/TopBar.xaml
index 0677526..c393a21 100644
--- a/Controls/TopBar.xaml
+++ b/Controls/TopBar.xaml
@@ -21,11 +21,22 @@
-
+