diff --git a/Documentation/Blazorise.Docs.Server/Infrastructure/EmailOptions.cs b/Documentation/Blazorise.Docs.Server/Infrastructure/EmailOptions.cs new file mode 100644 index 0000000000..ffd3b66540 --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/Infrastructure/EmailOptions.cs @@ -0,0 +1,19 @@ +using Blazorise.Docs.Core; + +namespace Blazorise.Docs.Server.Infrastructure; + +public class EmailOptions : IEmailOptions +{ + public string SmtpServer { get; set; } + public int SmtpPort { get; set; } + public string SmtpUsername { get; set; } + public string SmtpPassword { get; set; } + public bool SmtpUseSSL { get; set; } + + public string FromName { get; set; } + public string FromAddress { get; set; } + public string ReplyToAddress { get; set; } + + public string ThemeReviewName { get; set; } + public string ThemeReviewAddress { get; set; } +} diff --git a/Documentation/Blazorise.Docs.Server/Pages/_Layout.cshtml b/Documentation/Blazorise.Docs.Server/Pages/_Layout.cshtml index cbde0fda3a..4c4afac811 100644 --- a/Documentation/Blazorise.Docs.Server/Pages/_Layout.cshtml +++ b/Documentation/Blazorise.Docs.Server/Pages/_Layout.cshtml @@ -44,6 +44,11 @@ + + + diff --git a/Documentation/Blazorise.Docs.Server/Startup.cs b/Documentation/Blazorise.Docs.Server/Startup.cs index 230b5eced6..e4d4351ee3 100644 --- a/Documentation/Blazorise.Docs.Server/Startup.cs +++ b/Documentation/Blazorise.Docs.Server/Startup.cs @@ -1,7 +1,9 @@ using System; using System.IO.Compression; using Blazorise.Bootstrap5; +using Blazorise.Docs.Core; using Blazorise.Docs.Server.Infrastructure; +using Blazorise.Docs.Services; using Blazorise.FluentValidation; using Blazorise.Icons.FontAwesome; using Blazorise.RichTextEdit; @@ -56,6 +58,11 @@ public void ConfigureServices( IServiceCollection services ) services.AddScoped(); services.AddScoped(); + var emailOptions = Configuration.GetSection( "Email" ).Get(); + services.AddSingleton( serviceProvider => emailOptions ); + + services.AddSingleton(); + services.AddResponseCompression( options => { options.EnableForHttps = true; diff --git a/Documentation/Blazorise.Docs.Server/appsettings.json b/Documentation/Blazorise.Docs.Server/appsettings.json index ccb91443d3..2c4e3a4304 100644 --- a/Documentation/Blazorise.Docs.Server/appsettings.json +++ b/Documentation/Blazorise.Docs.Server/appsettings.json @@ -13,5 +13,17 @@ "SendGrid": { "ApiKey": "SECRET_KEY", "ListId": "SECRET_ID" + }, + "Email": { + "SmtpServer": "", + "SmtpPort": 465, + "SmtpUseSSL": true, + "SmtpUsername": "apikey", + "SmtpPassword": "", + "FromName": "Blazorise Commercial", + "FromAddress": "commercial@blazorise.com", + "ReplyToAddress": "commercial@blazorise.com", + "ThemeReviewName": "Blazorise Commercial", + "ThemeReviewAddress": "commercial@blazorise.com" } } diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/files/licences/SLA-2023-07.pdf b/Documentation/Blazorise.Docs.Server/wwwroot/files/licences/SLA-2023-07.pdf new file mode 100644 index 0000000000..2ad8beb464 Binary files /dev/null and b/Documentation/Blazorise.Docs.Server/wwwroot/files/licences/SLA-2023-07.pdf differ diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/files/supports/BlazorisePrioritySupport.pdf b/Documentation/Blazorise.Docs.Server/wwwroot/files/supports/BlazorisePrioritySupport.pdf new file mode 100644 index 0000000000..fdbef34ec4 Binary files /dev/null and b/Documentation/Blazorise.Docs.Server/wwwroot/files/supports/BlazorisePrioritySupport.pdf differ diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/enterprise/expert-1.jpg b/Documentation/Blazorise.Docs.Server/wwwroot/img/enterprise/expert-1.jpg new file mode 100644 index 0000000000..9527161d2a Binary files /dev/null and b/Documentation/Blazorise.Docs.Server/wwwroot/img/enterprise/expert-1.jpg differ diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/enterprise/mentor-1.jpg b/Documentation/Blazorise.Docs.Server/wwwroot/img/enterprise/mentor-1.jpg new file mode 100644 index 0000000000..b27bed3a4c Binary files /dev/null and b/Documentation/Blazorise.Docs.Server/wwwroot/img/enterprise/mentor-1.jpg differ diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/features/code-utils-1.png b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/code-utils-1.png new file mode 100644 index 0000000000..60f3dcfb5f Binary files /dev/null and b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/code-utils-1.png differ diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/features/code-validation-1.png b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/code-validation-1.png new file mode 100644 index 0000000000..ea5d8460b2 Binary files /dev/null and b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/code-validation-1.png differ diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/features/frameworks-1.png b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/frameworks-1.png new file mode 100644 index 0000000000..3b00c61f6b Binary files /dev/null and b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/frameworks-1.png differ diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/features/localization.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/localization.svg new file mode 100644 index 0000000000..608d169c64 --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/localization.svg @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/features/open-source.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/open-source.svg new file mode 100644 index 0000000000..4097040852 --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/open-source.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/features/responsive.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/responsive.svg new file mode 100644 index 0000000000..a89704310c --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/responsive.svg @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/features/themes.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/themes.svg new file mode 100644 index 0000000000..383cf6d6ff --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/features/themes.svg @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/illustrations/save-tag-monthly.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/illustrations/save-tag-monthly.svg new file mode 100644 index 0000000000..660bb39369 --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/illustrations/save-tag-monthly.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/abp.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/abp.svg new file mode 100644 index 0000000000..18e5446736 --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/abp.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/bluepanda.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/bluepanda.svg new file mode 100644 index 0000000000..b3479d6b7a --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/bluepanda.svg @@ -0,0 +1,121 @@ + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/corptrade.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/corptrade.svg new file mode 100644 index 0000000000..8954e36473 --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/corptrade.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/daimler.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/daimler.svg new file mode 100644 index 0000000000..679d0f60d4 --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/daimler.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/deutsche-telekom.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/deutsche-telekom.svg new file mode 100644 index 0000000000..e681b915c6 --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/deutsche-telekom.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/fitabase.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/fitabase.svg new file mode 100644 index 0000000000..10b1fc90bd --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/fitabase.svg @@ -0,0 +1,40 @@ + + + + + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/ge.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/ge.svg new file mode 100644 index 0000000000..88552d5d21 --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/ge.svg @@ -0,0 +1,48 @@ + + + + + + + + + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/microsoft.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/microsoft.svg new file mode 100644 index 0000000000..9fe91ca22c --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/microsoft.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/pebble.svg b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/pebble.svg new file mode 100644 index 0000000000..5f07875459 --- /dev/null +++ b/Documentation/Blazorise.Docs.Server/wwwroot/img/logos/users/pebble.svg @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazespark/dashboard-small.jpg b/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazespark/dashboard-small.jpg new file mode 100644 index 0000000000..6e627cc87d Binary files /dev/null and b/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazespark/dashboard-small.jpg differ diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazespark/dashboard.jpg b/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazespark/dashboard.jpg new file mode 100644 index 0000000000..151f0dd5eb Binary files /dev/null and b/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazespark/dashboard.jpg differ diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazestack/dashboard-small.jpg b/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazestack/dashboard-small.jpg new file mode 100644 index 0000000000..7762055840 Binary files /dev/null and b/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazestack/dashboard-small.jpg differ diff --git a/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazestack/dashboard.jpg b/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazestack/dashboard.jpg new file mode 100644 index 0000000000..0edf3ca3d3 Binary files /dev/null and b/Documentation/Blazorise.Docs.Server/wwwroot/img/themes/blazestack/dashboard.jpg differ diff --git a/Documentation/Blazorise.Docs/Blazorise.Docs.csproj b/Documentation/Blazorise.Docs/Blazorise.Docs.csproj index f017d068ad..af456a29c8 100644 --- a/Documentation/Blazorise.Docs/Blazorise.Docs.csproj +++ b/Documentation/Blazorise.Docs/Blazorise.Docs.csproj @@ -32,6 +32,8 @@ + + diff --git a/Documentation/Blazorise.Docs/Components/Commercial/CustomerQuote.razor b/Documentation/Blazorise.Docs/Components/Commercial/CustomerQuote.razor new file mode 100644 index 0000000000..ee566d832e --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/CustomerQuote.razor @@ -0,0 +1,22 @@ + + + + + + + + @Quote + + Partner web + + + +@code{ + [Parameter] public string LogoUrl { get; set; } + + [Parameter] public string LogoText { get; set; } + + [Parameter] public string Quote { get; set; } + + [Parameter] public string PartnerUrl { get; set; } +} \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Components/Commercial/DevelopersPicker.razor b/Documentation/Blazorise.Docs/Components/Commercial/DevelopersPicker.razor new file mode 100644 index 0000000000..7f44068041 --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/DevelopersPicker.razor @@ -0,0 +1,41 @@ +
+ + + +
+@code { + [Parameter] public int Value { get; set; } = 1; + + [Parameter] public EventCallback ValueChanged { get; set; } + + private Task OnValueChanged( int value ) + { + Value = value; + + return ValueChanged.InvokeAsync( Value ); + } + + private Task OnDownClicked() + { + Value--; + + if ( Value < 1 ) + Value = 1; + + return ValueChanged.InvokeAsync( Value ); + } + + private Task OnUpClicked() + { + Value++; + + if ( Value > 999 ) + Value = 999; + + return ValueChanged.InvokeAsync( Value ); + } +} diff --git a/Documentation/Blazorise.Docs/Components/Commercial/Faq.razor b/Documentation/Blazorise.Docs/Components/Commercial/Faq.razor new file mode 100644 index 0000000000..9a684b1aad --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/Faq.razor @@ -0,0 +1,97 @@ +@if ( ShowHeader ) +{ + + FAQ + +} + + + @foreach ( var faqInfo in faqInfos ) + { + var index = faqInfos.IndexOf( faqInfo ) + 1; + + + + + @($"{index}. {faqInfo.Title}") + + + + @faqInfo.Body + + + } + +@code { + [Parameter] public bool ShowHeader { get; set; } = true; + + class FaqInfo + { + public bool Visible { get; set; } + + public string Title { get; set; } + + public string Body { get; set; } + } + + private List faqInfos = new List + { + new FaqInfo { + Title = "Is subscription renewal automatic?", + Body = "The renewal is automatic if it was activated through our partner Paddle.com. It will recur after the subscription period ends. You can cancel your subscription at any time." + }, + + new FaqInfo { + Title = "What happens if I stop with yearly subscription?", + Body = "By ending the yearly subscription you will no longer get free Blazorise updates, access to our support web and access to our private repositories. The last Blazorise version that was at the time of ending the yearly subscription will stay with you and you can continue to use it." + }, + + new FaqInfo { + Title = "Is the license perpetual?", + Body = "Yes. Blazorise licenses are perpetual. Perpetual means that the Professional features are available after the subscription ends. Product updates and support are only available during the subscription period." + }, + + new FaqInfo { + Title = "Does the license include support?", + Body = "Blazorise Professional and Blazorise Enterprise include dedicated support over our support forum during the subscription period." + }, + + new FaqInfo { + Title = "How many licenses do I need?", + Body = "All developers contributing to a project that uses any of the commercial products need to have a valid license." + }, + + new FaqInfo { + Title = "Do I need to purchase license if I'm freelancer and work with Blazorise for my clients?", + Body = "If freelancers are using Blazorise for their client projects, they would be considered as developers who are using Blazorise in their work. Therefore, they would need to obtain a commercial license for Blazorise. The responsibility for obtaining the necessary Blazorise licenses would depend on the terms of the agreement between the freelancer and their client company." + }, + + new FaqInfo { + Title = "If I deploy Blazorise based apps to my client, do they also need to purchase license?", + Body = "No. Your client doesn't need to purchase Blazorise license." }, + + new FaqInfo { + Title = "What is a customized agreement?", + Body = "You have the option to tailor the agreements that best suit your needs." }, + + new FaqInfo { + Title = "What does the Blazorise Mentor service include?", + Body = "Blazorise Mentor provides you with a personal Blazorise expert to assist you on your Blazorise journey. Consider your mentor to be a senior developer who can answer difficult questions about Blazorise and web development in person or via the communication tool of your choice. Blazorise Mentor keeps you out of common pitfalls and can have a significant impact on the productivity and quality of your team." + }, + + new FaqInfo { + Title = "What are packaged services?", + Body = "Packaged services are the service offerings most favored by our consulting customers that we bundle together and make available to Enterprise customers." + }, + + new FaqInfo { + Title = "What is the currency your prices are shown in?", + Body = "Our prices are shown in USD, and are charged in your local currency if available. Otherwise it is charged in USD." + }, + + new FaqInfo { + Title = "Do you offer volume discounts?", + Body = "Yes, get in touch with us at sales@blazorise.com." + }, + }; +} \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Components/Commercial/HorizontalHero.razor b/Documentation/Blazorise.Docs/Components/Commercial/HorizontalHero.razor new file mode 100644 index 0000000000..44996df195 --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/HorizontalHero.razor @@ -0,0 +1,48 @@ + + + + + + + @if ( Title != null ) + { + + @Title + + } + @if ( Description != null ) + { + + @Description + + } + @if ( Actions != null ) + { +
+ @Actions +
+ } +
+
+
+@code{ + private IFluentFlex RowFlex => Reversed + ? Flex.ReverseRow.OnWidescreen.AlignItems.Center + : Flex.Row.OnWidescreen.AlignItems.Center; + + private IFluentFlex ButtonFlex => Reversed + ? Flex._.OnDesktop.JustifyContent.Start.OnDesktop + : Flex._.OnDesktop.JustifyContent.End.OnDesktop; + + [Parameter] public bool Reversed { get; set; } + + [Parameter] public string ImageSource { get; set; } + + [Parameter] public string ImageText { get; set; } + + [Parameter] public RenderFragment Title { get; set; } + + [Parameter] public RenderFragment Description { get; set; } + + [Parameter] public RenderFragment Actions { get; set; } +} \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Components/Commercial/PlanSwitch.razor b/Documentation/Blazorise.Docs/Components/Commercial/PlanSwitch.razor new file mode 100644 index 0000000000..118e0c02ba --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/PlanSwitch.razor @@ -0,0 +1,30 @@ +
+
+ One time payment +
+
+ Monthly +
+
+ Annually +
+
+ +
+
+@code { + private TextColor GetSaveColor( string value ) => SelectedValue == value ? TextColor.Light : TextColor.Success; + + private Background GetSelectedBackground( string value ) => SelectedValue == value ? Background.Primary : Background.Default; + + private TextColor GetTextSelectedColor( string value ) => SelectedValue == value ? TextColor.White : TextColor.Default; + + private Task OnClicked( string value ) + { + return SelectedValueChanged.InvokeAsync( value ); + } + + [Parameter] public string SelectedValue { get; set; } + + [Parameter] public EventCallback SelectedValueChanged { get; set; } +} diff --git a/Documentation/Blazorise.Docs/Components/Commercial/PlansComparer.razor b/Documentation/Blazorise.Docs/Components/Commercial/PlansComparer.razor new file mode 100644 index 0000000000..02e5476068 --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/PlansComparer.razor @@ -0,0 +1,189 @@ + + Compare plans + + + + + + + Free + Professional + Enterprise + Enterprise Plus + + + + + Public + + + + + + + + Private + + + + + + + + + + + + + + + Commercial Use + + + + + + + + + Regular updates + + + + + + + + + Unlimited number of applications + + + + + + + + + + + + + Themes + + + + + + + + + + + @* + + + Blocks + + + + + + + + + + *@ + + + + 1 year premium forum support + + + + + + + + + + + + + + + + + + + + + + + + + + + Forum support incident count/year + + + + + + 10 + 25 + Unlimited + + + + Guaranteed response time + + + + + + 24 hours + 16 hours + Custom + + + + Priority fixes and feature requests + + + + + + + + + + + + + Blazorise Mentor + + + + + + + + + + + + + + Expert on Demand + + + + + + + + + + + +
\ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Components/Commercial/Pricing.razor b/Documentation/Blazorise.Docs/Components/Commercial/Pricing.razor new file mode 100644 index 0000000000..ca4fbdf604 --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/Pricing.razor @@ -0,0 +1,287 @@ +@using System.Globalization; + + + COMMERCIAL LICENSE + COMMUNITY LICENSE + + + + + + + Flexible plans + + + Choose a plan that works best for you and your team + + + + + + + users + + + + + + + + + + + @if ( plan == "one-time" ) + { + + This plan offers you permanent access to our services with a single payment. You'll receive all current features without the need for recurring payments. Ideal for those who are committed to long-term use and prefer a one-off payment option. + + } + else if ( plan == "monthly" ) + { + + This is a recurring plan where you pay every month for continuous access to our services. This plan gives you the flexibility to cancel at any time. It is best suited for those who want to try our services or need them for a short period. + + } + else if ( plan == "annually" ) + { + + This plan offers you access to our services for an entire year. You'll pay once a year, and it often comes at a discounted price compared to the monthly plan. This plan is recommended for users who want to maintain access to our services while enjoying a discounted price. + + } + + + + + + + + + Professional + + + +
+ @($"${( professionalPrices[plan].Price * quantity ).ToString( CultureInfo.InvariantCulture )}")/@professionalPrices[plan].Unit +
+ + @($"${( professionalPrices[plan].HigherPrice * quantity ).ToString( CultureInfo.InvariantCulture )}")/@professionalPrices[plan].Unit + + + + local tax (if applicable) + + + (per developer, royalty-free subscription) + + + + + + Everything from Blazorise Community + + + + Premium forum support + + + + Dedicated customer support with 24 hour response time + + + + + Buy Now + +
+
+
+ + + + + Enterprise Popular + + + +
+ @($"${( enterprisePrices[plan].Price * quantity ).ToString( CultureInfo.InvariantCulture )}")/@professionalPrices[plan].Unit +
+ + @($"${( enterprisePrices[plan].HigherPrice * quantity ).ToString( CultureInfo.InvariantCulture )}")/@professionalPrices[plan].Unit + + + + local tax (if applicable) + + + (per developer, royalty-free subscription) + + + + + + Everything from Blazorise Professional + + + + + Premium themes + + + + + Priority customer support with 16 hour response time + + + + Priority fixes and feature requests + + + + + Buy Now + +
+
+
+ + + + + Enterprise Plus + + + +
+ Custom +
+ + (a custom plan to suit any large enterprise) + + + + + + Everything from Blazorise Enterprise + + + + Unlimited seats + + + + Blazorise Mentor + + + + Expert on Demand + + + + Packaged services + + + + Customized agreement + + + + +
+
+
+
+ + + + + + + + Other Ways to Make a Purchase? + + + Enter your information, and you'll receive a quote or estimate to sign. We will activate your licenses and send you an invoice with NET 30 payment terms once it has been signed and returned. + + + + + + + + + + +
+ + + + + Get Blazorise for Free + + + Any individual can claim Blazorise license for free Learn more! + + + + + + + + + + No credit card required. + + + + + +
+ + For individuals + + + Any individual developer can use Blazorise Community to create their own apps for free. + +
+
+ @* +
+ + For organizations + + + An unlimited number of users within an organization can use Blazorise Community in a Non-Commercial Manner way for the following scenarios: in a classroom learning environment, for academic research, or for contributing to open source projects. + +
+
*@ + +
+ + Unlimited access + + + Get unlimited access to our 80+ components. + +
+
+ +
+ + Community support + + + Community License holders have access to our community support system via the public forum on GitHub, and Discord channels, + +
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Components/Commercial/Pricing.razor.cs b/Documentation/Blazorise.Docs/Components/Commercial/Pricing.razor.cs new file mode 100644 index 0000000000..0ddfa4daf1 --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/Pricing.razor.cs @@ -0,0 +1,71 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Blazorise.Docs.Models; +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; + +namespace Blazorise.Docs.Components.Commercial; + +public partial class Pricing +{ + private class PriceInfo + { + public int Price { get; set; } + + public int HigherPrice { get; set; } + + public string Unit { get; set; } + + public int ProductId { get; set; } + + public object Upsell { get; set; } + } + + private Dictionary professionalPrices = new Dictionary() + { + { "one-time", new PriceInfo { Unit = "year", Price = 659, ProductId = PaddlePrices.ProfessionalOneTimePerDeveloper, Upsell = new { Id = PaddlePrices.ProfessionalBundle, Title = "Upgrade to Professional Bundle", Text = "

Consider the Blazorise Professional Bundle!

Besides standard features, it offers exclusive themes for a richer, more engaging user experience.

Stand out with stunning design, all in one upgrade. Enhance your project now!

", Action = "Buy Bundle »" } } }, + { "annually", new PriceInfo { Unit = "year", Price = 599, HigherPrice = 708, ProductId = PaddlePrices.ProfessionalYearlySubscriptionPerDeveloper } }, + { "monthly", new PriceInfo { Unit = "month", Price = 59, ProductId = PaddlePrices.ProfessionalMonthlySubscriptionPerDeveloper } }, + }; + + private Dictionary enterprisePrices = new Dictionary() + { + { "one-time", new PriceInfo { Unit = "year", Price = 1099, ProductId = PaddlePrices.EnterpriseOneTimePerDeveloper } }, + { "annually", new PriceInfo { Unit = "year", Price = 999, HigherPrice = 1188, ProductId = PaddlePrices.EnterpriseYearlySubscriptionPerDeveloper } }, + { "monthly", new PriceInfo { Unit = "month", Price = 99, ProductId = PaddlePrices.EnterpriseMonthlySubscriptionPerDeveloper } }, + }; + + string plan = "annually"; + + int quantity = 1; + + string selectedTab = "commercial"; + + private Task OnSelectedTabChanged( string name ) + { + selectedTab = name; + + return Task.CompletedTask; + } + + protected async Task OnProfessionalClicked() + { + await JSRuntime.InvokeVoidAsync( "blazorisePRO.paddle.openCheckout", professionalPrices[plan].ProductId, quantity, professionalPrices[plan].Upsell ); + } + + protected async Task OnEnterpriseClicked() + { + await JSRuntime.InvokeVoidAsync( "blazorisePRO.paddle.openCheckout", enterprisePrices[plan].ProductId, quantity ); + } + + Task OnProductOrderClicked() + { + NavigationManager.NavigateTo( $"purchase-order" ); + + return Task.CompletedTask; + } + + [Inject] IJSRuntime JSRuntime { get; set; } + + [Inject] NavigationManager NavigationManager { get; set; } +} diff --git a/Documentation/Blazorise.Docs/Components/Commercial/PurchaseButton.razor b/Documentation/Blazorise.Docs/Components/Commercial/PurchaseButton.razor new file mode 100644 index 0000000000..8f7b143cc5 --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/PurchaseButton.razor @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Components/Commercial/PurchaseButton.razor.cs b/Documentation/Blazorise.Docs/Components/Commercial/PurchaseButton.razor.cs new file mode 100644 index 0000000000..bd95596be2 --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/PurchaseButton.razor.cs @@ -0,0 +1,41 @@ +#region Using directives +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; +#endregion + +namespace Blazorise.Docs.Components.Commercial; + +public partial class PurchaseButton +{ + #region Members + + #endregion + + #region Methods + + async Task OnPurchaseClicked() + { + await JSRuntime.InvokeVoidAsync( "blazorisePRO.paddle.openCheckout", ProductId, Quantity, Upsell ); + } + + #endregion + + #region Properties + + [Inject] IJSRuntime JSRuntime { get; set; } + + [Parameter] public Color Color { get; set; } + + [Parameter] public int ProductId { get; set; } + + [Parameter] public int Quantity { get; set; } + + [Parameter] public object Upsell { get; set; } + + [Parameter] public string ProductName { get; set; } + + [Parameter] public RenderFragment ChildContent { get; set; } + + #endregion +} diff --git a/Documentation/Blazorise.Docs/Components/Commercial/ThemePage.razor b/Documentation/Blazorise.Docs/Components/Commercial/ThemePage.razor new file mode 100644 index 0000000000..9ad2f67518 --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/ThemePage.razor @@ -0,0 +1,52 @@ + + + + + + + @Title + + + + + + + + @Description + + + + + + + Options + + + +
+ + + @foreach ( var product in Products ) + { + + + + } + + + + + + + + +
+
+
+
+
+
\ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Components/Commercial/ThemePage.razor.cs b/Documentation/Blazorise.Docs/Components/Commercial/ThemePage.razor.cs new file mode 100644 index 0000000000..0f4ebab481 --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/ThemePage.razor.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Blazorise.Docs.Models; +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; + +namespace Blazorise.Docs.Components.Commercial; + +public partial class ThemePage +{ + int checkedProductId; + + protected override Task OnInitializedAsync() + { + checkedProductId = Products?.Select( x => x.Id )?.FirstOrDefault() ?? 0; + + return base.OnInitializedAsync(); + } + + async Task OnPurchaseClicked() + { + await JSRuntime.InvokeVoidAsync( "blazorisePRO.paddle.openCheckout", checkedProductId ); + } + + bool PurchaseDisabled => checkedProductId == 0; + + [Inject] IJSRuntime JSRuntime { get; set; } + + [Parameter] public string SeoCanonical { get; set; } + + [Parameter] public string SeoTitle { get; set; } + + [Parameter] public string SeoDescription { get; set; } + + [Parameter] public string PreviewUrl { get; set; } + + [Parameter] public string ImageUrl { get; set; } + + [Parameter] public string ImageText { get; set; } + + [Parameter] public RenderFragment Title { get; set; } + + [Parameter] public RenderFragment Description { get; set; } + + [Parameter] public IEnumerable Products { get; set; } +} diff --git a/Documentation/Blazorise.Docs/Components/Commercial/ThemePrice.razor b/Documentation/Blazorise.Docs/Components/Commercial/ThemePrice.razor new file mode 100644 index 0000000000..0a415f0778 --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/ThemePrice.razor @@ -0,0 +1,10 @@ + + + @Name + @Description + + + @Currency + @Price + + \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Components/Commercial/ThemePrice.razor.cs b/Documentation/Blazorise.Docs/Components/Commercial/ThemePrice.razor.cs new file mode 100644 index 0000000000..482a014d4c --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/Commercial/ThemePrice.razor.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Components; + +namespace Blazorise.Docs.Components.Commercial; + +public partial class ThemePrice +{ + [Parameter] public string Name { get; set; } + + [Parameter] public string Description { get; set; } + + [Parameter] public decimal? Price { get; set; } + + [Parameter] public string Currency { get; set; } +} diff --git a/Documentation/Blazorise.Docs/Components/Footer.razor b/Documentation/Blazorise.Docs/Components/Footer.razor index e0a7d043ec..006478a6a8 100644 --- a/Documentation/Blazorise.Docs/Components/Footer.razor +++ b/Documentation/Blazorise.Docs/Components/Footer.razor @@ -27,16 +27,16 @@ Product - Community + Community - Features + Features - Pricing + Pricing - Success stories + Success stories Resellers @@ -50,7 +50,7 @@ Company - About + About News diff --git a/Documentation/Blazorise.Docs/Components/PageHeader.razor b/Documentation/Blazorise.Docs/Components/PageHeader.razor new file mode 100644 index 0000000000..8a32c9190c --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/PageHeader.razor @@ -0,0 +1,54 @@ + +@code { + [Parameter] public RenderFragment Title { get; set; } + + [Parameter] public RenderFragment Subtitle { get; set; } + + [Parameter] public RenderFragment Description { get; set; } + + [Parameter] public RenderFragment Actions { get; set; } + + private bool IsChristmasHolidays + { + get + { + var d1 = new DateTime( DateTime.Today.Year, 12, 15 ); + var d2 = d1.AddDays( 20 ); + var now = DateTime.Now; + + return now >= d1 && now <= d2; + } + } + + string BlazoriseLogo => IsChristmasHolidays + ? "/img/logos/blazorise-small-santa-hat.svg" + : "/img/logos/blazorise-small.svg"; +} \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Components/TopMenuEnd.razor b/Documentation/Blazorise.Docs/Components/TopMenuEnd.razor index 1506ed8017..5b2b7c34af 100644 --- a/Documentation/Blazorise.Docs/Components/TopMenuEnd.razor +++ b/Documentation/Blazorise.Docs/Components/TopMenuEnd.razor @@ -1,26 +1,14 @@  - Documentation + Commercial - News + Pricing - Blog + Support - - Pricing - - - - - Support - - - - - Account - + Account diff --git a/Documentation/Blazorise.Docs/Components/TopMenuStart.razor b/Documentation/Blazorise.Docs/Components/TopMenuStart.razor new file mode 100644 index 0000000000..64504fbfa2 --- /dev/null +++ b/Documentation/Blazorise.Docs/Components/TopMenuStart.razor @@ -0,0 +1,12 @@ + + Documentation + + + News + + + Blog + + + Themes + \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Core/DisposableContainer.cs b/Documentation/Blazorise.Docs/Core/DisposableContainer.cs new file mode 100644 index 0000000000..38396782a2 --- /dev/null +++ b/Documentation/Blazorise.Docs/Core/DisposableContainer.cs @@ -0,0 +1,33 @@ +#region Using directives +using System; +using System.Collections.Generic; +#endregion + +namespace Blazorise.Docs.Core; + +/// +/// Used to hold a list of disposable that are going to be disposed after +/// some long running process has ended, like sending an email. +/// +public class DisposableContainer : IDisposable +{ + private readonly List disposables; + + public DisposableContainer() + { + disposables = new List(); + } + + public void Add( IDisposable disposable ) + { + disposables.Add( disposable ); + } + + public void Dispose() + { + foreach ( var disposable in disposables ) + { + disposable.Dispose(); + } + } +} diff --git a/Documentation/Blazorise.Docs/Core/IEmailOptions.cs b/Documentation/Blazorise.Docs/Core/IEmailOptions.cs new file mode 100644 index 0000000000..534fa7ffa6 --- /dev/null +++ b/Documentation/Blazorise.Docs/Core/IEmailOptions.cs @@ -0,0 +1,17 @@ +namespace Blazorise.Docs.Core; + +public interface IEmailOptions +{ + string SmtpServer { get; } + int SmtpPort { get; } + string SmtpUsername { get; set; } + string SmtpPassword { get; set; } + bool SmtpUseSSL { get; set; } + + string FromName { get; set; } + string FromAddress { get; set; } + string ReplyToAddress { get; set; } + + string ThemeReviewName { get; set; } + string ThemeReviewAddress { get; set; } +} diff --git a/Documentation/Blazorise.Docs/Domain/EmailAddress.cs b/Documentation/Blazorise.Docs/Domain/EmailAddress.cs new file mode 100644 index 0000000000..6df6ae13a3 --- /dev/null +++ b/Documentation/Blazorise.Docs/Domain/EmailAddress.cs @@ -0,0 +1,15 @@ +namespace Blazorise.Docs.Domain +{ + public class EmailAddress + { + public EmailAddress( string name, string address ) + { + Name = name; + Address = address; + } + + public string Name { get; set; } + + public string Address { get; set; } + } +} diff --git a/Documentation/Blazorise.Docs/Domain/EmailMessage.cs b/Documentation/Blazorise.Docs/Domain/EmailMessage.cs new file mode 100644 index 0000000000..9473025b34 --- /dev/null +++ b/Documentation/Blazorise.Docs/Domain/EmailMessage.cs @@ -0,0 +1,48 @@ +using System.Collections.Generic; + +namespace Blazorise.Docs.Domain +{ + public class EmailMessage + { + public EmailMessage() + { + To = new List(); + From = new List(); + Bcc = new List(); + Cc = new List(); + } + + public EmailMessage( User user ) + : this() + { + To.Add( new EmailAddress( $"{user.FirstName} {user.LastName}", user.Email ) ); + } + + public EmailMessage( string toName, string toAddress ) + : this() + { + To.Add( new EmailAddress( toName, toAddress ) ); + } + + public EmailMessage( string toFirstName, string toLastName, string toAddress ) + : this( $"{toFirstName} {toLastName}", toAddress ) + { + } + + public List To { get; set; } + + public List From { get; set; } + + public List Bcc { get; set; } + + public List Cc { get; set; } + + public string Subject { get; set; } + + public string Body { get; set; } + + public bool IsHtml { get; set; } = true; + + public List Attachments { get; set; } + } +} diff --git a/Documentation/Blazorise.Docs/Domain/EmailMessageAttachment.cs b/Documentation/Blazorise.Docs/Domain/EmailMessageAttachment.cs new file mode 100644 index 0000000000..b32b0f4150 --- /dev/null +++ b/Documentation/Blazorise.Docs/Domain/EmailMessageAttachment.cs @@ -0,0 +1,15 @@ +namespace Blazorise.Docs.Domain +{ + public class EmailMessageAttachment + { + public EmailMessageAttachment( string fileName, byte[] data ) + { + FileName = fileName; + Data = data; + } + + public string FileName { get; set; } + + public byte[] Data { get; set; } + } +} diff --git a/Documentation/Blazorise.Docs/Domain/Result.cs b/Documentation/Blazorise.Docs/Domain/Result.cs new file mode 100644 index 0000000000..4d1a3adcb5 --- /dev/null +++ b/Documentation/Blazorise.Docs/Domain/Result.cs @@ -0,0 +1,268 @@ +#region Using directives +using System; +using System.Collections.Generic; +#endregion + +namespace Blazorise.Docs.Domain +{ + public enum ResultType + { + Ok, + + Created, + + Updated, + Upserted, + Replaced, + + Deleted + } + + public enum ErrorType + { + None, + + // User related + NotFound, + WrongArguments, + NotValid, + + // Auth + NoAuthentication, + NotAuthorized, + EmailNotConfirmed, + + // Logic related + Unknown, + ConfigurationError, + NetworkError, + Duplicate, + + SendEmail, + + ///// + ///// Specific error code + ///// + //E311 = 311, + + } + + /// + /// The Result itself. + /// + public class Result + { + /// + /// Is set to true if the method ran correcty. + /// + public bool Succeeded { get; private set; } + + + /// + /// ResultType of the method. + /// + public ResultType? ResultType { get; private set; } + + /// + /// Description of the error. Can be null. + /// + public ErrorDescription ErrorDescription { get; private set; } + + + #region Constructors + + /// + /// Positive result. Conclusion is true and result type is Ok. + /// + public Result() + { + Succeeded = true; + this.ResultType = Domain.ResultType.Ok; + } + + /// + /// Positive result. Conclusion is true and result type is given as argument. + /// + /// + public Result( ResultType resultType ) + { + Succeeded = true; + this.ResultType = resultType; + } + + + + /// + /// Negative result. Conclusion is false. + /// + /// + public Result( ErrorType errorType ) + { + Succeeded = false; + ErrorDescription = new ErrorDescription(); + ErrorDescription.ErrorType = errorType; + } + + public Result( ErrorType errorType, Exception exception ) + { + Succeeded = false; + ErrorDescription = new ErrorDescription(); + ErrorDescription.ErrorMessage = exception.Message; + ErrorDescription.Exception = exception; + ErrorDescription.ErrorType = errorType; + } + + public Result( ErrorType errorType, string errorMessage, Exception exception = null ) + { + Succeeded = false; + ErrorDescription = new ErrorDescription(); + ErrorDescription.ErrorMessage = errorMessage; + ErrorDescription.Exception = exception; + ErrorDescription.ErrorType = errorType; + } + + public Result( ErrorType errorType, IEnumerable errorMessages, Exception exception = null ) + { + Succeeded = false; + ErrorDescription = new ErrorDescription(); + ErrorDescription.ErrorMessage = string.Join( "\n", errorMessages ); + ErrorDescription.Exception = exception; + ErrorDescription.ErrorType = errorType; + } + + + + #endregion + + /// + /// Will throw SafeRunException if Conclusion is false. + /// + public Result EnsureSuccess() + { + if ( !Succeeded ) + throw ErrorDescription.AsException(); + + return this; + } + + public void Set( ErrorType errorType, IEnumerable errorMessages, Exception exception = null ) + { + Succeeded = false; + ErrorDescription = new ErrorDescription(); + ErrorDescription.ErrorMessage = string.Join( "\n", errorMessages ); + ErrorDescription.Exception = exception; + ErrorDescription.ErrorType = errorType; + } + } + + /// + /// Generic Result, which is able to return the desired object. So instead of return typ "Customer", it would be Result + /// + /// + public class Result : Result + { + /// + /// The desired output. + /// + public T Output { get; private set; } + + + public Result() : base() { } + public Result( ResultType resultType ) : base( resultType ) { } + + + public Result( ErrorType errorType ) : base( errorType ) { } + public Result( ErrorType errorType, Exception exception ) : base( errorType, exception ) { } + public Result( ErrorType errorType, string errorMessage, Exception exception = null ) : base( errorType, errorMessage, exception ) { } + public Result( ErrorType errorType, IEnumerable errorMessages, Exception exception = null ) : base( errorType, errorMessages, exception ) { } + + public Result( ErrorDescription errorDescription ) : base( errorDescription.ErrorType, errorDescription.ErrorMessage, errorDescription.Exception ) { } + + + public Result AddMethodInfo( params string[] infos ) + { + // Prepend error message with additional info + base.ErrorDescription.ErrorMessage = $"{typeof( T ).Name} {string.Join( ", ", infos )}, {ErrorDescription.ErrorMessage}"; + return this; + } + + + public Result SetOutput( T value ) + { + Output = value; + return this; + } + + /// + /// Makes sure that Result is positive and the Output is not null. Otherwise Exception is thrown. + /// Not null Output is returned. + /// + /// + public T EnsureOutput() + { + if ( Succeeded && Output != null ) + return Output; + + throw ErrorDescription.AsException(); + } + } + + /// + /// Detailed error description. + /// + public class ErrorDescription + { + + //[JsonConverter(typeof(StringEnumConverter))] + public ErrorType ErrorType { get; set; } + public string ErrorMessage { get; set; } + public string StackTrace { get; set; } + + private Exception exception; + internal Exception Exception + { + get => exception; + set + { + exception = value; + StackTrace = exception?.StackTrace; + } + } + + public Guid Guid { get; private set; } + + public ErrorDescription() + { + Guid = Guid.NewGuid(); + } + + public AppException AsException() + { + return new AppException( ErrorType, ErrorMessage, Exception ); + } + } + + /// + /// The exception which is able to hold informations about the Result. + /// + public class AppException : Exception + { + public ErrorType ErrorType { get; private set; } + + public AppException( ErrorType errorType ) : base( errorType.ToString() ) + { + ErrorType = errorType; + } + + public AppException( ErrorType errorType, string errorMessage, Exception exception ) : base( errorMessage, exception ) + { + ErrorType = errorType; + } + + public Result AsResultObject() + { + return new Result( ErrorType, Message, InnerException ); + } + + } +} diff --git a/Documentation/Blazorise.Docs/Domain/User.cs b/Documentation/Blazorise.Docs/Domain/User.cs new file mode 100644 index 0000000000..c6f5bcf5c7 --- /dev/null +++ b/Documentation/Blazorise.Docs/Domain/User.cs @@ -0,0 +1,19 @@ +namespace Blazorise.Docs.Domain +{ + public class User + { + public int Id { get; set; } + + public string Email { get; set; } + + public string FirstName { get; set; } + + public string LastName { get; set; } + + public string Company { get; set; } + + public string VAT { get; set; } + + public bool NewsletterEnabled { get; set; } + } +} diff --git a/Documentation/Blazorise.Docs/Layouts/BlogLayout.razor b/Documentation/Blazorise.Docs/Layouts/BlogLayout.razor index 1ecca25d9d..e4ce69bb56 100644 --- a/Documentation/Blazorise.Docs/Layouts/BlogLayout.razor +++ b/Documentation/Blazorise.Docs/Layouts/BlogLayout.razor @@ -15,16 +15,7 @@ - - - Community - - - - - Commercial - - + diff --git a/Documentation/Blazorise.Docs/Layouts/DocsLayout.razor b/Documentation/Blazorise.Docs/Layouts/DocsLayout.razor index 3ca1466b64..ef14dd19cf 100644 --- a/Documentation/Blazorise.Docs/Layouts/DocsLayout.razor +++ b/Documentation/Blazorise.Docs/Layouts/DocsLayout.razor @@ -298,7 +298,7 @@ FAQ - License + License @@ -319,6 +319,7 @@ Home + @@ -344,4 +345,4 @@ @code { RenderFragment customIcon =@; -} +} \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Layouts/MainLayout.razor b/Documentation/Blazorise.Docs/Layouts/MainLayout.razor index 62a83d7015..be60fc4731 100644 --- a/Documentation/Blazorise.Docs/Layouts/MainLayout.razor +++ b/Documentation/Blazorise.Docs/Layouts/MainLayout.razor @@ -15,16 +15,7 @@ - - - Community - - - - - Commercial - - + diff --git a/Documentation/Blazorise.Docs/Layouts/MainLayout.razor.cs b/Documentation/Blazorise.Docs/Layouts/MainLayout.razor.cs index ab13b4983a..5c45cb1670 100644 --- a/Documentation/Blazorise.Docs/Layouts/MainLayout.razor.cs +++ b/Documentation/Blazorise.Docs/Layouts/MainLayout.razor.cs @@ -1,8 +1,8 @@ #region Using directives using Blazorise; +using Microsoft.AspNetCore.Components; #endregion - namespace Blazorise.Docs.Layouts; public partial class MainLayout diff --git a/Documentation/Blazorise.Docs/Layouts/NewsLayout.razor b/Documentation/Blazorise.Docs/Layouts/NewsLayout.razor index 573dc921d2..0688119cc4 100644 --- a/Documentation/Blazorise.Docs/Layouts/NewsLayout.razor +++ b/Documentation/Blazorise.Docs/Layouts/NewsLayout.razor @@ -15,16 +15,7 @@ - - - Community - - - - - Commercial - - + diff --git a/Documentation/Blazorise.Docs/Models/PaddlePrices.cs b/Documentation/Blazorise.Docs/Models/PaddlePrices.cs new file mode 100644 index 0000000000..3af33a9c03 --- /dev/null +++ b/Documentation/Blazorise.Docs/Models/PaddlePrices.cs @@ -0,0 +1,24 @@ +namespace Blazorise.Docs.Models; + +public static class PaddlePrices +{ + public const int ProfessionalYearlySubscriptionPerDeveloper = 753363; + + public const int EnterpriseYearlySubscriptionPerDeveloper = 753364; + + public const int ProfessionalMonthlySubscriptionPerDeveloper = 839258; + + public const int EnterpriseMonthlySubscriptionPerDeveloper = 839259; + + public const int ProfessionalOneTimePerDeveloper = 753365; + + public const int EnterpriseOneTimePerDeveloper = 753366; + + public const int SinglesiteBlazeSparkTheme = 694283; + public const int SinglesiteBlazeStackTheme = 685785; + + public const int MultisiteBlazeSparkTheme = 694287; + public const int MultisiteBlazeStackTheme = 685789; + + public const int ProfessionalBundle = 839353; +} diff --git a/Documentation/Blazorise.Docs/Models/ProductOrder.cs b/Documentation/Blazorise.Docs/Models/ProductOrder.cs new file mode 100644 index 0000000000..6d1c585ced --- /dev/null +++ b/Documentation/Blazorise.Docs/Models/ProductOrder.cs @@ -0,0 +1,53 @@ +using System.ComponentModel.DataAnnotations; + +namespace Blazorise.Docs.Models; + +public class ProductOrder +{ + [Required] + public string Product { get; set; } + + [Required] + [Display( Name = "Full Name" )] + public string FullName { get; set; } + + [Required] + public string Company { get; set; } + + [Required] + public string VAT { get; set; } + + [Required] + [EmailAddress] + public string Email { get; set; } + + [Display( Name = "Phone Number" )] + public string PhoneNumber { get; set; } + + [Required] + public string Address { get; set; } + + [Display( Name = "Address line 2" )] + public string Address2 { get; set; } + + [Required] + public string Country { get; set; } + + [Required] + public string State { get; set; } + + [Required] + public string City { get; set; } + + [Required] + [Display( Name = "Zip code" )] + public string Zip { get; set; } + + public string Note { get; set; } + + [Required] + public int Quantity { get; set; } = 1; + + [Display( Name = "Payment Type" )] + public string PaymentType { get; set; } = "Bank Transfer"; +} diff --git a/Documentation/Blazorise.Docs/Models/Snippets.generated.cs b/Documentation/Blazorise.Docs/Models/Snippets.generated.cs index f26a53b14c..a039ac6ed2 100644 --- a/Documentation/Blazorise.Docs/Models/Snippets.generated.cs +++ b/Documentation/Blazorise.Docs/Models/Snippets.generated.cs @@ -2183,11 +2183,11 @@ void OnProgressed( FileProgressedEventArgs e ) string sentence = ""\""There will be no foolish wand-waving or silly incantations in this class. As such, I don't expect many of you to appreciate the subtle science and exact art that is potion-making. However, for those select few who possess the predisposition, I can teach you how to bewitch the mind and ensnare the senses. I can tell you how to bottle fame, brew glory, and even put a stopper in death. Then again, maybe some of you have come to Hogwarts in possession of abilities so formidable that you feel confident enough to not pay attention!\"" — Severus Snape""; }"; - public const string BasicImageExample = @""; + public const string BasicImageExample = @""; - public const string ImageFluidExample = @""; + public const string ImageFluidExample = @""; - public const string ImageLoadingExample = @""; + public const string ImageLoadingExample = @""; public const string ImageTextExample = @""; diff --git a/Documentation/Blazorise.Docs/Models/ThemeInfo.cs b/Documentation/Blazorise.Docs/Models/ThemeInfo.cs new file mode 100644 index 0000000000..eb03cb6201 --- /dev/null +++ b/Documentation/Blazorise.Docs/Models/ThemeInfo.cs @@ -0,0 +1,23 @@ +namespace Blazorise.Docs.Models; + +public class ThemeInfo +{ + public ThemeInfo( int id, string licenseName, string licenseDescription, decimal price, string currency ) + { + Id = id; + LicenseName = licenseName; + LicenseDescription = licenseDescription; + Price = price; + Currency = currency; + } + + public int Id { get; set; } + + public string LicenseName { get; set; } + + public string LicenseDescription { get; set; } + + public decimal Price { get; set; } + + public string Currency { get; set; } +} diff --git a/Documentation/Blazorise.Docs/Pages/BasePage.cs b/Documentation/Blazorise.Docs/Pages/BasePage.cs new file mode 100644 index 0000000000..824759708d --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/BasePage.cs @@ -0,0 +1,18 @@ +using Blazorise.Docs.Core; +using Microsoft.AspNetCore.Components; + +namespace Blazorise.Docs.Pages +{ + public class BasePage : ComponentBase + { + protected string MailToLink + => $"mailto:{EmailOptions.ReplyToAddress}"; + + protected string MailToAddress + => EmailOptions.ReplyToAddress; + + [Inject] protected NavigationManager NavigationManager { get; set; } + + [Inject] protected IEmailOptions EmailOptions { get; set; } + } +} diff --git a/Documentation/Blazorise.Docs/Pages/Blog/2022-07-20_WhatIsBlazorWASM/Index.md b/Documentation/Blazorise.Docs/Pages/Blog/2022-07-20_WhatIsBlazorWASM/Index.md index b0568dbe41..25c437a0f6 100644 --- a/Documentation/Blazorise.Docs/Pages/Blog/2022-07-20_WhatIsBlazorWASM/Index.md +++ b/Documentation/Blazorise.Docs/Pages/Blog/2022-07-20_WhatIsBlazorWASM/Index.md @@ -49,7 +49,7 @@ By using Blazor WASM, the client-side and server-side can share a common code ba Programming languages take years to learn and master. As developers do not come cheap, finding and paying developers is a strategic decision for small teams. Having a team of skilled developers who can switch between client and server-side applications without losing any understanding of both sides enhances collaboration which is vital for small teams. -> [Click here to discover how a Blazorise Mentor](commercial/enterprise-plus) can quickly help your development teams scale up rapid application development using Blazorise Components. +> [Click here to discover how a Blazorise Mentor](enterprise-plus) can quickly help your development teams scale up rapid application development using Blazorise Components. ### Code Reuse @@ -126,4 +126,4 @@ The goal of Blazor WASM is to allow C# to run in the browser, but that does not ## Conclusion -Blazor helps teams build rich UI interfaces. If your team uses Blazor, [reach out to us](commercial/contact) on how we can help you speed up your development with our [production-ready UI components](docs/components). \ No newline at end of file +Blazor helps teams build rich UI interfaces. If your team uses Blazor, [reach out to us](contact) on how we can help you speed up your development with our [production-ready UI components](docs/components). \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Blog/2022-07-20_WhatIsBlazorWASM/Index.razor b/Documentation/Blazorise.Docs/Pages/Blog/2022-07-20_WhatIsBlazorWASM/Index.razor index cdb0f6d2b4..49776c82b8 100644 --- a/Documentation/Blazorise.Docs/Pages/Blog/2022-07-20_WhatIsBlazorWASM/Index.razor +++ b/Documentation/Blazorise.Docs/Pages/Blog/2022-07-20_WhatIsBlazorWASM/Index.razor @@ -72,7 +72,7 @@
- Click here to discover how a Blazorise Mentor can quickly help your development teams scale up rapid application development using Blazorise Components. + Click here to discover how a Blazorise Mentor can quickly help your development teams scale up rapid application development using Blazorise Components.
@@ -205,7 +205,7 @@ - Blazor helps teams build rich UI interfaces. If your team uses Blazor, reach out to us on how we can help you speed up your development with our production-ready UI components. + Blazor helps teams build rich UI interfaces. If your team uses Blazor, reach out to us on how we can help you speed up your development with our production-ready UI components. diff --git a/Documentation/Blazorise.Docs/Pages/Blog/2022-07-27_BeginnerGuideToMAUI/Index.md b/Documentation/Blazorise.Docs/Pages/Blog/2022-07-27_BeginnerGuideToMAUI/Index.md index b5b68672a5..5da792d17a 100644 --- a/Documentation/Blazorise.Docs/Pages/Blog/2022-07-27_BeginnerGuideToMAUI/Index.md +++ b/Documentation/Blazorise.Docs/Pages/Blog/2022-07-27_BeginnerGuideToMAUI/Index.md @@ -89,4 +89,4 @@ Cross-platform and multi-platform frameworks are here to stay as the lines of na This is MAUI's first stable release so we will keep an eye on updates from Microsoft with regards to future roadmap of MAUI. -If you want to build out rich user interfaces with MAUI Blazor quickly, [reach out to our team](commercial/contact), and we will help you get started quickly with our [tested and production-ready UI components](https://blazorise.com/docs/components). \ No newline at end of file +If you want to build out rich user interfaces with MAUI Blazor quickly, [reach out to our team](contact), and we will help you get started quickly with our [tested and production-ready UI components](https://blazorise.com/docs/components). \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Blog/2022-07-27_BeginnerGuideToMAUI/Index.razor b/Documentation/Blazorise.Docs/Pages/Blog/2022-07-27_BeginnerGuideToMAUI/Index.razor index 70e2878180..02923d1c3a 100644 --- a/Documentation/Blazorise.Docs/Pages/Blog/2022-07-27_BeginnerGuideToMAUI/Index.razor +++ b/Documentation/Blazorise.Docs/Pages/Blog/2022-07-27_BeginnerGuideToMAUI/Index.razor @@ -142,7 +142,7 @@ - If you want to build out rich user interfaces with MAUI Blazor quickly, reach out to our team, and we will help you get started quickly with our tested and production-ready UI components. + If you want to build out rich user interfaces with MAUI Blazor quickly, reach out to our team, and we will help you get started quickly with our tested and production-ready UI components. diff --git a/Documentation/Blazorise.Docs/Pages/Blog/2022-08-12_CreateTabbedLoginDemo/Index.md b/Documentation/Blazorise.Docs/Pages/Blog/2022-08-12_CreateTabbedLoginDemo/Index.md index f5e46b4b09..b153a37586 100644 --- a/Documentation/Blazorise.Docs/Pages/Blog/2022-08-12_CreateTabbedLoginDemo/Index.md +++ b/Documentation/Blazorise.Docs/Pages/Blog/2022-08-12_CreateTabbedLoginDemo/Index.md @@ -318,7 +318,7 @@ Registration and login are essential components of web security. Form validation This post demonstrated how to embed login and registration forms into a tab element. We also showed how you could guide users to enter the correct data into your forms using validations. -From the post, we established how easy it is to build modern web functionality with Blazorise components in a few lines of code. We invite you to [try Blazorise components for free](https://blazorise.com/docs) or [apply for a license](commercial/pricing) on commercial products and get assistance from a dedicated [Blazorise Mentor](commercial/enterprise-plus). +From the post, we established how easy it is to build modern web functionality with Blazorise components in a few lines of code. We invite you to [try Blazorise components for free](https://blazorise.com/docs) or [apply for a license](pricing) on commercial products and get assistance from a dedicated [Blazorise Mentor](enterprise-plus). ## Related blogs diff --git a/Documentation/Blazorise.Docs/Pages/Blog/2022-08-12_CreateTabbedLoginDemo/Index.razor b/Documentation/Blazorise.Docs/Pages/Blog/2022-08-12_CreateTabbedLoginDemo/Index.razor index 857ff24866..124a231f9b 100644 --- a/Documentation/Blazorise.Docs/Pages/Blog/2022-08-12_CreateTabbedLoginDemo/Index.razor +++ b/Documentation/Blazorise.Docs/Pages/Blog/2022-08-12_CreateTabbedLoginDemo/Index.razor @@ -187,7 +187,7 @@ - From the post, we established how easy it is to build modern web functionality with Blazorise components in a few lines of code. We invite you to try Blazorise components for free or apply for a license on commercial products and get assistance from a dedicated Blazorise Mentor. + From the post, we established how easy it is to build modern web functionality with Blazorise components in a few lines of code. We invite you to try Blazorise components for free or apply for a license on commercial products and get assistance from a dedicated Blazorise Mentor. diff --git a/Documentation/Blazorise.Docs/Pages/Blog/2023-03-03_BlazoriseGoals/Index.md b/Documentation/Blazorise.Docs/Pages/Blog/2023-03-03_BlazoriseGoals/Index.md index 5d34fb8e31..56b0d76200 100644 --- a/Documentation/Blazorise.Docs/Pages/Blog/2023-03-03_BlazoriseGoals/Index.md +++ b/Documentation/Blazorise.Docs/Pages/Blog/2023-03-03_BlazoriseGoals/Index.md @@ -81,7 +81,7 @@ While the changes in version 1.1 were not groundbreaking, Blazorise is gradually ## Enterprise Plus Model -After considering adding a new form of Commercial package, we added [Enterprise Plus](https://blazorise.com/commercial/enterprise-plus). As businesses grow and scale, their technology needs evolve. Large enterprises require tailor-made solutions that can meet their unique challenges and objectives. Blazorise understands this and offers a customized plan designed to fit any large business's specific requirements. +After considering adding a new form of Commercial package, we added [Enterprise Plus](https://blazorise.com/enterprise-plus). As businesses grow and scale, their technology needs evolve. Large enterprises require tailor-made solutions that can meet their unique challenges and objectives. Blazorise understands this and offers a customized plan designed to fit any large business's specific requirements. The Blazorise Enterprise Plus plan provides businesses with everything they need to build robust and scalable applications. With unlimited seats, companies can equip their entire team with the tools to build high-quality apps quickly and efficiently. diff --git a/Documentation/Blazorise.Docs/Pages/Blog/2023-03-03_BlazoriseGoals/Index.razor b/Documentation/Blazorise.Docs/Pages/Blog/2023-03-03_BlazoriseGoals/Index.razor index ff83c60e0f..6863230f2a 100644 --- a/Documentation/Blazorise.Docs/Pages/Blog/2023-03-03_BlazoriseGoals/Index.razor +++ b/Documentation/Blazorise.Docs/Pages/Blog/2023-03-03_BlazoriseGoals/Index.razor @@ -145,7 +145,7 @@ - After considering adding a new form of Commercial package, we added Enterprise Plus. As businesses grow and scale, their technology needs evolve. Large enterprises require tailor-made solutions that can meet their unique challenges and objectives. Blazorise understands this and offers a customized plan designed to fit any large business's specific requirements. + After considering adding a new form of Commercial package, we added Enterprise Plus. As businesses grow and scale, their technology needs evolve. Large enterprises require tailor-made solutions that can meet their unique challenges and objectives. Blazorise understands this and offers a customized plan designed to fit any large business's specific requirements. diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/CommercialPage.razor b/Documentation/Blazorise.Docs/Pages/Commercial/CommercialPage.razor new file mode 100644 index 0000000000..f8e77db1bf --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/CommercialPage.razor @@ -0,0 +1,193 @@ +@page "/commercial" + + + + + + Blazorise Commercial + + + Be one of the thousands of satisfied users of Blazorise components. + + + Blazorise is an open-source toolkit for building high-quality, cross-platform native and web app experiences. Use one of the most advanced Blazor UI libraries to rapidly build amazing web applications without leaving C# language and toolchain. + + + + + + + + + + + + Trusted By + + + The world's best product teams trust Blazorise to deliver an unrivaled experience for both developers and users. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Additional Services + + + Do you need additional or custom services? We and our partners can provide it. + + + + + + +
+ +
+ Design System + Custom Blazorise integration with your design system. +
+ + +
+ +
+ Porting Existing Projects + Migrating your legacy projects to the Blazor platform. +
+ + +
+ +
+ Custom Project Development + Dedicated developers for your custom projects. +
+ + +
+ +
+ Live Support + Live remote support option when you need it. +
+ + +
+ +
+ Training + Dedicated training for your developers. +
+ + +
+ +
+ Onboarding + Help to setup your development, CI/CD environments. +
+
+ + + + + +
+ + + + + + Premium Support + + + Aside from the Blazorise library's strong community support, our support team prioritizes technical questions and problems from commercial users. + + + + + + +
+ +
+ + Premium Forum Support + + + Blazorise Commercial licenses include premium forum support from a team of Blazorise experts. + + +
+ +
+ +
+ + Private Ticket + + + Private support via e-mail and a ticket system is also included with the Enterprise License. + + +
+
+
\ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/CommunityPage.razor b/Documentation/Blazorise.Docs/Pages/Commercial/CommunityPage.razor new file mode 100644 index 0000000000..4d2d2fc30b --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/CommunityPage.razor @@ -0,0 +1,48 @@ +@page "/community" + + + + + + Blazorise Community + + + A fully-featured, extensible, free Blazor Components library for building the .NET web applications. + + + + + + Usage + + + + For individuals + + The Community License is offered free of charge to all individuals. This includes anyone using Blazorise for personal projects, or educational purposes. This license is perfect for developers who are just getting started with Blazorise or those who are using it on small-scale projects. It grants access to all basic features of the software, but may lack certain advanced capabilities available in the Commercial License. + + + Although it is free, users are still bound to the terms of the Community License, which prohibit uses that go beyond the specified scope. + + + + For organizations + + The Commercial License is required for all corporations, non-profit organizations, governmental entities, and any other commercial entities. This license is mandatory regardless of the entity's scale or nature. It includes start-ups, small and medium businesses, large enterprises, and government agencies among others. This license is also required if the software is used for any commercial purpose, including but not limited to, generating revenue or serving organizational needs. The Commercial License provides access to the full suite of features, advanced support, and future updates of Blazorise. + + + Commercial entities are obligated to procure this license not just for legal compliance, but also to ensure continuous support and upgrades, helping their systems remain robust and secure. The fees collected from the Commercial License help support the ongoing development and maintenance of the Blazorise project, ensuring its sustainability and advancement. + + + + + Please note that the exact details and terms of these licenses, including any restrictions or allowances, should be reviewed in the official documentation or license agreements provided by the Blazorise team. The details provided here are a general overview and may not fully cover all terms and conditions outlined in the actual license agreements. + + + For more information, see the +
+ Blazorise licence +
+
+
+
\ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/CustomersPage.razor b/Documentation/Blazorise.Docs/Pages/Commercial/CustomersPage.razor new file mode 100644 index 0000000000..338c97820e --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/CustomersPage.razor @@ -0,0 +1,22 @@ +@page "/customers" + + + + + + Customer success is our biggest priority! + + + Here is what our users say about us. + + + + + + \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/EnterprisePlusPage.razor b/Documentation/Blazorise.Docs/Pages/Commercial/EnterprisePlusPage.razor new file mode 100644 index 0000000000..7f71b5e6c7 --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/EnterprisePlusPage.razor @@ -0,0 +1,59 @@ +@page "/enterprise-plus" + + + + + + Enterprise Plus support + + + Partner with Blazorise and speed up development with Blazorise experts joining your team. Get a tailored subscription matching your needs. + + + + + + + + + Expert on Demand + + + If you require assistance beyond what can be provided in chat, Blazorise Experts and Designers on our team are available to assist you. They have created many Blazorise applications and can assist you in designing and implementing best practices in your app. Allow our team to lend their expertise so you can focus on the business logic while we ensure you avoid common pitfalls! + + + + + + Blazorise Mentor + + + Would you climb Mount Everest alone or with an experienced guide who has completed the climb dozens of times? Blazorise Mentor, as your personal guide to Blazorise technology or UI Design, will assist you in tackling the challenge of building a large business application and ensuring you avoid pitfalls along the way. Mentors are senior Blazorise team members with extensive experience. They will get to know your project on a personal level and will actively guide your team to the most efficient path to successful completion. + + + + + + +
+ +
+ +
+ “Blazorise has been a key framework which allowed us to quickly build new products while focusing on distinguishing features. The diverse offering of components and compelling documentation made thinking about new features and visualising them much quicker. The customisation layer offered is also excellent and allows us to really make our products and solutions feel coherent and in line with the company brand.” +
+
+
+
+ Cristian Recoseanu + + @@Pebble + +
+
+
+
+
\ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/FeaturesPage.razor b/Documentation/Blazorise.Docs/Pages/Commercial/FeaturesPage.razor new file mode 100644 index 0000000000..8ab4a485d4 --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/FeaturesPage.razor @@ -0,0 +1,164 @@ +@page "/features" + + + + + + The fastest & easiest Blazor UI components + + + Quickly design and customize responsive sites with Blazorise, the world’s most popular front-end open source Blazor components, featuring support for multiple CSS frameworks, extensive prebuilt components, and many more. + + + + + + Multiple CSS frameworks + + + Blazorise is built from the ground up to support any favorite CSS framework without sacrificing speed or features. +

+ Have a try at Bootstrap, Bulma, Material, or AntDesign. +
+ + + +
+ + + + Themes & Templates + + + Chose any available template from the web or from one of our prebuilt themes and Blazorise will not stop you from using it in any way. + + + + + + + + + + Open Source + + + Blazorise is open-source and free to use under our Community License. You can install it from nuget or build your own copy from source. +

+ You can contribute directly to Blazorise by submiting a PR, reporting an issue, or asking for a feature. +
+ + + +
+ + + + Responsive + + + Our components are based on responsive css frameworks, and as such made to be fully responsive, whether your on a desktop or mobile our components will render accordingly. + + + + + + + + + Localization + + + Provide localized version of your application. Blazorise has it's own built-in localization system that shows translated content when the language changes. + + + + + + + + + Validation + + + With our custom validation system you will be able to do any validation type you want for your form elements. + + + + + + + + + Utilities + + + Advance fluent builder utilities with support for grid, display, spacing, flex, borders, shadows, typography, and many more. + + + + + + + + And Even More Features + + + + +
+ Bootstrap + World most loved CSS framework with all of it's great features. +
+
+ + +
+ DataGrid + Advanced DataGrid component with paging, fltering and large data support. +
+
+ + +
+ Charts + Chart JS with live updates as a native Blazor component. +
+
+ + +
+ Utilities + Advanced grid, spacing and flex utilities with fluent builders. +
+
+ + +
+ Autocomplete + The autocomplete component with search and selectable suggestions. +
+
+ + +
+ Forms + All standard input and form elements are available out of the box. +
+
+ + +
+ Pickers + Date and time pickers for easier input. +
+
+ + +
+ Quill + Modern WYSIWYG editor built for compatibility and extensibility.. +
+
+
+
\ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/LicensePage.razor b/Documentation/Blazorise.Docs/Pages/Commercial/LicensePage.razor new file mode 100644 index 0000000000..c37f9db6fd --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/LicensePage.razor @@ -0,0 +1,58 @@ +@page "/license" + + + + + + Blazorise Licenses + + + Our product licenses are listed below for download and viewing. + + + + + + + + + + Blazorise Software License Agreement + + + + + An open-source, standards-compliant, Blazorise component library for Blazor and .NET. + + + + + + + + + + + + Blazorise Priority Support + + + + + Priority support agreement for Blazorise component library. + + + + + + + + + +@code { + string LicenseUrl => "files/licences/SLA-2023-07.pdf"; +} \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/PricingPage.razor b/Documentation/Blazorise.Docs/Pages/Commercial/PricingPage.razor new file mode 100644 index 0000000000..2a26bf2275 --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/PricingPage.razor @@ -0,0 +1,25 @@ +@page "/pricing" + + + + + + Blazorise Pricing + + + + Blazorise Community is free and open source for all individuals. + + + For advanced requirements, explore our tailored packages to match your organization's needs. + + + + + + + + + + + \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/PurchaseOrderPage.razor b/Documentation/Blazorise.Docs/Pages/Commercial/PurchaseOrderPage.razor new file mode 100644 index 0000000000..adff90d8f1 --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/PurchaseOrderPage.razor @@ -0,0 +1,249 @@ +@page "/purchase-order" +@page "/purchase-order/{ProductName}" + + + + + + Request a Quote + + + We will send you a quote to sign; once signed and returned, we will activate your licenses and send you an invoice with NET 30 payment terms. + + + + + + + + + + + + + Product + + + + + + + + + + Quantity + + + + + + + + + + + + + + + + + + + Full Name + + + + + + + + + + + + + + Work Email + + + + + + + + + + + Phone + + + + + + + + + + + + + Company Name + + + + + + + + + + + + VAT / TAX Number + + + + + + + + + + + + + + Address + + + + + + + + + + + + + Address 2 + + + + + + + + + Country + + + + + + + + + + + + + + Town / City + + + + + + + + + + + + State / Region + + + + + + + + + + + + Zip / Postal Code + + + + + + + + + + + + + + Preferred Payment Type + + + + + + + + + Additional Notes + + + + + + + + + + + + + + + + + + By clicking "Submit Order" you agree to our + Terms of Service + and + Privacy Policy. + + + + + + \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/PurchaseOrderPage.razor.cs b/Documentation/Blazorise.Docs/Pages/Commercial/PurchaseOrderPage.razor.cs new file mode 100644 index 0000000000..a9301927c9 --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/PurchaseOrderPage.razor.cs @@ -0,0 +1,136 @@ +#region Using directives +using System; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Blazorise.Docs.Core; +using Blazorise.Docs.Domain; +using Blazorise.Docs.Models; +using Blazorise.Docs.Services; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Logging; +#endregion + +namespace Blazorise.Docs.Pages.Commercial; + +public partial class PurchaseOrderPage +{ + #region Members + + Validations validationsRef; + + private string[] SupportedProductNames = new string[] + { + "Blazorise Professional", + "Blazorise Enterprise", + }; + + private string[] SupportedPaymentTypes = new string[] + { + "Bank Transfer", + "Stripe Payment Link", + }; + + #endregion + + #region Methods + + protected override Task OnInitializedAsync() + { + if ( SupportedProductNames.Any( x => x == ProductName ) ) + { + InputModel.Product = ProductName; + } + + return base.OnInitializedAsync(); + } + + async Task OnSubmit() + { + if ( await validationsRef.ValidateAll() ) + { + await SendEmail(); + } + } + + protected async Task SendEmail() + { + try + { + var message = new StringBuilder(); + + message.AppendLine( $"Product: {InputModel.Product}" ); + message.AppendLine( $"Quantity: {InputModel.Quantity}" ); + message.AppendLine(); + + message.AppendLine( $"From: {InputModel.FullName}" ); + message.AppendLine( $"Email: {InputModel.Email}" ); + message.AppendLine( $"Phone Number: {InputModel.PhoneNumber}" ); + message.AppendLine(); + + message.AppendLine( $"Company: {InputModel.Company}" ); + message.AppendLine( $"Address: {InputModel.Address}" ); + + if ( !string.IsNullOrEmpty( InputModel.Address2 ) ) + message.AppendLine( $"Address 2: {InputModel.Address2}" ); + + message.AppendLine( $"City: {InputModel.City}" ); + message.AppendLine( $"State: {InputModel.State}" ); + message.AppendLine( $"Zip: {InputModel.Zip}" ); + message.AppendLine( $"Country: {InputModel.Country}" ); + message.AppendLine( $"VAT: {InputModel.VAT}" ); + message.AppendLine(); + + message.AppendLine( $"Payment Type: {InputModel.PaymentType}" ); + message.AppendLine(); + + message.AppendLine( $"Additional Notes: {InputModel.Note}" ); + + var emailMessage = new EmailMessage( EmailOptions.FromName, EmailOptions.FromAddress ) + { + Subject = $"Product Order Request: {InputModel.FullName} - {InputModel.Company}", + Body = message.ToString(), + IsHtml = false, + }; + + var result = await EmailSender.Send( emailMessage, CancellationToken.None ); + + if ( result.Succeeded ) + { + await MessageService.Success( (MarkupString)"Order is sent.
We will contact you shortly." ); + + InputModel = new ProductOrder(); + + await validationsRef.ClearAll(); + } + else + await MessageService.Error( "Failed to send the order." ); + } + catch ( Exception exc ) + { + Logger.LogError( exc, "Error sending email." ); + } + } + + #endregion + + #region Properties + + private ProductOrder InputModel { get; set; } = new ProductOrder() + { + Product = "Blazorise Professional", + }; + + [Inject] public EmailSender EmailSender { get; set; } + + [Inject] public IEmailOptions EmailOptions { get; set; } + + [Inject] public ILogger Logger { get; set; } + + [Inject] public IMessageService MessageService { get; set; } + + [Parameter] public string ProductName { get; set; } + + #endregion +} diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/Themes/BlazeSparkPage.razor b/Documentation/Blazorise.Docs/Pages/Commercial/Themes/BlazeSparkPage.razor new file mode 100644 index 0000000000..00a69ce019 --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/Themes/BlazeSparkPage.razor @@ -0,0 +1,26 @@ +@page "/themes/blazespark" +@using Blazorise.Docs.Models; + + + + BlazeSpark - Admin & Dashboard Template - Blazorise Themes + + + BlazeSpark is a fully-featured dashboard and admin template that comes with tones of well-designed UI elements, + components, widgets, and pages. The super clean and flexible layout would enable you to easily build web applications. + It can be used to create a saas-based interface, custom admin panels, dashboard, CRM, e-commerce, etc. + + +@code{ + ThemeInfo[] products = new ThemeInfo[] + { + new ThemeInfo( PaddlePrices.SinglesiteBlazeSparkTheme, "Standard", "Single Site", 49m, "$" ), + new ThemeInfo( PaddlePrices.MultisiteBlazeSparkTheme, "Multisite", "Unlimited sites", 149m, "$" ), + }; +} \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/Themes/BlazeStackPage.razor b/Documentation/Blazorise.Docs/Pages/Commercial/Themes/BlazeStackPage.razor new file mode 100644 index 0000000000..7a07eb1d21 --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/Themes/BlazeStackPage.razor @@ -0,0 +1,28 @@ +@page "/themes/blazestack" +@using Blazorise.Docs.Models; + + + + BlazeStack - Admin & Dashboard Template - Blazorise Themes + + + BlazeStack - Admin & Dashboard Template is a responsive Blazorise administrator dashboard built + for everyone who wants to create web apps on top of the most popular frameworks, Bootstrap, Bulma & AntDesign. + BlazeStack helps you to create your next Blazorise even faster than before. It can be used to create a + Saas based interface, administrator dashboard, or anything you want to build on the web. + BlazeStack helps your team moving faster and saving development costs. + + +@code{ + ThemeInfo[] products = new ThemeInfo[] + { + new ThemeInfo( PaddlePrices.SinglesiteBlazeStackTheme, "Standard", "Single Site", 39m, "$" ), + new ThemeInfo( PaddlePrices.MultisiteBlazeStackTheme, "Multisite", "Unlimited sites", 139m, "$" ), + }; +} \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Commercial/ThemesPage.razor b/Documentation/Blazorise.Docs/Pages/Commercial/ThemesPage.razor new file mode 100644 index 0000000000..9639a4d9ef --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Commercial/ThemesPage.razor @@ -0,0 +1,59 @@ +@page "/themes" + + + + + + Themes + + + Professional, modern UI themes + + + + + + + + + + + + Admin & Dashboard + + BlazeStack - Admin & Dashboard + +
+ + +
+
+
+
+ + + + + + + Admin & Dashboard + + BlazeSpark - Admin & Dashboard + +
+ + +
+
+
+
+
+
\ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/BasicImageExampleCode.html b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/BasicImageExampleCode.html index 905de57716..ab62c4ae97 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/BasicImageExampleCode.html +++ b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/BasicImageExampleCode.html @@ -1,5 +1,5 @@
-<Image Source="_content/Blazorise.Docs/assets/img/animals/animal-01.jpg" />
+<Image Source="_content/Blazorise.Docs/assets/img/animals/animal-01.jpg" Text="A lovely animal..." />
 
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/ImageFluidExampleCode.html b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/ImageFluidExampleCode.html index a88c1de754..ae1f4d3d82 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/ImageFluidExampleCode.html +++ b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/ImageFluidExampleCode.html @@ -1,5 +1,5 @@
-<Image Source="_content/Blazorise.Docs/assets/img/animals/animal-02-large.jpg" Fluid />
+<Image Source="_content/Blazorise.Docs/assets/img/animals/animal-02-large.jpg" Text="A lovely animal..." Fluid />
 
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/ImageLoadingExampleCode.html b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/ImageLoadingExampleCode.html index da37331e6a..cd0714b31c 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/ImageLoadingExampleCode.html +++ b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Code/ImageLoadingExampleCode.html @@ -1,5 +1,5 @@
-<Image Source="_content/Blazorise.Docs/assets/img/animals/animal-06.jpg" Loading />
+<Image Source="_content/Blazorise.Docs/assets/img/animals/animal-06.jpg" Text="A lovely animal..." Loading />
 
diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/BasicImageExample.razor b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/BasicImageExample.razor index 78b8c244fa..9d04755ee6 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/BasicImageExample.razor +++ b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/BasicImageExample.razor @@ -1,3 +1,3 @@ @namespace Blazorise.Docs.Docs.Examples - + diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/ImageFluidExample.razor b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/ImageFluidExample.razor index b2a58c19a2..f6afa29b40 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/ImageFluidExample.razor +++ b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/ImageFluidExample.razor @@ -1,3 +1,3 @@ @namespace Blazorise.Docs.Docs.Examples - + diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/ImageLoadingExample.razor b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/ImageLoadingExample.razor index 717b58fe51..4f834032fe 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/ImageLoadingExample.razor +++ b/Documentation/Blazorise.Docs/Pages/Docs/Components/Image/Examples/ImageLoadingExample.razor @@ -1,4 +1,4 @@ @namespace Blazorise.Docs.Docs.Examples - + diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DataGrid/BindingData/ObservableCollectionsPage.razor b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DataGrid/BindingData/ObservableCollectionsPage.razor index 7984ba2937..1ac08029a6 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DataGrid/BindingData/ObservableCollectionsPage.razor +++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DataGrid/BindingData/ObservableCollectionsPage.razor @@ -1,6 +1,6 @@ @page "/docs/extensions/datagrid/binding-data/observable" - + Blazorise DataGrid: Observable Data diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DataGrid/ColumnsPage.razor b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DataGrid/ColumnsPage.razor index 49d419b3ce..2bfd3ee714 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DataGrid/ColumnsPage.razor +++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/DataGrid/ColumnsPage.razor @@ -1,6 +1,6 @@ @page "/docs/extensions/datagrid/columns" - + Blazorise DataGrid: Columns diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SignaturePad/SignaturePadPage.razor b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SignaturePad/SignaturePadPage.razor index b007781606..fcdc888e0d 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SignaturePad/SignaturePadPage.razor +++ b/Documentation/Blazorise.Docs/Pages/Docs/Extensions/SignaturePad/SignaturePadPage.razor @@ -1,6 +1,6 @@ @page "/docs/extensions/signaturepad" - + Blazorise Signature Pad component diff --git a/Documentation/Blazorise.Docs/Pages/Docs/Helpers/Utilities/CssGrids/CssGridsPage.razor b/Documentation/Blazorise.Docs/Pages/Docs/Helpers/Utilities/CssGrids/CssGridsPage.razor index da760fcc21..380567e49b 100644 --- a/Documentation/Blazorise.Docs/Pages/Docs/Helpers/Utilities/CssGrids/CssGridsPage.razor +++ b/Documentation/Blazorise.Docs/Pages/Docs/Helpers/Utilities/CssGrids/CssGridsPage.razor @@ -1,6 +1,6 @@ @page "/docs/helpers/utilities/css-grid" - + Blazorise CSS Grid Utilities diff --git a/Documentation/Blazorise.Docs/Pages/Home/AboutPage.razor b/Documentation/Blazorise.Docs/Pages/Home/AboutPage.razor new file mode 100644 index 0000000000..44db7a723b --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Home/AboutPage.razor @@ -0,0 +1,116 @@ +@page "/about" +@inherits BasePage + + + + + + About Us + + +
+ + +
+
+
+ + + + + + Megabit Ltd is engaged in the production and maintenance of Blazorise component library. + + + + Company: + Megabit d.o.o. + + + Headquarter: + Hrvojeva 11, 21204 Dugopolje, Croatia + + + OIB: + 11987636635 + + + VAT: + HR11987636635 + + + MBS: + 2687593 + + + Commercial Court: + Split, Tt-10/2258-2 + + + Activities: + 6201 Computer programming + + + Key Person: + Mladen Macanović, board member + + + Year Of Foundation: + 2010 + + + Size: + Small + + + Website: + + megabitsoft.com + + + + Contact: + + @MailToAddress + + +
+
+
+ + + + + Bank details + + + + Bank: + Podravska banka d.d. + + + Headquarter: + Opatička 3, 48000 Koprivnica, Croatia + + + OIB: + 97326283154 + + + IBAN: + HR8023860021110095639 + + + Swift: + PDKCHR2X + +
+
+
+
diff --git a/Documentation/Blazorise.Docs/Pages/Home/ContactPage.razor b/Documentation/Blazorise.Docs/Pages/Home/ContactPage.razor new file mode 100644 index 0000000000..e71b513fb8 --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Home/ContactPage.razor @@ -0,0 +1,133 @@ +@page "/contact" + + + + + + + + Leave a message + + + Tell us more about yourself + + + Whether you have questions or you would just like to say hello, contact us. + + + + + + + +
+ + + + + + + First name + + + + + + + + + + + + + + + + + + + Last name + + + + + + + + + + + + + + + + + + + + Email address + + + + + + + + + + + + + + + Subject + + + + + + + + + + + + + + + Your message + + + + + + + + + + + I'm not a robot + + + + + + + + + + + + + +
+
+
+
+
\ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Pages/Home/ContactPage.razor.cs b/Documentation/Blazorise.Docs/Pages/Home/ContactPage.razor.cs new file mode 100644 index 0000000000..8801e1ec98 --- /dev/null +++ b/Documentation/Blazorise.Docs/Pages/Home/ContactPage.razor.cs @@ -0,0 +1,113 @@ +#region Using directives +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Blazorise.Docs.Core; +using Blazorise.Docs.Domain; +using Blazorise.Docs.Services; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Logging; +#endregion + +namespace Blazorise.Docs.Pages.Home; + +public partial class ContactPage +{ + #region Members + + private Validations validationsRef; + + private Result result; + + #endregion + + #region Methods + + protected async Task SendEmail() + { + try + { + if ( await validationsRef.ValidateAll() ) + { + var message = new StringBuilder(); + + message.AppendLine( $"From: {User.FirstName} {User.LastName}" ); + message.AppendLine( $"Email: {User.Email}" ); + message.AppendLine(); + message.AppendLine( "Message: " + MessageBody ); + + var emailMessage = new EmailMessage( EmailOptions.FromName, EmailOptions.FromAddress ) + { + Subject = MessageSubject, + Body = message.ToString(), + IsHtml = false, + }; + + //emailMessage.From.Add( new EmailAddress( $"{User.FirstName} {User.LastName}", User.Email ) ); + + result = await EmailSender.Send( emailMessage, CancellationToken.None ); + + if ( result.Succeeded ) + { + await MessageService.Success( "Your message is sent." ); + + User = new User(); + MessageSubject = "Product questions"; + MessageBody = null; + NotARobot = false; + + await validationsRef.ClearAll(); + } + else + await MessageService.Error( "Failed to send the message." ); + } + } + catch ( Exception exc ) + { + Logger.LogError( exc, "Error sending email." ); + } + } + + private void ValidateRobot( ValidatorEventArgs eventArgs ) + { + eventArgs.Status = NotARobot ? ValidationStatus.Success : ValidationStatus.Error; + + if ( eventArgs.Status == ValidationStatus.Error ) + eventArgs.ErrorText = "Please check to confirm you're a real human!"; + else + eventArgs.ErrorText = null; + } + + #endregion + + #region Properties + + public List Subjects { get; set; } = new List + { + "Product questions", + "Licensing/Pricing/Quotes", + "Invoicing/Billing", + "Renewal", + "General Inquiries", + }; + + public User User { get; set; } = new User(); + + public string MessageSubject { get; set; } = "Product questions"; + + public string MessageBody { get; set; } + + public bool NotARobot { get; set; } + + [Inject] public EmailSender EmailSender { get; set; } + + [Inject] public IEmailOptions EmailOptions { get; set; } + + [Inject] public ILogger Logger { get; set; } + + [Inject] public IMessageService MessageService { get; set; } + + #endregion +} diff --git a/Documentation/Blazorise.Docs/Pages/Home/Index.razor b/Documentation/Blazorise.Docs/Pages/Home/Index.razor index a8db34b0f8..1b8f2c90d1 100644 --- a/Documentation/Blazorise.Docs/Pages/Home/Index.razor +++ b/Documentation/Blazorise.Docs/Pages/Home/Index.razor @@ -2,30 +2,27 @@ -
- - - - The modern UI components for Blazor - - - A set of 80+ free and open source native Blazor UI controls. - - - Blazorise is a Blazor component library with support for multiple CSS frameworks like Bootstrap, Tailwind, Bulma, AntDesign and Material. - -
- - -
-
-
+ + + The modern UI components for Blazor + + + A set of 80+ free and open source native Blazor UI controls. + + + Blazorise is a Blazor component library with support for multiple CSS frameworks like Bootstrap, Tailwind, Bulma, AntDesign and Material. + + + + + +
@@ -336,144 +333,128 @@
-
- -
- “Blazorise has been a key framework which allowed us to quickly build new products while focusing on distinguishing features. The diverse offering of components and compelling documentation made thinking about new features and visualising them much quicker. The customisation layer offered is also excellent and allows us to really make our products and solutions feel coherent and in line with the company brand.” -
-
-
-
- Cristian Recoseanu - - @@Pebble - -
-
-
- -
- -
- -
- “We moved from Radzen to Blazorise a year ago and never looked back. Being able to target Boostrap on the desktop and Material for mobile with the same markup is amazing.” -
-
-
-
- Mark Davis - - @@Dark Matter Consulting - -
-
-
- -
- -
- -
- “Blazorise is one of the most complete Blazor component libraries. It provides built-in solutions for all the essential UI requirements. It is easy to learn, use and customize. We trust it in our solutions, and it is highly recommended.” -
-
-
-
- Halil İbrahim Kalkan - - @@ABP Framework - -
-
-
- - - -
- - - Start Building With Blazorise Now! - - We are here to help you succeed. Our specialists are happy to answer any questions you may have, and our technical documentation includes tutorials and copy-paste code examples on the different Blazorise features. - - - - - -
- - -
-
-
-
- -
- - - Join Our Community - - Great systems have a great community behind it. We open sourced Blazorise early in our journey because we believe in the importance of community. It is foundational to our story. We are open about our roadmap and priorities. We are proud of what we have running under the hood. Check out our Github and take a look at our priority list, our code, our documentation, and join our community. - - - +
+ +
+ “Blazorise has been a key framework which allowed us to quickly build new products while focusing on distinguishing features. The diverse offering of components and compelling documentation made thinking about new features and visualising them much quicker. The customisation layer offered is also excellent and allows us to really make our products and solutions feel coherent and in line with the company brand.” +
+
+
+
+ Cristian Recoseanu + + @@Pebble + +
+
+ + +
+ +
+ +
+ “We moved from Radzen to Blazorise a year ago and never looked back. Being able to target Boostrap on the desktop and Material for mobile with the same markup is amazing.” +
+
+
+
+ Mark Davis + + @@Dark Matter Consulting + +
+
+
+ +
+ +
+ +
+ “Blazorise is one of the most complete Blazor component libraries. It provides built-in solutions for all the essential UI requirements. It is easy to learn, use and customize. We trust it in our solutions, and it is highly recommended.” +
+
+
+
+ Halil İbrahim Kalkan + + @@ABP Framework + +
+
+
+ + + +
+ + + Start Building With Blazorise Now! + + We are here to help you succeed. Our specialists are happy to answer any questions you may have, and our technical documentation includes tutorials and copy-paste code examples on the different Blazorise features. + + + + + +
+ + +
+
+
+
+ +
+ + + Join Our Community + + Great systems have a great community behind it. We open sourced Blazorise early in our journey because we believe in the importance of community. It is foundational to our story. We are open about our roadmap and priorities. We are proud of what we have running under the hood. Check out our Github and take a look at our priority list, our code, our documentation, and join our community. + + + - - - - Twitter - For announcements, blog posts, and general Blazorise stuff. - Follow us - - - - Discord - Get help over chat from community members. A maintainer is usually online. - Chat now - - - - Reddit - Subscribe to be notified of any Blazorise news or announcements. - Subscribe - - - - GitHub - If you encounter an issue, do us a favor and report it. Someone else may have the same issue. - View GitHub issues - - -
- -
- - - -
- - -@code { + + + + Twitter + For announcements, blog posts, and general Blazorise stuff. + Follow us + + + + Discord + Get help over chat from community members. A maintainer is usually online. + Chat now + + + + Reddit + Subscribe to be notified of any Blazorise news or announcements. + Subscribe + + + + GitHub + If you encounter an issue, do us a favor and report it. Someone else may have the same issue. + View GitHub issues + + + + +
+ + + +
+ + + @code { string selectedPopularComponentsTab = "DataGrid"; - - private bool IsChristmasHolidays - { - get - { - var d1 = new DateTime( DateTime.Today.Year, 12, 15 ); - var d2 = d1.AddDays( 20 ); - var now = DateTime.Now; - - return now >= d1 && now <= d2; - } - } - - string BlazoriseLogo => IsChristmasHolidays - ? "/img/logos/blazorise-small-santa-hat.svg" - : "/img/logos/blazorise-small.svg"; } \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/Services/EmailSender.cs b/Documentation/Blazorise.Docs/Services/EmailSender.cs new file mode 100644 index 0000000000..b33833a478 --- /dev/null +++ b/Documentation/Blazorise.Docs/Services/EmailSender.cs @@ -0,0 +1,134 @@ +#region Using directives +using System; +using System.IO; +using System.Linq; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using Blazorise.Docs.Core; +using Blazorise.Docs.Domain; +using MailKit.Net.Smtp; +using Microsoft.Extensions.Logging; +using MimeKit; +#endregion + +namespace Blazorise.Docs.Services; + +public class EmailSender +{ + #region Members + + private readonly IEmailOptions emailOptions; + + private readonly ILogger logger; + + #endregion + + #region Constructors + + public EmailSender( IEmailOptions emailOptions, + ILogger logger ) + { + this.emailOptions = emailOptions; + this.logger = logger; + } + + #endregion + + #region Methods + + public async Task Send( EmailMessage emailMessage, CancellationToken cancellationToken ) + { + try + { + var mimeMessage = new MimeMessage(); + + // Set From Address it was not set + if ( emailMessage.From.Count == 0 ) + { + emailMessage.From.Add( new EmailAddress( emailOptions.FromName, emailOptions.FromAddress ) ); + } + + mimeMessage.To.AddRange( emailMessage.To.Select( x => new MailboxAddress( x.Name, x.Address ) ) ); + mimeMessage.From.AddRange( emailMessage.From.Select( x => new MailboxAddress( x.Name, x.Address ) ) ); + mimeMessage.Cc.AddRange( emailMessage.Cc.Select( x => new MailboxAddress( x.Name, x.Address ) ) ); + mimeMessage.Bcc.AddRange( emailMessage.Bcc.Select( x => new MailboxAddress( x.Name, x.Address ) ) ); + + mimeMessage.Subject = emailMessage.Subject; + + var body = emailMessage.IsHtml ? + new BodyBuilder { HtmlBody = emailMessage.Body }.ToMessageBody() : + new TextPart( "plain" ) { Text = emailMessage.Body }; + + using ( var disposableContainer = new DisposableContainer() ) + { + if ( emailMessage.Attachments != null ) + { + // when sending attachments we need to build email as an multipart with a content-disposition + var multipart = new Multipart( "mixed" ); + + multipart.Add( body ); + + foreach ( var attachment in emailMessage.Attachments ) + { + var memoryStream = new MemoryStream( attachment.Data ); + + // we cannot dispose attachment just yet so put on hold for later dispose + disposableContainer.Add( memoryStream ); + + var mimeAttachment = new MimePart() + { + Content = new MimeContent( memoryStream, ContentEncoding.Default ), + ContentDisposition = new ContentDisposition( ContentDisposition.Attachment ), + ContentTransferEncoding = ContentEncoding.Base64, + FileName = attachment.FileName, + }; + + multipart.Add( mimeAttachment ); + } + + // now set the multipart/ mixed as the message body + mimeMessage.Body = multipart; + } + else + { + mimeMessage.Body = body; + } + + //Be careful that the SmtpClient class is the one from Mailkit not the framework! + using ( var emailClient = new SmtpClient() ) + { + if ( !emailOptions.SmtpUseSSL ) + { + emailClient.ServerCertificateValidationCallback = ( object sender2, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors ) => true; + } + + await emailClient.ConnectAsync( emailOptions.SmtpServer, emailOptions.SmtpPort, emailOptions.SmtpUseSSL ).ConfigureAwait( false ); + + //Remove any OAuth functionality as we won't be using it. + emailClient.AuthenticationMechanisms.Remove( "XOAUTH2" ); + + if ( !string.IsNullOrWhiteSpace( emailOptions.SmtpUsername ) ) + { + await emailClient.AuthenticateAsync( emailOptions.SmtpUsername, emailOptions.SmtpPassword ).ConfigureAwait( false ); + } + + await emailClient.SendAsync( mimeMessage ).ConfigureAwait( false ); + + await emailClient.DisconnectAsync( true ).ConfigureAwait( false ); + } + } + + return new Result( ResultType.Ok ); + } + catch ( Exception exc ) + { + var errorMessage = "Failed to send email."; + logger.LogCritical( exc, errorMessage ); + return new Result( ErrorType.NetworkError, errorMessage, exc ); + } + } + + #endregion +} diff --git a/Documentation/Blazorise.Docs/Styles/_commercial.scss b/Documentation/Blazorise.Docs/Styles/_commercial.scss new file mode 100644 index 0000000000..57937ac4cf --- /dev/null +++ b/Documentation/Blazorise.Docs/Styles/_commercial.scss @@ -0,0 +1,48 @@ +.nav.pricing-tabs > .nav-item > .nav-link { + padding: 1.25rem; +} + +.nav.pricing-tabs > .nav-item > .nav-link:not(.active) { + color: var(--b-theme-primary); + outline: solid var(--b-theme-primary) 1px; + transition: background-color 0.3s ease-out; +} + +.nav.pricing-tabs > .nav-item > .nav-link.active { + transition: background-color 0.3s ease-in; +} + +.plan-switch > .plan-switch-button { + box-shadow: 0 0 5px 0 rgba(0,0,0,.2); + transition: background-color 0.3s ease-in; +} + +.plan-switch > .plan-switch-button:hover { + box-shadow: 0 0 15px 0 rgba(0,0,0,.3); + transition-duration: .3s; +} + +div.card.pricing-card { + box-shadow: 0 0 5px 0 rgba(0,0,0,.2); + transition: all 0.3s ease-out; +} + +div.card.pricing-card:hover { + box-shadow: 0 0 25px 0 rgba(0,0,0,.3); + transform: translateY(-5px) scale(1.005) +} + +div.developers-picker input { + font-size: 1.25rem; +} + +div.developers-picker button { + transition-duration: .3s; + transition-property: color,background-color; + transition-timing-function: ease-out; +} + +div.developers-picker button:hover { + background-color: var(--b-theme-primary); + color: var(--b-theme-white); +} diff --git a/Documentation/Blazorise.Docs/Styles/_home.scss b/Documentation/Blazorise.Docs/Styles/_home.scss index 43055380bb..a0a66837aa 100644 --- a/Documentation/Blazorise.Docs/Styles/_home.scss +++ b/Documentation/Blazorise.Docs/Styles/_home.scss @@ -10,12 +10,8 @@ --docsearch-logo-color: var(--bd-violet); } -.home-banner { - /*background-color: #f7f8fa;*/ +.page-header { text-align: center; - /* background-repeat: no-repeat; - background-size: cover; - background-position: center center;*/ background-image: linear-gradient(180deg, rgba(var(--bs-body-bg-rgb), 0.01), rgba(var(--bs-body-bg-rgb), 1) 85%),radial-gradient(ellipse at top left, rgba(var(--bs-primary-rgb), 0.5), transparent 50%),radial-gradient(ellipse at top right, rgba(var(--bd-accent-rgb), 0.5), transparent 50%),radial-gradient(ellipse at center right, rgba(var(--bd-violet-rgb), 0.5), transparent 50%),radial-gradient(ellipse at center left, rgba(var(--bd-pink-rgb), 0.5), transparent 50%); &-img { @@ -208,7 +204,6 @@ /*background-image: linear-gradient( 106.4deg, rgba(255,104,192,1) 11.1%, rgba(104,84,249,1) 81.3% );*/ background-image: linear-gradient( 111.6deg, rgba(174,68,223,1) 27.3%, rgba(246,135,135,1) 112.7% ); /*background-image: linear-gradient( 109.6deg, rgba(209,0,116,1) 11.2%, rgba(110,44,107,1) 91.1% );*/ - /*background-image: linear-gradient(43deg, #4158D0 0%, #C850C0 46%, #FFCC70 100%);*/ /*background-image: linear-gradient(120deg, #a6c0fe 0%, #f68084 100%);*/ /*background-image: linear-gradient(to right, #fc5c7d, #6a82fb);*/ diff --git a/Documentation/Blazorise.Docs/Styles/blazorise.docs.scss b/Documentation/Blazorise.Docs/Styles/blazorise.docs.scss index 93ee6eea62..a0fb70b2f2 100644 --- a/Documentation/Blazorise.Docs/Styles/blazorise.docs.scss +++ b/Documentation/Blazorise.Docs/Styles/blazorise.docs.scss @@ -5,5 +5,6 @@ @import 'code'; @import 'news'; @import 'blog'; +@import 'commercial'; @import 'vendors/tocbot/tocbot'; \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/_Imports.razor b/Documentation/Blazorise.Docs/_Imports.razor index 2e414f091c..99c52ebe2a 100644 --- a/Documentation/Blazorise.Docs/_Imports.razor +++ b/Documentation/Blazorise.Docs/_Imports.razor @@ -7,6 +7,7 @@ @using Blazorise.Docs @using Blazorise.Docs.Layouts @using Blazorise.Docs.Components +@using Blazorise.Docs.Components.Commercial @using Blazorise @using Blazorise.Animate diff --git a/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.css b/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.css index 235721cc6b..db1cc3f0cb 100644 --- a/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.css +++ b/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.css @@ -137,15 +137,11 @@ html, body * { --docsearch-logo-color: var(--bd-violet); } -.home-banner { - /*background-color: #f7f8fa;*/ +.page-header { text-align: center; - /* background-repeat: no-repeat; - background-size: cover; - background-position: center center;*/ background-image: linear-gradient(180deg, rgba(var(--bs-body-bg-rgb), 0.01), rgba(var(--bs-body-bg-rgb), 1) 85%), radial-gradient(ellipse at top left, rgba(var(--bs-primary-rgb), 0.5), transparent 50%), radial-gradient(ellipse at top right, rgba(var(--bd-accent-rgb), 0.5), transparent 50%), radial-gradient(ellipse at center right, rgba(var(--bd-violet-rgb), 0.5), transparent 50%), radial-gradient(ellipse at center left, rgba(var(--bd-pink-rgb), 0.5), transparent 50%); } -.home-banner-img { +.page-header-img { aspect-ratio: 3; } @@ -758,6 +754,55 @@ code { color: #576b85; } +.nav.pricing-tabs > .nav-item > .nav-link { + padding: 1.25rem; +} + +.nav.pricing-tabs > .nav-item > .nav-link:not(.active) { + color: var(--b-theme-primary); + outline: solid var(--b-theme-primary) 1px; + transition: background-color 0.3s ease-out; +} + +.nav.pricing-tabs > .nav-item > .nav-link.active { + transition: background-color 0.3s ease-in; +} + +.plan-switch > .plan-switch-button { + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.2); + transition: background-color 0.3s ease-in; +} + +.plan-switch > .plan-switch-button:hover { + box-shadow: 0 0 15px 0 rgba(0, 0, 0, 0.3); + transition-duration: 0.3s; +} + +div.card.pricing-card { + box-shadow: 0 0 5px 0 rgba(0, 0, 0, 0.2); + transition: all 0.3s ease-out; +} + +div.card.pricing-card:hover { + box-shadow: 0 0 25px 0 rgba(0, 0, 0, 0.3); + transform: translateY(-5px) scale(1.005); +} + +div.developers-picker input { + font-size: 1.25rem; +} + +div.developers-picker button { + transition-duration: 0.3s; + transition-property: color, background-color; + transition-timing-function: ease-out; +} + +div.developers-picker button:hover { + background-color: var(--b-theme-primary); + color: var(--b-theme-white); +} + a.toc-link { text-decoration: none; } diff --git a/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.js b/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.js index b0e0aa7f36..471414aa9c 100644 --- a/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.js +++ b/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.js @@ -95,4 +95,44 @@ window.myComponent = { return newUrl; } } -} \ No newline at end of file +} + +window.blazorisePRO = { + paddle: { + openCheckout: (product, quantity, upsell) => { + if (upsell) { + Paddle.Checkout.open({ + product: product, + quantity: quantity, + upsell: upsell.id, + upsellTitle: upsell.title, + upsellText: upsell.text, + upsellAction: upsell.action, + }); + } + else { + Paddle.Checkout.open({ + product: product, + quantity: quantity + }); + } + } + }, + wspay: { + submit: (elementId, data) => { + const form = document.getElementById(elementId); + + if (form) { + const shoppingCartIDInput = document.getElementsByName("ShoppingCartID")[0]; + const signatureInput = document.getElementsByName("Signature")[0]; + + if (shoppingCartIDInput && signatureInput) { + shoppingCartIDInput.value = data.shoppingCartID; + signatureInput.value = data.signature; + + form.submit(); + } + } + } + } +}; diff --git a/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.min.css b/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.min.css index e905131fe7..f97347f231 100644 --- a/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.min.css +++ b/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.min.css @@ -1 +1 @@ -@charset "UTF-8";@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4taVIGxA.woff2) format("woff2");unicode-range:U+460-52F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4kaVIGxA.woff2) format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4saVIGxA.woff2) format("woff2");unicode-range:U+1F00-1FFF;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4jaVIGxA.woff2) format("woff2");unicode-range:U+370-3FF;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4iaVIGxA.woff2) format("woff2");unicode-range:U+590-5FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4vaVIGxA.woff2) format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+1EA0-1EF9,U+20AB;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4uaVIGxA.woff2) format("woff2");unicode-range:U+100-24F,U+259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVI.woff2) format("woff2");unicode-range:U+0-FF,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}body{color:#3f4d62;font-family:"Open Sans","Helvetica","Arial","sans-serif";font-weight:400;line-height:1.5;letter-spacing:.00938em;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}a{color:#1a81fa;}.b-top-bar>:not(.navbar-brand) .nav-link{font-size:1.1rem;font-weight:400;}::-webkit-scrollbar{width:8px;height:8px;z-index:1;}::-webkit-scrollbar-track{background:transparent;}::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:1px;}::-webkit-scrollbar-thumb:hover{background:#a8a8a8;}html,body *{scrollbar-color:#bfbfbf transparent;scrollbar-width:thin;}.img-circle{border-radius:4.25rem!important;}:root{--bd-purple:#4c0bce;--bd-violet:#712cf9;--bd-accent:#ffe484;--bd-violet-rgb:112.520718,44.062154,249.437846;--bd-accent-rgb:255,228,132;--bd-pink-rgb:214,51,132;--bd-teal-rgb:32,201,151;--docsearch-primary-color:var(--bd-violet);--docsearch-logo-color:var(--bd-violet);}.home-banner{text-align:center;background-image:linear-gradient(180deg,rgba(var(--bs-body-bg-rgb),.01),rgba(var(--bs-body-bg-rgb),1) 85%),radial-gradient(ellipse at top left,rgba(var(--bs-primary-rgb),.5),transparent 50%),radial-gradient(ellipse at top right,rgba(var(--bd-accent-rgb),.5),transparent 50%),radial-gradient(ellipse at center right,rgba(var(--bd-violet-rgb),.5),transparent 50%),radial-gradient(ellipse at center left,rgba(var(--bd-pink-rgb),.5),transparent 50%);}.home-banner-img{aspect-ratio:3;}.home-community-readmore-link{font-size:13px;color:var(--b-theme-secondary);font-weight:500;transition:color .5s ease-in-out;}.home-community-readmore-link:hover{color:var(--b-theme-primary);}.home-community-img-icons{transition:all .4s ease-in-out;}.home-community-img-icons:hover{transform:scale(1.1);}.home-newsletter-readmore-link{font-size:13px;color:var(--b-theme-secondary);font-weight:500;transition:color .5s ease-in-out;}.home-newsletter-readmore-link:hover{color:var(--b-theme-primary);}.home-newsletter-img-icons{transition:all .4s ease-in-out;}.home-newsletter-img-icons:hover{transform:scale(1.1);}@media(max-width:992px){.home-features .flex-item:nth-of-type(1){order:2;}.home-features .flex-item:nth-of-type(2){order:1;}.home-features .img-digital{text-align:center;}}.home-features a:not(.home-feature-info-image){color:#3f4d62;border-bottom:2px solid var(--b-theme-primary);text-decoration:none;transition:color .5s ease-in-out;}.home-features a:not(.home-feature-info-image):hover{color:var(--b-theme-primary);}.home-case-studies .color-cards .card-contents{position:relative;padding:30px 0;}.home-case-studies .color-cards .card-details p{color:#6e6e6e;font-weight:500;}.home-case-studies .color-cards:hover .card-details{color:var(--b-theme-primary);}.home-case-studies .color-cards:hover .card-details p{color:var(--b-theme-primary);}.home-case-studies .color-cards:hover .card-desc-box{opacity:1;}.home-case-studies .color-cards .btn{padding:6px 14px;font-size:12px;}.home-case-studies .case-studies-card-img{height:150px;}.home-case-studies .card-desc-box{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(0,51,204,.8);transition:all .8s ease-in-out;opacity:0;}.home-customer-feedback-customer-cards{background:#f3f7fb;font-size:18px;margin:0 12px;transition:all .7s ease-in-out;}.home-customer-feedback-customer-cards-img-customer{border-radius:50%;transition:all .7s ease-in-out;}.home-customer-feedback-customer-cards:hover{background:#e4e7ea;transform:scale(1.02);}.home-customer-feedback-customer-cards:hover .img-customer{transform:scale(1.05);}.home-customer-feedback-customer-cards-content-divider{width:73px;height:3px;}.home-popular-components .nav .nav-link:not(.active){color:var(--b-theme-secondary);}.home-popular-components a{color:#3f4d62;border-bottom:2px solid var(--b-theme-primary);text-decoration:none;transition:color .5s ease-in-out;}.home-popular-components a:hover{color:var(--b-theme-primary);}.home-testimonials a{color:#3f4d62;border-bottom:2px solid var(--b-theme-primary);text-decoration:none;transition:color .5s ease-in-out;}.home-testimonials a:hover{color:var(--b-theme-primary);}.home-newsletter-container{padding:50px 50px;position:relative;border-radius:13px;background-image:linear-gradient(111.6deg,#ae44df 27.3%,#f68787 112.7%);}.b-docs-page .b-docs-page-title{margin-bottom:1.5rem;}.b-docs-page .b-docs-page-subtitle{padding-bottom:.5em;border-bottom:1px solid #f2f3f3;}.b-docs-page .b-docs-page-paragraph{margin-bottom:1.5rem;}.b-docs-page .b-docs-page-lead{font-size:calc(1.275rem + .3vw);font-weight:300;}@media(min-width:1200px){.b-docs-page .b-docs-page-lead{font-size:1.5rem;}}.b-docs-page .b-docs-page-unordered-list .b-docs-page-unordered-list-item{margin-bottom:.5rem;}.b-docs-page .b-docs-page-section{margin-bottom:50px;}.b-docs-page .b-docs-page-section-header{margin-bottom:20px;}.b-docs-page .b-docs-page-section-content{padding:20px;border-radius:4px 4px 0 0;margin-bottom:40px;background-color:#fff;margin:auto;display:flex;outline:0;position:relative;justify-content:start;}.b-docs-page .b-docs-page-section-content .b-docs-page-section-content-inner{display:block;outline:0;position:relative;justify-content:start;}.b-docs-page .b-docs-page-section-content.b-docs-display-flex>.b-docs-page-section-content-inner{display:flex;flex-grow:1;flex-wrap:wrap;}.b-docs-page .b-docs-page-section-content.b-docs-page-section-content-fullwidth>.b-docs-page-section-content-inner{width:100%;}.b-docs-page .b-docs-page-section-content:not(.b-docs-page-section-content-outlined){padding-left:0;}.b-docs-page .b-docs-page-section-content.b-docs-page-section-content-outlined{border:1px solid #e3e3e3;}.b-docs-page .b-docs-page-section-content.b-docs-page-section-content-display-grid{display:grid;}.b-docs-page .b-docs-page-section-source{position:relative;height:100%;}.b-docs-page .b-docs-page-section-source .b-docs-page-section-source-toolbar{position:absolute;top:0;right:0;}.b-docs-page .b-docs-page-section-source .b-docs-page-section-source-code{height:100%;}.b-docs-page .b-docs-page-section-source .b-docs-page-section-source-code.b-docs-page-section-source-code-show{display:block;}.b-docs-page .b-docs-page-section-source .b-docs-page-section-source-code.b-docs-page-section-source-code-hide{display:none;}.b-docs-page .b-docs-page-section-source .btn{color:#576b85;}.b-docs-page .b-docs .b-bar-vertical-inline .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu .b-bar-dropdown-item{padding:.3rem;}.b-docs-page .b-docs-attributes tbody tr td:first-child code{color:#1867c0;}.b-docs-page .b-docs-attributes tbody tr td:nth-child(2) code{color:#690;}.b-docs-page .b-docs-attributes tbody tr .b-attribute-token.boolean code{color:#905;}.b-docs-page .b-docs-attributes tbody tr .b-attribute-token.keyword code{color:#07a;}.b-docs-page .b-docs-attributes tbody tr .b-attribute-token.string code{color:#690;}.b-docs-page .b-docs-methods tbody tr td:first-child code{color:#1867c0;}.b-docs-page .b-docs-methods tbody tr td:nth-child(2) code{color:#690;}.b-docs-page .b-docs-methods tbody tr .b-method-token.boolean code{color:#905;}.b-docs-page .b-docs-methods tbody tr .b-method-token.keyword code{color:#07a;}.b-docs-page .b-docs-methods tbody tr .b-method-token.string code{color:#690;}.b-docs-page .b-docs-example{position:relative;padding:1rem;margin:1rem -.75rem 0;border:solid #dee2e6;border-width:1px 0 0;}.b-docs-page .b-docs-example::after{display:block;clear:both;content:"";}@media(min-width:576px){.b-docs-page .b-docs-example{padding:1.5rem;margin-right:0;margin-left:0;border-width:1px;border-top-left-radius:.25rem;border-top-right-radius:.25rem;}}.b-docs-page .b-docs-example+p{margin-top:2rem;}.b-docs-page .b-docs-example-border-utils [class*=border]{display:inline-block;width:5rem;height:5rem;margin:.25rem;background-color:#f5f5f5;display:inline-flex;justify-content:center;align-items:center;}.b-docs-page .b-docs-example-border-utils [class*=rounded]{display:inline-block;width:5rem;height:5rem;margin:.25rem;background-color:#6b757d;color:#dee2e6;display:inline-flex;justify-content:center;align-items:center;}.b-docs-page .b-docs-example-border-utils-0 [class*=border]{border:1px solid #dee2e6;}.b-docs-page .b-docs-example-position-utils{position:relative;padding:3em;}.b-docs-page .b-docs-example-position-utils>div{height:200px;background-color:#f5f5f5;}.b-docs-page .b-docs-example-position-utils>div>div{width:2em;height:2em;background-color:#212529;border-radius:.25rem;}.b-docs-page .b-docs-example-blazorise-icon span{width:150px;overflow-wrap:break-word;}.b-docs-page a:not(.dropdown-item):not(.page-link):not(.b-bar-link):not(.nav-link):not(.b-bar-toggler-inline):not(.navbar-toggler):not([role=button]){color:#3f4d62;border-bottom:2px solid var(--b-theme-primary);text-decoration:none;transition:color .5s ease-in-out;}.b-docs-page a:not(.dropdown-item):not(.page-link):not(.b-bar-link):not(.nav-link):not(.b-bar-toggler-inline):not(.navbar-toggler):not([role=button]):hover{color:var(--b-theme-primary);}.blazorise-codeblock{height:100%;background-color:#f5f8fd;border-radius:0 0 4px 4px;padding:16px;font-size:.9rem;overflow:auto;}.blazorise-codeblock pre{height:100%;color:#3f4d62;padding:0;font-size:1em;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;-webkit-font-smoothing:subpixel-antialiased;direction:ltr;margin-bottom:0;overflow:visible;}.blazorise-codeblock .html+.csharp{margin-top:23px;}.blazorise-codeblock .html .htmlTagDelimiter{color:#979797;}.blazorise-codeblock .html .htmlElementName{color:#1a81fa;}.blazorise-codeblock .html .htmlAttributeName{color:#ff3a49;}.blazorise-codeblock .html .htmlOperator,.blazorise-codeblock .html .quot{color:#576b85;}.blazorise-codeblock .html .htmlAttributeValue{color:#1ba875;}.blazorise-codeblock .html .htmlLink{color:#61afef;text-decoration:underline;}.blazorise-codeblock .html .enum{color:#1ba875;background-color:rgba(255,255,255,.15);}.blazorise-codeblock .html .enumValue,.blazorise-codeblock .html .sharpVariable{color:#6823d4;background-color:rgba(255,255,255,.15);}.blazorise-codeblock .html .keyword{color:#61afef;background-color:rgba(255,255,255,.15);}.blazorise-codeblock .html .atSign{color:#3f4d62;background-color:#e8e8e8;}.blazorise-codeblock .html .comment{color:#57a64a;}.blazorise-codeblock .csharp .atSign{color:#3f4d62;background-color:#e8e8e8;}.blazorise-codeblock .csharp .keyword{color:#5748ff;}.blazorise-codeblock .csharp .string{color:#d69d85;}.blazorise-codeblock .csharp .function{color:#68b6f8;}.blazorise-codeblock .csharp .class{color:#ff3a49;}.blazorise-codeblock .csharp .localVar{color:#ffc74c;}.blazorise-codeblock .csharp .interface{color:#b0d7a3;}.blazorise-codeblock .csharp .number{color:#b0d7a3;}.blazorise-codeblock .csharp .enum{color:#1ba875;}.blazorise-codeblock .csharp .comment{color:#57a64a;}.blazorise-codeblock .powershell .comment{color:#57a64a;}.blazorise-codeblock .powershell .powershellOperator{color:#f00;}code{color:#5748ff;background-color:#f5f8fd;padding:.25em .375em;}.b-news .b-news-content{line-height:1.5;font-size:1.25rem;}@media(max-width:48rem){.b-news .b-news-content{font-size:1.125rem;}}@media(max-width:40rem){.b-news .b-news-content{font-size:1rem;}}.b-news .b-news-content a{color:var(--b-theme-primary);}.b-news .b-news-content p{margin-bottom:1.3rem;}.b-news .b-news-content p dl{padding-top:.5em;padding-bottom:.5em;}.b-news .b-news-content p .blockquote{border-left:4px solid #d6d6d7;padding:0 0 0 1.25rem;margin:0 0 1.25rem 0;}.b-news .b-news-content h2{padding-bottom:.5em;border-bottom:1px solid #f2f3f3;}.b-news .b-news-content h3{padding-bottom:.5em;border-bottom:1px solid #f2f3f3;}.b-news .b-news-content h4{padding-bottom:.5em;}.b-news .b-news-content p>code,.b-news .b-news-content a>code,.b-news .b-news-content li>code,.b-news .b-news-content td>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:#fafafa;border-radius:4px;}.b-news .b-news-content p>code:before,.b-news .b-news-content a>code:before,.b-news .b-news-content li>code:before,.b-news .b-news-content td>code:before{letter-spacing:-.2em;content:" ";}.b-news .b-news-content p>code:after,.b-news .b-news-content a>code:after,.b-news .b-news-content li>code:after,.b-news .b-news-content td>code:after{letter-spacing:-.2em;content:" ";}.b-news .b-news-content :not(pre)>code{background-color:#f5f5f5;color:#ff3860;font-weight:400;}.b-news .b-news-content a{color:#3f4d62;border-bottom:2px solid #9317e1;text-decoration:none;}.b-news .b-news-post-info .b-news-post-info-user{font-size:1.125rem;}.b-news .b-news-post-info .b-news-post-info-date{font-size:1rem;}.b-blog .b-blog-content{line-height:1.5;font-size:1.25rem;}@media(max-width:48rem){.b-blog .b-blog-content{font-size:1.125rem;}}@media(max-width:40rem){.b-blog .b-blog-content{font-size:1rem;}}.b-blog .b-blog-content a{color:#3f4d62;border-bottom:2px solid var(--b-theme-primary);text-decoration:none;}.b-blog .b-blog-content p{margin-bottom:1.3rem;}.b-blog .b-blog-content p dl{padding-top:.5em;padding-bottom:.5em;}.b-blog .b-blog-content p .blockquote{border-left:4px solid #d6d6d7;padding:0 0 0 1.25rem;margin:0 0 1.25rem 0;}.b-blog .b-blog-content h2{padding-bottom:.5em;border-bottom:1px solid #f2f3f3;}.b-blog .b-blog-content h3{padding-bottom:.5em;border-bottom:1px solid #f2f3f3;}.b-blog .b-blog-content h4{padding-bottom:.5em;}.b-blog .b-blog-content p>code,.b-blog .b-blog-content a>code,.b-blog .b-blog-content li>code,.b-blog .b-blog-content td>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:#fafafa;border-radius:4px;}.b-blog .b-blog-content p>code:before,.b-blog .b-blog-content a>code:before,.b-blog .b-blog-content li>code:before,.b-blog .b-blog-content td>code:before{letter-spacing:-.2em;content:" ";}.b-blog .b-blog-content p>code:after,.b-blog .b-blog-content a>code:after,.b-blog .b-blog-content li>code:after,.b-blog .b-blog-content td>code:after{letter-spacing:-.2em;content:" ";}.b-blog .b-blog-content :not(pre)>code{background-color:#f5f5f5;color:#ff3860;font-weight:400;}.b-blog .b-blog-post-info .b-blog-post-info-user{font-size:1.125rem;}.b-blog .b-blog-post-info .b-blog-post-info-date{font-size:1rem;}.blog-page-section-source{position:relative;height:100%;}.blog-page-section-source .blog-page-section-source-toolbar{position:absolute;top:0;right:0;}.blog-page-section-source .blog-page-section-source-code{height:100%;}.blog-page-section-source .blog-page-section-source-code.blog-page-section-source-code-show{display:block;}.blog-page-section-source .blog-page-section-source-code.blog-page-section-source-code-hide{display:none;}.blog-page-section-source .btn{color:#576b85;}a.toc-link{text-decoration:none;}.b-docs-toc{position:sticky;top:5rem;right:0;overflow-y:hidden;}.b-docs-toc .toc>.toc-list{overflow:hidden;position:relative;}.b-docs-toc .toc>.toc-list li{margin-bottom:.25rem;list-style:none;}.b-docs-toc .toc .toc-list{margin:0;padding-left:10px;}.b-docs-toc .toc a.toc-link{color:currentColor;height:100%;cursor:pointer;font-size:.875rem;}.b-docs-toc .toc a.toc-link.is-active-link{font-weight:700;}.b-docs-toc .toc a.toc-link:hover{text-decoration:underline;} \ No newline at end of file +@charset "UTF-8";@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4taVIGxA.woff2) format("woff2");unicode-range:U+460-52F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4kaVIGxA.woff2) format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4saVIGxA.woff2) format("woff2");unicode-range:U+1F00-1FFF;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4jaVIGxA.woff2) format("woff2");unicode-range:U+370-3FF;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4iaVIGxA.woff2) format("woff2");unicode-range:U+590-5FF,U+200C-2010,U+20AA,U+25CC,U+FB1D-FB4F;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4vaVIGxA.woff2) format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+1EA0-1EF9,U+20AB;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4uaVIGxA.woff2) format("woff2");unicode-range:U+100-24F,U+259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;}@font-face{font-family:"Open Sans";font-style:normal;font-weight:400;font-stretch:100%;src:url(https://fonts.gstatic.com/s/opensans/v29/memSYaGs126MiZpBA-UvWbX2vVnXBbObj2OVZyOOSr4dVJWUgsjZ0B4gaVI.woff2) format("woff2");unicode-range:U+0-FF,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;}body{color:#3f4d62;font-family:"Open Sans","Helvetica","Arial","sans-serif";font-weight:400;line-height:1.5;letter-spacing:.00938em;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;}a{color:#1a81fa;}.b-top-bar>:not(.navbar-brand) .nav-link{font-size:1.1rem;font-weight:400;}::-webkit-scrollbar{width:8px;height:8px;z-index:1;}::-webkit-scrollbar-track{background:transparent;}::-webkit-scrollbar-thumb{background:#bfbfbf;border-radius:1px;}::-webkit-scrollbar-thumb:hover{background:#a8a8a8;}html,body *{scrollbar-color:#bfbfbf transparent;scrollbar-width:thin;}.img-circle{border-radius:4.25rem!important;}:root{--bd-purple:#4c0bce;--bd-violet:#712cf9;--bd-accent:#ffe484;--bd-violet-rgb:112.520718,44.062154,249.437846;--bd-accent-rgb:255,228,132;--bd-pink-rgb:214,51,132;--bd-teal-rgb:32,201,151;--docsearch-primary-color:var(--bd-violet);--docsearch-logo-color:var(--bd-violet);}.page-header{text-align:center;background-image:linear-gradient(180deg,rgba(var(--bs-body-bg-rgb),.01),rgba(var(--bs-body-bg-rgb),1) 85%),radial-gradient(ellipse at top left,rgba(var(--bs-primary-rgb),.5),transparent 50%),radial-gradient(ellipse at top right,rgba(var(--bd-accent-rgb),.5),transparent 50%),radial-gradient(ellipse at center right,rgba(var(--bd-violet-rgb),.5),transparent 50%),radial-gradient(ellipse at center left,rgba(var(--bd-pink-rgb),.5),transparent 50%);}.page-header-img{aspect-ratio:3;}.home-community-readmore-link{font-size:13px;color:var(--b-theme-secondary);font-weight:500;transition:color .5s ease-in-out;}.home-community-readmore-link:hover{color:var(--b-theme-primary);}.home-community-img-icons{transition:all .4s ease-in-out;}.home-community-img-icons:hover{transform:scale(1.1);}.home-newsletter-readmore-link{font-size:13px;color:var(--b-theme-secondary);font-weight:500;transition:color .5s ease-in-out;}.home-newsletter-readmore-link:hover{color:var(--b-theme-primary);}.home-newsletter-img-icons{transition:all .4s ease-in-out;}.home-newsletter-img-icons:hover{transform:scale(1.1);}@media(max-width:992px){.home-features .flex-item:nth-of-type(1){order:2;}.home-features .flex-item:nth-of-type(2){order:1;}.home-features .img-digital{text-align:center;}}.home-features a:not(.home-feature-info-image){color:#3f4d62;border-bottom:2px solid var(--b-theme-primary);text-decoration:none;transition:color .5s ease-in-out;}.home-features a:not(.home-feature-info-image):hover{color:var(--b-theme-primary);}.home-case-studies .color-cards .card-contents{position:relative;padding:30px 0;}.home-case-studies .color-cards .card-details p{color:#6e6e6e;font-weight:500;}.home-case-studies .color-cards:hover .card-details{color:var(--b-theme-primary);}.home-case-studies .color-cards:hover .card-details p{color:var(--b-theme-primary);}.home-case-studies .color-cards:hover .card-desc-box{opacity:1;}.home-case-studies .color-cards .btn{padding:6px 14px;font-size:12px;}.home-case-studies .case-studies-card-img{height:150px;}.home-case-studies .card-desc-box{position:absolute;top:0;left:0;right:0;bottom:0;background-color:rgba(0,51,204,.8);transition:all .8s ease-in-out;opacity:0;}.home-customer-feedback-customer-cards{background:#f3f7fb;font-size:18px;margin:0 12px;transition:all .7s ease-in-out;}.home-customer-feedback-customer-cards-img-customer{border-radius:50%;transition:all .7s ease-in-out;}.home-customer-feedback-customer-cards:hover{background:#e4e7ea;transform:scale(1.02);}.home-customer-feedback-customer-cards:hover .img-customer{transform:scale(1.05);}.home-customer-feedback-customer-cards-content-divider{width:73px;height:3px;}.home-popular-components .nav .nav-link:not(.active){color:var(--b-theme-secondary);}.home-popular-components a{color:#3f4d62;border-bottom:2px solid var(--b-theme-primary);text-decoration:none;transition:color .5s ease-in-out;}.home-popular-components a:hover{color:var(--b-theme-primary);}.home-testimonials a{color:#3f4d62;border-bottom:2px solid var(--b-theme-primary);text-decoration:none;transition:color .5s ease-in-out;}.home-testimonials a:hover{color:var(--b-theme-primary);}.home-newsletter-container{padding:50px 50px;position:relative;border-radius:13px;background-image:linear-gradient(111.6deg,#ae44df 27.3%,#f68787 112.7%);}.b-docs-page .b-docs-page-title{margin-bottom:1.5rem;}.b-docs-page .b-docs-page-subtitle{padding-bottom:.5em;border-bottom:1px solid #f2f3f3;}.b-docs-page .b-docs-page-paragraph{margin-bottom:1.5rem;}.b-docs-page .b-docs-page-lead{font-size:calc(1.275rem + .3vw);font-weight:300;}@media(min-width:1200px){.b-docs-page .b-docs-page-lead{font-size:1.5rem;}}.b-docs-page .b-docs-page-unordered-list .b-docs-page-unordered-list-item{margin-bottom:.5rem;}.b-docs-page .b-docs-page-section{margin-bottom:50px;}.b-docs-page .b-docs-page-section-header{margin-bottom:20px;}.b-docs-page .b-docs-page-section-content{padding:20px;border-radius:4px 4px 0 0;margin-bottom:40px;background-color:#fff;margin:auto;display:flex;outline:0;position:relative;justify-content:start;}.b-docs-page .b-docs-page-section-content .b-docs-page-section-content-inner{display:block;outline:0;position:relative;justify-content:start;}.b-docs-page .b-docs-page-section-content.b-docs-display-flex>.b-docs-page-section-content-inner{display:flex;flex-grow:1;flex-wrap:wrap;}.b-docs-page .b-docs-page-section-content.b-docs-page-section-content-fullwidth>.b-docs-page-section-content-inner{width:100%;}.b-docs-page .b-docs-page-section-content:not(.b-docs-page-section-content-outlined){padding-left:0;}.b-docs-page .b-docs-page-section-content.b-docs-page-section-content-outlined{border:1px solid #e3e3e3;}.b-docs-page .b-docs-page-section-content.b-docs-page-section-content-display-grid{display:grid;}.b-docs-page .b-docs-page-section-source{position:relative;height:100%;}.b-docs-page .b-docs-page-section-source .b-docs-page-section-source-toolbar{position:absolute;top:0;right:0;}.b-docs-page .b-docs-page-section-source .b-docs-page-section-source-code{height:100%;}.b-docs-page .b-docs-page-section-source .b-docs-page-section-source-code.b-docs-page-section-source-code-show{display:block;}.b-docs-page .b-docs-page-section-source .b-docs-page-section-source-code.b-docs-page-section-source-code-hide{display:none;}.b-docs-page .b-docs-page-section-source .btn{color:#576b85;}.b-docs-page .b-docs .b-bar-vertical-inline .b-bar-dropdown .b-bar-dropdown-menu-container .b-bar-dropdown-menu .b-bar-dropdown-item{padding:.3rem;}.b-docs-page .b-docs-attributes tbody tr td:first-child code{color:#1867c0;}.b-docs-page .b-docs-attributes tbody tr td:nth-child(2) code{color:#690;}.b-docs-page .b-docs-attributes tbody tr .b-attribute-token.boolean code{color:#905;}.b-docs-page .b-docs-attributes tbody tr .b-attribute-token.keyword code{color:#07a;}.b-docs-page .b-docs-attributes tbody tr .b-attribute-token.string code{color:#690;}.b-docs-page .b-docs-methods tbody tr td:first-child code{color:#1867c0;}.b-docs-page .b-docs-methods tbody tr td:nth-child(2) code{color:#690;}.b-docs-page .b-docs-methods tbody tr .b-method-token.boolean code{color:#905;}.b-docs-page .b-docs-methods tbody tr .b-method-token.keyword code{color:#07a;}.b-docs-page .b-docs-methods tbody tr .b-method-token.string code{color:#690;}.b-docs-page .b-docs-example{position:relative;padding:1rem;margin:1rem -.75rem 0;border:solid #dee2e6;border-width:1px 0 0;}.b-docs-page .b-docs-example::after{display:block;clear:both;content:"";}@media(min-width:576px){.b-docs-page .b-docs-example{padding:1.5rem;margin-right:0;margin-left:0;border-width:1px;border-top-left-radius:.25rem;border-top-right-radius:.25rem;}}.b-docs-page .b-docs-example+p{margin-top:2rem;}.b-docs-page .b-docs-example-border-utils [class*=border]{display:inline-block;width:5rem;height:5rem;margin:.25rem;background-color:#f5f5f5;display:inline-flex;justify-content:center;align-items:center;}.b-docs-page .b-docs-example-border-utils [class*=rounded]{display:inline-block;width:5rem;height:5rem;margin:.25rem;background-color:#6b757d;color:#dee2e6;display:inline-flex;justify-content:center;align-items:center;}.b-docs-page .b-docs-example-border-utils-0 [class*=border]{border:1px solid #dee2e6;}.b-docs-page .b-docs-example-position-utils{position:relative;padding:3em;}.b-docs-page .b-docs-example-position-utils>div{height:200px;background-color:#f5f5f5;}.b-docs-page .b-docs-example-position-utils>div>div{width:2em;height:2em;background-color:#212529;border-radius:.25rem;}.b-docs-page .b-docs-example-blazorise-icon span{width:150px;overflow-wrap:break-word;}.b-docs-page a:not(.dropdown-item):not(.page-link):not(.b-bar-link):not(.nav-link):not(.b-bar-toggler-inline):not(.navbar-toggler):not([role=button]){color:#3f4d62;border-bottom:2px solid var(--b-theme-primary);text-decoration:none;transition:color .5s ease-in-out;}.b-docs-page a:not(.dropdown-item):not(.page-link):not(.b-bar-link):not(.nav-link):not(.b-bar-toggler-inline):not(.navbar-toggler):not([role=button]):hover{color:var(--b-theme-primary);}.blazorise-codeblock{height:100%;background-color:#f5f8fd;border-radius:0 0 4px 4px;padding:16px;font-size:.9rem;overflow:auto;}.blazorise-codeblock pre{height:100%;color:#3f4d62;padding:0;font-size:1em;font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;-webkit-font-smoothing:subpixel-antialiased;direction:ltr;margin-bottom:0;overflow:visible;}.blazorise-codeblock .html+.csharp{margin-top:23px;}.blazorise-codeblock .html .htmlTagDelimiter{color:#979797;}.blazorise-codeblock .html .htmlElementName{color:#1a81fa;}.blazorise-codeblock .html .htmlAttributeName{color:#ff3a49;}.blazorise-codeblock .html .htmlOperator,.blazorise-codeblock .html .quot{color:#576b85;}.blazorise-codeblock .html .htmlAttributeValue{color:#1ba875;}.blazorise-codeblock .html .htmlLink{color:#61afef;text-decoration:underline;}.blazorise-codeblock .html .enum{color:#1ba875;background-color:rgba(255,255,255,.15);}.blazorise-codeblock .html .enumValue,.blazorise-codeblock .html .sharpVariable{color:#6823d4;background-color:rgba(255,255,255,.15);}.blazorise-codeblock .html .keyword{color:#61afef;background-color:rgba(255,255,255,.15);}.blazorise-codeblock .html .atSign{color:#3f4d62;background-color:#e8e8e8;}.blazorise-codeblock .html .comment{color:#57a64a;}.blazorise-codeblock .csharp .atSign{color:#3f4d62;background-color:#e8e8e8;}.blazorise-codeblock .csharp .keyword{color:#5748ff;}.blazorise-codeblock .csharp .string{color:#d69d85;}.blazorise-codeblock .csharp .function{color:#68b6f8;}.blazorise-codeblock .csharp .class{color:#ff3a49;}.blazorise-codeblock .csharp .localVar{color:#ffc74c;}.blazorise-codeblock .csharp .interface{color:#b0d7a3;}.blazorise-codeblock .csharp .number{color:#b0d7a3;}.blazorise-codeblock .csharp .enum{color:#1ba875;}.blazorise-codeblock .csharp .comment{color:#57a64a;}.blazorise-codeblock .powershell .comment{color:#57a64a;}.blazorise-codeblock .powershell .powershellOperator{color:#f00;}code{color:#5748ff;background-color:#f5f8fd;padding:.25em .375em;}.b-news .b-news-content{line-height:1.5;font-size:1.25rem;}@media(max-width:48rem){.b-news .b-news-content{font-size:1.125rem;}}@media(max-width:40rem){.b-news .b-news-content{font-size:1rem;}}.b-news .b-news-content a{color:var(--b-theme-primary);}.b-news .b-news-content p{margin-bottom:1.3rem;}.b-news .b-news-content p dl{padding-top:.5em;padding-bottom:.5em;}.b-news .b-news-content p .blockquote{border-left:4px solid #d6d6d7;padding:0 0 0 1.25rem;margin:0 0 1.25rem 0;}.b-news .b-news-content h2{padding-bottom:.5em;border-bottom:1px solid #f2f3f3;}.b-news .b-news-content h3{padding-bottom:.5em;border-bottom:1px solid #f2f3f3;}.b-news .b-news-content h4{padding-bottom:.5em;}.b-news .b-news-content p>code,.b-news .b-news-content a>code,.b-news .b-news-content li>code,.b-news .b-news-content td>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:#fafafa;border-radius:4px;}.b-news .b-news-content p>code:before,.b-news .b-news-content a>code:before,.b-news .b-news-content li>code:before,.b-news .b-news-content td>code:before{letter-spacing:-.2em;content:" ";}.b-news .b-news-content p>code:after,.b-news .b-news-content a>code:after,.b-news .b-news-content li>code:after,.b-news .b-news-content td>code:after{letter-spacing:-.2em;content:" ";}.b-news .b-news-content :not(pre)>code{background-color:#f5f5f5;color:#ff3860;font-weight:400;}.b-news .b-news-content a{color:#3f4d62;border-bottom:2px solid #9317e1;text-decoration:none;}.b-news .b-news-post-info .b-news-post-info-user{font-size:1.125rem;}.b-news .b-news-post-info .b-news-post-info-date{font-size:1rem;}.b-blog .b-blog-content{line-height:1.5;font-size:1.25rem;}@media(max-width:48rem){.b-blog .b-blog-content{font-size:1.125rem;}}@media(max-width:40rem){.b-blog .b-blog-content{font-size:1rem;}}.b-blog .b-blog-content a{color:#3f4d62;border-bottom:2px solid var(--b-theme-primary);text-decoration:none;}.b-blog .b-blog-content p{margin-bottom:1.3rem;}.b-blog .b-blog-content p dl{padding-top:.5em;padding-bottom:.5em;}.b-blog .b-blog-content p .blockquote{border-left:4px solid #d6d6d7;padding:0 0 0 1.25rem;margin:0 0 1.25rem 0;}.b-blog .b-blog-content h2{padding-bottom:.5em;border-bottom:1px solid #f2f3f3;}.b-blog .b-blog-content h3{padding-bottom:.5em;border-bottom:1px solid #f2f3f3;}.b-blog .b-blog-content h4{padding-bottom:.5em;}.b-blog .b-blog-content p>code,.b-blog .b-blog-content a>code,.b-blog .b-blog-content li>code,.b-blog .b-blog-content td>code{padding-top:.1rem;padding-bottom:.1rem;font-size:.8em;background:#fafafa;border-radius:4px;}.b-blog .b-blog-content p>code:before,.b-blog .b-blog-content a>code:before,.b-blog .b-blog-content li>code:before,.b-blog .b-blog-content td>code:before{letter-spacing:-.2em;content:" ";}.b-blog .b-blog-content p>code:after,.b-blog .b-blog-content a>code:after,.b-blog .b-blog-content li>code:after,.b-blog .b-blog-content td>code:after{letter-spacing:-.2em;content:" ";}.b-blog .b-blog-content :not(pre)>code{background-color:#f5f5f5;color:#ff3860;font-weight:400;}.b-blog .b-blog-post-info .b-blog-post-info-user{font-size:1.125rem;}.b-blog .b-blog-post-info .b-blog-post-info-date{font-size:1rem;}.blog-page-section-source{position:relative;height:100%;}.blog-page-section-source .blog-page-section-source-toolbar{position:absolute;top:0;right:0;}.blog-page-section-source .blog-page-section-source-code{height:100%;}.blog-page-section-source .blog-page-section-source-code.blog-page-section-source-code-show{display:block;}.blog-page-section-source .blog-page-section-source-code.blog-page-section-source-code-hide{display:none;}.blog-page-section-source .btn{color:#576b85;}.nav.pricing-tabs>.nav-item>.nav-link{padding:1.25rem;}.nav.pricing-tabs>.nav-item>.nav-link:not(.active){color:var(--b-theme-primary);outline:solid var(--b-theme-primary) 1px;transition:background-color .3s ease-out;}.nav.pricing-tabs>.nav-item>.nav-link.active{transition:background-color .3s ease-in;}.plan-switch>.plan-switch-button{box-shadow:0 0 5px 0 rgba(0,0,0,.2);transition:background-color .3s ease-in;}.plan-switch>.plan-switch-button:hover{box-shadow:0 0 15px 0 rgba(0,0,0,.3);transition-duration:.3s;}div.card.pricing-card{box-shadow:0 0 5px 0 rgba(0,0,0,.2);transition:all .3s ease-out;}div.card.pricing-card:hover{box-shadow:0 0 25px 0 rgba(0,0,0,.3);transform:translateY(-5px) scale(1.005);}div.developers-picker input{font-size:1.25rem;}div.developers-picker button{transition-duration:.3s;transition-property:color,background-color;transition-timing-function:ease-out;}div.developers-picker button:hover{background-color:var(--b-theme-primary);color:var(--b-theme-white);}a.toc-link{text-decoration:none;}.b-docs-toc{position:sticky;top:5rem;right:0;overflow-y:hidden;}.b-docs-toc .toc>.toc-list{overflow:hidden;position:relative;}.b-docs-toc .toc>.toc-list li{margin-bottom:.25rem;list-style:none;}.b-docs-toc .toc .toc-list{margin:0;padding-left:10px;}.b-docs-toc .toc a.toc-link{color:currentColor;height:100%;cursor:pointer;font-size:.875rem;}.b-docs-toc .toc a.toc-link.is-active-link{font-weight:700;}.b-docs-toc .toc a.toc-link:hover{text-decoration:underline;} \ No newline at end of file diff --git a/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.min.js b/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.min.js index bd0643ea61..3e6451654d 100644 --- a/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.min.js +++ b/Documentation/Blazorise.Docs/wwwroot/blazorise.docs.min.js @@ -1 +1 @@ -window.blazoriseDocs={code:{copyToClipboard:n=>{navigator.clipboard.writeText(n)}},navigation:{scrollToTop:()=>{var n=document.getElementById("b-docs-layout-header");n&&n.scrollIntoView({behavior:"auto"})},generateToc:(n,t)=>{document.querySelectorAll(".b-docs-page>h2, .b-docs-page>h3, .b-docs-page>h4, .b-docs-page-section-header>h3").forEach(function(n){if(n&&!n.id&&n.textContent){const t=n.textContent.trim();n.id="toc_"+t.replace(/[^A-Za-z0-9]/g,"-")}}),tocbot.destroy(),tocbot.init({basePath:t.basePath,tocSelector:"#TableOfContents",contentSelector:".b-docs-page",headingSelector:".b-docs-page>h2, .b-docs-page>h3, .b-docs-page>h4, .b-docs-page-section-header>h3",hasInnerContainers:!1,orderedList:!1,activeLinkClass:"active",scrollSmooth:!0,scrollSmoothDuration:420,scrollSmoothOffset:0,scrollEndCallback:function(){},disableTocScrollSync:!1,onClick:function(n){n.preventDefault();n.stopPropagation();const t=n.target;if(t&&t.href){const n=new URL(t.href);if(n){const t=n.hash;if(t&&t.length>0){const n=document.getElementById(t.substring(1));n&&n.scrollIntoView({behavior:"smooth",block:"center",inline:"start"})}}}},headingObjectCallback:function(n,t){return n&&n.textContent&&!n.id&&!t.id&&(n.id="toc_"+n.textContent.replace(/[^A-Za-z0-9]/g,"-")),n}})}}};window.myComponent={configureQuillJs:()=>{var n=Quill.import("formats/link");n.sanitize=n=>{let t=window.decodeURIComponent(n);return(t=t.trim().replace(/\s/g,""),/^(:\/\/)/.test(t))?`http${t}`:/^(f|ht)tps?:\/\//i.test(t)?t:`http://${t}`}}}; \ No newline at end of file +window.blazoriseDocs={code:{copyToClipboard:n=>{navigator.clipboard.writeText(n)}},navigation:{scrollToTop:()=>{var n=document.getElementById("b-docs-layout-header");n&&n.scrollIntoView({behavior:"auto"})},generateToc:(n,t)=>{document.querySelectorAll(".b-docs-page>h2, .b-docs-page>h3, .b-docs-page>h4, .b-docs-page-section-header>h3").forEach(function(n){if(n&&!n.id&&n.textContent){const t=n.textContent.trim();n.id="toc_"+t.replace(/[^A-Za-z0-9]/g,"-")}}),tocbot.destroy(),tocbot.init({basePath:t.basePath,tocSelector:"#TableOfContents",contentSelector:".b-docs-page",headingSelector:".b-docs-page>h2, .b-docs-page>h3, .b-docs-page>h4, .b-docs-page-section-header>h3",hasInnerContainers:!1,orderedList:!1,activeLinkClass:"active",scrollSmooth:!0,scrollSmoothDuration:420,scrollSmoothOffset:0,scrollEndCallback:function(){},disableTocScrollSync:!1,onClick:function(n){n.preventDefault();n.stopPropagation();const t=n.target;if(t&&t.href){const n=new URL(t.href);if(n){const t=n.hash;if(t&&t.length>0){const n=document.getElementById(t.substring(1));n&&n.scrollIntoView({behavior:"smooth",block:"center",inline:"start"})}}}},headingObjectCallback:function(n,t){return n&&n.textContent&&!n.id&&!t.id&&(n.id="toc_"+n.textContent.replace(/[^A-Za-z0-9]/g,"-")),n}})}}};window.myComponent={configureQuillJs:()=>{var n=Quill.import("formats/link");n.sanitize=n=>{let t=window.decodeURIComponent(n);return(t=t.trim().replace(/\s/g,""),/^(:\/\/)/.test(t))?`http${t}`:/^(f|ht)tps?:\/\//i.test(t)?t:`http://${t}`}}};window.blazorisePRO={paddle:{openCheckout:(n,t,i)=>{i?Paddle.Checkout.open({product:n,quantity:t,upsell:i.id,upsellTitle:i.title,upsellText:i.text,upsellAction:i.action}):Paddle.Checkout.open({product:n,quantity:t})}},wspay:{submit:(n,t)=>{const i=document.getElementById(n);if(i){const n=document.getElementsByName("ShoppingCartID")[0],r=document.getElementsByName("Signature")[0];n&&r&&(n.value=t.shoppingCartID,r.value=t.signature,i.submit())}}}}; \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md index 97b62c0929..0d3904e589 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,5 +1,5 @@ By accessing the Blazorise code here, you are agreeing to the following licensing terms: -https://blazorise.com/commercial/files/licences/SLA-2023-07.pdf +https://blazorise.com/files/licences/SLA-2023-07.pdf If you disagree with these terms, do not access the Blazorise code. diff --git a/Shared/Blazorise.Shared/Data/PageEntryData.cs b/Shared/Blazorise.Shared/Data/PageEntryData.cs index 49636f664e..64d18483d9 100644 --- a/Shared/Blazorise.Shared/Data/PageEntryData.cs +++ b/Shared/Blazorise.Shared/Data/PageEntryData.cs @@ -180,7 +180,7 @@ private Task LoadData( ICacheEntry cacheEntry ) new PageEntry( "docs/services/notification-provider", "Notification Provider", "Notification service is used to provide feedback to the user." ), new PageEntry( "docs/services/page-progress-provider", "Page Progress Provider", "Page Progress service is used to provide a page loading indicator to the user." ), new PageEntry( "docs/faq", "FAQ" ), - new PageEntry( "commercial/license", "License" ), + new PageEntry( "license", "License" ), }.ToArray() ); } } \ No newline at end of file