diff --git a/samples/ShellDemo/AppShell.xaml b/samples/ShellDemo/AppShell.xaml
index 797f8b1..7f15c70 100644
--- a/samples/ShellDemo/AppShell.xaml
+++ b/samples/ShellDemo/AppShell.xaml
@@ -41,6 +41,14 @@
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/DialogsPage.xaml b/samples/ShellDemo/Pages/DialogsPage.xaml
new file mode 100644
index 0000000..b634412
--- /dev/null
+++ b/samples/ShellDemo/Pages/DialogsPage.xaml
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/DialogsPage.xaml.cs b/samples/ShellDemo/Pages/DialogsPage.xaml.cs
new file mode 100644
index 0000000..fe1feaf
--- /dev/null
+++ b/samples/ShellDemo/Pages/DialogsPage.xaml.cs
@@ -0,0 +1,165 @@
+using System;
+using Microsoft.Maui.Controls;
+using Microsoft.Maui.Storage;
+
+namespace ShellDemo.Pages;
+
+public partial class DialogsPage : ContentPage
+{
+ private int _eventCount = 0;
+
+ public DialogsPage()
+ {
+ InitializeComponent();
+ }
+
+ private void LogEvent(string message)
+ {
+ _eventCount++;
+ var timestamp = DateTime.Now.ToString("HH:mm:ss");
+ EventLog.Text = $"[{timestamp}] {_eventCount}. {message}\n{EventLog.Text}";
+ }
+
+ // Alert Dialogs
+ private async void OnSimpleAlertClicked(object? sender, EventArgs e)
+ {
+ await DisplayAlert("Information", "This is a simple alert dialog.", "OK");
+ AlertResultLabel.Text = "Result: Alert dismissed";
+ LogEvent("Simple alert shown");
+ }
+
+ private async void OnConfirmationClicked(object? sender, EventArgs e)
+ {
+ bool answer = await DisplayAlert("Confirm", "Do you want to proceed with this action?", "Yes", "No");
+ AlertResultLabel.Text = $"Result: {(answer ? "Yes" : "No")}";
+ LogEvent($"Confirmation: {(answer ? "Yes" : "No")}");
+ }
+
+ // Action Sheets
+ private async void OnActionSheetClicked(object? sender, EventArgs e)
+ {
+ string action = await DisplayActionSheet("Choose an option", "Cancel", null, "Option 1", "Option 2", "Option 3");
+ ActionResultLabel.Text = $"Selection: {action ?? "None"}";
+ LogEvent($"Action sheet: {action ?? "Cancelled"}");
+ }
+
+ private async void OnDestructiveActionSheetClicked(object? sender, EventArgs e)
+ {
+ string action = await DisplayActionSheet("Danger Zone", "Cancel", "Delete Everything", "Edit", "Share", "Archive");
+ ActionResultLabel.Text = $"Selection: {action ?? "None"}";
+ LogEvent($"Destructive action: {action ?? "Cancelled"}");
+ }
+
+ // Prompts
+ private async void OnTextPromptClicked(object? sender, EventArgs e)
+ {
+ string result = await DisplayPromptAsync("Name", "What is your name?", placeholder: "Enter name");
+ PromptResultLabel.Text = $"Input: {result ?? "(cancelled)"}";
+ LogEvent($"Text prompt: {result ?? "Cancelled"}");
+ }
+
+ private async void OnNumericPromptClicked(object? sender, EventArgs e)
+ {
+ string result = await DisplayPromptAsync("Age", "Enter your age:", keyboard: Keyboard.Numeric, placeholder: "0");
+ PromptResultLabel.Text = $"Input: {result ?? "(cancelled)"}";
+ LogEvent($"Numeric prompt: {result ?? "Cancelled"}");
+ }
+
+ // File Pickers
+ private async void OnPickFileClicked(object? sender, EventArgs e)
+ {
+ try
+ {
+ var result = await FilePicker.Default.PickAsync();
+ if (result != null)
+ {
+ FileResultLabel.Text = $"Selected: {result.FileName}";
+ LogEvent($"File: {result.FileName}");
+ }
+ else
+ {
+ FileResultLabel.Text = "Selected: (cancelled)";
+ LogEvent("File picker cancelled");
+ }
+ }
+ catch (Exception ex)
+ {
+ FileResultLabel.Text = $"Error: {ex.Message}";
+ LogEvent($"File picker error: {ex.Message}");
+ }
+ }
+
+ private async void OnPickMultipleFilesClicked(object? sender, EventArgs e)
+ {
+ try
+ {
+ var results = await FilePicker.Default.PickMultipleAsync();
+ if (results != null && results.Any())
+ {
+ FileResultLabel.Text = $"Selected: {results.Count()} files";
+ LogEvent($"Multiple files: {results.Count()} selected");
+ }
+ else
+ {
+ FileResultLabel.Text = "Selected: (cancelled)";
+ LogEvent("Multiple file picker cancelled");
+ }
+ }
+ catch (Exception ex)
+ {
+ FileResultLabel.Text = $"Error: {ex.Message}";
+ LogEvent($"Multiple file picker error: {ex.Message}");
+ }
+ }
+
+ private async void OnPickImageClicked(object? sender, EventArgs e)
+ {
+ try
+ {
+ var options = new PickOptions
+ {
+ PickerTitle = "Select an image",
+ FileTypes = FilePickerFileType.Images
+ };
+ var result = await FilePicker.Default.PickAsync(options);
+ if (result != null)
+ {
+ FileResultLabel.Text = $"Selected: {result.FileName}";
+ LogEvent($"Image: {result.FileName}");
+ }
+ else
+ {
+ FileResultLabel.Text = "Selected: (cancelled)";
+ LogEvent("Image picker cancelled");
+ }
+ }
+ catch (Exception ex)
+ {
+ FileResultLabel.Text = $"Error: {ex.Message}";
+ LogEvent($"Image picker error: {ex.Message}");
+ }
+ }
+
+ private async void OnPickFolderClicked(object? sender, EventArgs e)
+ {
+ try
+ {
+ var result = await FolderPicker.Default.PickAsync();
+ if (result.IsSuccessful)
+ {
+ FileResultLabel.Text = $"Selected: {result.Folder?.Path}";
+ LogEvent($"Folder: {result.Folder?.Name}");
+ }
+ else
+ {
+ FileResultLabel.Text = "Selected: (cancelled)";
+ LogEvent("Folder picker cancelled");
+ }
+ }
+ catch (Exception ex)
+ {
+ FileResultLabel.Text = $"Error: {ex.Message}";
+ LogEvent($"Folder picker error: {ex.Message}");
+ }
+ }
+}
diff --git a/samples/ShellDemo/Pages/MoreControlsPage.xaml b/samples/ShellDemo/Pages/MoreControlsPage.xaml
new file mode 100644
index 0000000..603e20b
--- /dev/null
+++ b/samples/ShellDemo/Pages/MoreControlsPage.xaml
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/ShellDemo/Pages/MoreControlsPage.xaml.cs b/samples/ShellDemo/Pages/MoreControlsPage.xaml.cs
new file mode 100644
index 0000000..00845e9
--- /dev/null
+++ b/samples/ShellDemo/Pages/MoreControlsPage.xaml.cs
@@ -0,0 +1,131 @@
+using System;
+using Microsoft.Maui.ApplicationModel;
+using Microsoft.Maui.ApplicationModel.DataTransfer;
+using Microsoft.Maui.Controls;
+
+namespace ShellDemo.Pages;
+
+public partial class MoreControlsPage : ContentPage
+{
+ private int _eventCount = 0;
+
+ public MoreControlsPage()
+ {
+ InitializeComponent();
+ }
+
+ private void LogEvent(string message)
+ {
+ _eventCount++;
+ var timestamp = DateTime.Now.ToString("HH:mm:ss");
+ EventLog.Text = $"[{timestamp}] {_eventCount}. {message}\n{EventLog.Text}";
+ }
+
+ // Stepper
+ private void OnStepperChanged(object? sender, ValueChangedEventArgs e)
+ {
+ StepperValueLabel.Text = $"Value: {(int)e.NewValue}";
+ LogEvent($"Stepper: {(int)e.NewValue}");
+ }
+
+ private void OnCustomStepperChanged(object? sender, ValueChangedEventArgs e)
+ {
+ CustomStepperLabel.Text = $"Value: {(int)e.NewValue}";
+ LogEvent($"Custom Stepper: {(int)e.NewValue}");
+ }
+
+ // RadioButton
+ private void OnRadioChanged(object? sender, CheckedChangedEventArgs e)
+ {
+ if (e.Value && sender is RadioButton rb)
+ {
+ RadioResultLabel.Text = $"Selected: {rb.Content}";
+ LogEvent($"Size: {rb.Content}");
+ }
+ }
+
+ private void OnColorRadioChanged(object? sender, CheckedChangedEventArgs e)
+ {
+ if (e.Value && sender is RadioButton rb)
+ {
+ LogEvent($"Color: {rb.Content}");
+ }
+ }
+
+ // Clipboard
+ private async void OnCopyClicked(object? sender, EventArgs e)
+ {
+ var text = ClipboardEntry.Text;
+ if (!string.IsNullOrEmpty(text))
+ {
+ await Clipboard.Default.SetTextAsync(text);
+ ClipboardResultLabel.Text = $"Copied: {text}";
+ LogEvent($"Copied to clipboard: {text}");
+ }
+ else
+ {
+ ClipboardResultLabel.Text = "Nothing to copy";
+ LogEvent("Copy failed: empty text");
+ }
+ }
+
+ private async void OnPasteClicked(object? sender, EventArgs e)
+ {
+ if (Clipboard.Default.HasText)
+ {
+ var text = await Clipboard.Default.GetTextAsync();
+ ClipboardEntry.Text = text;
+ ClipboardResultLabel.Text = $"Pasted: {text}";
+ LogEvent($"Pasted from clipboard: {text}");
+ }
+ else
+ {
+ ClipboardResultLabel.Text = "Clipboard is empty";
+ LogEvent("Paste failed: clipboard empty");
+ }
+ }
+
+ // Share & Launcher
+ private async void OnShareTextClicked(object? sender, EventArgs e)
+ {
+ try
+ {
+ await Share.Default.RequestAsync(new ShareTextRequest
+ {
+ Text = "Check out OpenMaui Linux - .NET MAUI for Linux!",
+ Title = "Share OpenMaui"
+ });
+ LogEvent("Share dialog opened");
+ }
+ catch (Exception ex)
+ {
+ LogEvent($"Share error: {ex.Message}");
+ }
+ }
+
+ private async void OnOpenUrlClicked(object? sender, EventArgs e)
+ {
+ try
+ {
+ await Launcher.Default.OpenAsync("https://github.com/pablotoledo/OpenMaui-Linux");
+ LogEvent("Opened URL in browser");
+ }
+ catch (Exception ex)
+ {
+ LogEvent($"Launcher error: {ex.Message}");
+ }
+ }
+
+ private async void OnOpenEmailClicked(object? sender, EventArgs e)
+ {
+ try
+ {
+ await Launcher.Default.OpenAsync("mailto:info@example.com?subject=OpenMaui%20Feedback");
+ LogEvent("Opened email client");
+ }
+ catch (Exception ex)
+ {
+ LogEvent($"Email error: {ex.Message}");
+ }
+ }
+}