diff --git a/src/Angor/Avalonia/AngorApp.Model/Amounts/AmountUI.cs b/src/Angor/Avalonia/AngorApp.Model/Amounts/AmountUI.cs index 3aa640ce8..e575a21e6 100644 --- a/src/Angor/Avalonia/AngorApp.Model/Amounts/AmountUI.cs +++ b/src/Angor/Avalonia/AngorApp.Model/Amounts/AmountUI.cs @@ -6,4 +6,8 @@ public class AmountUI(long sats, string symbol = "BTC") : IAmountUI { public long Sats { get; } = sats; public string Symbol { get; } = symbol; + + public static AmountUI FromBtc(int btc) => new(btc * 100_000_000); + public static AmountUI FromBtc(decimal btc) => new((long)(btc * 100_000_000)); + public static AmountUI FromBtc(double btc) => new((long)(btc * 100_000_000)); } \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp.Model/Contracts/Amounts/IAmountUI.cs b/src/Angor/Avalonia/AngorApp.Model/Contracts/Amounts/IAmountUI.cs index dd2b30972..3ef72eec6 100644 --- a/src/Angor/Avalonia/AngorApp.Model/Contracts/Amounts/IAmountUI.cs +++ b/src/Angor/Avalonia/AngorApp.Model/Contracts/Amounts/IAmountUI.cs @@ -8,7 +8,7 @@ public interface IAmountUI public string BtcString => $"{Btc:0.00 000 000} " + Symbol; - private decimal Btc => Sats / (decimal)1_0000_0000; + public decimal Btc => Sats / (decimal)1_0000_0000; public string DecimalString => $"{Btc:G} {Symbol}"; public string RoundedDecimalString => $"{Btc:N2} {Symbol}"; diff --git a/src/Angor/Avalonia/AngorApp/AngorApp.csproj b/src/Angor/Avalonia/AngorApp/AngorApp.csproj index fb45bd9a9..3b2e725bb 100644 --- a/src/Angor/Avalonia/AngorApp/AngorApp.csproj +++ b/src/Angor/Avalonia/AngorApp/AngorApp.csproj @@ -9,7 +9,7 @@ - Assets/angor-app-icon-light.png + Assets/angor-app-icon-light84c17bc6d299ec806d065d7d23c9b42aa21f330e.png Assets/angor-app-icon-dark.png diff --git a/src/Angor/Avalonia/AngorApp/Composition/Registrations/Services/ModelServices.cs b/src/Angor/Avalonia/AngorApp/Composition/Registrations/Services/ModelServices.cs index f62f9d037..45168214b 100644 --- a/src/Angor/Avalonia/AngorApp/Composition/Registrations/Services/ModelServices.cs +++ b/src/Angor/Avalonia/AngorApp/Composition/Registrations/Services/ModelServices.cs @@ -16,7 +16,7 @@ public static IServiceCollection AddModelServices(this IServiceCollection servic return services .AddSingleton() .AddSingleton() - .AddScoped() + .AddScoped() .AddScoped() .AddSingleton() .AddSingleton() diff --git a/src/Angor/Avalonia/AngorApp/IProjectTypeViewModel.cs b/src/Angor/Avalonia/AngorApp/IProjectTypeViewModel.cs new file mode 100644 index 000000000..c0c762a48 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/IProjectTypeViewModel.cs @@ -0,0 +1,6 @@ +namespace AngorApp +{ + public interface IProjectTypeViewModel : IHaveTitle + { + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/ProjectTypeConverter.cs b/src/Angor/Avalonia/AngorApp/ProjectTypeConverter.cs new file mode 100644 index 000000000..a1a48366b --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/ProjectTypeConverter.cs @@ -0,0 +1,19 @@ +using AngorApp.UI.Flows.CreateProject.Wizard; +using Avalonia.Data.Converters; +using Avalonia.Media; + +namespace AngorApp +{ + public static class ProjectTypeConverter + { + public static FuncValueConverter ToBrush { get; } = + new FuncValueConverter(type => + { + return type.Name switch + { + "Investment" => Brushes.Green, + _ => Brushes.Orange, + }; + }); + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/CreateProjectFlowV2.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/CreateProjectFlowV2.cs new file mode 100644 index 000000000..09fbfb598 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/CreateProjectFlowV2.cs @@ -0,0 +1,67 @@ +using Angor.Sdk.Common; +using Angor.Sdk.Funding.Founder; +using Angor.Sdk.Funding.Founder.Dtos; +using Angor.Sdk.Funding.Founder.Operations; +using AngorApp.UI.Flows.CreateProject.Wizard; +using AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject; +using AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject.Model; +using Zafiro.Avalonia.Controls.Wizards.Slim; +using Zafiro.UI.Navigation; +using Zafiro.UI.Wizards.Slim; +using Zafiro.UI.Wizards.Slim.Builder; + +namespace AngorApp.UI.Flows.CreateProject +{ + public class CreateProjectFlowV2( + INavigator navigator, + IFounderAppService founderAppService, + IWalletContext walletContext + ) + : ICreateProjectFlow + { + public Task>> CreateProject() + { + var createWizardResult = from wallet in walletContext.GetDefaultWallet() + from seed in GetProjectSeed(wallet.Id) + select CreateInvestmentProjectWizard(); + + NewProject newProject = null!; + + var rootWizard = WizardBuilder + .StartWith(() => new WelcomeViewModel()).NextCommand(model => model.Start) + .Then(_ => new ProjectTypeViewModel()) + .NextCommand(_ => StartSubwizard()) + .WithCompletionFinalStep(); + + return createWizardResult.Map(wizard => rootWizard.Navigate(navigator)); + } + + private IEnhancedCommand> StartSubwizard() + { + return ReactiveCommand + .CreateFromTask(() => CreateInvestmentProjectWizard().Navigate(navigator).ToResult("Salute")) + .Enhance(); + } + + private SlimWizard CreateInvestmentProjectWizard() + { + var newProject = new NewProject(); + var wizard = WizardBuilder + .StartWith(() => new ProjectProfileViewModel(newProject)).NextUnit().Always() + .Then(_ => new ProjectImagesViewModel(newProject)).NextUnit().Always() + .Then(_ => new FundingConfigurationViewModel(newProject)).NextUnit().Always() + .Then(_ => new StagesViewModel(newProject)).NextUnit().Always() + .Then(_ => new ReviewAndDeployViewModel(newProject)).NextResult(_ => Result.Success("")) + .Always() + .WithCommitFinalStep(); + + return wizard; + } + + private async Task> GetProjectSeed(WalletId walletId) + { + var result = await founderAppService.CreateNewProjectKeysAsync(new CreateProjectNewKeys.CreateProjectNewKeysRequest(walletId)); + return result.Map(response => response.ProjectSeedDto); + } + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/FundingConfigurationView.axaml b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/FundingConfigurationView.axaml new file mode 100644 index 000000000..74a58127d --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/FundingConfigurationView.axaml @@ -0,0 +1,358 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Configure your funding target, window, and project nature. + + + + + + + + + + Set your target funding amount + + + + + + + Target Amount (BTC) * + + + + + + BTC + + + + + + The minimum amount your project needs to raise + + + + + + + + + + + + + + + + + + + + + + + + + Fundraising Window + + Help + + + + + + + + + Start Date + + + + Automatically set to today + + + + + + End Date * + + + + + Must be before first stage (chosen on next screen) + + + + + 1 + 2 + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Project Nature (Penalty) + + Help + + + + + + + + + + + + + + 24 + 24 + 4 + 12 + + + + + + + + + diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/FundingConfigurationView.axaml.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/FundingConfigurationView.axaml.cs new file mode 100644 index 000000000..75c99984b --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/FundingConfigurationView.axaml.cs @@ -0,0 +1,10 @@ +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject +{ + public partial class FundingConfigurationView : UserControl + { + public FundingConfigurationView() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/FundingConfigurationViewModel.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/FundingConfigurationViewModel.cs new file mode 100644 index 000000000..c01efa1a4 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/FundingConfigurationViewModel.cs @@ -0,0 +1,40 @@ +using AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject.Model; + +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject +{ + public interface IFundingConfigurationViewModel + { + IEnumerable AmountPresets { get; } + } + + public class FundingConfigurationViewModelSample : IFundingConfigurationViewModel + { + public IEnumerable AmountPresets { get; } = + [ + AmountUI.FromBtc(0.25), + AmountUI.FromBtc(0.5), + AmountUI.FromBtc(1), + AmountUI.FromBtc(2.5), + ]; + } + + public class FundingConfigurationViewModel : IHaveTitle, IFundingConfigurationViewModel + { + public NewProject NewProject { get; } + + public FundingConfigurationViewModel(NewProject newProject) + { + NewProject = newProject; + } + + public IObservable Title => Observable.Return("Funding Configuration"); + + public IEnumerable AmountPresets { get; } = + [ + AmountUI.FromBtc(0.25), + AmountUI.FromBtc(0.5), + AmountUI.FromBtc(1), + AmountUI.FromBtc(2.5), + ]; + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/Model/NewProject.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/Model/NewProject.cs new file mode 100644 index 000000000..8df686092 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/Model/NewProject.cs @@ -0,0 +1,9 @@ +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject.Model +{ + public class NewProject + { + public string Name { get; set; } + public string Description { get; set; } + public string Website { get; set; } + } +} diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesView.axaml b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesView.axaml new file mode 100644 index 000000000..16af1d29e --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesView.axaml @@ -0,0 +1,254 @@ + + + 220 + 120 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Upload your project's banner and profile images. + + + + + + + + + + + + + + + + 820×312px recommended + + + + + + + + + + + + + + + + + + + + + + + + + + + 170×170px + + + + + + + + + + diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesView.axaml.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesView.axaml.cs new file mode 100644 index 000000000..0527484a0 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesView.axaml.cs @@ -0,0 +1,10 @@ +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject +{ + public partial class ProjectImagesView : UserControl + { + public ProjectImagesView() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesViewModel.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesViewModel.cs new file mode 100644 index 000000000..d02b8af8b --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesViewModel.cs @@ -0,0 +1,16 @@ +using AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject.Model; + +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject +{ + public class ProjectImagesViewModel : IHaveTitle + { + public NewProject NewProject { get; } + + public ProjectImagesViewModel(NewProject newProject) + { + NewProject = newProject; + } + + public IObservable Title => Observable.Return("Project Images"); + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesViewModelSample.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesViewModelSample.cs new file mode 100644 index 000000000..a773a13fb --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectImagesViewModelSample.cs @@ -0,0 +1,8 @@ +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject +{ + public class ProjectImagesViewModelSample : IProjectTypeViewModel + { + public IObservable Title => Observable.Return("Title"); + public bool IsStarted { get; set; } + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectProfileView.axaml b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectProfileView.axaml new file mode 100644 index 000000000..78c05c026 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectProfileView.axaml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + Tell us about your project and what you're building. + + + + + + Project Name * + + + + + + + + + + + + + + + About * + + + + + + + + + + + + + + + Project Website + + + + + + + + diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectProfileView.axaml.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectProfileView.axaml.cs new file mode 100644 index 000000000..2ebbb8740 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectProfileView.axaml.cs @@ -0,0 +1,10 @@ +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject +{ + public partial class ProjectProfileView : UserControl + { + public ProjectProfileView() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectProfileViewModel.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectProfileViewModel.cs new file mode 100644 index 000000000..c9fd46df6 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ProjectProfileViewModel.cs @@ -0,0 +1,16 @@ +using AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject.Model; + +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject +{ + public class ProjectProfileViewModel : IHaveTitle + { + public NewProject NewProject { get; } + + public ProjectProfileViewModel(NewProject newProject) + { + NewProject = newProject; + } + + public IObservable Title => Observable.Return("Project Profile"); + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ReviewAndDeployView.axaml b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ReviewAndDeployView.axaml new file mode 100644 index 000000000..3d6fd7d46 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ReviewAndDeployView.axaml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Project Profile + + + + + + + + + + + + + + + + Funding Configuration + + + + + + + + + + + + + + + + Funding Stages + + + + + + + Public Keys & IDs (Advanced) + + + + + + + + + + + + + + + + + + + + + + + + + + + Ready to deploy + Please review all information carefully. Once deployed only profile information can be changed. Your project will be live on bitcoin MainNet. + + + + + \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ReviewAndDeployView.axaml.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ReviewAndDeployView.axaml.cs new file mode 100644 index 000000000..e88bf0744 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ReviewAndDeployView.axaml.cs @@ -0,0 +1,10 @@ +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject +{ + public partial class ReviewAndDeployView : UserControl + { + public ReviewAndDeployView() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ReviewAndDeployViewModel.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ReviewAndDeployViewModel.cs new file mode 100644 index 000000000..75f52e454 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/ReviewAndDeployViewModel.cs @@ -0,0 +1,16 @@ +using AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject.Model; + +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject +{ + public class ReviewAndDeployViewModel : IHaveTitle + { + public NewProject NewProject { get; } + + public ReviewAndDeployViewModel(NewProject newProject) + { + NewProject = newProject; + } + + public IObservable Title => Observable.Return("Review & Deploy"); + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/StagesView.axaml b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/StagesView.axaml new file mode 100644 index 000000000..9de61a8ac --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/StagesView.axaml @@ -0,0 +1,9 @@ + + Design pending. Please, go to the next page. + diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/StagesView.axaml.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/StagesView.axaml.cs new file mode 100644 index 000000000..5af4628c5 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/StagesView.axaml.cs @@ -0,0 +1,10 @@ +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject +{ + public partial class StagesView : UserControl + { + public StagesView() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/StagesViewModel.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/StagesViewModel.cs new file mode 100644 index 000000000..828a0ced1 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/InvestmentProject/StagesViewModel.cs @@ -0,0 +1,16 @@ +using AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject.Model; + +namespace AngorApp.UI.Flows.CreateProject.Wizard.InvestmentProject +{ + public class StagesViewModel : IHaveTitle + { + public NewProject NewProject { get; } + + public StagesViewModel(NewProject newProject) + { + NewProject = newProject; + } + + public IObservable Title => Observable.Return("Stages"); + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/ProjectTypeView.axaml b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/ProjectTypeView.axaml new file mode 100644 index 000000000..366ef7535 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/ProjectTypeView.axaml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Choose the type of project you want to launch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/ProjectTypeView.axaml.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/ProjectTypeView.axaml.cs new file mode 100644 index 000000000..855048e7d --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/ProjectTypeView.axaml.cs @@ -0,0 +1,10 @@ +namespace AngorApp.UI.Flows.CreateProject.Wizard +{ + public partial class ProjectTypeView : UserControl + { + public ProjectTypeView() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/ProjectTypeViewModel.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/ProjectTypeViewModel.cs new file mode 100644 index 000000000..2bbe1430b --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/ProjectTypeViewModel.cs @@ -0,0 +1,20 @@ +using System.Security.Principal; + +namespace AngorApp.UI.Flows.CreateProject.Wizard +{ + public partial class ProjectTypeViewModel : ReactiveObject, IHaveTitle + { + [Reactive] private ProjectType projectType; + + public IObservable Title => Observable.Return("Project Type"); + + public IEnumerable ProjectTypes { get; } = + [ + new("Investment", "One-time funding with start and end dates.", new Icon("fa-arrow-trend-up")), + new("Fund", "Recurring funding with periodic contributions.", new Icon("fa-bitcoin")), + new("Subscription", "Ongoing subscription-based funding model.", new Icon("fa-arrows-rotate")) + ]; + } + + public record ProjectType(string Name, string Description, object Icon); +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/WelcomeView.axaml b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/WelcomeView.axaml new file mode 100644 index 000000000..cbccb567b --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/WelcomeView.axaml @@ -0,0 +1,29 @@ + + + + + + + + Welcome + Create and launch your project to raise funding from the Bitcoin community. + + + A small fee is required to prevent spam and will be paid when you submit your project for deployment. + + + Start + + + diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/WelcomeView.axaml.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/WelcomeView.axaml.cs new file mode 100644 index 000000000..df6ab9197 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/WelcomeView.axaml.cs @@ -0,0 +1,10 @@ +namespace AngorApp.UI.Flows.CreateProject.Wizard +{ + public partial class WelcomeView : UserControl + { + public WelcomeView() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/WelcomeViewModel.cs b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/WelcomeViewModel.cs new file mode 100644 index 000000000..cd4707ff4 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Flows/CreateProject/Wizard/WelcomeViewModel.cs @@ -0,0 +1,9 @@ +namespace AngorApp.UI.Flows.CreateProject.Wizard +{ + public class WelcomeViewModel : IHaveTitle + { + public IEnhancedCommand> Start { get; } = EnhancedCommand.Create(() => Result.Success(Unit.Default)); + + public IObservable Title => Observable.Return("Welcome"); + }; +} \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Sections/FindProjects/FindProjectsSectionView.axaml b/src/Angor/Avalonia/AngorApp/UI/Sections/FindProjects/FindProjectsSectionView.axaml index 1e089f367..5442d51e4 100644 --- a/src/Angor/Avalonia/AngorApp/UI/Sections/FindProjects/FindProjectsSectionView.axaml +++ b/src/Angor/Avalonia/AngorApp/UI/Sections/FindProjects/FindProjectsSectionView.axaml @@ -28,10 +28,10 @@ - + - + @@ -44,7 +44,7 @@ - + @@ -61,4 +61,4 @@ - \ No newline at end of file + diff --git a/src/Angor/Avalonia/AngorApp/UI/Sections/FindProjects/FindProjectsSectionViewModel.cs b/src/Angor/Avalonia/AngorApp/UI/Sections/FindProjects/FindProjectsSectionViewModel.cs index d024cfa43..b0f1375c8 100644 --- a/src/Angor/Avalonia/AngorApp/UI/Sections/FindProjects/FindProjectsSectionViewModel.cs +++ b/src/Angor/Avalonia/AngorApp/UI/Sections/FindProjects/FindProjectsSectionViewModel.cs @@ -46,7 +46,7 @@ private Task>> DoLoadItems() return projectAppService .Latest(new LatestProjects.LatestProjectsRequest()) .Map(response => response.Projects) - .TraverseSequentially(dto => projectAppService.GetProjectStatistics(dto.Id) + .MapSequentially(dto => projectAppService.GetProjectStatistics(dto.Id) .Map(statistics => new FindProjectItem(dto, statistics, projectAppService, detailsFactory, navigator))); } diff --git a/src/Angor/Avalonia/AngorApp/UI/Sections/Home/HomeSectionView.axaml b/src/Angor/Avalonia/AngorApp/UI/Sections/Home/HomeSectionView.axaml index 807b49547..81ee96ee7 100644 --- a/src/Angor/Avalonia/AngorApp/UI/Sections/Home/HomeSectionView.axaml +++ b/src/Angor/Avalonia/AngorApp/UI/Sections/Home/HomeSectionView.axaml @@ -7,34 +7,34 @@ x:Class="AngorApp.UI.Sections.Home.HomeSectionView" x:DataType="new:HomeSectionSectionViewModel"> - + - - Fund Projects + + Fund Projects Discover and fund innovative Bitcoin projects on the Angor platform. - + - + - Get Projects Funded + Get Projects Funded Create and launch your own projects to raise funding from the Bitcoin community. - - + + - \ No newline at end of file + diff --git a/src/Angor/Avalonia/AngorApp/UI/Shared/Controls/AngorConverters.cs b/src/Angor/Avalonia/AngorApp/UI/Shared/Controls/AngorConverters.cs index 297fb6fb0..674824532 100644 --- a/src/Angor/Avalonia/AngorApp/UI/Shared/Controls/AngorConverters.cs +++ b/src/Angor/Avalonia/AngorApp/UI/Shared/Controls/AngorConverters.cs @@ -1,3 +1,4 @@ +using System.Globalization; using System.Diagnostics; using System.Text.Json; using Angor.Shared.Utilities; @@ -41,6 +42,12 @@ public static class AngorConverters return offset.Value.ToString("d"); }); + public static readonly FuncValueConverter MonthLabel = new(value => + { + var label = value == 1 ? "month" : "month".Pluralize(); + return label.Humanize(LetterCasing.Title); + }); + public static FuncValueConverter StringToQRCode { get; } = new(s => { Debug.Assert(s != null, nameof(s) + " != null"); @@ -59,4 +66,20 @@ public static class AngorConverters })); public static IValueConverter HexToNpub { get;} = new FuncValueConverter(s => s == null ? null : NostrConversionHelper.ConvertHexToNpub(s)); + + public static IValueConverter FallbackIfNullOrEmpty { get; } = new FallbackIfNullOrEmptyConverter(); + + private sealed class FallbackIfNullOrEmptyConverter : IValueConverter + { + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + var fallback = parameter?.ToString() ?? string.Empty; + return value is string s && !string.IsNullOrWhiteSpace(s) ? s : fallback; + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value; + } + } } diff --git a/src/Angor/Avalonia/AngorApp/UI/Shared/Styles/Styles.axaml b/src/Angor/Avalonia/AngorApp/UI/Shared/Styles/Styles.axaml index def7a784d..f8b9893bc 100644 --- a/src/Angor/Avalonia/AngorApp/UI/Shared/Styles/Styles.axaml +++ b/src/Angor/Avalonia/AngorApp/UI/Shared/Styles/Styles.axaml @@ -115,7 +115,7 @@ - \ No newline at end of file + diff --git a/src/Angor/Avalonia/AngorApp/UI/Shell/ShellView.axaml b/src/Angor/Avalonia/AngorApp/UI/Shell/ShellView.axaml index ab65af3c4..5cee45225 100644 --- a/src/Angor/Avalonia/AngorApp/UI/Shell/ShellView.axaml +++ b/src/Angor/Avalonia/AngorApp/UI/Shell/ShellView.axaml @@ -5,7 +5,7 @@ xmlns:generic="clr-namespace:System.Collections.Generic;assembly=System.Collections" xmlns:shell="clr-namespace:AngorApp.UI.Shell" mc:Ignorable="d" d:DesignWidth="1200" d:DesignHeight="650" - x:Class="AngorApp.UI.Shell.ShellView" x:DataType="shell:IShellViewModel" Background="{DynamicResource Background}"> + x:Class="AngorApp.UI.Shell.ShellView" x:DataType="shell:IShellViewModel" Background="{DynamicResource AppBackground}"> @@ -13,28 +13,28 @@ - + @@ -62,13 +62,13 @@ - + - + @@ -76,8 +76,8 @@ - + - \ No newline at end of file + diff --git a/src/Angor/Avalonia/AngorApp/UI/Themes/New/Custom/Buttons.axaml b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Custom/Buttons.axaml index aa088c7c0..3b3086691 100644 --- a/src/Angor/Avalonia/AngorApp/UI/Themes/New/Custom/Buttons.axaml +++ b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Custom/Buttons.axaml @@ -2,12 +2,12 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> - - - - - - + + + + + + @@ -24,7 +24,7 @@ - + @@ -32,4 +32,4 @@ - \ No newline at end of file + diff --git a/src/Angor/Avalonia/AngorApp/UI/Themes/New/Custom/ListBox.axaml b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Custom/ListBox.axaml new file mode 100644 index 000000000..46318ee7a --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Custom/ListBox.axaml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Themes/New/Icons.axaml b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Icons.axaml index 8e61777fa..ef84fc980 100644 --- a/src/Angor/Avalonia/AngorApp/UI/Themes/New/Icons.axaml +++ b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Icons.axaml @@ -4,4 +4,5 @@ M 13 10 V 3 L 4 14 H 11 V 21 L 20 10 H 13 Z m 59.886719,4.4863281 c -1.07495,0.5899597 -1.63314,1.8065382 -2.234996,2.8273089 -3.214053,6.681439 -6.271027,13.43767 -9.461081,20.131215 -6.345644,13.595261 -12.73279,27.170711 -19.124329,40.744944 -0.887942,1.935861 -1.872609,4.056333 -2.685454,5.88247 -0.643109,1.671055 -1.555067,3.277459 -1.847656,5.058593 -0.220023,1.768085 1.161632,3.160566 2.421875,4.181641 2.705637,1.946282 5.64285,3.540645 8.442648,5.344828 6.962457,4.279407 13.887935,8.620935 20.897564,12.822152 1.430271,0.79318 3.123174,1.30651 4.762109,1.06837 2.198587,-0.67634 4.040894,-2.12779 6.02925,-3.237557 7.817802,-4.852046 15.742335,-9.532452 23.509054,-14.466543 1.424729,-1.011022 3.039184,-1.876992 4.10827,-3.291464 1.11554,-1.67289 0.293473,-3.724997 -0.316253,-5.421215 C 90.835394,68.226406 87.075999,60.412197 83.417969,52.537109 77.515085,39.892865 71.528971,27.253248 65.683594,14.603516 64.886087,12.887707 63.986906,11.009213 63.201172,9.4199219 62.426775,7.9858816 61.756748,6.4706036 60.801096,5.1493769 60.538495,4.9024504 60.247043,4.5572525 59.886719,4.4863281 Z M 75.022242,71.785024 c 0.281395,0.69611 0.563287,1.392019 0.844946,2.088023 -4.825832,3.012072 -9.658587,6.018137 -14.527344,8.957031 C 60.086898,83.48834 58.603096,83.06479 57.534492,82.248701 52.968781,79.424599 48.366191,76.660696 43.835938,73.78125 48.99544,62.73373 55.050972,50.823685 60.23687,39.78852 65.209256,50.3146 70.244238,61.064005 75.022242,71.785024 Z M 16.769531,98.128906 c -1.734672,0.208861 -2.458123,2.039204 -3.238281,3.357424 -3.01348,5.77302 -5.6814402,11.71853 -8.4648438,17.60351 -0.5229742,1.32192 -1.0763019,2.87073 -0.5390624,4.26758 0.6196273,0.95591 1.9434053,0.73048 2.9201167,0.90896 2.0945798,0.1919 4.1944745,0.31533 6.2946745,0.1396 2.046675,-0.16417 4.39538,0.0723 6.02413,-1.43517 1.512184,-1.39517 2.24257,-3.39011 3.227756,-5.1518 1.584234,-3.34954 3.298058,-6.66045 4.502611,-10.17052 0.532374,-1.57427 -0.06009,-3.38648 -1.417218,-4.34484 -2.527613,-1.84781 -5.23303,-3.453387 -7.990774,-4.928295 -0.414334,-0.178574 -0.866489,-0.280917 -1.319109,-0.246449 z M 103.03711,98.125 c -2.35697,0.424382 -4.321459,1.93311 -6.326704,3.15037 -1.35792,0.98806 -3.018139,1.7188 -3.951517,3.17273 -0.798734,1.43253 -0.376512,3.18737 0.128493,4.64671 1.639807,3.59809 3.334574,7.20073 5.101467,10.66798 0.834174,1.81162 2.047101,3.77984 4.153781,4.21358 3.05079,0.50728 6.10647,0.42207 9.19092,0.37966 1.23407,-0.11407 2.54746,-0.0974 3.69184,-0.61775 0.99649,-0.71585 0.66696,-2.15584 0.39274,-3.15933 -2.72199,-6.21989 -5.56197,-12.39205 -8.61344,-18.45786 -0.79186,-1.32152 -1.37899,-2.917004 -2.72365,-3.782142 -0.31574,-0.179207 -0.68546,-0.231419 -1.04393,-0.213948 z M30,13.21A3.93,3.93,0,1,1,36.8,9.27L41.86,18A3.94,3.94,0,1,1,35.05,22L30,13.21Zm31.45,13A35.23,35.23,0,1,1,36.52,36.52,35.13,35.13,0,0,1,61.44,26.2ZM58.31,4A3.95,3.95,0,1,1,66.2,4V14.06a3.95,3.95,0,1,1-7.89,0V4ZM87.49,10.1A3.93,3.93,0,1,1,94.3,14l-5.06,8.76a3.93,3.93,0,1,1-6.81-3.92l5.06-8.75ZM109.67,30a3.93,3.93,0,1,1,3.94,6.81l-8.75,5.06a3.94,3.94,0,1,1-4-6.81L109.67,30Zm9.26,28.32a3.95,3.95,0,1,1,0,7.89H108.82a3.95,3.95,0,1,1,0-7.89Zm-6.15,29.18a3.93,3.93,0,1,1-3.91,6.81l-8.76-5.06A3.93,3.93,0,1,1,104,82.43l8.75,5.06ZM92.89,109.67a3.93,3.93,0,1,1-6.81,3.94L81,104.86a3.94,3.94,0,0,1,6.81-4l5.06,8.76Zm-28.32,9.26a3.95,3.95,0,1,1-7.89,0V108.82a3.95,3.95,0,1,1,7.89,0v10.11Zm-29.18-6.15a3.93,3.93,0,0,1-6.81-3.91l5.06-8.76A3.93,3.93,0,1,1,40.45,104l-5.06,8.75ZM13.21,92.89a3.93,3.93,0,1,1-3.94-6.81L18,81A3.94,3.94,0,1,1,22,87.83l-8.76,5.06ZM4,64.57a3.95,3.95,0,1,1,0-7.89H14.06a3.95,3.95,0,1,1,0,7.89ZM10.1,35.39A3.93,3.93,0,1,1,14,28.58l8.76,5.06a3.93,3.93,0,1,1-3.92,6.81L10.1,35.39Z + M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12 \ No newline at end of file diff --git a/src/Angor/Avalonia/AngorApp/UI/Themes/New/NewTheme.axaml b/src/Angor/Avalonia/AngorApp/UI/Themes/New/NewTheme.axaml index 825eec47c..dc2536b47 100644 --- a/src/Angor/Avalonia/AngorApp/UI/Themes/New/NewTheme.axaml +++ b/src/Angor/Avalonia/AngorApp/UI/Themes/New/NewTheme.axaml @@ -9,8 +9,7 @@ - - + @@ -40,130 +39,180 @@ - #F9F9F9 - White - #19000000 - #6B7280 - #2D5A3D - #2D5A3D - #0A0A0A - #E9E9E9 - White - White + #F9F9F9 + White + #19000000 + #6B7280 + #0A0A0A + #2D5A3D + #2D5A3D + #F7931A + #E9E9E9 + White + White + #E5E7EB + #FAF9F6 + + + + + + + 0 0 30 0 LightGray 0 0 20 0 LightGray 0 5 25 0 LightGray - - - - - - - - - - - + + + - - - + + + + + + + + + - #0A0A0A - #B31A1A1A - #19FFFFFF - #A0A0A0 - #E5E8E1 - #5FAF78 - #FAFAFA - #3A3A3A - #202020 - #2A2A2A + #0A0A0A + #B31A1A1A + #19FFFFFF + #A0A0A0 + #FAFAFA + #5FAF78 + #E5E8E1 + #F7931A + #3A3A3A + #202020 + #2A2A2A + #333333 + #0A0A0A + + + + + + + + + + 0 0 0 0 Transparent 0 0 0 0 LightGray 0 0 0 0 LightGray - - + + - - + + - + - + - + - - - - - - - + + + + + #2D5A3D + + + + + - - - - - - - - - 5 - 10 - 12 - 20 - 40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + - - - - - - - - - - - - - - - + + + + - - + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + - + - - - HOLA - - - - - - - + + + + HOLA + + + + + + + + + - - - HOLA - - - - - - - + + + + HOLA + + + + + + + + + diff --git a/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/ButtonStylesTemplate.axaml b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/ButtonStylesTemplate.axaml new file mode 100644 index 000000000..6b8547d44 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/ButtonStylesTemplate.axaml @@ -0,0 +1,105 @@ + + + + + + + + + + + + Buttons + NewTheme (local-only) – style classes + + + + EnhancedButton + + + Default + + + + + + Accent + + + + + + Secondary + + + + + + Outline + + + + + + ToggleButton + + + Widget (unchecked) + + + + + + + Widget (checked) + + + + + + + Widget (disabled) + + + + + + + ProgressRing + + + + + + + + + + + Buttons + Dark variant preview + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/ColorsAndBrushesTemplate.axaml b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/ColorsAndBrushesTemplate.axaml new file mode 100644 index 000000000..2c7bf558a --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/ColorsAndBrushesTemplate.axaml @@ -0,0 +1,191 @@ + + + + + + + + + + + + Colors & Brushes + NewTheme (local-only) – resource keys + + + + Colors (Color resources) + + + Key + Swatch + Typical usage + + AppBackground + + + + + + App/page background. + + Surface + + + + + + Panels, cards, containers. + + CardSurface + + + + + + Elevated surfaces and cards. + + SurfaceHover + + + + + + Hover background states. + + SurfaceSelected + + + + + + Selected items, active surfaces. + + SurfaceSubtle + + + + + + Subtle separators and neutral fills. + + Stroke + + + + + + Borders, separators, outlines. + + TextMuted + + + + + + Secondary text, hints, metadata. + + TextStrong + + + + + + Primary text and emphasis. + + Accent / Brand + + + + + + Brand highlights, accents, progress. + + + Brushes + + Key + Swatch + Typical usage + + ProgressBrush + + Progress indicators / gradients. + + PrimaryButton* + + Primary buttons (default EnhancedButton). + + AccentButton* + + Accent buttons (EnhancedButton.Classes="Accent"). + + SecondaryButton* + + Secondary buttons (EnhancedButton.Classes="Secondary"). + + + Shadows (BoxShadows) + + + SectionShadow + + + ItemShadow + + + ItemShadowBig + + + + + + + + + + + + Colors & Brushes + Dark variant preview + + + + Primary surfaces + + + + + + Surface + + + SurfaceHover + + + ProgressBrush + + + + Buttons + + + + + + + + + + + + + + diff --git a/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/NewTheme.LocalOnly.axaml b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/NewTheme.LocalOnly.axaml new file mode 100644 index 000000000..c447b4411 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/NewTheme.LocalOnly.axaml @@ -0,0 +1,192 @@ + + + + + + + + + + + + #F9F9F9 + White + #19000000 + #6B7280 + #0A0A0A + #2D5A3D + #2D5A3D + #F7931A + #E9E9E9 + White + White + #E5E7EB + + + + + + + + + 0 0 30 0 LightGray + 0 0 20 0 LightGray + 0 5 25 0 LightGray + + + + + + + + + + + + + + + + #0A0A0A + #B31A1A1A + #19FFFFFF + #A0A0A0 + #FAFAFA + #E5E8E1 + #5FAF78 + #F7931A + #3A3A3A + #202020 + #2A2A2A + #333333 + + + + + + + + + 0 0 0 0 Transparent + 0 0 0 0 LightGray + 0 0 0 0 LightGray + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/TextStylesTemplate.axaml b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/TextStylesTemplate.axaml new file mode 100644 index 000000000..a28ff0513 --- /dev/null +++ b/src/Angor/Avalonia/AngorApp/UI/Themes/New/Templates/TextStylesTemplate.axaml @@ -0,0 +1,85 @@ + + + + + + + + + + + + Text Styles + NewTheme (local-only) – reference sheet + + + + + + Style + Example + Usage + + TextBlock.Title + Page Title + Top-level headings (pages, screens, dialogs). + + TextBlock.Header + Section header with a long title that trims + Section titles inside a page; use when space is limited. + + TextBlock.Big + Emphasized text + Primary emphasis (key values, totals, callouts). + + TextBlock.Subtitle + Supporting subtitle + Secondary headings, intro lines, or brief summaries. + + TextBlock.Regular + Body text paragraph example. + Default body copy for descriptions and longer content. + + TextBlock.Strong + Strong emphasis + Inline emphasis inside regular text (labels, key parts). + + Run.Label / Run.Thin + + + + + Inline styling within a single TextBlock sentence. + + + + + + + + + + + Text Styles + Dark variant preview + + + + Header + + + + + Strong text uses TextStrong color. + + + + + + + + diff --git a/src/Angor/Avalonia/Directory.Packages.props b/src/Angor/Avalonia/Directory.Packages.props index c9dc05695..678977d91 100644 --- a/src/Angor/Avalonia/Directory.Packages.props +++ b/src/Angor/Avalonia/Directory.Packages.props @@ -47,15 +47,15 @@ - + - - - + + + - +