diff --git a/Controls/BottomBar.xaml b/Controls/BottomBar.xaml
new file mode 100644
index 0000000..18686fb
--- /dev/null
+++ b/Controls/BottomBar.xaml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Controls/BottomBar.xaml.cs b/Controls/BottomBar.xaml.cs
new file mode 100644
index 0000000..df355db
--- /dev/null
+++ b/Controls/BottomBar.xaml.cs
@@ -0,0 +1,22 @@
+using System.Windows;
+using System.Windows.Controls;
+
+namespace ytLive.Controls;
+
+public partial class BottomBar : UserControl
+{
+ public BottomBar()
+ {
+ InitializeComponent();
+ }
+
+ private void GearButton_Click(object sender, RoutedEventArgs e)
+ {
+ if (sender is Button { ContextMenu: { } menu } button)
+ {
+ menu.PlacementTarget = button;
+ menu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;
+ menu.IsOpen = true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/MainWindow.xaml b/MainWindow.xaml
index 0f809f1..4d15880 100644
--- a/MainWindow.xaml
+++ b/MainWindow.xaml
@@ -6,6 +6,7 @@
xmlns:vm="clr-namespace:ytLive.ViewModels"
xmlns:models="clr-namespace:ytLive.Models"
xmlns:Helpers="clr-namespace:ytLive.Helpers"
+ xmlns:controls="clr-namespace:ytLive.Controls"
xmlns:notifications="clr-namespace:Notification.Wpf.Controls;assembly=Notification.Wpf"
mc:Ignorable="d"
Title="{Binding WindowTitle}" Height="1040" Width="1920"
@@ -1437,68 +1438,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs
index ff50937..afe5cc7 100644
--- a/MainWindow.xaml.cs
+++ b/MainWindow.xaml.cs
@@ -291,16 +291,6 @@ public partial class MainWindow : Window
e.Handled = true; // the button's right-click context menu must not fire
}
- private void GearButton_Click(object sender, RoutedEventArgs e)
- {
- if (sender is Button { ContextMenu: { } menu } button)
- {
- menu.PlacementTarget = button;
- menu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;
- menu.IsOpen = true;
- }
- }
-
private void BackToAbout_Click(object sender, RoutedEventArgs e)
{
if (DataContext is ViewModels.MainViewModel vm)
diff --git a/ViewModels/index.md b/ViewModels/index.md
index 7ef9d8a..9017529 100644
--- a/ViewModels/index.md
+++ b/ViewModels/index.md
@@ -51,7 +51,10 @@ Progress (Commit N/12 · tag):
- [x] **Commit 9/12 · `refactor-commit-9`** — **Streaming** → `MainViewModel.Streaming.cs`
- [x] **Commit 10/12 · `refactor-commit-10`** — **Chat** → `MainViewModel.Chat.cs`
- [x] **Commit 11/12 · `refactor-commit-11`** — **Overlays** → `MainViewModel.Overlays.cs`
-- [x] **Phase 1 complete:** core `MainViewModel.cs` split into 10 functional partials (1,890 → 758 lines). Phase 2 (splitting `MainWindow.xaml` into UserControls) not yet started.
+- [x] **Phase 1 complete:** core `MainViewModel.cs` split into 10 functional partials (1,890 → 758 lines).
+
+**Phase 2 — `MainWindow.xaml` split into UserControls** (new `Controls/` folder, namespace `ytLive.Controls`):
+- [x] **Commit 12 · `refactor-commit-12`** — **BottomBar** → `Controls/BottomBar.xaml(.cs)` (gear menu + stream stats + quality dropdown; `GearButton_Click` moved to the control's code-behind). Pending: TopBar, health banner, left scene/chat panel, preview pane, overlay host.
The partial `.cs` files land next to `MainViewModel.cs` in this folder as the split
proceeds; each partial carries its own `using`s and re-declares nothing from core.
\ No newline at end of file