diff --git a/samples/ShellDemo/App.xaml b/samples/ShellDemo/App.xaml
new file mode 100644
index 0000000..bfb7819
--- /dev/null
+++ b/samples/ShellDemo/App.xaml
@@ -0,0 +1,31 @@
+
+
+
+
+
+ #03A9F4
+ #0288D1
+
+
+ #4CAF50
+ #FF9800
+ #F44336
+ #9C27B0
+ #673AB7
+
+
+ #F5F5F5
+ #FFFFFF
+ #E1F5FE
+
+
+ #212121
+ #757575
+
+
+ #E0E0E0
+
+
+
diff --git a/samples/ShellDemo/App.xaml.cs b/samples/ShellDemo/App.xaml.cs
new file mode 100644
index 0000000..f909838
--- /dev/null
+++ b/samples/ShellDemo/App.xaml.cs
@@ -0,0 +1,12 @@
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo;
+
+public partial class App : Application
+{
+ public App()
+ {
+ InitializeComponent();
+ MainPage = new AppShell();
+ }
+}
diff --git a/samples/ShellDemo/AppShell.xaml b/samples/ShellDemo/AppShell.xaml
new file mode 100644
index 0000000..797f8b1
--- /dev/null
+++ b/samples/ShellDemo/AppShell.xaml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/AppShell.xaml.cs b/samples/ShellDemo/AppShell.xaml.cs
new file mode 100644
index 0000000..70345c2
--- /dev/null
+++ b/samples/ShellDemo/AppShell.xaml.cs
@@ -0,0 +1,12 @@
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo;
+
+public partial class AppShell : Shell
+{
+ public AppShell()
+ {
+ InitializeComponent();
+ Routing.RegisterRoute("detail", typeof(Pages.DetailPage));
+ }
+}
diff --git a/samples/ShellDemo/MauiProgram.cs b/samples/ShellDemo/MauiProgram.cs
new file mode 100644
index 0000000..396b6d6
--- /dev/null
+++ b/samples/ShellDemo/MauiProgram.cs
@@ -0,0 +1,24 @@
+using Microsoft.Maui;
+using Microsoft.Maui.Controls.Hosting;
+using Microsoft.Maui.Hosting;
+using Microsoft.Maui.Platform.Linux.Hosting;
+
+namespace ShellDemo;
+
+public static class MauiProgram
+{
+ public static MauiApp CreateMauiApp()
+ {
+ var builder = MauiApp.CreateBuilder();
+ builder
+ .UseMauiApp()
+ .UseLinuxPlatform()
+ .ConfigureFonts(fonts =>
+ {
+ fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
+ fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
+ });
+
+ return builder.Build();
+ }
+}
diff --git a/samples/ShellDemo/Pages/AboutPage.xaml b/samples/ShellDemo/Pages/AboutPage.xaml
new file mode 100644
index 0000000..56e8e2b
--- /dev/null
+++ b/samples/ShellDemo/Pages/AboutPage.xaml
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/AboutPage.xaml.cs b/samples/ShellDemo/Pages/AboutPage.xaml.cs
new file mode 100644
index 0000000..c769347
--- /dev/null
+++ b/samples/ShellDemo/Pages/AboutPage.xaml.cs
@@ -0,0 +1,11 @@
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo.Pages;
+
+public partial class AboutPage : ContentPage
+{
+ public AboutPage()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/samples/ShellDemo/Pages/ButtonsPage.xaml b/samples/ShellDemo/Pages/ButtonsPage.xaml
new file mode 100644
index 0000000..334b191
--- /dev/null
+++ b/samples/ShellDemo/Pages/ButtonsPage.xaml
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/ButtonsPage.xaml.cs b/samples/ShellDemo/Pages/ButtonsPage.xaml.cs
new file mode 100644
index 0000000..3e64c22
--- /dev/null
+++ b/samples/ShellDemo/Pages/ButtonsPage.xaml.cs
@@ -0,0 +1,93 @@
+using System;
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo.Pages;
+
+public partial class ButtonsPage : ContentPage
+{
+ private int _eventCount = 0;
+
+ public ButtonsPage()
+ {
+ InitializeComponent();
+ }
+
+ private void LogEvent(string message)
+ {
+ _eventCount++;
+ var timestamp = DateTime.Now.ToString("HH:mm:ss");
+ EventLog.Text = $"[{timestamp}] {_eventCount}. {message}\n{EventLog.Text}";
+ }
+
+ private void OnDefaultButtonClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Default Button clicked");
+ }
+
+ private void OnDefaultButtonPressed(object? sender, EventArgs e)
+ {
+ LogEvent("Default Button pressed");
+ }
+
+ private void OnDefaultButtonReleased(object? sender, EventArgs e)
+ {
+ LogEvent("Default Button released");
+ }
+
+ private void OnTextButtonClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Text Button clicked");
+ }
+
+ private void OnPrimaryClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Primary button clicked");
+ }
+
+ private void OnSuccessClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Success button clicked");
+ }
+
+ private void OnWarningClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Warning button clicked");
+ }
+
+ private void OnDangerClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Danger button clicked");
+ }
+
+ private void OnPurpleClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Purple button clicked");
+ }
+
+ private void OnEnabledClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Enabled button clicked");
+ }
+
+ private void OnToggleClicked(object? sender, EventArgs e)
+ {
+ DisabledButton.IsEnabled = !DisabledButton.IsEnabled;
+ DisabledButton.Text = DisabledButton.IsEnabled ? "Now Enabled!" : "Disabled Button";
+ LogEvent($"Toggled button to: {(DisabledButton.IsEnabled ? "Enabled" : "Disabled")}");
+ }
+
+ private void OnWideClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Wide button clicked");
+ }
+
+ private void OnTallClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Tall button clicked");
+ }
+
+ private void OnRoundClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Round button clicked");
+ }
+}
diff --git a/samples/ShellDemo/Pages/DetailPage.xaml b/samples/ShellDemo/Pages/DetailPage.xaml
new file mode 100644
index 0000000..ede14b8
--- /dev/null
+++ b/samples/ShellDemo/Pages/DetailPage.xaml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/DetailPage.xaml.cs b/samples/ShellDemo/Pages/DetailPage.xaml.cs
new file mode 100644
index 0000000..e792cca
--- /dev/null
+++ b/samples/ShellDemo/Pages/DetailPage.xaml.cs
@@ -0,0 +1,34 @@
+using System;
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo.Pages;
+
+[QueryProperty(nameof(ItemName), "item")]
+public partial class DetailPage : ContentPage
+{
+ private string _itemName = "Detail Item";
+
+ public string ItemName
+ {
+ get => _itemName;
+ set
+ {
+ _itemName = value;
+ Title = $"Detail: {value}";
+ if (ItemLabel != null)
+ {
+ ItemLabel.Text = $"You navigated to: {value}";
+ }
+ }
+ }
+
+ public DetailPage()
+ {
+ InitializeComponent();
+ }
+
+ private async void OnGoBackClicked(object? sender, EventArgs e)
+ {
+ await Shell.Current.GoToAsync("..");
+ }
+}
diff --git a/samples/ShellDemo/Pages/GridsPage.xaml b/samples/ShellDemo/Pages/GridsPage.xaml
new file mode 100644
index 0000000..41ade25
--- /dev/null
+++ b/samples/ShellDemo/Pages/GridsPage.xaml
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/GridsPage.xaml.cs b/samples/ShellDemo/Pages/GridsPage.xaml.cs
new file mode 100644
index 0000000..47c8a26
--- /dev/null
+++ b/samples/ShellDemo/Pages/GridsPage.xaml.cs
@@ -0,0 +1,11 @@
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo.Pages;
+
+public partial class GridsPage : ContentPage
+{
+ public GridsPage()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/samples/ShellDemo/Pages/HomePage.xaml b/samples/ShellDemo/Pages/HomePage.xaml
new file mode 100644
index 0000000..caee409
--- /dev/null
+++ b/samples/ShellDemo/Pages/HomePage.xaml
@@ -0,0 +1,257 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/HomePage.xaml.cs b/samples/ShellDemo/Pages/HomePage.xaml.cs
new file mode 100644
index 0000000..cd2f175
--- /dev/null
+++ b/samples/ShellDemo/Pages/HomePage.xaml.cs
@@ -0,0 +1,62 @@
+using System;
+using Microsoft.Maui.ApplicationModel;
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo.Pages;
+
+public partial class HomePage : ContentPage
+{
+ public HomePage()
+ {
+ InitializeComponent();
+ ThemeSwitch.IsToggled = Application.Current?.UserAppTheme == AppTheme.Dark;
+ }
+
+ private void OnThemeToggled(object? sender, ToggledEventArgs e)
+ {
+ if (Application.Current != null)
+ {
+ Application.Current.UserAppTheme = e.Value ? AppTheme.Dark : AppTheme.Light;
+ }
+ }
+
+ private async void OnButtonsCardTapped(object? sender, TappedEventArgs e)
+ {
+ await Shell.Current.GoToAsync("//Buttons");
+ }
+
+ private async void OnTextInputCardTapped(object? sender, TappedEventArgs e)
+ {
+ await Shell.Current.GoToAsync("//TextInput");
+ }
+
+ private async void OnSelectionCardTapped(object? sender, TappedEventArgs e)
+ {
+ await Shell.Current.GoToAsync("//Selection");
+ }
+
+ private async void OnPickersCardTapped(object? sender, TappedEventArgs e)
+ {
+ await Shell.Current.GoToAsync("//Pickers");
+ }
+
+ private async void OnListsCardTapped(object? sender, TappedEventArgs e)
+ {
+ await Shell.Current.GoToAsync("//Lists");
+ }
+
+ private async void OnProgressCardTapped(object? sender, TappedEventArgs e)
+ {
+ await Shell.Current.GoToAsync("//Progress");
+ }
+
+ private async void OnTryButtonsClicked(object? sender, EventArgs e)
+ {
+ await Shell.Current.GoToAsync("//Buttons");
+ }
+
+ private async void OnTryListsClicked(object? sender, EventArgs e)
+ {
+ await Shell.Current.GoToAsync("//Lists");
+ }
+}
diff --git a/samples/ShellDemo/Pages/ListsPage.xaml b/samples/ShellDemo/Pages/ListsPage.xaml
new file mode 100644
index 0000000..59c0cae
--- /dev/null
+++ b/samples/ShellDemo/Pages/ListsPage.xaml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/ListsPage.xaml.cs b/samples/ShellDemo/Pages/ListsPage.xaml.cs
new file mode 100644
index 0000000..b5cd5d5
--- /dev/null
+++ b/samples/ShellDemo/Pages/ListsPage.xaml.cs
@@ -0,0 +1,116 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo.Pages;
+
+public partial class ListsPage : ContentPage
+{
+ private int _eventCount = 0;
+
+ public ListsPage()
+ {
+ InitializeComponent();
+ LoadData();
+ }
+
+ private void LoadData()
+ {
+ // Fruits
+ var fruits = new List
+ {
+ "Apple", "Banana", "Cherry", "Date", "Elderberry",
+ "Fig", "Grape", "Honeydew", "Kiwi", "Lemon",
+ "Mango", "Nectarine", "Orange", "Papaya", "Quince"
+ };
+ FruitsCollectionView.ItemsSource = fruits;
+
+ // Colors
+ var colors = new List
+ {
+ new("Red", "#F44336"),
+ new("Pink", "#E91E63"),
+ new("Purple", "#9C27B0"),
+ new("Deep Purple", "#673AB7"),
+ new("Indigo", "#3F51B5"),
+ new("Blue", "#2196F3"),
+ new("Cyan", "#00BCD4"),
+ new("Teal", "#009688"),
+ new("Green", "#4CAF50"),
+ new("Light Green", "#8BC34A"),
+ new("Lime", "#CDDC39"),
+ new("Yellow", "#FFEB3B"),
+ new("Amber", "#FFC107"),
+ new("Orange", "#FF9800"),
+ new("Deep Orange", "#FF5722")
+ };
+ ColorsCollectionView.ItemsSource = colors;
+
+ // Contacts
+ var contacts = new List
+ {
+ new("Alice Johnson", "alice@example.com", "Engineering"),
+ new("Bob Smith", "bob@example.com", "Marketing"),
+ new("Carol Williams", "carol@example.com", "Design"),
+ new("David Brown", "david@example.com", "Sales"),
+ new("Eva Martinez", "eva@example.com", "Engineering"),
+ new("Frank Lee", "frank@example.com", "Support"),
+ new("Grace Kim", "grace@example.com", "HR"),
+ new("Henry Wilson", "henry@example.com", "Finance")
+ };
+ ContactsCollectionView.ItemsSource = contacts;
+ }
+
+ private void LogEvent(string message)
+ {
+ _eventCount++;
+ var timestamp = DateTime.Now.ToString("HH:mm:ss");
+ EventLog.Text = $"[{timestamp}] {_eventCount}. {message}\n{EventLog.Text}";
+ }
+
+ private void OnFruitSelected(object? sender, SelectionChangedEventArgs e)
+ {
+ if (e.CurrentSelection.Count > 0)
+ {
+ var item = e.CurrentSelection[0]?.ToString();
+ FruitSelectedLabel.Text = $"Selected: {item}";
+ LogEvent($"Fruit selected: {item}");
+ }
+ }
+
+ private void OnColorSelected(object? sender, SelectionChangedEventArgs e)
+ {
+ if (e.CurrentSelection.Count > 0 && e.CurrentSelection[0] is ColorItem item)
+ {
+ LogEvent($"Color selected: {item.Name} ({item.Hex})");
+ }
+ }
+
+ private void OnContactSelected(object? sender, SelectionChangedEventArgs e)
+ {
+ if (e.CurrentSelection.Count > 0 && e.CurrentSelection[0] is ContactItem contact)
+ {
+ LogEvent($"Contact: {contact.Name} - {contact.Department}");
+ }
+ }
+
+ private void OnAddContactClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Add contact clicked");
+ }
+
+ private void OnDeleteContactClicked(object? sender, EventArgs e)
+ {
+ LogEvent("Delete contact clicked");
+ }
+}
+
+public record ColorItem(string Name, string Hex)
+{
+ public override string ToString() => Name;
+}
+
+public record ContactItem(string Name, string Email, string Department)
+{
+ public override string ToString() => $"{Name} ({Department})";
+}
diff --git a/samples/ShellDemo/Pages/PickersPage.xaml b/samples/ShellDemo/Pages/PickersPage.xaml
new file mode 100644
index 0000000..fe57ae8
--- /dev/null
+++ b/samples/ShellDemo/Pages/PickersPage.xaml
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Apple
+ Banana
+ Cherry
+ Date
+ Elderberry
+ Fig
+ Grape
+
+
+
+
+
+
+
+
+
+ Red
+ Green
+ Blue
+ Yellow
+ Purple
+
+
+
+
+
+
+
+
+ Small
+ Medium
+ Large
+ Extra Large
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/PickersPage.xaml.cs b/samples/ShellDemo/Pages/PickersPage.xaml.cs
new file mode 100644
index 0000000..7cd87cd
--- /dev/null
+++ b/samples/ShellDemo/Pages/PickersPage.xaml.cs
@@ -0,0 +1,92 @@
+using System;
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo.Pages;
+
+public partial class PickersPage : ContentPage
+{
+ private int _eventCount = 0;
+
+ public PickersPage()
+ {
+ InitializeComponent();
+
+ // Set date range for the range picker
+ var startOfMonth = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
+ var endOfMonth = startOfMonth.AddMonths(1).AddDays(-1);
+ RangeDatePicker.MinimumDate = startOfMonth;
+ RangeDatePicker.MaximumDate = endOfMonth;
+ }
+
+ private void LogEvent(string message)
+ {
+ _eventCount++;
+ var timestamp = DateTime.Now.ToString("HH:mm:ss");
+ EventLog.Text = $"[{timestamp}] {_eventCount}. {message}\n{EventLog.Text}";
+ }
+
+ private void OnFruitPickerChanged(object? sender, EventArgs e)
+ {
+ if (FruitPicker.SelectedIndex >= 0)
+ {
+ var item = FruitPicker.ItemsSource[FruitPicker.SelectedIndex]?.ToString();
+ FruitSelectedLabel.Text = $"Selected: {item}";
+ LogEvent($"Fruit selected: {item}");
+ }
+ }
+
+ private void OnColorPickerChanged(object? sender, EventArgs e)
+ {
+ if (ColorPicker.SelectedIndex >= 0)
+ {
+ LogEvent($"Color selected: {ColorPicker.ItemsSource[ColorPicker.SelectedIndex]}");
+ }
+ }
+
+ private void OnSizePickerChanged(object? sender, EventArgs e)
+ {
+ if (sender is Picker picker && picker.SelectedIndex >= 0)
+ {
+ LogEvent($"Size selected: {picker.ItemsSource[picker.SelectedIndex]}");
+ }
+ }
+
+ private void OnDateSelected(object? sender, DateChangedEventArgs e)
+ {
+ DateSelectedLabel.Text = $"Selected: {e.NewDate:d}";
+ LogEvent($"Date selected: {e.NewDate:d}");
+ }
+
+ private void OnRangeDateSelected(object? sender, DateChangedEventArgs e)
+ {
+ LogEvent($"Date (limited): {e.NewDate:d}");
+ }
+
+ private void OnStyledDateSelected(object? sender, DateChangedEventArgs e)
+ {
+ LogEvent($"Styled date: {e.NewDate:d}");
+ }
+
+ private void OnTimeChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
+ {
+ if (e.PropertyName == nameof(TimePicker.Time))
+ {
+ var time = BasicTimePicker.Time;
+ TimeSelectedLabel.Text = $"Selected: {time:hh\\:mm}";
+ LogEvent($"Time selected: {time:hh\\:mm}");
+ }
+ }
+
+ private void OnStyledTimeChanged(object? sender, System.ComponentModel.PropertyChangedEventArgs e)
+ {
+ if (e.PropertyName == nameof(TimePicker.Time) && sender is TimePicker picker)
+ {
+ LogEvent($"Styled time: {picker.Time:hh\\:mm}");
+ }
+ }
+
+ private void OnSetAlarmClicked(object? sender, EventArgs e)
+ {
+ LogEvent($"Alarm set for {AlarmTimePicker.Time:hh\\:mm}");
+ }
+}
diff --git a/samples/ShellDemo/Pages/ProgressPage.xaml b/samples/ShellDemo/Pages/ProgressPage.xaml
new file mode 100644
index 0000000..6be0c4c
--- /dev/null
+++ b/samples/ShellDemo/Pages/ProgressPage.xaml
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/ProgressPage.xaml.cs b/samples/ShellDemo/Pages/ProgressPage.xaml.cs
new file mode 100644
index 0000000..0d245cb
--- /dev/null
+++ b/samples/ShellDemo/Pages/ProgressPage.xaml.cs
@@ -0,0 +1,84 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo.Pages;
+
+public partial class ProgressPage : ContentPage
+{
+ private int _eventCount = 0;
+ private bool _isAnimating = false;
+
+ public ProgressPage()
+ {
+ InitializeComponent();
+ }
+
+ private void LogEvent(string message)
+ {
+ _eventCount++;
+ var timestamp = DateTime.Now.ToString("HH:mm:ss");
+ EventLog.Text = $"[{timestamp}] {_eventCount}. {message}\n{EventLog.Text}";
+ }
+
+ private void OnToggleIndicatorClicked(object? sender, EventArgs e)
+ {
+ ToggleIndicator.IsRunning = !ToggleIndicator.IsRunning;
+ LogEvent($"ActivityIndicator: {(ToggleIndicator.IsRunning ? "Started" : "Stopped")}");
+ }
+
+ private void OnProgressSliderChanged(object? sender, ValueChangedEventArgs e)
+ {
+ var value = e.NewValue / 100.0;
+ AnimatedProgress.Progress = value;
+ ProgressLabel.Text = $"Progress: {e.NewValue:0}%";
+ }
+
+ private void OnResetClicked(object? sender, EventArgs e)
+ {
+ AnimatedProgress.Progress = 0;
+ ProgressSlider.Value = 0;
+ LogEvent("Progress reset to 0%");
+ }
+
+ private async void OnAnimateClicked(object? sender, EventArgs e)
+ {
+ if (_isAnimating) return;
+ _isAnimating = true;
+ LogEvent("Animation started");
+
+ for (int i = (int)ProgressSlider.Value; i <= 100; i += 5)
+ {
+ AnimatedProgress.Progress = i / 100.0;
+ ProgressSlider.Value = i;
+ await Task.Delay(100);
+ }
+
+ _isAnimating = false;
+ LogEvent("Animation completed");
+ }
+
+ private async void OnSimulateClicked(object? sender, EventArgs e)
+ {
+ if (_isAnimating) return;
+ _isAnimating = true;
+ LogEvent("Download simulation started");
+
+ AnimatedProgress.Progress = 0;
+ ProgressSlider.Value = 0;
+
+ var random = new Random();
+ double progress = 0;
+ while (progress < 1.0)
+ {
+ progress += random.NextDouble() * 0.1;
+ if (progress > 1.0) progress = 1.0;
+ AnimatedProgress.Progress = progress;
+ ProgressSlider.Value = progress * 100;
+ await Task.Delay(200 + random.Next(300));
+ }
+
+ _isAnimating = false;
+ LogEvent("Download simulation completed");
+ }
+}
diff --git a/samples/ShellDemo/Pages/SelectionPage.xaml b/samples/ShellDemo/Pages/SelectionPage.xaml
new file mode 100644
index 0000000..d9243cd
--- /dev/null
+++ b/samples/ShellDemo/Pages/SelectionPage.xaml
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/SelectionPage.xaml.cs b/samples/ShellDemo/Pages/SelectionPage.xaml.cs
new file mode 100644
index 0000000..179f1ec
--- /dev/null
+++ b/samples/ShellDemo/Pages/SelectionPage.xaml.cs
@@ -0,0 +1,70 @@
+using System;
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo.Pages;
+
+public partial class SelectionPage : ContentPage
+{
+ private int _eventCount = 0;
+
+ public SelectionPage()
+ {
+ InitializeComponent();
+ }
+
+ private void LogEvent(string message)
+ {
+ _eventCount++;
+ var timestamp = DateTime.Now.ToString("HH:mm:ss");
+ EventLog.Text = $"[{timestamp}] {_eventCount}. {message}\n{EventLog.Text}";
+ }
+
+ private void OnCheckbox1Changed(object? sender, CheckedChangedEventArgs e)
+ {
+ LogEvent($"Checkbox 1: {(e.Value ? "Checked" : "Unchecked")}");
+ }
+
+ private void OnCheckbox2Changed(object? sender, CheckedChangedEventArgs e)
+ {
+ LogEvent($"Checkbox 2: {(e.Value ? "Checked" : "Unchecked")}");
+ }
+
+ private void OnColoredCheckboxChanged(object? sender, CheckedChangedEventArgs e)
+ {
+ if (sender is CheckBox cb)
+ {
+ LogEvent($"{cb.Color} checkbox: {(e.Value ? "Checked" : "Unchecked")}");
+ }
+ }
+
+ private void OnBasicSwitchToggled(object? sender, ToggledEventArgs e)
+ {
+ SwitchStatusLabel.Text = e.Value ? "On" : "Off";
+ LogEvent($"Switch toggled: {(e.Value ? "ON" : "OFF")}");
+ }
+
+ private void OnColoredSwitchToggled(object? sender, ToggledEventArgs e)
+ {
+ if (sender is Switch sw)
+ {
+ LogEvent($"{sw.OnColor} switch: {(e.Value ? "ON" : "OFF")}");
+ }
+ }
+
+ private void OnBasicSliderChanged(object? sender, ValueChangedEventArgs e)
+ {
+ SliderValueLabel.Text = $"Value: {(int)e.NewValue}";
+ LogEvent($"Slider value: {(int)e.NewValue}");
+ }
+
+ private void OnTempSliderChanged(object? sender, ValueChangedEventArgs e)
+ {
+ TempLabel.Text = $"{(int)e.NewValue}C";
+ LogEvent($"Temperature: {(int)e.NewValue}C");
+ }
+
+ private void OnColoredSliderChanged(object? sender, ValueChangedEventArgs e)
+ {
+ LogEvent($"Colored slider: {(int)e.NewValue}");
+ }
+}
diff --git a/samples/ShellDemo/Pages/TextInputPage.xaml b/samples/ShellDemo/Pages/TextInputPage.xaml
new file mode 100644
index 0000000..a9880a2
--- /dev/null
+++ b/samples/ShellDemo/Pages/TextInputPage.xaml
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/TextInputPage.xaml.cs b/samples/ShellDemo/Pages/TextInputPage.xaml.cs
new file mode 100644
index 0000000..3d14f71
--- /dev/null
+++ b/samples/ShellDemo/Pages/TextInputPage.xaml.cs
@@ -0,0 +1,33 @@
+using System;
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo.Pages;
+
+public partial class TextInputPage : ContentPage
+{
+ public TextInputPage()
+ {
+ InitializeComponent();
+ }
+
+ private void OnNameEntryTextChanged(object? sender, TextChangedEventArgs e)
+ {
+ EntryOutput.Text = $"You typed: {e.NewTextValue}";
+ }
+
+ private void OnSearchTextChanged(object? sender, TextChangedEventArgs e)
+ {
+ SearchOutput.Text = $"Searching: {e.NewTextValue}";
+ }
+
+ private void OnSearchButtonPressed(object? sender, EventArgs e)
+ {
+ SearchOutput.Text = $"Search submitted: {DemoSearchBar.Text}";
+ }
+
+ private void OnEditorTextChanged(object? sender, TextChangedEventArgs e)
+ {
+ var lineCount = string.IsNullOrEmpty(e.NewTextValue) ? 0 : e.NewTextValue.Split('\n').Length;
+ EditorOutput.Text = $"Lines: {lineCount}, Characters: {e.NewTextValue?.Length ?? 0}";
+ }
+}
diff --git a/samples/ShellDemo/Program.cs b/samples/ShellDemo/Program.cs
new file mode 100644
index 0000000..6566a91
--- /dev/null
+++ b/samples/ShellDemo/Program.cs
@@ -0,0 +1,12 @@
+using Microsoft.Maui.Platform.Linux.Hosting;
+
+namespace ShellDemo;
+
+public class Program
+{
+ [STAThread]
+ public static void Main(string[] args)
+ {
+ LinuxProgramHost.Run(args, MauiProgram.CreateMauiApp);
+ }
+}
diff --git a/samples/ShellDemo/ShellDemo.csproj b/samples/ShellDemo/ShellDemo.csproj
new file mode 100644
index 0000000..6dd1672
--- /dev/null
+++ b/samples/ShellDemo/ShellDemo.csproj
@@ -0,0 +1,20 @@
+
+
+
+ net9.0
+ Exe
+ ShellDemo
+ enable
+ enable
+ true
+ OpenMaui Controls Demo
+ com.openmaui.shelldemo
+ 1.0
+ 9.0
+
+
+
+
+
+
+