diff --git a/Bitvault.Avalonia.Desktop/Bitvault.Avalonia.Desktop.csproj b/Bitvault.Avalonia.Desktop/Bitvault.Avalonia.Desktop.csproj
index b4bcfce..182cb26 100644
--- a/Bitvault.Avalonia.Desktop/Bitvault.Avalonia.Desktop.csproj
+++ b/Bitvault.Avalonia.Desktop/Bitvault.Avalonia.Desktop.csproj
@@ -7,7 +7,7 @@
app.manifest
-
+
diff --git a/Bitvault.Avalonia/AllNavigationView.axaml b/Bitvault.Avalonia/AllNavigationView.axaml
new file mode 100644
index 0000000..37cd350
--- /dev/null
+++ b/Bitvault.Avalonia/AllNavigationView.axaml
@@ -0,0 +1,5 @@
+
diff --git a/Bitvault.Avalonia/AllNavigationView.axaml.cs b/Bitvault.Avalonia/AllNavigationView.axaml.cs
new file mode 100644
index 0000000..df03d16
--- /dev/null
+++ b/Bitvault.Avalonia/AllNavigationView.axaml.cs
@@ -0,0 +1,8 @@
+using Toolkit.UI.Controls.Avalonia;
+
+namespace Bitvault.Avalonia;
+
+public partial class AllNavigationView : NavigationViewItem
+{
+ public AllNavigationView() => InitializeComponent();
+}
diff --git a/Bitvault.Avalonia/App.axaml b/Bitvault.Avalonia/App.axaml
index 5ac4be5..a893936 100644
--- a/Bitvault.Avalonia/App.axaml
+++ b/Bitvault.Avalonia/App.axaml
@@ -1,10 +1,64 @@
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+ 0,5,6,6
+ avares://HyperX.Launcher.Avalonia/Assets/SegoeIcons.ttf#Segoe Fluent Icons
+
+
+ 0
+ 0,8,0,0
+
diff --git a/Bitvault.Avalonia/App.axaml.cs b/Bitvault.Avalonia/App.axaml.cs
index 8716426..1a6116c 100644
--- a/Bitvault.Avalonia/App.axaml.cs
+++ b/Bitvault.Avalonia/App.axaml.cs
@@ -1,5 +1,10 @@
using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Toolkit.Avalonia;
+using Toolkit.Foundation;
namespace Bitvault.Avalonia;
@@ -10,8 +15,39 @@ public partial class App : Application
AvaloniaXamlLoader.Load(this);
}
- public override void OnFrameworkInitializationCompleted()
+ public override async void OnFrameworkInitializationCompleted()
{
- base.OnFrameworkInitializationCompleted();
+ IHost? host = DefaultBuilder.Create()
+ .ConfigureServices((context, services) =>
+ {
+ services.AddAvalonia();
+ services.AddHandler();
+
+ //services.AddTransient();
+ //services.AddInitializer();
+
+ if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime)
+ {
+ services.AddTemplate("MainWindow");
+ }
+
+ services.AddTemplate("Main");
+ services.AddHandler();
+
+ services.AddTemplate();
+ services.AddTemplate();
+ services.AddTemplate();
+ services.AddTemplate();
+ services.AddTemplate();
+
+ services.AddTemplate("Vault");
+
+ services.AddConfiguration(args => args.Name = "foo1", $"{nameof(VaultConfiguration)}:Personal");
+ services.AddConfiguration(args => args.Name = "foo2", $"{nameof(VaultConfiguration)}:Test");
+
+ })
+ .Build();
+
+ await host.RunAsync();
}
}
diff --git a/Bitvault.Avalonia/AppHandler.cs b/Bitvault.Avalonia/AppHandler.cs
new file mode 100644
index 0000000..68195a7
--- /dev/null
+++ b/Bitvault.Avalonia/AppHandler.cs
@@ -0,0 +1,24 @@
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using System.Threading;
+using System.Threading.Tasks;
+using Toolkit.Foundation;
+
+namespace Bitvault.Avalonia;
+
+public class AppHandler(IPublisher publisher) :
+ INotificationHandler
+{
+ public async Task Handle(Started args, CancellationToken cancellationToken = default)
+ {
+ if (Application.Current is Application application)
+ {
+ if (application.ApplicationLifetime is IApplicationLifetime lifetime)
+ {
+ await publisher.Publish(new Navigate(lifetime is IClassicDesktopStyleApplicationLifetime ? "MainWindow" : "Main",
+ lifetime is IClassicDesktopStyleApplicationLifetime ? typeof(IClassicDesktopStyleApplicationLifetime) :
+ typeof(ISingleViewApplicationLifetime)), cancellationToken);
+ }
+ }
+ }
+}
diff --git a/Bitvault.Avalonia/ArchiveNavigationView.axaml b/Bitvault.Avalonia/ArchiveNavigationView.axaml
new file mode 100644
index 0000000..62ffa09
--- /dev/null
+++ b/Bitvault.Avalonia/ArchiveNavigationView.axaml
@@ -0,0 +1,5 @@
+
\ No newline at end of file
diff --git a/Bitvault.Avalonia/ArchiveNavigationView.axaml.cs b/Bitvault.Avalonia/ArchiveNavigationView.axaml.cs
new file mode 100644
index 0000000..68ef7db
--- /dev/null
+++ b/Bitvault.Avalonia/ArchiveNavigationView.axaml.cs
@@ -0,0 +1,8 @@
+using Toolkit.UI.Controls.Avalonia;
+
+namespace Bitvault.Avalonia;
+
+public partial class ArchiveNavigationView : NavigationViewItem
+{
+ public ArchiveNavigationView() => InitializeComponent();
+}
diff --git a/Bitvault.Avalonia/Bitvault.Avalonia.csproj b/Bitvault.Avalonia/Bitvault.Avalonia.csproj
index eae7b75..7bcb486 100644
--- a/Bitvault.Avalonia/Bitvault.Avalonia.csproj
+++ b/Bitvault.Avalonia/Bitvault.Avalonia.csproj
@@ -9,11 +9,22 @@
-
-
-
-
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Bitvault.Avalonia/CategoriesNavigationView.axaml b/Bitvault.Avalonia/CategoriesNavigationView.axaml
new file mode 100644
index 0000000..e088589
--- /dev/null
+++ b/Bitvault.Avalonia/CategoriesNavigationView.axaml
@@ -0,0 +1,5 @@
+
diff --git a/Bitvault.Avalonia/CategoriesNavigationView.axaml.cs b/Bitvault.Avalonia/CategoriesNavigationView.axaml.cs
new file mode 100644
index 0000000..7e55540
--- /dev/null
+++ b/Bitvault.Avalonia/CategoriesNavigationView.axaml.cs
@@ -0,0 +1,8 @@
+using Toolkit.UI.Controls.Avalonia;
+
+namespace Bitvault.Avalonia;
+
+public partial class CategoriesNavigationView : NavigationViewItem
+{
+ public CategoriesNavigationView() => InitializeComponent();
+}
diff --git a/Bitvault.Avalonia/MainView.axaml b/Bitvault.Avalonia/MainView.axaml
index 96d526f..4066b19 100644
--- a/Bitvault.Avalonia/MainView.axaml
+++ b/Bitvault.Avalonia/MainView.axaml
@@ -1,8 +1,17 @@
-
- Welcome to Avalonia!
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Bitvault.Avalonia/MainView.axaml.cs b/Bitvault.Avalonia/MainView.axaml.cs
index 744e35d..428c4e8 100644
--- a/Bitvault.Avalonia/MainView.axaml.cs
+++ b/Bitvault.Avalonia/MainView.axaml.cs
@@ -1,12 +1,11 @@
using Avalonia.Controls;
+using Toolkit.Foundation;
-namespace Bitvault.Avalonia
+namespace Bitvault.Avalonia;
+
+
+[NavigationTarget("Main")]
+public partial class MainView : UserControl
{
- public partial class MainView : UserControl
- {
- public MainView()
- {
- InitializeComponent();
- }
- }
+ public MainView() => InitializeComponent();
}
diff --git a/Bitvault.Avalonia/MainWindow.axaml b/Bitvault.Avalonia/MainWindow.axaml
index 135a0f8..64f1b8e 100644
--- a/Bitvault.Avalonia/MainWindow.axaml
+++ b/Bitvault.Avalonia/MainWindow.axaml
@@ -1,9 +1,15 @@
-
- Welcome to Avalonia!
-
+
+
+
diff --git a/Bitvault.Avalonia/MainWindow.axaml.cs b/Bitvault.Avalonia/MainWindow.axaml.cs
index ef6a1a8..b4fb74a 100644
--- a/Bitvault.Avalonia/MainWindow.axaml.cs
+++ b/Bitvault.Avalonia/MainWindow.axaml.cs
@@ -1,12 +1,14 @@
-using Avalonia.Controls;
+using FluentAvalonia.UI.Windowing;
+using Toolkit.Foundation;
-namespace Bitvault.Avalonia
+namespace Bitvault.Avalonia;
+
+[NavigationTarget("Window")]
+public partial class MainWindow : AppWindow
{
- public partial class MainWindow : Window
+ public MainWindow()
{
- public MainWindow()
- {
- InitializeComponent();
- }
+ InitializeComponent();
+ TitleBar.ExtendsContentIntoTitleBar = true;
}
}
diff --git a/Bitvault.Avalonia/StarredNavigationView.axaml b/Bitvault.Avalonia/StarredNavigationView.axaml
new file mode 100644
index 0000000..f53bc1a
--- /dev/null
+++ b/Bitvault.Avalonia/StarredNavigationView.axaml
@@ -0,0 +1,5 @@
+
diff --git a/Bitvault.Avalonia/StarredNavigationView.axaml.cs b/Bitvault.Avalonia/StarredNavigationView.axaml.cs
new file mode 100644
index 0000000..d691a85
--- /dev/null
+++ b/Bitvault.Avalonia/StarredNavigationView.axaml.cs
@@ -0,0 +1,8 @@
+using Toolkit.UI.Controls.Avalonia;
+
+namespace Bitvault.Avalonia;
+
+public partial class StarredNavigationView : NavigationViewItem
+{
+ public StarredNavigationView() => InitializeComponent();
+}
diff --git a/Bitvault.Avalonia/VaultComponent.cs b/Bitvault.Avalonia/VaultComponent.cs
new file mode 100644
index 0000000..3d16ac7
--- /dev/null
+++ b/Bitvault.Avalonia/VaultComponent.cs
@@ -0,0 +1,14 @@
+using Toolkit.Foundation;
+
+namespace Bitvault.Avalonia;
+
+public class VaultComponent :
+ IVaultComponent
+{
+ public IComponentBuilder Create() =>
+ ComponentBuilder.Create()
+ .AddServices(services =>
+ {
+
+ });
+}
diff --git a/Bitvault.Avalonia/VaultNavigationView.axaml b/Bitvault.Avalonia/VaultNavigationView.axaml
new file mode 100644
index 0000000..a36f646
--- /dev/null
+++ b/Bitvault.Avalonia/VaultNavigationView.axaml
@@ -0,0 +1,8 @@
+
diff --git a/Bitvault.Avalonia/VaultNavigationView.axaml.cs b/Bitvault.Avalonia/VaultNavigationView.axaml.cs
new file mode 100644
index 0000000..fce2ec4
--- /dev/null
+++ b/Bitvault.Avalonia/VaultNavigationView.axaml.cs
@@ -0,0 +1,9 @@
+using Toolkit.UI.Controls.Avalonia;
+
+namespace Bitvault.Avalonia
+{
+ public partial class VaultNavigationView : NavigationViewItem
+ {
+ public VaultNavigationView() => InitializeComponent();
+ }
+}
diff --git a/Bitvault.Avalonia/VaultView.axaml b/Bitvault.Avalonia/VaultView.axaml
new file mode 100644
index 0000000..597ea94
--- /dev/null
+++ b/Bitvault.Avalonia/VaultView.axaml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/Bitvault.Avalonia/VaultView.axaml.cs b/Bitvault.Avalonia/VaultView.axaml.cs
new file mode 100644
index 0000000..b4119f2
--- /dev/null
+++ b/Bitvault.Avalonia/VaultView.axaml.cs
@@ -0,0 +1,8 @@
+using Avalonia.Controls;
+
+namespace Bitvault.Avalonia;
+
+public partial class VaultView : UserControl
+{
+ public VaultView() => InitializeComponent();
+}
diff --git a/Bitvault.sln b/Bitvault.sln
index 6227859..f4bb637 100644
--- a/Bitvault.sln
+++ b/Bitvault.sln
@@ -7,7 +7,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bitvault.Avalonia", "Bitvau
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bitvault.Avalonia.Desktop", "Bitvault.Avalonia.Desktop\Bitvault.Avalonia.Desktop.csproj", "{D0067AEC-503B-4C6F-B3C9-728CA2E42B6F}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bitvault", "Bitvault\Bitvault.csproj", "{CE10F8C0-B0DB-40F1-9B6C-517C008B4E8F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Bitvault", "Bitvault\Bitvault.csproj", "{CE10F8C0-B0DB-40F1-9B6C-517C008B4E8F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Toolkit.Avalonia", "Toolkit\Toolkit.Avalonia\Toolkit.Avalonia.csproj", "{D6AAB1E0-7E3E-4E0B-A70D-D23DC9CE50C7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Toolkit.Foundation", "Toolkit\Toolkit.Foundation\Toolkit.Foundation.csproj", "{E2E3E066-869A-40A4-8F22-657E4AD3718C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Toolkit.UI.Avalonia", "Toolkit\Toolkit.UI.Avalonia\Toolkit.UI.Avalonia.csproj", "{6EB99311-D120-4BE3-971C-BFC5BA94F9A1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Toolkit.UI.Controls.Avalonia", "Toolkit\Toolkit.UI.Controls.Avalonia\Toolkit.UI.Controls.Avalonia.csproj", "{716E252B-B758-4134-9D34-50FC42B414C6}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -27,6 +35,22 @@ Global
{CE10F8C0-B0DB-40F1-9B6C-517C008B4E8F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CE10F8C0-B0DB-40F1-9B6C-517C008B4E8F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CE10F8C0-B0DB-40F1-9B6C-517C008B4E8F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D6AAB1E0-7E3E-4E0B-A70D-D23DC9CE50C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D6AAB1E0-7E3E-4E0B-A70D-D23DC9CE50C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D6AAB1E0-7E3E-4E0B-A70D-D23DC9CE50C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D6AAB1E0-7E3E-4E0B-A70D-D23DC9CE50C7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2E3E066-869A-40A4-8F22-657E4AD3718C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E2E3E066-869A-40A4-8F22-657E4AD3718C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2E3E066-869A-40A4-8F22-657E4AD3718C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E2E3E066-869A-40A4-8F22-657E4AD3718C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6EB99311-D120-4BE3-971C-BFC5BA94F9A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6EB99311-D120-4BE3-971C-BFC5BA94F9A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6EB99311-D120-4BE3-971C-BFC5BA94F9A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6EB99311-D120-4BE3-971C-BFC5BA94F9A1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {716E252B-B758-4134-9D34-50FC42B414C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {716E252B-B758-4134-9D34-50FC42B414C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {716E252B-B758-4134-9D34-50FC42B414C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {716E252B-B758-4134-9D34-50FC42B414C6}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Bitvault/AllNavigationViewModel.cs b/Bitvault/AllNavigationViewModel.cs
new file mode 100644
index 0000000..2dff6dc
--- /dev/null
+++ b/Bitvault/AllNavigationViewModel.cs
@@ -0,0 +1,11 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public class AllNavigationViewModel(IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) :
+ ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer),
+ IMainNavigationViewModel;
\ No newline at end of file
diff --git a/Bitvault/ArchiveNavigationViewModel.cs b/Bitvault/ArchiveNavigationViewModel.cs
new file mode 100644
index 0000000..3ec64b0
--- /dev/null
+++ b/Bitvault/ArchiveNavigationViewModel.cs
@@ -0,0 +1,11 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public class ArchiveNavigationViewModel(IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) :
+ ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer),
+ IMainNavigationViewModel;
\ No newline at end of file
diff --git a/Bitvault/Bitvault.csproj b/Bitvault/Bitvault.csproj
index fa71b7a..905a28f 100644
--- a/Bitvault/Bitvault.csproj
+++ b/Bitvault/Bitvault.csproj
@@ -1,9 +1,14 @@
-
-
- net8.0
- enable
- enable
-
-
-
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Bitvault/CategoriesNavigationViewModel.cs b/Bitvault/CategoriesNavigationViewModel.cs
new file mode 100644
index 0000000..5485195
--- /dev/null
+++ b/Bitvault/CategoriesNavigationViewModel.cs
@@ -0,0 +1,11 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public class CategoriesNavigationViewModel(IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) :
+ ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer),
+ IMainNavigationViewModel;
\ No newline at end of file
diff --git a/Bitvault/IMainNavigationViewModel.cs b/Bitvault/IMainNavigationViewModel.cs
new file mode 100644
index 0000000..cdc3f28
--- /dev/null
+++ b/Bitvault/IMainNavigationViewModel.cs
@@ -0,0 +1,4 @@
+namespace Bitvault;
+
+public interface IMainNavigationViewModel;
+
diff --git a/Bitvault/IVaultComponent.cs b/Bitvault/IVaultComponent.cs
new file mode 100644
index 0000000..1642023
--- /dev/null
+++ b/Bitvault/IVaultComponent.cs
@@ -0,0 +1,5 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public interface IVaultComponent : IComponent;
diff --git a/Bitvault/Locked.cs b/Bitvault/Locked.cs
new file mode 100644
index 0000000..072760e
--- /dev/null
+++ b/Bitvault/Locked.cs
@@ -0,0 +1,3 @@
+namespace Bitvault;
+
+public record Locked;
diff --git a/Bitvault/LockerNavigationViewModel.cs b/Bitvault/LockerNavigationViewModel.cs
new file mode 100644
index 0000000..06f1834
--- /dev/null
+++ b/Bitvault/LockerNavigationViewModel.cs
@@ -0,0 +1,10 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public class LockerNavigationViewModel(IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) :
+ ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer);
\ No newline at end of file
diff --git a/Bitvault/LockerViewModel.cs b/Bitvault/LockerViewModel.cs
new file mode 100644
index 0000000..5967026
--- /dev/null
+++ b/Bitvault/LockerViewModel.cs
@@ -0,0 +1,10 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public class LockerViewModel(IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) :
+ ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer);
\ No newline at end of file
diff --git a/Bitvault/LoginViewModel.cs b/Bitvault/LoginViewModel.cs
index d47fbbf..26a33e4 100644
--- a/Bitvault/LoginViewModel.cs
+++ b/Bitvault/LoginViewModel.cs
@@ -1,14 +1,10 @@
-namespace Bitvault
-{
- public class LockViewModel;
+using Toolkit.Foundation;
- public class VaultViewModel;
+namespace Bitvault;
- public class VaultNavigationViewModel;
-
- public class AllNavigationViewModel;
-
- public class FavouriteNavigationViewModel;
-
- public class CategoryNavigationViewModel;
-}
+public class LockViewModel(IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) :
+ ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer);
\ No newline at end of file
diff --git a/Bitvault/MainViewHandler.cs b/Bitvault/MainViewHandler.cs
new file mode 100644
index 0000000..bb14d25
--- /dev/null
+++ b/Bitvault/MainViewHandler.cs
@@ -0,0 +1,14 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public class MainViewHandler(IPublisher publisher,
+ IServiceFactory factory) :
+ INotificationHandler>
+{
+ public async Task Handle(Enumerate args,
+ CancellationToken cancellationToken = default)
+ {
+
+ }
+}
\ No newline at end of file
diff --git a/Bitvault/MainViewModel.cs b/Bitvault/MainViewModel.cs
new file mode 100644
index 0000000..3bab1eb
--- /dev/null
+++ b/Bitvault/MainViewModel.cs
@@ -0,0 +1,20 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public partial class MainViewModel :
+ ObservableCollectionViewModel
+{
+ public MainViewModel(IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer,
+ IContentTemplate template) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer)
+ {
+ Template = template;
+ Add();
+ }
+
+ public IContentTemplate Template { get; set; }
+}
diff --git a/Bitvault/MainWindowViewModel.cs b/Bitvault/MainWindowViewModel.cs
new file mode 100644
index 0000000..c7ee5e8
--- /dev/null
+++ b/Bitvault/MainWindowViewModel.cs
@@ -0,0 +1,10 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public class MainWindowViewModel(IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) :
+ ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer);
\ No newline at end of file
diff --git a/Bitvault/StarredNavigationViewModel.cs b/Bitvault/StarredNavigationViewModel.cs
new file mode 100644
index 0000000..232b3e6
--- /dev/null
+++ b/Bitvault/StarredNavigationViewModel.cs
@@ -0,0 +1,11 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public class StarredNavigationViewModel(IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) :
+ ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer),
+ IMainNavigationViewModel;
\ No newline at end of file
diff --git a/Bitvault/SystemIdleTimer.cs b/Bitvault/SystemIdleTimer.cs
new file mode 100644
index 0000000..dcd2861
--- /dev/null
+++ b/Bitvault/SystemIdleTimer.cs
@@ -0,0 +1,3 @@
+namespace Bitvault;
+
+public class SystemIdleTimer;
diff --git a/Bitvault/Unlocked.cs b/Bitvault/Unlocked.cs
new file mode 100644
index 0000000..551b9f9
--- /dev/null
+++ b/Bitvault/Unlocked.cs
@@ -0,0 +1,3 @@
+namespace Bitvault;
+
+public record Unlocked;
\ No newline at end of file
diff --git a/Bitvault/VaultComponentsCollectionInitializer.cs b/Bitvault/VaultComponentsCollectionInitializer.cs
new file mode 100644
index 0000000..445100a
--- /dev/null
+++ b/Bitvault/VaultComponentsCollectionInitializer.cs
@@ -0,0 +1,50 @@
+using Microsoft.Extensions.DependencyInjection;
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public class VaultComponentsCollectionInitializer(IServiceProvider provider,
+ IProxyServiceCollection proxy,
+ VaultConfigurationCollection configurations) : IInitializer
+{
+ public Task Initialize()
+ {
+ //for (int index = 0; index < configurations.Count; index++)
+ //{
+ // VaultConfiguration configuration = configurations[index];
+ // if (provider.GetRequiredService() is IVaultComponent component)
+ // {
+ // IComponentBuilder builder = component.Create();
+ // builder.AddServices(services =>
+ // {
+ // services.AddTransient(_ =>
+ // provider.GetRequiredService>());
+
+ // services.AddTransient(_ =>
+ // provider.GetRequiredService>());
+
+ // services.AddScoped(_ =>
+ // provider.GetRequiredService());
+
+ // services.AddScoped(_ =>
+ // provider.GetRequiredService());
+
+ // services.AddScoped(_ =>
+ // provider.GetRequiredService());
+
+ // services.AddTransient(_ =>
+ // provider.GetRequiredService());
+
+ // services.AddRange(proxy.Services);
+ // });
+
+ // builder.AddConfiguration(name: $"{nameof(VaultConfigurationCollection)}:{configuration.Name}");
+
+ // IComponentHost host = builder.Build();
+ // host.StartAsync();
+ // }
+ //}
+
+ return Task.CompletedTask;
+ }
+}
diff --git a/Bitvault/VaultConfiguration.cs b/Bitvault/VaultConfiguration.cs
new file mode 100644
index 0000000..ee70f34
--- /dev/null
+++ b/Bitvault/VaultConfiguration.cs
@@ -0,0 +1,9 @@
+using System.Text.Json.Serialization;
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public record VaultConfiguration : ComponentConfiguration
+{
+ public string? Name { get; set; }
+}
diff --git a/Bitvault/VaultConfigurationCollection.cs b/Bitvault/VaultConfigurationCollection.cs
new file mode 100644
index 0000000..fe8e1d2
--- /dev/null
+++ b/Bitvault/VaultConfigurationCollection.cs
@@ -0,0 +1,5 @@
+using System.Dynamic;
+
+namespace Bitvault;
+
+public class VaultConfigurationCollection : DynamicObject;
\ No newline at end of file
diff --git a/Bitvault/VaultNavigationViewModel.cs b/Bitvault/VaultNavigationViewModel.cs
new file mode 100644
index 0000000..69eef58
--- /dev/null
+++ b/Bitvault/VaultNavigationViewModel.cs
@@ -0,0 +1,25 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public partial class VaultNavigationViewModel :
+ ObservableCollectionViewModel,
+ IMainNavigationViewModel
+{
+ public VaultNavigationViewModel(IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer,
+ IContentTemplate template) : base(serviceProvider, serviceFactory, publisher, subscriber, disposer)
+ {
+ Template = template;
+
+ Add();
+ Add();
+ Add();
+ Add();
+ }
+
+ public IContentTemplate Template { get; set; }
+}
\ No newline at end of file
diff --git a/Bitvault/VaultViewModel.cs b/Bitvault/VaultViewModel.cs
new file mode 100644
index 0000000..56b40ea
--- /dev/null
+++ b/Bitvault/VaultViewModel.cs
@@ -0,0 +1,10 @@
+using Toolkit.Foundation;
+
+namespace Bitvault;
+
+public class VaultViewModel(IServiceProvider serviceProvider,
+ IServiceFactory serviceFactory,
+ IPublisher publisher,
+ ISubscriber subscriber,
+ IDisposer disposer) :
+ ObservableViewModel(serviceProvider, serviceFactory, publisher, subscriber, disposer);
diff --git a/Toolkit b/Toolkit
index 5b055bb..e0f4983 160000
--- a/Toolkit
+++ b/Toolkit
@@ -1 +1 @@
-Subproject commit 5b055bb2d7b240ef30b72184eb58e7eb05986400
+Subproject commit e0f49832f82896291e5216adc2538c2b4d788a14