diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
new file mode 100644
index 0000000..c2b7d8f
--- /dev/null
+++ b/docs/ROADMAP.md
@@ -0,0 +1,96 @@
+# OpenMaui Linux Platform Roadmap
+
+This document outlines the development roadmap for the OpenMaui Linux platform.
+
+## Version 1.0 (Current - Preview)
+
+### Completed Features ✅
+
+| Feature | Status | Description |
+|---------|--------|-------------|
+| Core Control Library | ✅ Complete | 35+ controls including Button, Label, Entry, etc. |
+| SkiaSharp Rendering | ✅ Complete | Hardware-accelerated 2D graphics |
+| X11 Support | ✅ Complete | Full X11 display server integration |
+| Platform Services | ✅ Complete | Clipboard, file picker, notifications, etc. |
+| Accessibility (AT-SPI2) | ✅ Complete | Screen reader support |
+| Input Methods | ✅ Complete | IBus and XIM support |
+| High DPI Support | ✅ Complete | Automatic scale factor detection |
+| Drag and Drop | ✅ Complete | XDND protocol implementation |
+| Global Hotkeys | ✅ Complete | System-wide keyboard shortcuts |
+| XAML Support | ✅ Complete | Standard .NET MAUI XAML syntax |
+| Project Templates | ✅ Complete | Code and XAML-based templates |
+| Visual Studio Extension | ✅ Complete | Project templates and launch profiles |
+
+## Version 1.1 (Next Release)
+
+### In Progress 🚧
+
+| Feature | Priority | Description |
+|---------|----------|-------------|
+| Complete Wayland Support | High | Full Wayland compositor support |
+| XAML Hot Reload | High | Live XAML editing during debugging |
+| Performance Optimizations | Medium | Rendering and memory improvements |
+
+### Planned 📋
+
+| Feature | Priority | Description |
+|---------|----------|-------------|
+| Hardware Video Acceleration | Medium | VA-API/VDPAU integration |
+| Live Visual Tree | Medium | Debug tool for inspecting UI hierarchy |
+| Theming Improvements | Medium | Better system theme integration |
+
+## Version 1.2 (Future)
+
+### Planned 📋
+
+| Feature | Priority | Description |
+|---------|----------|-------------|
+| GTK4 Interop Layer | Low | Native GTK dialog support |
+| WebView Control | Medium | Embedded web browser support |
+| Maps Integration | Low | OpenStreetMap-based mapping |
+| Printing Support | Medium | CUPS printing integration |
+
+## Version 2.0 (Long-term)
+
+### Vision 🔮
+
+| Feature | Description |
+|---------|-------------|
+| Vulkan Rendering | Next-gen graphics API support |
+| Flatpak Packaging | Easy distribution via Flatpak |
+| Snap Packaging | Ubuntu Snap store support |
+| AppImage Support | Portable Linux app format |
+| Multi-window Support | Multiple top-level windows |
+| System Tray Menus | Rich tray icon interactions |
+
+## Contributing
+
+We welcome contributions! Priority areas:
+
+1. **Wayland Support** - Help complete the Wayland backend
+2. **Testing** - Integration tests on various distributions
+3. **Documentation** - API docs and tutorials
+4. **Controls** - Additional control implementations
+5. **Samples** - Real-world demo applications
+
+See [CONTRIBUTING.md](../CONTRIBUTING.md) for details.
+
+## Milestones
+
+| Milestone | Target | Status |
+|-----------|--------|--------|
+| v1.0.0-preview.1 | Q1 2025 | ✅ Released |
+| v1.0.0-preview.2 | Q1 2025 | ✅ Released |
+| v1.0.0 | Q2 2025 | 🚧 In Progress |
+| v1.1.0 | Q3 2025 | 📋 Planned |
+| v1.2.0 | Q4 2025 | 📋 Planned |
+
+## Feedback
+
+- GitHub Issues: https://github.com/open-maui/maui-linux/issues
+- Discussions: https://github.com/open-maui/maui-linux/discussions
+
+---
+
+*Last updated: January 2025*
+*Copyright 2025 MarketAlly LLC*
diff --git a/samples/ControlGallery/App.xaml b/samples/ControlGallery/App.xaml
new file mode 100644
index 0000000..8de3e73
--- /dev/null
+++ b/samples/ControlGallery/App.xaml
@@ -0,0 +1,20 @@
+
+
+
+
+ #512BD4
+ #3B1F9E
+ #DFD8F7
+ #2B0B98
+ #E1E1E1
+ #C8C8C8
+ #ACACAC
+ #919191
+ #6E6E6E
+ #404040
+ #212121
+
+
+
diff --git a/samples/ControlGallery/App.xaml.cs b/samples/ControlGallery/App.xaml.cs
new file mode 100644
index 0000000..9270a3b
--- /dev/null
+++ b/samples/ControlGallery/App.xaml.cs
@@ -0,0 +1,10 @@
+namespace ControlGallery;
+
+public partial class App : Application
+{
+ public App()
+ {
+ InitializeComponent();
+ MainPage = new AppShell();
+ }
+}
diff --git a/samples/ControlGallery/AppShell.xaml b/samples/ControlGallery/AppShell.xaml
new file mode 100644
index 0000000..40514a6
--- /dev/null
+++ b/samples/ControlGallery/AppShell.xaml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/AppShell.xaml.cs b/samples/ControlGallery/AppShell.xaml.cs
new file mode 100644
index 0000000..419d271
--- /dev/null
+++ b/samples/ControlGallery/AppShell.xaml.cs
@@ -0,0 +1,9 @@
+namespace ControlGallery;
+
+public partial class AppShell : Shell
+{
+ public AppShell()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/samples/ControlGallery/ControlGallery.csproj b/samples/ControlGallery/ControlGallery.csproj
new file mode 100644
index 0000000..4b6880d
--- /dev/null
+++ b/samples/ControlGallery/ControlGallery.csproj
@@ -0,0 +1,21 @@
+
+
+
+ net9.0
+ Exe
+ enable
+ enable
+ ControlGallery
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/MauiProgram.cs b/samples/ControlGallery/MauiProgram.cs
new file mode 100644
index 0000000..ea6104d
--- /dev/null
+++ b/samples/ControlGallery/MauiProgram.cs
@@ -0,0 +1,22 @@
+using Microsoft.Maui.Hosting;
+using OpenMaui.Platform.Linux.Hosting;
+
+namespace ControlGallery;
+
+public static class MauiProgram
+{
+ public static MauiApp CreateMauiApp()
+ {
+ var builder = MauiApp.CreateBuilder();
+ builder
+ .UseMauiApp()
+ .UseOpenMauiLinux()
+ .ConfigureFonts(fonts =>
+ {
+ fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+ fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
+ });
+
+ return builder.Build();
+ }
+}
diff --git a/samples/ControlGallery/Pages/ButtonsPage.xaml b/samples/ControlGallery/Pages/ButtonsPage.xaml
new file mode 100644
index 0000000..0f03138
--- /dev/null
+++ b/samples/ControlGallery/Pages/ButtonsPage.xaml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/ButtonsPage.xaml.cs b/samples/ControlGallery/Pages/ButtonsPage.xaml.cs
new file mode 100644
index 0000000..9751a42
--- /dev/null
+++ b/samples/ControlGallery/Pages/ButtonsPage.xaml.cs
@@ -0,0 +1,22 @@
+namespace ControlGallery.Pages;
+
+public partial class ButtonsPage : ContentPage
+{
+ private int _clickCount = 0;
+
+ public ButtonsPage()
+ {
+ InitializeComponent();
+ }
+
+ private void OnButtonClicked(object sender, EventArgs e)
+ {
+ _clickCount++;
+ ButtonResultLabel.Text = $"Button clicked {_clickCount} time(s)";
+ }
+
+ private async void OnImageButtonClicked(object sender, EventArgs e)
+ {
+ await DisplayAlert("ImageButton", "You clicked the ImageButton!", "OK");
+ }
+}
diff --git a/samples/ControlGallery/Pages/CarouselViewPage.xaml b/samples/ControlGallery/Pages/CarouselViewPage.xaml
new file mode 100644
index 0000000..f650a0e
--- /dev/null
+++ b/samples/ControlGallery/Pages/CarouselViewPage.xaml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/CarouselViewPage.xaml.cs b/samples/ControlGallery/Pages/CarouselViewPage.xaml.cs
new file mode 100644
index 0000000..4d0c4c1
--- /dev/null
+++ b/samples/ControlGallery/Pages/CarouselViewPage.xaml.cs
@@ -0,0 +1,70 @@
+namespace ControlGallery.Pages;
+
+public partial class CarouselViewPage : ContentPage
+{
+ private readonly List _items;
+
+ public CarouselViewPage()
+ {
+ InitializeComponent();
+
+ _items = new List
+ {
+ new() { Title = "Welcome", Description = "Get started with OpenMaui", Icon = "👋", Color = Color.FromArgb("#512BD4") },
+ new() { Title = "Controls", Description = "35+ beautiful controls", Icon = "🎨", Color = Color.FromArgb("#2196F3") },
+ new() { Title = "Native", Description = "X11 & Wayland support", Icon = "🐧", Color = Color.FromArgb("#4CAF50") },
+ new() { Title = "Fast", Description = "Hardware accelerated", Icon = "⚡", Color = Color.FromArgb("#FF9800") },
+ new() { Title = "Accessible", Description = "Screen reader support", Icon = "♿", Color = Color.FromArgb("#9C27B0") },
+ };
+
+ Carousel.ItemsSource = _items;
+ Carousel.IndicatorView = CarouselIndicator;
+
+ UpdateCurrentItemLabel();
+ }
+
+ private void OnCurrentItemChanged(object sender, CurrentItemChangedEventArgs e)
+ {
+ UpdateCurrentItemLabel();
+ }
+
+ private void UpdateCurrentItemLabel()
+ {
+ var index = _items.IndexOf(Carousel.CurrentItem as CarouselItem);
+ CurrentItemLabel.Text = $"Slide {index + 1} of {_items.Count}";
+ }
+
+ private void OnPreviousClicked(object sender, EventArgs e)
+ {
+ var index = _items.IndexOf(Carousel.CurrentItem as CarouselItem);
+ if (index > 0)
+ {
+ Carousel.ScrollTo(index - 1);
+ }
+ else
+ {
+ Carousel.ScrollTo(_items.Count - 1);
+ }
+ }
+
+ private void OnNextClicked(object sender, EventArgs e)
+ {
+ var index = _items.IndexOf(Carousel.CurrentItem as CarouselItem);
+ if (index < _items.Count - 1)
+ {
+ Carousel.ScrollTo(index + 1);
+ }
+ else
+ {
+ Carousel.ScrollTo(0);
+ }
+ }
+}
+
+public class CarouselItem
+{
+ public string Title { get; set; } = string.Empty;
+ public string Description { get; set; } = string.Empty;
+ public string Icon { get; set; } = string.Empty;
+ public Color Color { get; set; } = Colors.Gray;
+}
diff --git a/samples/ControlGallery/Pages/CollectionViewPage.xaml b/samples/ControlGallery/Pages/CollectionViewPage.xaml
new file mode 100644
index 0000000..bff04ed
--- /dev/null
+++ b/samples/ControlGallery/Pages/CollectionViewPage.xaml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/CollectionViewPage.xaml.cs b/samples/ControlGallery/Pages/CollectionViewPage.xaml.cs
new file mode 100644
index 0000000..5fd3b98
--- /dev/null
+++ b/samples/ControlGallery/Pages/CollectionViewPage.xaml.cs
@@ -0,0 +1,40 @@
+namespace ControlGallery.Pages;
+
+public partial class CollectionViewPage : ContentPage
+{
+ public CollectionViewPage()
+ {
+ InitializeComponent();
+
+ var items = new List
+ {
+ new() { Title = "Product A", Description = "High quality item", Price = 29.99m, Color = Colors.Purple },
+ new() { Title = "Product B", Description = "Best seller", Price = 49.99m, Color = Colors.Blue },
+ new() { Title = "Product C", Description = "New arrival", Price = 19.99m, Color = Colors.Green },
+ new() { Title = "Product D", Description = "Limited edition", Price = 99.99m, Color = Colors.Orange },
+ new() { Title = "Product E", Description = "Customer favorite", Price = 39.99m, Color = Colors.Red },
+ new() { Title = "Product F", Description = "Eco-friendly", Price = 24.99m, Color = Colors.Teal },
+ new() { Title = "Product G", Description = "Premium quality", Price = 79.99m, Color = Colors.Indigo },
+ new() { Title = "Product H", Description = "Budget friendly", Price = 9.99m, Color = Colors.Pink },
+ };
+
+ ItemsCollection.ItemsSource = items;
+ }
+
+ private async void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ if (e.CurrentSelection.FirstOrDefault() is ItemModel item)
+ {
+ await DisplayAlert("Selected", $"You selected {item.Title}", "OK");
+ ((CollectionView)sender).SelectedItem = null;
+ }
+ }
+}
+
+public class ItemModel
+{
+ public string Title { get; set; } = string.Empty;
+ public string Description { get; set; } = string.Empty;
+ public decimal Price { get; set; }
+ public Color Color { get; set; } = Colors.Gray;
+}
diff --git a/samples/ControlGallery/Pages/EntryPage.xaml b/samples/ControlGallery/Pages/EntryPage.xaml
new file mode 100644
index 0000000..4da70b4
--- /dev/null
+++ b/samples/ControlGallery/Pages/EntryPage.xaml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/EntryPage.xaml.cs b/samples/ControlGallery/Pages/EntryPage.xaml.cs
new file mode 100644
index 0000000..4af119b
--- /dev/null
+++ b/samples/ControlGallery/Pages/EntryPage.xaml.cs
@@ -0,0 +1,14 @@
+namespace ControlGallery.Pages;
+
+public partial class EntryPage : ContentPage
+{
+ public EntryPage()
+ {
+ InitializeComponent();
+ }
+
+ private void OnEntryTextChanged(object sender, TextChangedEventArgs e)
+ {
+ BoundLabel.Text = $"You typed: {e.NewTextValue}";
+ }
+}
diff --git a/samples/ControlGallery/Pages/HomePage.xaml b/samples/ControlGallery/Pages/HomePage.xaml
new file mode 100644
index 0000000..470375d
--- /dev/null
+++ b/samples/ControlGallery/Pages/HomePage.xaml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/HomePage.xaml.cs b/samples/ControlGallery/Pages/HomePage.xaml.cs
new file mode 100644
index 0000000..e3fb27f
--- /dev/null
+++ b/samples/ControlGallery/Pages/HomePage.xaml.cs
@@ -0,0 +1,14 @@
+namespace ControlGallery.Pages;
+
+public partial class HomePage : ContentPage
+{
+ public HomePage()
+ {
+ InitializeComponent();
+ }
+
+ private async void OnGetStartedClicked(object sender, EventArgs e)
+ {
+ await Shell.Current.GoToAsync("//ButtonsPage");
+ }
+}
diff --git a/samples/ControlGallery/Pages/ImagesPage.xaml b/samples/ControlGallery/Pages/ImagesPage.xaml
new file mode 100644
index 0000000..5c58ece
--- /dev/null
+++ b/samples/ControlGallery/Pages/ImagesPage.xaml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/ImagesPage.xaml.cs b/samples/ControlGallery/Pages/ImagesPage.xaml.cs
new file mode 100644
index 0000000..ff435a4
--- /dev/null
+++ b/samples/ControlGallery/Pages/ImagesPage.xaml.cs
@@ -0,0 +1,9 @@
+namespace ControlGallery.Pages;
+
+public partial class ImagesPage : ContentPage
+{
+ public ImagesPage()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/samples/ControlGallery/Pages/LabelsPage.xaml b/samples/ControlGallery/Pages/LabelsPage.xaml
new file mode 100644
index 0000000..74cf13e
--- /dev/null
+++ b/samples/ControlGallery/Pages/LabelsPage.xaml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/LabelsPage.xaml.cs b/samples/ControlGallery/Pages/LabelsPage.xaml.cs
new file mode 100644
index 0000000..d574d49
--- /dev/null
+++ b/samples/ControlGallery/Pages/LabelsPage.xaml.cs
@@ -0,0 +1,9 @@
+namespace ControlGallery.Pages;
+
+public partial class LabelsPage : ContentPage
+{
+ public LabelsPage()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/samples/ControlGallery/Pages/PickersPage.xaml b/samples/ControlGallery/Pages/PickersPage.xaml
new file mode 100644
index 0000000..e634681
--- /dev/null
+++ b/samples/ControlGallery/Pages/PickersPage.xaml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Red
+ Green
+ Blue
+ Yellow
+ Purple
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/PickersPage.xaml.cs b/samples/ControlGallery/Pages/PickersPage.xaml.cs
new file mode 100644
index 0000000..b4efb26
--- /dev/null
+++ b/samples/ControlGallery/Pages/PickersPage.xaml.cs
@@ -0,0 +1,36 @@
+namespace ControlGallery.Pages;
+
+public partial class PickersPage : ContentPage
+{
+ public PickersPage()
+ {
+ InitializeComponent();
+
+ // Set date range
+ RangeDatePicker.MinimumDate = DateTime.Today;
+ RangeDatePicker.MaximumDate = DateTime.Today.AddDays(30);
+ }
+
+ private void OnColorPickerChanged(object sender, EventArgs e)
+ {
+ var picker = (Picker)sender;
+ if (picker.SelectedIndex >= 0)
+ {
+ ColorResultLabel.Text = $"Selected: {picker.Items[picker.SelectedIndex]}";
+ }
+ }
+
+ private void OnDateSelected(object sender, DateChangedEventArgs e)
+ {
+ DateResultLabel.Text = $"Selected: {e.NewDate:MMMM dd, yyyy}";
+ }
+
+ private void OnTimeChanged(object sender, PropertyChangedEventArgs e)
+ {
+ if (e.PropertyName == nameof(TimePicker.Time))
+ {
+ var picker = (TimePicker)sender;
+ TimeResultLabel.Text = $"Selected: {picker.Time:hh\\:mm}";
+ }
+ }
+}
diff --git a/samples/ControlGallery/Pages/ProgressPage.xaml b/samples/ControlGallery/Pages/ProgressPage.xaml
new file mode 100644
index 0000000..0aee33b
--- /dev/null
+++ b/samples/ControlGallery/Pages/ProgressPage.xaml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/ProgressPage.xaml.cs b/samples/ControlGallery/Pages/ProgressPage.xaml.cs
new file mode 100644
index 0000000..651b06d
--- /dev/null
+++ b/samples/ControlGallery/Pages/ProgressPage.xaml.cs
@@ -0,0 +1,33 @@
+namespace ControlGallery.Pages;
+
+public partial class ProgressPage : ContentPage
+{
+ public ProgressPage()
+ {
+ InitializeComponent();
+ }
+
+ private void OnProgress0(object sender, EventArgs e) => DemoProgress.Progress = 0;
+ private void OnProgress50(object sender, EventArgs e) => DemoProgress.Progress = 0.5;
+ private void OnProgress100(object sender, EventArgs e) => DemoProgress.Progress = 1.0;
+
+ private void OnStartIndicator(object sender, EventArgs e) => ControlledIndicator.IsRunning = true;
+ private void OnStopIndicator(object sender, EventArgs e) => ControlledIndicator.IsRunning = false;
+
+ private async void OnAnimateProgress(object sender, EventArgs e)
+ {
+ AnimatedProgress.Progress = 0;
+ await AnimatedProgress.ProgressTo(1.0, 2000, Easing.Linear);
+ }
+
+ private async void OnShowLoading(object sender, EventArgs e)
+ {
+ ContentPanel.IsVisible = false;
+ LoadingPanel.IsVisible = true;
+
+ await Task.Delay(2000);
+
+ LoadingPanel.IsVisible = false;
+ ContentPanel.IsVisible = true;
+ }
+}
diff --git a/samples/ControlGallery/Pages/RefreshViewPage.xaml b/samples/ControlGallery/Pages/RefreshViewPage.xaml
new file mode 100644
index 0000000..212b499
--- /dev/null
+++ b/samples/ControlGallery/Pages/RefreshViewPage.xaml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/RefreshViewPage.xaml.cs b/samples/ControlGallery/Pages/RefreshViewPage.xaml.cs
new file mode 100644
index 0000000..30d77c9
--- /dev/null
+++ b/samples/ControlGallery/Pages/RefreshViewPage.xaml.cs
@@ -0,0 +1,48 @@
+namespace ControlGallery.Pages;
+
+public partial class RefreshViewPage : ContentPage
+{
+ private readonly Random _random = new();
+ private readonly string[] _headlines = new[]
+ {
+ "OpenMaui 1.0 Released!",
+ "Linux Desktop Apps Made Easy",
+ "SkiaSharp Powers Modern UIs",
+ "Cross-Platform Development Grows",
+ ".NET 9 Performance Boost",
+ "XAML Hot Reload Coming Soon",
+ "Wayland Support Expanding",
+ "Community Contributions Welcome",
+ "New Controls Added Weekly",
+ "Accessibility Features Improved"
+ };
+
+ public RefreshViewPage()
+ {
+ InitializeComponent();
+ UpdateNews();
+ }
+
+ private async void OnRefreshing(object sender, EventArgs e)
+ {
+ // Simulate network delay
+ await Task.Delay(1500);
+
+ UpdateNews();
+ LastRefreshLabel.Text = $"Last refreshed: {DateTime.Now:HH:mm:ss}";
+
+ RefreshContainer.IsRefreshing = false;
+ }
+
+ private void OnManualRefreshClicked(object sender, EventArgs e)
+ {
+ RefreshContainer.IsRefreshing = true;
+ }
+
+ private void UpdateNews()
+ {
+ NewsItem1.Text = _headlines[_random.Next(_headlines.Length)];
+ NewsItem2.Text = _headlines[_random.Next(_headlines.Length)];
+ NewsItem3.Text = _headlines[_random.Next(_headlines.Length)];
+ }
+}
diff --git a/samples/ControlGallery/Pages/SlidersPage.xaml b/samples/ControlGallery/Pages/SlidersPage.xaml
new file mode 100644
index 0000000..148c33b
--- /dev/null
+++ b/samples/ControlGallery/Pages/SlidersPage.xaml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/SlidersPage.xaml.cs b/samples/ControlGallery/Pages/SlidersPage.xaml.cs
new file mode 100644
index 0000000..c78c867
--- /dev/null
+++ b/samples/ControlGallery/Pages/SlidersPage.xaml.cs
@@ -0,0 +1,30 @@
+namespace ControlGallery.Pages;
+
+public partial class SlidersPage : ContentPage
+{
+ public SlidersPage()
+ {
+ InitializeComponent();
+ }
+
+ private void OnSliderValueChanged(object sender, ValueChangedEventArgs e)
+ {
+ SliderValueLabel.Text = $"Value: {e.NewValue:F0}";
+ }
+
+ private void OnStepperValueChanged(object sender, ValueChangedEventArgs e)
+ {
+ StepperValueLabel.Text = $"Value: {e.NewValue:F0}";
+ }
+
+ private void OnDecimalStepperValueChanged(object sender, ValueChangedEventArgs e)
+ {
+ DecimalStepperLabel.Text = $"Value: {e.NewValue:F1}";
+ }
+
+ private void OnSizeSliderChanged(object sender, ValueChangedEventArgs e)
+ {
+ DemoBox.WidthRequest = e.NewValue;
+ DemoBox.HeightRequest = e.NewValue;
+ }
+}
diff --git a/samples/ControlGallery/Pages/SwipeViewPage.xaml b/samples/ControlGallery/Pages/SwipeViewPage.xaml
new file mode 100644
index 0000000..0fa0a4e
--- /dev/null
+++ b/samples/ControlGallery/Pages/SwipeViewPage.xaml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/SwipeViewPage.xaml.cs b/samples/ControlGallery/Pages/SwipeViewPage.xaml.cs
new file mode 100644
index 0000000..a162a34
--- /dev/null
+++ b/samples/ControlGallery/Pages/SwipeViewPage.xaml.cs
@@ -0,0 +1,34 @@
+namespace ControlGallery.Pages;
+
+public partial class SwipeViewPage : ContentPage
+{
+ public SwipeViewPage()
+ {
+ InitializeComponent();
+ }
+
+ private async void OnDeleteInvoked(object sender, EventArgs e)
+ {
+ await DisplayAlert("Delete", "Item would be deleted", "OK");
+ }
+
+ private async void OnArchiveInvoked(object sender, EventArgs e)
+ {
+ await DisplayAlert("Archive", "Item would be archived", "OK");
+ }
+
+ private async void OnFavoriteInvoked(object sender, EventArgs e)
+ {
+ await DisplayAlert("Favorite", "Item added to favorites", "OK");
+ }
+
+ private async void OnReplyInvoked(object sender, EventArgs e)
+ {
+ await DisplayAlert("Reply", "Opening reply composer", "OK");
+ }
+
+ private async void OnForwardInvoked(object sender, EventArgs e)
+ {
+ await DisplayAlert("Forward", "Opening forward dialog", "OK");
+ }
+}
diff --git a/samples/ControlGallery/Pages/TogglesPage.xaml b/samples/ControlGallery/Pages/TogglesPage.xaml
new file mode 100644
index 0000000..3b7d429
--- /dev/null
+++ b/samples/ControlGallery/Pages/TogglesPage.xaml
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ControlGallery/Pages/TogglesPage.xaml.cs b/samples/ControlGallery/Pages/TogglesPage.xaml.cs
new file mode 100644
index 0000000..1c9ca0f
--- /dev/null
+++ b/samples/ControlGallery/Pages/TogglesPage.xaml.cs
@@ -0,0 +1,27 @@
+namespace ControlGallery.Pages;
+
+public partial class TogglesPage : ContentPage
+{
+ public TogglesPage()
+ {
+ InitializeComponent();
+ }
+
+ private void OnCheckBoxChanged(object sender, CheckedChangedEventArgs e)
+ {
+ CheckBoxLabel.Text = e.Value ? "Agreed!" : "Not agreed";
+ }
+
+ private void OnSwitchToggled(object sender, ToggledEventArgs e)
+ {
+ SwitchLabel.Text = $"Notifications: {(e.Value ? "On" : "Off")}";
+ }
+
+ private void OnRadioButtonChecked(object sender, CheckedChangedEventArgs e)
+ {
+ if (e.Value && sender is RadioButton rb)
+ {
+ RadioLabel.Text = $"Selected: {rb.Content}";
+ }
+ }
+}
diff --git a/samples/ControlGallery/README.md b/samples/ControlGallery/README.md
new file mode 100644
index 0000000..0ddf0cc
--- /dev/null
+++ b/samples/ControlGallery/README.md
@@ -0,0 +1,41 @@
+# OpenMaui Control Gallery
+
+A comprehensive sample application demonstrating all 35+ controls available in OpenMaui for Linux.
+
+## Features
+
+This gallery showcases:
+
+- **Basic Controls**: Buttons, Labels, Entry, Editor
+- **Selection Controls**: Picker, DatePicker, TimePicker, Slider, Stepper
+- **Toggle Controls**: CheckBox, Switch, RadioButton
+- **Progress Controls**: ProgressBar, ActivityIndicator
+- **Image Controls**: Image, ImageButton with various aspect ratios
+- **Collection Controls**: CollectionView, CarouselView with IndicatorView
+- **Gesture Controls**: SwipeView, RefreshView
+
+## Running the Sample
+
+```bash
+cd samples/ControlGallery
+dotnet run
+```
+
+## Requirements
+
+- .NET 9.0 SDK
+- Linux with X11 or Wayland
+- OpenMaui.Controls.Linux NuGet package
+
+## Screenshots
+
+The gallery uses Shell navigation with a flyout menu to organize controls by category.
+
+## Adding Images
+
+Before running, add the following images to `Resources/Images/`:
+- `dotnet_bot.png` - From official MAUI templates
+
+## License
+
+MIT License - Copyright 2025 MarketAlly LLC
diff --git a/samples/ControlGallery/Resources/Fonts/.gitkeep b/samples/ControlGallery/Resources/Fonts/.gitkeep
new file mode 100644
index 0000000..d41856e
--- /dev/null
+++ b/samples/ControlGallery/Resources/Fonts/.gitkeep
@@ -0,0 +1,2 @@
+# Add fonts here
+# Recommended: OpenSans-Regular.ttf, OpenSans-Semibold.ttf
diff --git a/samples/ControlGallery/Resources/Images/.gitkeep b/samples/ControlGallery/Resources/Images/.gitkeep
new file mode 100644
index 0000000..29e3f93
--- /dev/null
+++ b/samples/ControlGallery/Resources/Images/.gitkeep
@@ -0,0 +1,2 @@
+# Add images here
+# Required: dotnet_bot.png
diff --git a/templates/openmaui-linux-xaml-app/Resources/Images/README.md b/templates/openmaui-linux-xaml-app/Resources/Images/README.md
new file mode 100644
index 0000000..bfb18f4
--- /dev/null
+++ b/templates/openmaui-linux-xaml-app/Resources/Images/README.md
@@ -0,0 +1,22 @@
+# Image Resources
+
+## Required Images
+
+### dotnet_bot.png
+Download from the official .NET MAUI repository:
+https://github.com/dotnet/maui/blob/main/src/Templates/src/templates/maui-mobile/Resources/Images/dotnet_bot.png
+
+Or use your own application icon.
+
+## Adding Images
+
+Place images in this folder and reference them in XAML:
+
+```xml
+
+```
+
+Images are automatically included via the project file:
+```xml
+
+```
diff --git a/vsix/OpenMaui.VisualStudio/Resources/README.md b/vsix/OpenMaui.VisualStudio/Resources/README.md
new file mode 100644
index 0000000..0fc08c8
--- /dev/null
+++ b/vsix/OpenMaui.VisualStudio/Resources/README.md
@@ -0,0 +1,33 @@
+# VSIX Resources
+
+## Required Images
+
+Before publishing to Visual Studio Marketplace, add these images:
+
+### Icon.png
+- Size: 128x128 pixels
+- Format: PNG with transparency
+- Use: Extension icon in VS marketplace and extension manager
+
+### Preview.png
+- Size: 200x200 pixels (or larger, will be scaled)
+- Format: PNG
+- Use: Preview image in extension manager
+
+## Recommended Design
+
+Use the OpenMaui logo with Linux penguin integration:
+- Purple/blue gradient (#512BD4 to #7B68EE)
+- Clean, modern design
+- Recognizable at small sizes
+
+## Generating Icons
+
+You can use tools like:
+- Figma
+- Adobe Illustrator
+- Inkscape (open source)
+
+Or commission from a designer on:
+- Fiverr
+- 99designs