diff --git a/Ursa.sln b/Ursa.sln
index 51966e5..9b2953a 100644
--- a/Ursa.sln
+++ b/Ursa.sln
@@ -8,6 +8,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ursa.Themes.Semi", "src\Urs
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Demo", "Demo", "{A41BAF0D-DA61-4A63-889A-084BAD36FD66}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ursa.Demo.Android", "demo\Ursa.Demo.Android\Ursa.Demo.Android.csproj", "{3FC76CD9-CE5D-4804-A8D6-4E292EB296AA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ursa.Demo.Desktop", "demo\Ursa.Demo.Desktop\Ursa.Demo.Desktop.csproj", "{B6BAB821-A9FE-44F3-B9CD-06E27FDB63F6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ursa.Demo.iOS", "demo\Ursa.Demo.iOS\Ursa.Demo.iOS.csproj", "{94C2BBD9-8B57-4AE9-AAFD-7D4335B15A8E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ursa.Demo.Browser", "demo\Ursa.Demo.Browser\Ursa.Demo.Browser.csproj", "{D1942476-8473-4608-BB9F-5AC01083BBDA}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -26,8 +34,28 @@ Global
{53B5F277-3AEB-4661-ACAE-15CFFF2ED800}.Debug|Any CPU.Build.0 = Debug|Any CPU
{53B5F277-3AEB-4661-ACAE-15CFFF2ED800}.Release|Any CPU.ActiveCfg = Release|Any CPU
{53B5F277-3AEB-4661-ACAE-15CFFF2ED800}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3FC76CD9-CE5D-4804-A8D6-4E292EB296AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3FC76CD9-CE5D-4804-A8D6-4E292EB296AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3FC76CD9-CE5D-4804-A8D6-4E292EB296AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3FC76CD9-CE5D-4804-A8D6-4E292EB296AA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B6BAB821-A9FE-44F3-B9CD-06E27FDB63F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B6BAB821-A9FE-44F3-B9CD-06E27FDB63F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B6BAB821-A9FE-44F3-B9CD-06E27FDB63F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B6BAB821-A9FE-44F3-B9CD-06E27FDB63F6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {94C2BBD9-8B57-4AE9-AAFD-7D4335B15A8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {94C2BBD9-8B57-4AE9-AAFD-7D4335B15A8E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {94C2BBD9-8B57-4AE9-AAFD-7D4335B15A8E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {94C2BBD9-8B57-4AE9-AAFD-7D4335B15A8E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D1942476-8473-4608-BB9F-5AC01083BBDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D1942476-8473-4608-BB9F-5AC01083BBDA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D1942476-8473-4608-BB9F-5AC01083BBDA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D1942476-8473-4608-BB9F-5AC01083BBDA}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{407A91FD-A88B-459B-8DCE-8C6AA98279FE} = {A41BAF0D-DA61-4A63-889A-084BAD36FD66}
+ {3FC76CD9-CE5D-4804-A8D6-4E292EB296AA} = {A41BAF0D-DA61-4A63-889A-084BAD36FD66}
+ {B6BAB821-A9FE-44F3-B9CD-06E27FDB63F6} = {A41BAF0D-DA61-4A63-889A-084BAD36FD66}
+ {94C2BBD9-8B57-4AE9-AAFD-7D4335B15A8E} = {A41BAF0D-DA61-4A63-889A-084BAD36FD66}
+ {D1942476-8473-4608-BB9F-5AC01083BBDA} = {A41BAF0D-DA61-4A63-889A-084BAD36FD66}
EndGlobalSection
EndGlobal
diff --git a/demo/Directory.Build.props b/demo/Directory.Build.props
new file mode 100644
index 0000000..ae8bdf5
--- /dev/null
+++ b/demo/Directory.Build.props
@@ -0,0 +1,6 @@
+
+
+ enable
+ 11.0.0
+
+
diff --git a/demo/Ursa.Demo.Android/App.axaml b/demo/Ursa.Demo.Android/App.axaml
new file mode 100644
index 0000000..2b8c798
--- /dev/null
+++ b/demo/Ursa.Demo.Android/App.axaml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Ursa.Demo.Android/App.axaml.cs b/demo/Ursa.Demo.Android/App.axaml.cs
new file mode 100644
index 0000000..02e2b50
--- /dev/null
+++ b/demo/Ursa.Demo.Android/App.axaml.cs
@@ -0,0 +1,23 @@
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Markup.Xaml;
+using Ursa.Demo.Views;
+
+namespace Ursa.Demo.Android;
+
+public partial class App : Application
+{
+ public override void Initialize()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ public override void OnFrameworkInitializationCompleted()
+ {
+ if (ApplicationLifetime is ISingleViewApplicationLifetime single)
+ {
+ single.MainView = new MainWindow();
+ }
+ base.OnFrameworkInitializationCompleted();
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo.Android/Icon.png b/demo/Ursa.Demo.Android/Icon.png
new file mode 100644
index 0000000..41a2a61
Binary files /dev/null and b/demo/Ursa.Demo.Android/Icon.png differ
diff --git a/demo/Ursa.Demo.Android/MainActivity.cs b/demo/Ursa.Demo.Android/MainActivity.cs
new file mode 100644
index 0000000..2b4d4d6
--- /dev/null
+++ b/demo/Ursa.Demo.Android/MainActivity.cs
@@ -0,0 +1,20 @@
+using Android.App;
+using Android.Content.PM;
+using Avalonia;
+using Avalonia.Android;
+
+namespace Ursa.Demo.Android;
+
+[Activity(
+ Label = "Ursa.Demo.Android",
+ Theme = "@style/MyTheme.NoActionBar",
+ Icon = "@drawable/icon",
+ MainLauncher = true,
+ ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.ScreenSize | ConfigChanges.UiMode)]
+public class MainActivity : AvaloniaMainActivity
+{
+ protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
+ {
+ return base.CustomizeAppBuilder(builder);
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo.Android/Properties/AndroidManifest.xml b/demo/Ursa.Demo.Android/Properties/AndroidManifest.xml
new file mode 100644
index 0000000..a08e038
--- /dev/null
+++ b/demo/Ursa.Demo.Android/Properties/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/demo/Ursa.Demo.Android/Resources/AboutResources.txt b/demo/Ursa.Demo.Android/Resources/AboutResources.txt
new file mode 100644
index 0000000..c2bca97
--- /dev/null
+++ b/demo/Ursa.Demo.Android/Resources/AboutResources.txt
@@ -0,0 +1,44 @@
+Images, layout descriptions, binary blobs and string dictionaries can be included
+in your application as resource files. Various Android APIs are designed to
+operate on the resource IDs instead of dealing with images, strings or binary blobs
+directly.
+
+For example, a sample Android app that contains a user interface layout (main.axml),
+an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
+would keep its resources in the "Resources" directory of the application:
+
+Resources/
+ drawable/
+ icon.png
+
+ layout/
+ main.axml
+
+ values/
+ strings.xml
+
+In order to get the build system to recognize Android resources, set the build action to
+"AndroidResource". The native Android APIs do not operate directly with filenames, but
+instead operate on resource IDs. When you compile an Android application that uses resources,
+the build system will package the resources for distribution and generate a class called "R"
+(this is an Android convention) that contains the tokens for each one of the resources
+included. For example, for the above Resources layout, this is what the R class would expose:
+
+public class R {
+ public class drawable {
+ public const int icon = 0x123;
+ }
+
+ public class layout {
+ public const int main = 0x456;
+ }
+
+ public class strings {
+ public const int first_string = 0xabc;
+ public const int second_string = 0xbcd;
+ }
+}
+
+You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
+to reference the layout/main.axml file, or R.strings.first_string to reference the first
+string in the dictionary file values/strings.xml.
\ No newline at end of file
diff --git a/demo/Ursa.Demo.Android/Resources/drawable-night-v31/avalonia_anim.xml b/demo/Ursa.Demo.Android/Resources/drawable-night-v31/avalonia_anim.xml
new file mode 100644
index 0000000..dde4b5a
--- /dev/null
+++ b/demo/Ursa.Demo.Android/Resources/drawable-night-v31/avalonia_anim.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo.Android/Resources/drawable-v31/avalonia_anim.xml b/demo/Ursa.Demo.Android/Resources/drawable-v31/avalonia_anim.xml
new file mode 100644
index 0000000..94f27d9
--- /dev/null
+++ b/demo/Ursa.Demo.Android/Resources/drawable-v31/avalonia_anim.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo.Android/Resources/drawable/splash_screen.xml b/demo/Ursa.Demo.Android/Resources/drawable/splash_screen.xml
new file mode 100644
index 0000000..2e920b4
--- /dev/null
+++ b/demo/Ursa.Demo.Android/Resources/drawable/splash_screen.xml
@@ -0,0 +1,13 @@
+
+
+
+ -
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo.Android/Resources/values-night/colors.xml b/demo/Ursa.Demo.Android/Resources/values-night/colors.xml
new file mode 100644
index 0000000..3d47b6f
--- /dev/null
+++ b/demo/Ursa.Demo.Android/Resources/values-night/colors.xml
@@ -0,0 +1,4 @@
+
+
+ #212121
+
diff --git a/demo/Ursa.Demo.Android/Resources/values-v31/styles.xml b/demo/Ursa.Demo.Android/Resources/values-v31/styles.xml
new file mode 100644
index 0000000..d5ecec4
--- /dev/null
+++ b/demo/Ursa.Demo.Android/Resources/values-v31/styles.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo.Android/Resources/values/colors.xml b/demo/Ursa.Demo.Android/Resources/values/colors.xml
new file mode 100644
index 0000000..59279d5
--- /dev/null
+++ b/demo/Ursa.Demo.Android/Resources/values/colors.xml
@@ -0,0 +1,4 @@
+
+
+ #FFFFFF
+
diff --git a/demo/Ursa.Demo.Android/Resources/values/styles.xml b/demo/Ursa.Demo.Android/Resources/values/styles.xml
new file mode 100644
index 0000000..6e534de
--- /dev/null
+++ b/demo/Ursa.Demo.Android/Resources/values/styles.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo.Android/Ursa.Demo.Android.csproj b/demo/Ursa.Demo.Android/Ursa.Demo.Android.csproj
new file mode 100644
index 0000000..63059bc
--- /dev/null
+++ b/demo/Ursa.Demo.Android/Ursa.Demo.Android.csproj
@@ -0,0 +1,28 @@
+
+
+ Exe
+ net7.0-android
+ 21
+ enable
+ com.irihitech.Ursa.Demo
+ 1
+ 1.0
+ apk
+ False
+
+
+
+
+ Resources\drawable\Icon.png
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo.Browser/App.axaml b/demo/Ursa.Demo.Browser/App.axaml
new file mode 100644
index 0000000..94b6bbf
--- /dev/null
+++ b/demo/Ursa.Demo.Browser/App.axaml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Ursa.Demo.Browser/App.axaml.cs b/demo/Ursa.Demo.Browser/App.axaml.cs
new file mode 100644
index 0000000..409a54c
--- /dev/null
+++ b/demo/Ursa.Demo.Browser/App.axaml.cs
@@ -0,0 +1,23 @@
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Markup.Xaml;
+using Ursa.Demo.Views;
+
+namespace Ursa.Demo.Browser;
+
+public partial class App : Application
+{
+ public override void Initialize()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ public override void OnFrameworkInitializationCompleted()
+ {
+ if (ApplicationLifetime is ISingleViewApplicationLifetime single)
+ {
+ single.MainView = new MainWindow();
+ }
+ base.OnFrameworkInitializationCompleted();
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo.Browser/AppBundle/Logo.svg b/demo/Ursa.Demo.Browser/AppBundle/Logo.svg
new file mode 100644
index 0000000..9685a23
--- /dev/null
+++ b/demo/Ursa.Demo.Browser/AppBundle/Logo.svg
@@ -0,0 +1,5 @@
+
diff --git a/demo/Ursa.Demo.Browser/AppBundle/app.css b/demo/Ursa.Demo.Browser/AppBundle/app.css
new file mode 100644
index 0000000..a424538
--- /dev/null
+++ b/demo/Ursa.Demo.Browser/AppBundle/app.css
@@ -0,0 +1,74 @@
+:root {
+ --sat: env(safe-area-inset-top);
+ --sar: env(safe-area-inset-right);
+ --sab: env(safe-area-inset-bottom);
+ --sal: env(safe-area-inset-left);
+}
+
+/* HTML styles for the splash screen */
+
+.highlight {
+ color: white;
+ font-size: 2.5rem;
+ display: block;
+}
+
+.purple {
+ color: #8b44ac;
+}
+
+.icon {
+ opacity: 0.05;
+ height: 35%;
+ width: 35%;
+ position: absolute;
+ background-repeat: no-repeat;
+ right: 0px;
+ bottom: 0px;
+ margin-right: 3%;
+ margin-bottom: 5%;
+ z-index: 5000;
+ background-position: right bottom;
+ pointer-events: none;
+}
+
+#avalonia-splash a {
+ color: whitesmoke;
+ text-decoration: none;
+}
+
+.center {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100vh;
+}
+
+#avalonia-splash {
+ position: relative;
+ height: 100%;
+ width: 100%;
+ color: whitesmoke;
+ background: #1b2a4e;
+ font-family: 'Nunito', sans-serif;
+ background-position: center;
+ background-size: cover;
+ background-repeat: no-repeat;
+ justify-content: center;
+ align-items: center;
+}
+
+.splash-close {
+ animation: fadeout 0.25s linear forwards;
+}
+
+@keyframes fadeout {
+ 0% {
+ opacity: 100%;
+ }
+
+ 100% {
+ opacity: 0;
+ visibility: collapse;
+ }
+}
diff --git a/demo/Ursa.Demo.Browser/AppBundle/favicon.ico b/demo/Ursa.Demo.Browser/AppBundle/favicon.ico
new file mode 100644
index 0000000..da8d49f
Binary files /dev/null and b/demo/Ursa.Demo.Browser/AppBundle/favicon.ico differ
diff --git a/demo/Ursa.Demo.Browser/AppBundle/index.html b/demo/Ursa.Demo.Browser/AppBundle/index.html
new file mode 100644
index 0000000..5f6cc18
--- /dev/null
+++ b/demo/Ursa.Demo.Browser/AppBundle/index.html
@@ -0,0 +1,30 @@
+
+
+
+
+ Ursa.Demo.Browser
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
\ No newline at end of file
diff --git a/demo/Ursa.Demo.Browser/AppBundle/main.js b/demo/Ursa.Demo.Browser/AppBundle/main.js
new file mode 100644
index 0000000..0dbe2e4
--- /dev/null
+++ b/demo/Ursa.Demo.Browser/AppBundle/main.js
@@ -0,0 +1,13 @@
+import { dotnet } from './dotnet.js'
+
+const is_browser = typeof window != "undefined";
+if (!is_browser) throw new Error(`Expected to be running in a browser`);
+
+const dotnetRuntime = await dotnet
+ .withDiagnosticTracing(false)
+ .withApplicationArgumentsFromQuery()
+ .create();
+
+const config = dotnetRuntime.getConfig();
+
+await dotnetRuntime.runMainAndExit(config.mainAssemblyName, [window.location.search]);
\ No newline at end of file
diff --git a/demo/Ursa.Demo.Browser/Program.cs b/demo/Ursa.Demo.Browser/Program.cs
new file mode 100644
index 0000000..4fa7162
--- /dev/null
+++ b/demo/Ursa.Demo.Browser/Program.cs
@@ -0,0 +1,17 @@
+using System.Runtime.Versioning;
+using System.Threading.Tasks;
+using Avalonia;
+using Avalonia.Browser;
+
+[assembly: SupportedOSPlatform("browser")]
+
+namespace Ursa.Demo.Browser;
+
+internal partial class Program
+{
+ private static async Task Main(string[] args) => await BuildAvaloniaApp()
+ .StartBrowserAppAsync("out");
+
+ public static AppBuilder BuildAvaloniaApp()
+ => AppBuilder.Configure();
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo.Browser/Properties/launchSettings.json b/demo/Ursa.Demo.Browser/Properties/launchSettings.json
new file mode 100644
index 0000000..a1d7d0a
--- /dev/null
+++ b/demo/Ursa.Demo.Browser/Properties/launchSettings.json
@@ -0,0 +1,13 @@
+{
+ "profiles": {
+ "Ursa.Demo.Browser": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/debug?browser={browserInspectUri}"
+ }
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo.Browser/Ursa.Demo.Browser.csproj b/demo/Ursa.Demo.Browser/Ursa.Demo.Browser.csproj
new file mode 100644
index 0000000..f51b5fb
--- /dev/null
+++ b/demo/Ursa.Demo.Browser/Ursa.Demo.Browser.csproj
@@ -0,0 +1,20 @@
+
+
+ net7.0
+ browser-wasm
+ AppBundle\main.js
+ Exe
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo.Browser/runtimeconfig.template.json b/demo/Ursa.Demo.Browser/runtimeconfig.template.json
new file mode 100644
index 0000000..c6990ba
--- /dev/null
+++ b/demo/Ursa.Demo.Browser/runtimeconfig.template.json
@@ -0,0 +1,11 @@
+{
+ "wasmHostProperties": {
+ "perHostConfig": [
+ {
+ "name": "browser",
+ "html-path": "index.html",
+ "Host": "browser"
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo/App.axaml b/demo/Ursa.Demo.Desktop/App.axaml
similarity index 68%
rename from demo/Ursa.Demo/App.axaml
rename to demo/Ursa.Demo.Desktop/App.axaml
index e9083c2..5873771 100644
--- a/demo/Ursa.Demo/App.axaml
+++ b/demo/Ursa.Demo.Desktop/App.axaml
@@ -1,8 +1,7 @@
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
diff --git a/demo/Ursa.Demo/App.axaml.cs b/demo/Ursa.Demo.Desktop/App.axaml.cs
similarity index 90%
rename from demo/Ursa.Demo/App.axaml.cs
rename to demo/Ursa.Demo.Desktop/App.axaml.cs
index 47a67b5..66b6de0 100644
--- a/demo/Ursa.Demo/App.axaml.cs
+++ b/demo/Ursa.Demo.Desktop/App.axaml.cs
@@ -1,12 +1,10 @@
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
-using Avalonia.Data.Core;
-using Avalonia.Data.Core.Plugins;
using Avalonia.Markup.Xaml;
using Ursa.Demo.ViewModels;
using Ursa.Demo.Views;
-namespace Ursa.Demo;
+namespace Ursa.Demo.Desktop;
public partial class App : Application
{
diff --git a/demo/Ursa.Demo/Program.cs b/demo/Ursa.Demo.Desktop/Program.cs
similarity index 56%
rename from demo/Ursa.Demo/Program.cs
rename to demo/Ursa.Demo.Desktop/Program.cs
index 66ec68f..b74f9d3 100644
--- a/demo/Ursa.Demo/Program.cs
+++ b/demo/Ursa.Demo.Desktop/Program.cs
@@ -1,7 +1,9 @@
-using Avalonia;
-using System;
+using System;
+using Avalonia;
+using Avalonia.Dialogs;
+using Avalonia.Media;
-namespace Ursa.Demo;
+namespace Ursa.Demo.Desktop;
class Program
{
@@ -10,11 +12,23 @@ class Program
// yet and stuff might break.
[STAThread]
public static void Main(string[] args) => BuildAvaloniaApp()
+ .With(new FontManagerOptions
+ {
+ FontFallbacks = new[]
+ {
+ new FontFallback
+ {
+ FontFamily = new FontFamily("Microsoft YaHei")
+ }
+ }
+ })
.StartWithClassicDesktopLifetime(args);
// Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure()
+ .UseManagedSystemDialogs()
.UsePlatformDetect()
+ .With(new Win32PlatformOptions())
.LogToTrace();
}
\ No newline at end of file
diff --git a/demo/Ursa.Demo.Desktop/Ursa.Demo.Desktop.csproj b/demo/Ursa.Demo.Desktop/Ursa.Demo.Desktop.csproj
new file mode 100644
index 0000000..1ff2d0a
--- /dev/null
+++ b/demo/Ursa.Demo.Desktop/Ursa.Demo.Desktop.csproj
@@ -0,0 +1,31 @@
+
+
+ WinExe
+
+ net6.0
+ enable
+ true
+
+
+
+ app.manifest
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ App.axaml
+ Code
+
+
+
diff --git a/demo/Ursa.Demo/app.manifest b/demo/Ursa.Demo.Desktop/app.manifest
similarity index 92%
rename from demo/Ursa.Demo/app.manifest
rename to demo/Ursa.Demo.Desktop/app.manifest
index e0ce8d0..830f6a5 100644
--- a/demo/Ursa.Demo/app.manifest
+++ b/demo/Ursa.Demo.Desktop/app.manifest
@@ -3,7 +3,7 @@
-
+
diff --git a/demo/Ursa.Demo.iOS/AppDelegate.cs b/demo/Ursa.Demo.iOS/AppDelegate.cs
new file mode 100644
index 0000000..0eb6c00
--- /dev/null
+++ b/demo/Ursa.Demo.iOS/AppDelegate.cs
@@ -0,0 +1,23 @@
+using Foundation;
+using UIKit;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.iOS;
+using Avalonia.Media;
+using Avalonia.ReactiveUI;
+
+namespace Ursa.Demo.iOS;
+
+// The UIApplicationDelegate for the application. This class is responsible for launching the
+// User Interface of the application, as well as listening (and optionally responding) to
+// application events from iOS.
+[Register("AppDelegate")]
+public partial class AppDelegate : AvaloniaAppDelegate
+{
+ protected override AppBuilder CustomizeAppBuilder(AppBuilder builder)
+ {
+ return base.CustomizeAppBuilder(builder)
+ .WithInterFont()
+ .UseReactiveUI();
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo.iOS/Entitlements.plist b/demo/Ursa.Demo.iOS/Entitlements.plist
new file mode 100644
index 0000000..0c67376
--- /dev/null
+++ b/demo/Ursa.Demo.iOS/Entitlements.plist
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/demo/Ursa.Demo.iOS/Info.plist b/demo/Ursa.Demo.iOS/Info.plist
new file mode 100644
index 0000000..6ce68c9
--- /dev/null
+++ b/demo/Ursa.Demo.iOS/Info.plist
@@ -0,0 +1,47 @@
+
+
+
+
+ CFBundleDisplayName
+ Ursa.Demo
+ CFBundleIdentifier
+ companyName.Ursa.Demo
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1.0
+ LSRequiresIPhoneOS
+
+ MinimumOSVersion
+ 10.0
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIStatusBarHidden
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/demo/Ursa.Demo.iOS/Main.cs b/demo/Ursa.Demo.iOS/Main.cs
new file mode 100644
index 0000000..691c60d
--- /dev/null
+++ b/demo/Ursa.Demo.iOS/Main.cs
@@ -0,0 +1,14 @@
+using UIKit;
+
+namespace Ursa.Demo.iOS;
+
+public class Application
+{
+ // This is the main entry point of the application.
+ static void Main(string[] args)
+ {
+ // if you want to use a different Application Delegate class from "AppDelegate"
+ // you can specify it here.
+ UIApplication.Main(args, null, typeof(AppDelegate));
+ }
+}
\ No newline at end of file
diff --git a/demo/Ursa.Demo.iOS/Resources/LaunchScreen.xib b/demo/Ursa.Demo.iOS/Resources/LaunchScreen.xib
new file mode 100644
index 0000000..6e888e7
--- /dev/null
+++ b/demo/Ursa.Demo.iOS/Resources/LaunchScreen.xib
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo.iOS/Ursa.Demo.iOS.csproj b/demo/Ursa.Demo.iOS/Ursa.Demo.iOS.csproj
new file mode 100644
index 0000000..5f70ccb
--- /dev/null
+++ b/demo/Ursa.Demo.iOS/Ursa.Demo.iOS.csproj
@@ -0,0 +1,17 @@
+
+
+ Exe
+ net6.0-ios
+ 13.0
+ enable
+
+
+
+
+
+
+
+
+
+
+
diff --git a/demo/Ursa.Demo/Ursa.Demo.csproj b/demo/Ursa.Demo/Ursa.Demo.csproj
index 4181cf8..4f0188d 100644
--- a/demo/Ursa.Demo/Ursa.Demo.csproj
+++ b/demo/Ursa.Demo/Ursa.Demo.csproj
@@ -1,33 +1,29 @@
- WinExe
net6.0
enable
- true
- app.manifest
+ latest
false
-
-
+
-
+
-
-
+
-
-
-
+
+
+
-
-
+
+