diff --git a/Marechai.App/App.xaml b/Marechai.App/App.xaml
new file mode 100644
index 00000000..e430aa6d
--- /dev/null
+++ b/Marechai.App/App.xaml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Marechai.App/App.xaml.cs b/Marechai.App/App.xaml.cs
new file mode 100644
index 00000000..211a604e
--- /dev/null
+++ b/Marechai.App/App.xaml.cs
@@ -0,0 +1,114 @@
+using System.Net.Http;
+using Microsoft.UI.Xaml;
+using Uno.Extensions;
+using Uno.Extensions.Configuration;
+using Uno.Extensions.Hosting;
+using Uno.Extensions.Localization;
+using Uno.Extensions.Navigation;
+using Uno.Resizetizer;
+using Uno.UI;
+
+namespace Marechai.App;
+
+public partial class App : Application
+{
+ ///
+ /// Initializes the singleton application object. This is the first line of authored code
+ /// executed, and as such is the logical equivalent of main() or WinMain().
+ ///
+ public App()
+ {
+ this.InitializeComponent();
+ }
+
+ protected Window? MainWindow { get; private set; }
+ protected IHost? Host { get; private set; }
+
+ protected async override void OnLaunched(LaunchActivatedEventArgs args)
+ {
+ var builder = this.CreateBuilder(args)
+ // Add navigation support for toolkit controls such as TabBar and NavigationView
+ .UseToolkitNavigation()
+ .Configure(host => host
+#if DEBUG
+ // Switch to Development environment when running in DEBUG
+ .UseEnvironment(Environments.Development)
+#endif
+ .UseLogging(configure: (context, logBuilder) =>
+ {
+ // Configure log levels for different categories of logging
+ logBuilder
+ .SetMinimumLevel(
+ context.HostingEnvironment.IsDevelopment() ? LogLevel.Information : LogLevel.Warning)
+
+ // Default filters for core Uno Platform namespaces
+ .CoreLogLevel(LogLevel.Warning);
+
+ // Uno Platform namespace filter groups
+ // Uncomment individual methods to see more detailed logging
+ //// Generic Xaml events
+ //logBuilder.XamlLogLevel(LogLevel.Debug);
+ //// Layout specific messages
+ //logBuilder.XamlLayoutLogLevel(LogLevel.Debug);
+ //// Storage messages
+ //logBuilder.StorageLogLevel(LogLevel.Debug);
+ //// Binding related messages
+ //logBuilder.XamlBindingLogLevel(LogLevel.Debug);
+ //// Binder memory references tracking
+ //logBuilder.BinderMemoryReferenceLogLevel(LogLevel.Debug);
+ //// DevServer and HotReload related
+ //logBuilder.HotReloadCoreLogLevel(LogLevel.Information);
+ //// Debug JS interop
+ //logBuilder.WebAssemblyLogLevel(LogLevel.Debug);
+ }, enableUnoLogging: true)
+ .UseSerilog(consoleLoggingEnabled: true, fileLoggingEnabled: true)
+ .UseConfiguration(configure: configBuilder =>
+ configBuilder
+ .EmbeddedSource()
+ .Section()
+ )
+ // Enable localization (see appsettings.json for supported languages)
+ .UseLocalization()
+ .UseHttp((context, services) =>
+ {
+#if DEBUG
+ // DelegatingHandler will be automatically injected
+ services.AddTransient();
+#endif
+ })
+ .ConfigureServices((context, services) =>
+ {
+ // TODO: Register your services
+ //services.AddSingleton();
+ })
+ .UseNavigation(RegisterRoutes)
+ );
+ MainWindow = builder.Window;
+
+#if DEBUG
+ MainWindow.UseStudio();
+#endif
+ MainWindow.SetWindowIcon();
+
+ Host = await builder.NavigateAsync();
+ }
+
+ private static void RegisterRoutes(IViewRegistry views, IRouteRegistry routes)
+ {
+ views.Register(
+ new ViewMap(ViewModel: typeof(ShellViewModel)),
+ new ViewMap(),
+ new DataViewMap()
+ );
+
+ routes.Register(
+ new RouteMap("", View: views.FindByViewModel(),
+ Nested:
+ [
+ new("Main", View: views.FindByViewModel(), IsDefault: true),
+ new("Second", View: views.FindByViewModel()),
+ ]
+ )
+ );
+ }
+}
diff --git a/Marechai.App/Assets/Icons/icon.svg b/Marechai.App/Assets/Icons/icon.svg
new file mode 100644
index 00000000..a15af53a
--- /dev/null
+++ b/Marechai.App/Assets/Icons/icon.svg
@@ -0,0 +1,42 @@
+
+
diff --git a/Marechai.App/Assets/Icons/icon_foreground.svg b/Marechai.App/Assets/Icons/icon_foreground.svg
new file mode 100644
index 00000000..8ffc41ae
--- /dev/null
+++ b/Marechai.App/Assets/Icons/icon_foreground.svg
@@ -0,0 +1,137 @@
+
+
diff --git a/Marechai.App/Assets/SharedAssets.md b/Marechai.App/Assets/SharedAssets.md
new file mode 100644
index 00000000..b1cc4e76
--- /dev/null
+++ b/Marechai.App/Assets/SharedAssets.md
@@ -0,0 +1,32 @@
+# Shared Assets
+
+See documentation about assets here: https://github.com/unoplatform/uno/blob/master/doc/articles/features/working-with-assets.md
+
+## Here is a cheat sheet
+
+1. Add the image file to the `Assets` directory of a shared project.
+2. Set the build action to `Content`.
+3. (Recommended) Provide an asset for various scales/dpi
+
+### Examples
+
+```text
+\Assets\Images\logo.scale-100.png
+\Assets\Images\logo.scale-200.png
+\Assets\Images\logo.scale-400.png
+
+\Assets\Images\scale-100\logo.png
+\Assets\Images\scale-200\logo.png
+\Assets\Images\scale-400\logo.png
+```
+
+### Table of scales
+
+| Scale | WinUI | iOS | Android |
+|-------|:-----------:|:---------------:|:-------:|
+| `100` | scale-100 | @1x | mdpi |
+| `125` | scale-125 | N/A | N/A |
+| `150` | scale-150 | N/A | hdpi |
+| `200` | scale-200 | @2x | xhdpi |
+| `300` | scale-300 | @3x | xxhdpi |
+| `400` | scale-400 | N/A | xxxhdpi |
diff --git a/Marechai.App/Assets/Splash/splash_screen.svg b/Marechai.App/Assets/Splash/splash_screen.svg
new file mode 100644
index 00000000..8ffc41ae
--- /dev/null
+++ b/Marechai.App/Assets/Splash/splash_screen.svg
@@ -0,0 +1,137 @@
+
+
diff --git a/Marechai.App/GlobalUsings.cs b/Marechai.App/GlobalUsings.cs
new file mode 100644
index 00000000..8abee770
--- /dev/null
+++ b/Marechai.App/GlobalUsings.cs
@@ -0,0 +1,13 @@
+global using System.Collections.Immutable;
+global using Microsoft.Extensions.DependencyInjection;
+global using Microsoft.Extensions.Hosting;
+global using Microsoft.Extensions.Localization;
+global using Microsoft.Extensions.Logging;
+global using Microsoft.Extensions.Options;
+global using Marechai.App.Models;
+global using Marechai.App.Presentation;
+global using Marechai.App.Services.Endpoints;
+global using Uno.Extensions.Http.Kiota;
+global using ApplicationExecutionState = Windows.ApplicationModel.Activation.ApplicationExecutionState;
+global using CommunityToolkit.Mvvm.ComponentModel;
+global using CommunityToolkit.Mvvm.Input;
diff --git a/Marechai.App/Marechai.App.csproj b/Marechai.App/Marechai.App.csproj
new file mode 100644
index 00000000..5fedfef5
--- /dev/null
+++ b/Marechai.App/Marechai.App.csproj
@@ -0,0 +1,42 @@
+
+
+ net10.0-android;net10.0-browserwasm;net10.0-desktop
+ $(TargetFrameworks);net10.0-ios
+
+ Exe
+ true
+
+
+ Marechai.App
+
+ net.marechai.app
+
+ 1.0
+ 1
+
+ O=Marechai.App
+
+ Marechai.App powered by Uno Platform.
+
+
+
+ Lottie;
+ Hosting;
+ Toolkit;
+ Logging;
+ LoggingSerilog;
+ Mvvm;
+ Configuration;
+ HttpKiota;
+ Serialization;
+ Localization;
+ Navigation;
+ ThemeService;
+ SkiaRenderer;
+
+
+
+
diff --git a/Marechai.App/Models/AppConfig.cs b/Marechai.App/Models/AppConfig.cs
new file mode 100644
index 00000000..6a43cf7c
--- /dev/null
+++ b/Marechai.App/Models/AppConfig.cs
@@ -0,0 +1,6 @@
+namespace Marechai.App.Models;
+
+public record AppConfig
+{
+ public string? Environment { get; init; }
+}
diff --git a/Marechai.App/Models/Entity.cs b/Marechai.App/Models/Entity.cs
new file mode 100644
index 00000000..1550bcd8
--- /dev/null
+++ b/Marechai.App/Models/Entity.cs
@@ -0,0 +1,3 @@
+namespace Marechai.App.Models;
+
+public record Entity(string Name);
diff --git a/Marechai.App/Package.appxmanifest b/Marechai.App/Package.appxmanifest
new file mode 100644
index 00000000..9ef38146
--- /dev/null
+++ b/Marechai.App/Package.appxmanifest
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Marechai.App/Platforms/Android/AndroidManifest.xml b/Marechai.App/Platforms/Android/AndroidManifest.xml
new file mode 100644
index 00000000..95ae0753
--- /dev/null
+++ b/Marechai.App/Platforms/Android/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/Marechai.App/Platforms/Android/Assets/AboutAssets.txt b/Marechai.App/Platforms/Android/Assets/AboutAssets.txt
new file mode 100644
index 00000000..89ab409d
--- /dev/null
+++ b/Marechai.App/Platforms/Android/Assets/AboutAssets.txt
@@ -0,0 +1,22 @@
+To add cross-platform image assets for your Uno Platform app, use the Assets folder
+in the shared project instead. Assets in this folder are Android-only assets.
+
+Any raw assets you want to be deployed with your application can be placed in
+this directory (and child directories) and given a Build Action of "AndroidAsset".
+
+These files will be deployed with your package and will be accessible using Android's
+AssetManager, like this:
+
+public class ReadAsset : Activity
+{
+ protected override void OnCreate (Bundle bundle)
+ {
+ base.OnCreate (bundle);
+
+ InputStream input = Assets.Open ("my_asset.txt");
+ }
+}
+
+Additionally, some Android functions will automatically load asset files:
+
+Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");
diff --git a/Marechai.App/Platforms/Android/Main.Android.cs b/Marechai.App/Platforms/Android/Main.Android.cs
new file mode 100644
index 00000000..b6550644
--- /dev/null
+++ b/Marechai.App/Platforms/Android/Main.Android.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Android.App;
+using Android.Content;
+using Android.OS;
+using Android.Runtime;
+using Android.Views;
+using Android.Widget;
+using Microsoft.UI.Xaml.Media;
+
+namespace Marechai.App.Droid;
+
+[global::Android.App.ApplicationAttribute(
+ Label = "@string/ApplicationName",
+ Icon = "@mipmap/icon",
+ LargeHeap = true,
+ HardwareAccelerated = true,
+ Theme = "@style/Theme.App.Starting"
+)]
+public class Application : Microsoft.UI.Xaml.NativeApplication
+{
+ public Application(IntPtr javaReference, JniHandleOwnership transfer)
+ : base(() => new App(), javaReference, transfer)
+ {
+ }
+}
diff --git a/Marechai.App/Platforms/Android/MainActivity.Android.cs b/Marechai.App/Platforms/Android/MainActivity.Android.cs
new file mode 100644
index 00000000..0e9218a6
--- /dev/null
+++ b/Marechai.App/Platforms/Android/MainActivity.Android.cs
@@ -0,0 +1,22 @@
+using Android.App;
+using Android.Content.PM;
+using Android.OS;
+using Android.Views;
+using Android.Widget;
+
+namespace Marechai.App.Droid;
+
+[Activity(
+ MainLauncher = true,
+ ConfigurationChanges = global::Uno.UI.ActivityHelper.AllConfigChanges,
+ WindowSoftInputMode = SoftInput.AdjustNothing | SoftInput.StateHidden
+)]
+public class MainActivity : Microsoft.UI.Xaml.ApplicationActivity
+{
+ protected override void OnCreate(Bundle? savedInstanceState)
+ {
+ global::AndroidX.Core.SplashScreen.SplashScreen.InstallSplashScreen(this);
+
+ base.OnCreate(savedInstanceState);
+ }
+}
diff --git a/Marechai.App/Platforms/Android/Resources/AboutResources.txt b/Marechai.App/Platforms/Android/Resources/AboutResources.txt
new file mode 100644
index 00000000..17e3b133
--- /dev/null
+++ b/Marechai.App/Platforms/Android/Resources/AboutResources.txt
@@ -0,0 +1,47 @@
+To add cross-platform image assets for your Uno Platform app, use the Assets folder
+in the shared project instead. Resources in this folder are Android-only.
+
+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.
diff --git a/Marechai.App/Platforms/Android/Resources/values/Strings.xml b/Marechai.App/Platforms/Android/Resources/values/Strings.xml
new file mode 100644
index 00000000..f3b06fcd
--- /dev/null
+++ b/Marechai.App/Platforms/Android/Resources/values/Strings.xml
@@ -0,0 +1,5 @@
+
+
+ Hello World, Click Me!
+ Marechai.App
+
diff --git a/Marechai.App/Platforms/Android/Resources/values/Styles.xml b/Marechai.App/Platforms/Android/Resources/values/Styles.xml
new file mode 100644
index 00000000..f47dcf36
--- /dev/null
+++ b/Marechai.App/Platforms/Android/Resources/values/Styles.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/Marechai.App/Platforms/Android/environment.conf b/Marechai.App/Platforms/Android/environment.conf
new file mode 100644
index 00000000..d8c10645
--- /dev/null
+++ b/Marechai.App/Platforms/Android/environment.conf
@@ -0,0 +1,2 @@
+# See this for more details: http://developer.xamarin.com/guides/android/advanced_topics/garbage_collection/
+MONO_GC_PARAMS=bridge-implementation=new,nursery-size=32m,soft-heap-limit=256m
\ No newline at end of file
diff --git a/Marechai.App/Platforms/Desktop/Program.cs b/Marechai.App/Platforms/Desktop/Program.cs
new file mode 100644
index 00000000..1bc38775
--- /dev/null
+++ b/Marechai.App/Platforms/Desktop/Program.cs
@@ -0,0 +1,21 @@
+using System;
+using Uno.UI.Hosting;
+
+namespace Marechai.App;
+
+internal class Program
+{
+ [STAThread]
+ public static void Main(string[] args)
+ {
+ var host = UnoPlatformHostBuilder.Create()
+ .App(() => new App())
+ .UseX11()
+ .UseLinuxFrameBuffer()
+ .UseMacOS()
+ .UseWin32()
+ .Build();
+
+ host.Run();
+ }
+}
diff --git a/Marechai.App/Platforms/WebAssembly/LinkerConfig.xml b/Marechai.App/Platforms/WebAssembly/LinkerConfig.xml
new file mode 100644
index 00000000..83f467ad
--- /dev/null
+++ b/Marechai.App/Platforms/WebAssembly/LinkerConfig.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
diff --git a/Marechai.App/Platforms/WebAssembly/Program.cs b/Marechai.App/Platforms/WebAssembly/Program.cs
new file mode 100644
index 00000000..6c8c48e4
--- /dev/null
+++ b/Marechai.App/Platforms/WebAssembly/Program.cs
@@ -0,0 +1,17 @@
+using System.Threading.Tasks;
+using Uno.UI.Hosting;
+
+namespace Marechai.App;
+
+public class Program
+{
+ public static async Task Main(string[] args)
+ {
+ var host = UnoPlatformHostBuilder.Create()
+ .App(() => new App())
+ .UseWebAssembly()
+ .Build();
+
+ await host.RunAsync();
+ }
+}
diff --git a/Marechai.App/Platforms/WebAssembly/WasmCSS/Fonts.css b/Marechai.App/Platforms/WebAssembly/WasmCSS/Fonts.css
new file mode 100644
index 00000000..4fdd6055
--- /dev/null
+++ b/Marechai.App/Platforms/WebAssembly/WasmCSS/Fonts.css
@@ -0,0 +1,28 @@
+/**
+ When adding fonts here, make sure to add them using a base64 data uri, otherwise
+ fonts loading are delayed, and text may get displayed incorrectly.
+*/
+
+/* https://github.com/unoplatform/uno/issues/3954 */
+@font-face {
+ font-family: 'Segoe UI';
+ src: local('Segoe UI'), local('-apple-system'), local('BlinkMacSystemFont'), local('Inter'), local('Cantarell'), local('Ubuntu'), local('Roboto'), local('Open Sans'), local('Noto Sans'), local('Helvetica Neue'), local('sans-serif');
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url(./Uno.Fonts.Roboto/Fonts/Roboto-Light.ttf) format('truetype');
+ font-weight: 300;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url(./Uno.Fonts.Roboto/Fonts/Roboto-Regular.ttf) format('truetype');
+ font-weight: 400;
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: url(./Uno.Fonts.Roboto/Fonts/Roboto-Medium.ttf) format('truetype');
+ font-weight: 500;
+}
diff --git a/Marechai.App/Platforms/WebAssembly/WasmScripts/AppManifest.js b/Marechai.App/Platforms/WebAssembly/WasmScripts/AppManifest.js
new file mode 100644
index 00000000..d3077021
--- /dev/null
+++ b/Marechai.App/Platforms/WebAssembly/WasmScripts/AppManifest.js
@@ -0,0 +1,3 @@
+var UnoAppManifest = {
+ displayName: "Marechai.App"
+}
diff --git a/Marechai.App/Platforms/WebAssembly/manifest.webmanifest b/Marechai.App/Platforms/WebAssembly/manifest.webmanifest
new file mode 100644
index 00000000..d48c991a
--- /dev/null
+++ b/Marechai.App/Platforms/WebAssembly/manifest.webmanifest
@@ -0,0 +1,10 @@
+{
+ "background_color": "#ffffff",
+ "description": "Marechai.App",
+ "display": "standalone",
+ "name": "Marechai.App",
+ "short_name": "Marechai.App",
+ "start_url": "/index.html",
+ "theme_color": "#ffffff",
+ "scope": "/"
+}
diff --git a/Marechai.App/Platforms/WebAssembly/wwwroot/staticwebapp.config.json b/Marechai.App/Platforms/WebAssembly/wwwroot/staticwebapp.config.json
new file mode 100644
index 00000000..79c1b17c
--- /dev/null
+++ b/Marechai.App/Platforms/WebAssembly/wwwroot/staticwebapp.config.json
@@ -0,0 +1,30 @@
+{
+ "navigationFallback": {
+ "rewrite": "/index.html",
+ "exclude": [
+ "*.{css,js}",
+ "*.{png}",
+ "*.{c,h,wasm,clr,pdb,dat,txt}"
+ ]
+ },
+ "routes": [
+ {
+ "route": "/package_*",
+ "headers": {
+ "cache-control": "public, immutable, max-age=31536000"
+ }
+ },
+ {
+ "route": "/*.ttf",
+ "headers": {
+ "cache-control": "public, immutable, max-age=31536000"
+ }
+ },
+ {
+ "route": "/*",
+ "headers": {
+ "cache-control": "must-revalidate, max-age=3600"
+ }
+ }
+ ]
+}
diff --git a/Marechai.App/Platforms/WebAssembly/wwwroot/web.config b/Marechai.App/Platforms/WebAssembly/wwwroot/web.config
new file mode 100644
index 00000000..8f5a860f
--- /dev/null
+++ b/Marechai.App/Platforms/WebAssembly/wwwroot/web.config
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Marechai.App/Platforms/iOS/Entitlements.plist b/Marechai.App/Platforms/iOS/Entitlements.plist
new file mode 100644
index 00000000..24c31036
--- /dev/null
+++ b/Marechai.App/Platforms/iOS/Entitlements.plist
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/Marechai.App/Platforms/iOS/Info.plist b/Marechai.App/Platforms/iOS/Info.plist
new file mode 100644
index 00000000..ea3dcb4b
--- /dev/null
+++ b/Marechai.App/Platforms/iOS/Info.plist
@@ -0,0 +1,43 @@
+
+
+
+
+ LSRequiresIPhoneOS
+
+ UIDeviceFamily
+
+ 1
+ 2
+
+ UIRequiredDeviceCapabilities
+
+ armv7
+ arm64
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+ XSAppIconAssets
+ Assets.xcassets/icon.appiconset
+ UIApplicationSupportsIndirectInputEvents
+
+
+
+
+
diff --git a/Marechai.App/Platforms/iOS/Main.iOS.cs b/Marechai.App/Platforms/iOS/Main.iOS.cs
new file mode 100644
index 00000000..57618e7b
--- /dev/null
+++ b/Marechai.App/Platforms/iOS/Main.iOS.cs
@@ -0,0 +1,18 @@
+using UIKit;
+using Uno.UI.Hosting;
+
+namespace Marechai.App.iOS;
+
+public class EntryPoint
+{
+ // This is the main entry point of the application.
+ public static void Main(string[] args)
+ {
+ var host = UnoPlatformHostBuilder.Create()
+ .App(() => new App())
+ .UseAppleUIKit()
+ .Build();
+
+ host.Run();
+ }
+}
diff --git a/Marechai.App/Platforms/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json b/Marechai.App/Platforms/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json
new file mode 100644
index 00000000..69555e44
--- /dev/null
+++ b/Marechai.App/Platforms/iOS/Media.xcassets/LaunchImages.launchimage/Contents.json
@@ -0,0 +1,58 @@
+{
+ "images": [
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "size": "640x960",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "subtype": "retina4",
+ "scale": "2x",
+ "size": "640x1136",
+ "idiom": "iphone"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "1x",
+ "size": "768x1024",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "1x",
+ "size": "1024x768",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "portrait",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "size": "1536x2048",
+ "idiom": "ipad"
+ },
+ {
+ "orientation": "landscape",
+ "extent": "full-screen",
+ "minimum-system-version": "7.0",
+ "scale": "2x",
+ "size": "2048x1536",
+ "idiom": "ipad"
+ }
+ ],
+ "properties": {},
+ "info": {
+ "version": 1,
+ "author": ""
+ }
+}
\ No newline at end of file
diff --git a/Marechai.App/Platforms/iOS/PrivacyInfo.xcprivacy b/Marechai.App/Platforms/iOS/PrivacyInfo.xcprivacy
new file mode 100644
index 00000000..902abb05
--- /dev/null
+++ b/Marechai.App/Platforms/iOS/PrivacyInfo.xcprivacy
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryFileTimestamp
+ NSPrivacyAccessedAPITypeReasons
+
+ C617.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategorySystemBootTime
+ NSPrivacyAccessedAPITypeReasons
+
+ 35F9.1
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryDiskSpace
+ NSPrivacyAccessedAPITypeReasons
+
+ E174.1
+
+
+
+
+
+ NSPrivacyAccessedAPIType
+ NSPrivacyAccessedAPICategoryUserDefaults
+ NSPrivacyAccessedAPITypeReasons
+
+ CA92.1
+
+
+
diff --git a/Marechai.App/Presentation/MainPage.xaml b/Marechai.App/Presentation/MainPage.xaml
new file mode 100644
index 00000000..300d2e95
--- /dev/null
+++ b/Marechai.App/Presentation/MainPage.xaml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Marechai.App/Presentation/MainPage.xaml.cs b/Marechai.App/Presentation/MainPage.xaml.cs
new file mode 100644
index 00000000..4be99fea
--- /dev/null
+++ b/Marechai.App/Presentation/MainPage.xaml.cs
@@ -0,0 +1,11 @@
+using Microsoft.UI.Xaml.Controls;
+
+namespace Marechai.App.Presentation;
+
+public sealed partial class MainPage : Page
+{
+ public MainPage()
+ {
+ this.InitializeComponent();
+ }
+}
diff --git a/Marechai.App/Presentation/MainViewModel.cs b/Marechai.App/Presentation/MainViewModel.cs
new file mode 100644
index 00000000..cdd64d70
--- /dev/null
+++ b/Marechai.App/Presentation/MainViewModel.cs
@@ -0,0 +1,33 @@
+using System.Threading.Tasks;
+using System.Windows.Input;
+using Uno.Extensions.Navigation;
+
+namespace Marechai.App.Presentation;
+
+public partial class MainViewModel : ObservableObject
+{
+ private INavigator _navigator;
+
+ [ObservableProperty] private string? name;
+
+ public MainViewModel(
+ IStringLocalizer localizer,
+ IOptions appInfo,
+ INavigator navigator)
+ {
+ _navigator = navigator;
+ Title = "Main";
+ Title += $" - {localizer["ApplicationName"]}";
+ Title += $" - {appInfo?.Value?.Environment}";
+ GoToSecond = new AsyncRelayCommand(GoToSecondView);
+ }
+
+ public string? Title { get; }
+
+ public ICommand GoToSecond { get; }
+
+ private async Task GoToSecondView()
+ {
+ await _navigator.NavigateViewModelAsync(this, data: new Entity(Name!));
+ }
+}
diff --git a/Marechai.App/Presentation/SecondPage.xaml b/Marechai.App/Presentation/SecondPage.xaml
new file mode 100644
index 00000000..7f5f8274
--- /dev/null
+++ b/Marechai.App/Presentation/SecondPage.xaml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Marechai.App/Presentation/SecondPage.xaml.cs b/Marechai.App/Presentation/SecondPage.xaml.cs
new file mode 100644
index 00000000..8d0eff64
--- /dev/null
+++ b/Marechai.App/Presentation/SecondPage.xaml.cs
@@ -0,0 +1,11 @@
+using Microsoft.UI.Xaml.Controls;
+
+namespace Marechai.App.Presentation;
+
+public sealed partial class SecondPage : Page
+{
+ public SecondPage()
+ {
+ this.InitializeComponent();
+ }
+}
diff --git a/Marechai.App/Presentation/SecondViewModel.cs b/Marechai.App/Presentation/SecondViewModel.cs
new file mode 100644
index 00000000..cd90246d
--- /dev/null
+++ b/Marechai.App/Presentation/SecondViewModel.cs
@@ -0,0 +1,5 @@
+namespace Marechai.App.Presentation;
+
+public partial record SecondViewModel(Entity Entity)
+{
+}
diff --git a/Marechai.App/Presentation/Shell.xaml b/Marechai.App/Presentation/Shell.xaml
new file mode 100644
index 00000000..7cc97d14
--- /dev/null
+++ b/Marechai.App/Presentation/Shell.xaml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Marechai.App/Presentation/Shell.xaml.cs b/Marechai.App/Presentation/Shell.xaml.cs
new file mode 100644
index 00000000..2306cba3
--- /dev/null
+++ b/Marechai.App/Presentation/Shell.xaml.cs
@@ -0,0 +1,14 @@
+using Microsoft.UI.Xaml.Controls;
+using Uno.Extensions.Hosting;
+
+namespace Marechai.App.Presentation;
+
+public sealed partial class Shell : UserControl, IContentControlProvider
+{
+ public Shell()
+ {
+ this.InitializeComponent();
+ }
+
+ public ContentControl ContentControl => Splash;
+}
diff --git a/Marechai.App/Presentation/ShellViewModel.cs b/Marechai.App/Presentation/ShellViewModel.cs
new file mode 100644
index 00000000..38c4b1a6
--- /dev/null
+++ b/Marechai.App/Presentation/ShellViewModel.cs
@@ -0,0 +1,15 @@
+using Uno.Extensions.Navigation;
+
+namespace Marechai.App.Presentation;
+
+public class ShellViewModel
+{
+ private readonly INavigator _navigator;
+
+ public ShellViewModel(
+ INavigator navigator)
+ {
+ _navigator = navigator;
+ // Add code here to initialize or attach event handlers to singleton services
+ }
+}
diff --git a/Marechai.App/Services/Endpoints/DebugHandler.cs b/Marechai.App/Services/Endpoints/DebugHandler.cs
new file mode 100644
index 00000000..320de937
--- /dev/null
+++ b/Marechai.App/Services/Endpoints/DebugHandler.cs
@@ -0,0 +1,50 @@
+using System.Linq;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using Uno.Extensions.Logging;
+
+namespace Marechai.App.Services.Endpoints;
+
+internal class DebugHttpHandler : DelegatingHandler
+{
+ private readonly ILogger _logger;
+
+ public DebugHttpHandler(ILogger logger, HttpMessageHandler? innerHandler = null)
+ : base(innerHandler ?? new HttpClientHandler())
+ {
+ _logger = logger;
+ }
+
+ protected async override Task SendAsync(
+ HttpRequestMessage request,
+ CancellationToken cancellationToken)
+ {
+ var response = await base.SendAsync(request, cancellationToken);
+#if DEBUG
+ if (!response.IsSuccessStatusCode)
+ {
+ _logger.LogDebugMessage("Unsuccessful API Call");
+ if (request.RequestUri is not null)
+ {
+ _logger.LogDebugMessage($"{request.RequestUri} ({request.Method})");
+ }
+
+ foreach ((var key, var values) in request.Headers.ToDictionary(x => x.Key, x => string.Join(", ", x.Value)))
+ {
+ _logger.LogDebugMessage($"{key}: {values}");
+ }
+
+ var content = request.Content is not null ? await request.Content.ReadAsStringAsync() : null;
+ if (!string.IsNullOrEmpty(content))
+ {
+ _logger.LogDebugMessage(content);
+ }
+
+ // Uncomment to automatically break when an API call fails while debugging
+ // System.Diagnostics.Debugger.Break();
+ }
+#endif
+ return response;
+ }
+}
diff --git a/Marechai.App/Strings/en/Resources.resw b/Marechai.App/Strings/en/Resources.resw
new file mode 100644
index 00000000..222ecd3a
--- /dev/null
+++ b/Marechai.App/Strings/en/Resources.resw
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Marechai.App-en
+
+
diff --git a/Marechai.App/Strings/es/Resources.resw b/Marechai.App/Strings/es/Resources.resw
new file mode 100644
index 00000000..6eff8b60
--- /dev/null
+++ b/Marechai.App/Strings/es/Resources.resw
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Marechai.App-es
+
+
diff --git a/Marechai.App/Strings/fr/Resources.resw b/Marechai.App/Strings/fr/Resources.resw
new file mode 100644
index 00000000..d8659858
--- /dev/null
+++ b/Marechai.App/Strings/fr/Resources.resw
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Marechai.App-fr
+
+
diff --git a/Marechai.App/Strings/pt-BR/Resources.resw b/Marechai.App/Strings/pt-BR/Resources.resw
new file mode 100644
index 00000000..994e5cd8
--- /dev/null
+++ b/Marechai.App/Strings/pt-BR/Resources.resw
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Marechai.App-pt-BR
+
+
diff --git a/Marechai.App/app.manifest b/Marechai.App/app.manifest
new file mode 100644
index 00000000..c507a8b3
--- /dev/null
+++ b/Marechai.App/app.manifest
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true/PM
+ PerMonitorV2, PerMonitor
+
+
+
diff --git a/Marechai.App/appsettings.development.json b/Marechai.App/appsettings.development.json
new file mode 100644
index 00000000..2cf8df52
--- /dev/null
+++ b/Marechai.App/appsettings.development.json
@@ -0,0 +1,9 @@
+{
+ "AppConfig": {
+ "Environment": "Development"
+ },
+ "ApiClient": {
+ "Url": "https://localhost:5002",
+ "UseNativeHandler": true
+ }
+}
diff --git a/Marechai.App/appsettings.json b/Marechai.App/appsettings.json
new file mode 100644
index 00000000..aa890ef1
--- /dev/null
+++ b/Marechai.App/appsettings.json
@@ -0,0 +1,16 @@
+{
+ "AppConfig": {
+ "Environment": "Production"
+ },
+ "ApiClient": {
+ "UseNativeHandler": true
+ },
+ "LocalizationConfiguration": {
+ "Cultures": [
+ "es",
+ "fr",
+ "pt-BR",
+ "en"
+ ]
+ }
+}
diff --git a/global.json b/global.json
new file mode 100644
index 00000000..b7c7d275
--- /dev/null
+++ b/global.json
@@ -0,0 +1,8 @@
+{
+ "msbuild-sdks": {
+ "Uno.Sdk": "6.4.24"
+ },
+ "sdk": {
+ "allowPrerelease": true
+ }
+}
\ No newline at end of file