├── src └── Nexus │ ├── Components │ ├── Layout │ │ ├── MainLayout.razor.css │ │ ├── NavMenu.razor.css │ │ ├── NavMenu.razor.cs │ │ ├── MainLayout.razor │ │ └── NavMenu.razor │ ├── Shared │ │ ├── Button.razor │ │ ├── ScrollToTop.razor │ │ ├── ScrollToTop.razor.js │ │ ├── Breadcrumb.razor │ │ ├── BlogCard.razor │ │ ├── CategoryFilter.razor │ │ ├── ScrollToTop.razor.cs │ │ └── Button.razor.cs │ ├── Routes.razor │ ├── Sections │ │ ├── SimpleBlogHeader.razor │ │ ├── HeroSection.razor.cs │ │ ├── CtaSection.razor │ │ ├── HeroSection.razor │ │ ├── ProcessStepsSection.razor │ │ ├── FaqSection.razor │ │ ├── BlogHero.razor │ │ ├── ArticleContent.razor │ │ ├── TrustedBySection.razor │ │ ├── ContactSection.razor │ │ ├── IntegrationsSection.razor │ │ ├── ArticleHero.razor │ │ ├── FooterSection.razor │ │ ├── FeaturesSection.razor │ │ ├── ArticleSidebar.razor │ │ ├── BlogSection.razor │ │ ├── PricingSection.razor │ │ └── TestimonialsSection.razor │ ├── _Imports.razor │ ├── Pages │ │ ├── Home.razor │ │ ├── Home.razor.cs │ │ ├── Blog.razor.cs │ │ ├── Blog.razor │ │ ├── Error.razor │ │ ├── BlogDetail.razor.cs │ │ └── BlogDetail.razor │ └── App.razor │ ├── wwwroot │ ├── favicon.png │ ├── images │ │ ├── phone.png │ │ ├── phone2.png │ │ └── phone_nobg.png │ └── css │ │ └── input.css │ ├── appsettings.Development.json │ ├── appsettings.json │ ├── Models │ ├── BreadcrumbItem.cs │ ├── TableOfContentsItem.cs │ └── BlogPost.cs │ ├── Program.cs │ ├── Properties │ └── launchSettings.json │ ├── Nexus.csproj │ └── Services │ ├── ThemeService.cs │ └── BlogService.cs ├── postcss.config.js ├── .claude └── settings.local.json ├── package.json ├── tailwind.config.js ├── Nexus.sln ├── LICENSE ├── TAILWIND.md ├── README.md └── .gitignore /src/Nexus/Components/Layout/MainLayout.razor.css: -------------------------------------------------------------------------------- 1 | /* Layout is now handled by Tailwind CSS classes */ 2 | -------------------------------------------------------------------------------- /src/Nexus/Components/Layout/NavMenu.razor.css: -------------------------------------------------------------------------------- 1 | /* Navigation is now handled by Tailwind CSS classes */ 2 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } -------------------------------------------------------------------------------- /src/Nexus/wwwroot/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techfirst/BlazorMarket-Nexus/HEAD/src/Nexus/wwwroot/favicon.png -------------------------------------------------------------------------------- /src/Nexus/wwwroot/images/phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techfirst/BlazorMarket-Nexus/HEAD/src/Nexus/wwwroot/images/phone.png -------------------------------------------------------------------------------- /src/Nexus/wwwroot/images/phone2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techfirst/BlazorMarket-Nexus/HEAD/src/Nexus/wwwroot/images/phone2.png -------------------------------------------------------------------------------- /src/Nexus/wwwroot/images/phone_nobg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/techfirst/BlazorMarket-Nexus/HEAD/src/Nexus/wwwroot/images/phone_nobg.png -------------------------------------------------------------------------------- /src/Nexus/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /.claude/settings.local.json: -------------------------------------------------------------------------------- 1 | { 2 | "permissions": { 3 | "allow": [ 4 | "Bash(cp:*)", 5 | "Bash(rm:*)", 6 | "Bash(dotnet build:*)" 7 | ], 8 | "deny": [] 9 | } 10 | } -------------------------------------------------------------------------------- /src/Nexus/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "AllowedHosts": "*" 9 | } 10 | -------------------------------------------------------------------------------- /src/Nexus/Components/Shared/Button.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Components.Web 2 | 3 | -------------------------------------------------------------------------------- /src/Nexus/Models/BreadcrumbItem.cs: -------------------------------------------------------------------------------- 1 | namespace Nexus.Models; 2 | 3 | public class BreadcrumbItem 4 | { 5 | public string Text { get; set; } = string.Empty; 6 | public string Url { get; set; } = string.Empty; 7 | public bool IsActive { get; set; } = false; 8 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Routes.razor: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/Nexus/Models/TableOfContentsItem.cs: -------------------------------------------------------------------------------- 1 | namespace Nexus.Models; 2 | 3 | public class TableOfContentsItem 4 | { 5 | public string Id { get; set; } = string.Empty; 6 | public string Title { get; set; } = string.Empty; 7 | public int Level { get; set; } = 2; // H2, H3, etc. 8 | public List Children { get; set; } = new(); 9 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Sections/SimpleBlogHeader.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Our News

4 |

5 | Stories, updates, and inspirations to you. 6 |

7 |
8 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Sections/HeroSection.razor.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components; 2 | 3 | namespace Nexus.Components.Sections; 4 | 5 | public partial class HeroSection : ComponentBase 6 | { 7 | private async Task HandleGetStartedClick() 8 | { 9 | await Task.CompletedTask; 10 | // Add navigation or action logic here 11 | } 12 | 13 | private async Task HandleWatchDemoClick() 14 | { 15 | await Task.CompletedTask; 16 | // Add demo logic here 17 | } 18 | } -------------------------------------------------------------------------------- /src/Nexus/Components/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using System.Net.Http.Json 3 | @using Microsoft.AspNetCore.Components.Forms 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @using Microsoft.AspNetCore.Components.Web 6 | @using static Microsoft.AspNetCore.Components.Web.RenderMode 7 | @using Microsoft.AspNetCore.Components.Web.Virtualization 8 | @using Microsoft.JSInterop 9 | @using Nexus 10 | @using Nexus.Components 11 | @using Nexus.Components.Shared 12 | @using Nexus.Components.Sections 13 | @using Nexus.Models 14 | @using Nexus.Services 15 | -------------------------------------------------------------------------------- /src/Nexus/Components/Pages/Home.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | @using Nexus.Components.Sections 3 | 4 | Nexus - Grow Smarter, Build with Confidence 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
-------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nexus-blazor", 3 | "version": "1.0.0", 4 | "description": "Tailwind CSS build for Nexus Blazor application", 5 | "scripts": { 6 | "build-css": "tailwindcss -i ./src/Nexus/wwwroot/css/input.css -o ./src/Nexus/wwwroot/css/app.css --minify", 7 | "watch-css": "tailwindcss -i ./src/Nexus/wwwroot/css/input.css -o ./src/Nexus/wwwroot/css/app.css --watch", 8 | "dev": "npm run watch-css" 9 | }, 10 | "devDependencies": { 11 | "autoprefixer": "^10.4.20", 12 | "postcss": "^8.4.49", 13 | "tailwindcss": "^3.4.17" 14 | }, 15 | "private": true 16 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Shared/ScrollToTop.razor: -------------------------------------------------------------------------------- 1 | @rendermode InteractiveServer 2 | 3 | @* Scroll to Top Widget *@ 4 |
5 | 15 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Pages/Home.razor.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components; 2 | using Microsoft.JSInterop; 3 | 4 | namespace Nexus.Components.Pages; 5 | 6 | public partial class Home : ComponentBase 7 | { 8 | [Inject] private IJSRuntime JSRuntime { get; set; } = null!; 9 | 10 | protected override async Task OnAfterRenderAsync(bool firstRender) 11 | { 12 | // JavaScript handles hash navigation automatically 13 | await base.OnAfterRenderAsync(firstRender); 14 | } 15 | 16 | private async Task HandleGetStartedClick() 17 | { 18 | // TODO: Add navigation logic or show signup modal 19 | // For now, we could scroll to a signup section or navigate to a signup page 20 | await Task.CompletedTask; 21 | } 22 | 23 | private async Task HandleWatchDemoClick() 24 | { 25 | // TODO: Add demo modal or video player logic 26 | await Task.CompletedTask; 27 | } 28 | } -------------------------------------------------------------------------------- /src/Nexus/Program.cs: -------------------------------------------------------------------------------- 1 | using Nexus.Components; 2 | using Nexus.Services; 3 | 4 | var builder = WebApplication.CreateBuilder(args); 5 | 6 | // Add services to the container. 7 | builder.Services.AddRazorComponents() 8 | .AddInteractiveServerComponents(); 9 | 10 | // Register application services 11 | builder.Services.AddScoped(); 12 | builder.Services.AddScoped(); 13 | 14 | var app = builder.Build(); 15 | 16 | // Configure the HTTP request pipeline. 17 | if (!app.Environment.IsDevelopment()) 18 | { 19 | app.UseExceptionHandler("/Error", createScopeForErrors: true); 20 | // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 21 | app.UseHsts(); 22 | } 23 | 24 | app.UseHttpsRedirection(); 25 | 26 | app.UseStaticFiles(); 27 | app.UseAntiforgery(); 28 | 29 | app.MapRazorComponents() 30 | .AddInteractiveServerRenderMode(); 31 | 32 | app.Run(); 33 | -------------------------------------------------------------------------------- /src/Nexus/Components/Shared/ScrollToTop.razor.js: -------------------------------------------------------------------------------- 1 | let scrollToTopComponent = null; 2 | let scrollListener = null; 3 | 4 | export function initialize(dotnetHelper) { 5 | scrollToTopComponent = dotnetHelper; 6 | 7 | // Add scroll listener to track scroll position 8 | scrollListener = function() { 9 | const scrollTop = window.pageYOffset || document.documentElement.scrollTop; 10 | const shouldShow = scrollTop > 300; // Show after scrolling 300px 11 | 12 | if (scrollToTopComponent) { 13 | scrollToTopComponent.invokeMethodAsync('UpdateVisibility', shouldShow); 14 | } 15 | }; 16 | 17 | window.addEventListener('scroll', scrollListener, { passive: true }); 18 | 19 | // Initial check 20 | scrollListener(); 21 | } 22 | 23 | export function dispose() { 24 | if (scrollListener) { 25 | window.removeEventListener('scroll', scrollListener); 26 | scrollListener = null; 27 | } 28 | scrollToTopComponent = null; 29 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Sections/CtaSection.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Ready to Get Started?

4 |

5 | Join thousands of businesses already using Nexus to grow smarter and build with confidence. 6 |

7 | 8 |
9 | 12 | 15 |
16 |
17 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Pages/Blog.razor.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components; 2 | using Nexus.Models; 3 | using Nexus.Services; 4 | 5 | namespace Nexus.Components.Pages; 6 | 7 | public partial class Blog : ComponentBase, IDisposable 8 | { 9 | [Inject] private BlogService BlogService { get; set; } = null!; 10 | [Inject] private ThemeService ThemeService { get; set; } = null!; 11 | 12 | private List _allPosts = new(); 13 | private bool _isLoading = true; 14 | 15 | protected override async Task OnInitializedAsync() 16 | { 17 | await ThemeService.ReapplyThemeAsync(); 18 | await LoadData(); 19 | } 20 | 21 | private async Task LoadData() 22 | { 23 | _isLoading = true; 24 | 25 | try 26 | { 27 | _allPosts = await BlogService.GetAllPostsAsync(); 28 | } 29 | finally 30 | { 31 | _isLoading = false; 32 | } 33 | } 34 | 35 | public void Dispose() 36 | { 37 | // Cleanup if needed 38 | } 39 | } -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | darkMode: 'class', 4 | content: [ 5 | './src/Nexus/**/*.{razor,html,cshtml}', 6 | './src/Nexus/Components/**/*.{razor,html,cshtml}', 7 | './src/Nexus/wwwroot/index.html', 8 | './src/Nexus/wwwroot/**/*.js' 9 | ], 10 | theme: { 11 | extend: { 12 | colors: { 13 | 'nexus-blue': 'var(--nexus-blue)', 14 | 'nexus-blue-dark': 'var(--nexus-blue-dark)', 15 | 'nexus-blue-light': 'var(--nexus-blue-light)', 16 | 'nexus-gray': 'var(--bg-secondary)', 17 | 'nexus-dark': 'var(--text-primary)', 18 | 'nexus-light-gray': 'var(--bg-tertiary)', 19 | }, 20 | fontFamily: { 21 | 'sans': ['Inter', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'system-ui', 'sans-serif'], 22 | }, 23 | fontWeight: { 24 | 'light': '300', 25 | 'normal': '400', 26 | 'medium': '500', 27 | 'semibold': '600', 28 | 'bold': '700', 29 | } 30 | } 31 | }, 32 | plugins: [] 33 | } -------------------------------------------------------------------------------- /Nexus.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.14.36401.2 d17.14 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nexus", "src\Nexus\Nexus.csproj", "{C33D0032-E50D-4486-878B-9273DC1E026D}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {C33D0032-E50D-4486-878B-9273DC1E026D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {C33D0032-E50D-4486-878B-9273DC1E026D}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {C33D0032-E50D-4486-878B-9273DC1E026D}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {C33D0032-E50D-4486-878B-9273DC1E026D}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {546F06B5-37D0-4875-9DBA-F86B5E6560EF} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /src/Nexus/Components/Pages/Blog.razor: -------------------------------------------------------------------------------- 1 | @page "/blog" 2 | @using Nexus.Components.Sections 3 | @using Nexus.Models 4 | @using Nexus.Services 5 | 6 | Our News - Nexus Blog 7 | 8 |
9 | 10 | 11 |
12 |
13 | 14 | @if (_isLoading) 15 | { 16 |
17 |
18 |

Loading articles...

19 |
20 | } 21 | else 22 | { 23 | 24 |
25 | @foreach (var post in _allPosts) 26 | { 27 | 28 | } 29 |
30 | } 31 |
32 |
33 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Shared/Breadcrumb.razor: -------------------------------------------------------------------------------- 1 | @using Nexus.Models 2 | 3 | 26 | 27 | @code { 28 | [Parameter] public List Items { get; set; } = new(); 29 | } -------------------------------------------------------------------------------- /src/Nexus/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/launchsettings.json", 3 | "iisSettings": { 4 | "windowsAuthentication": false, 5 | "anonymousAuthentication": true, 6 | "iisExpress": { 7 | "applicationUrl": "http://localhost:46196", 8 | "sslPort": 44315 9 | } 10 | }, 11 | "profiles": { 12 | "http": { 13 | "commandName": "Project", 14 | "dotnetRunMessages": true, 15 | "launchBrowser": true, 16 | "applicationUrl": "http://localhost:5001", 17 | "environmentVariables": { 18 | "ASPNETCORE_ENVIRONMENT": "Development" 19 | } 20 | }, 21 | "https": { 22 | "commandName": "Project", 23 | "dotnetRunMessages": true, 24 | "launchBrowser": true, 25 | "applicationUrl": "https://localhost:7048;http://localhost:5001", 26 | "environmentVariables": { 27 | "ASPNETCORE_ENVIRONMENT": "Development" 28 | } 29 | }, 30 | "IIS Express": { 31 | "commandName": "IISExpress", 32 | "launchBrowser": true, 33 | "environmentVariables": { 34 | "ASPNETCORE_ENVIRONMENT": "Development" 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/Nexus/Models/BlogPost.cs: -------------------------------------------------------------------------------- 1 | namespace Nexus.Models; 2 | 3 | public class BlogPost 4 | { 5 | public int Id { get; set; } 6 | public string Title { get; set; } = string.Empty; 7 | public string Slug { get; set; } = string.Empty; 8 | public string Excerpt { get; set; } = string.Empty; 9 | public string Content { get; set; } = string.Empty; 10 | public string FullContent { get; set; } = string.Empty; 11 | public string Category { get; set; } = string.Empty; 12 | public string Author { get; set; } = string.Empty; 13 | public string AuthorInitials { get; set; } = string.Empty; 14 | public string AuthorJobTitle { get; set; } = string.Empty; 15 | public DateTime PublishedDate { get; set; } 16 | public int ReadTimeMinutes { get; set; } 17 | public string FeaturedImageGradient { get; set; } = "from-nexus-blue to-nexus-blue-dark"; 18 | public bool IsFeatured { get; set; } 19 | public List Tags { get; set; } = new(); 20 | } 21 | 22 | public static class BlogCategories 23 | { 24 | public const string All = "All"; 25 | public const string BusinessGrowth = "Business Growth"; 26 | public const string Technology = "Technology"; 27 | public const string Analytics = "Analytics"; 28 | public const string Strategy = "Strategy"; 29 | public const string Insights = "Industry Insights"; 30 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Pages/Error.razor: -------------------------------------------------------------------------------- 1 | @page "/Error" 2 | @using System.Diagnostics 3 | 4 | Error 5 | 6 |

Error.

7 |

An error occurred while processing your request.

8 | 9 | @if (ShowRequestId) 10 | { 11 |

12 | Request ID: @RequestId 13 |

14 | } 15 | 16 |

Development Mode

17 |

18 | Swapping to Development environment will display more detailed information about the error that occurred. 19 |

20 |

21 | The Development environment shouldn't be enabled for deployed applications. 22 | It can result in displaying sensitive information from exceptions to end users. 23 | For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development 24 | and restarting the app. 25 |

26 | 27 | @code{ 28 | [CascadingParameter] 29 | private HttpContext? HttpContext { get; set; } 30 | 31 | private string? RequestId { get; set; } 32 | private bool ShowRequestId => !string.IsNullOrEmpty(RequestId); 33 | 34 | protected override void OnInitialized() => 35 | RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier; 36 | } 37 | -------------------------------------------------------------------------------- /src/Nexus/Components/Shared/BlogCard.razor: -------------------------------------------------------------------------------- 1 | @using Nexus.Models 2 | 3 | 4 |
5 | 6 |
7 | @Post.Title 11 |
12 |
13 | 14 | 15 |
16 | 17 |

18 | @Post.Title 19 |

20 | 21 | 22 |

23 | @Post.Excerpt 24 |

25 |
26 |
27 |
28 | 29 | @code { 30 | [Parameter, EditorRequired] public BlogPost Post { get; set; } = null!; 31 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Shared/CategoryFilter.razor: -------------------------------------------------------------------------------- 1 |
2 | @foreach (var category in Categories) 3 | { 4 | 9 | } 10 |
11 | 12 | @code { 13 | [Parameter] public List Categories { get; set; } = new(); 14 | [Parameter] public string SelectedCategory { get; set; } = "All"; 15 | [Parameter] public EventCallback OnCategoryChanged { get; set; } 16 | 17 | private string GetCategoryButtonClasses(string category) 18 | { 19 | var baseClasses = "px-6 py-3 rounded-full font-medium transition-all duration-200 border"; 20 | 21 | if (category == SelectedCategory) 22 | { 23 | return $"{baseClasses} bg-nexus-blue text-white border-nexus-blue hover:bg-nexus-blue-dark hover:shadow-md"; 24 | } 25 | 26 | return $"{baseClasses} bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-300 border-gray-200 dark:border-gray-700 hover:border-nexus-blue hover:text-nexus-blue hover:shadow-sm"; 27 | } 28 | 29 | private async Task HandleCategoryClick(string category) 30 | { 31 | SelectedCategory = category; 32 | 33 | if (OnCategoryChanged.HasDelegate) 34 | { 35 | await OnCategoryChanged.InvokeAsync(category); 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Layout/NavMenu.razor.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components; 2 | using Microsoft.AspNetCore.Components.Routing; 3 | using Nexus.Services; 4 | 5 | namespace Nexus.Components.Layout; 6 | 7 | public partial class NavMenu : ComponentBase, IDisposable 8 | { 9 | [Inject] private NavigationManager Navigation { get; set; } = null!; 10 | [Inject] private ThemeService ThemeService { get; set; } = null!; 11 | 12 | private bool _mobileMenuOpen = false; 13 | 14 | protected override async Task OnInitializedAsync() 15 | { 16 | await ThemeService.InitializeAsync(); 17 | ThemeService.OnThemeChanged += StateHasChanged; 18 | } 19 | 20 | private async Task ToggleTheme() 21 | { 22 | await ThemeService.ToggleThemeAsync(); 23 | } 24 | 25 | private void ToggleMobileMenu() 26 | { 27 | _mobileMenuOpen = !_mobileMenuOpen; 28 | } 29 | 30 | private string GetMobileMenuClass() 31 | { 32 | return _mobileMenuOpen ? "" : "hidden"; 33 | } 34 | 35 | private string GetBlogLinkClass() 36 | { 37 | var uri = new Uri(Navigation.Uri); 38 | var isActive = uri.AbsolutePath.StartsWith("/blog", StringComparison.OrdinalIgnoreCase); 39 | 40 | if (isActive) 41 | { 42 | return "text-nexus-blue hover:text-nexus-blue-dark dark:text-nexus-blue dark:hover:text-nexus-blue-dark"; 43 | } 44 | else 45 | { 46 | return "text-gray-600 dark:text-gray-300 hover:text-nexus-dark dark:hover:text-white"; 47 | } 48 | } 49 | 50 | public void Dispose() 51 | { 52 | ThemeService.OnThemeChanged -= StateHasChanged; 53 | } 54 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Nexus Template License 2 | 3 | Copyright (c) 2025 Nexus Template. All rights reserved. 4 | 5 | COMMERCIAL USE LICENSE 6 | 7 | Permission is hereby granted to any person who have this template 8 | ("Licensee") to use, modify, and deploy this software and associated 9 | documentation files (the "Template") for commercial and personal projects, 10 | subject to the following conditions: 11 | 12 | PERMITTED USES: 13 | - Use the Template to create unlimited websites and applications 14 | - Modify, customize, and adapt the Template for your projects 15 | - Deploy the Template on client projects and commercial applications 16 | - Remove or modify branding and attribution 17 | 18 | PROHIBITED USES: 19 | - Redistribute, resell, sublicense, or share the original Template 20 | - Create derivative templates for sale or distribution 21 | - Share access to the Template with unlicensed users 22 | - Use the Template to create competing template products 23 | 24 | ATTRIBUTION: 25 | No attribution is required in your final projects. 26 | 27 | WARRANTY DISCLAIMER: 28 | THE TEMPLATE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 29 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 30 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 31 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 32 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 33 | OUT OF OR IN CONNECTION WITH THE TEMPLATE OR THE USE OR OTHER DEALINGS IN THE 34 | TEMPLATE. 35 | 36 | This license is effective until terminated. Your rights under this license 37 | will terminate automatically without notice if you fail to comply with any 38 | of its terms. 39 | -------------------------------------------------------------------------------- /src/Nexus/Components/Layout/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | @using Nexus.Components.Shared 3 | @using Nexus.Services 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @inject ThemeService ThemeService 6 | @inject NavigationManager NavigationManager 7 | @implements IDisposable 8 | 9 |
10 | 11 | 12 |
13 | @Body 14 |
15 | 16 | 17 | 18 | 19 |
20 | 21 | @code { 22 | protected override async Task OnAfterRenderAsync(bool firstRender) 23 | { 24 | if (firstRender) 25 | { 26 | await ThemeService.InitializeAsync(); 27 | NavigationManager.LocationChanged += OnLocationChanged; 28 | } 29 | } 30 | 31 | private async void OnLocationChanged(object? sender, LocationChangedEventArgs e) 32 | { 33 | // Reapply theme on every navigation to ensure consistency 34 | try 35 | { 36 | await InvokeAsync(async () => 37 | { 38 | await ThemeService.ReapplyThemeAsync(); 39 | }); 40 | } 41 | catch (InvalidOperationException) 42 | { 43 | // Component may be disposing - ignore 44 | } 45 | catch (Exception ex) 46 | { 47 | // Navigation error during theme reapplication 48 | } 49 | } 50 | 51 | public void Dispose() 52 | { 53 | NavigationManager.LocationChanged -= OnLocationChanged; 54 | } 55 | } 56 | 57 |
58 | An unhandled error has occurred. 59 | Reload 60 | 🗙 61 |
62 | -------------------------------------------------------------------------------- /src/Nexus/Components/Sections/HeroSection.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |

6 | Grow Smarter,
7 | Build with Confidence 8 |

9 | 10 |

11 | Smarter tools designed to help you grow your business effortlessly and 12 | take control of your digital future. 13 |

14 | 15 |
16 | 19 | 22 |
23 |
24 | 25 | 26 |
27 |
28 | 29 |
30 | Nexus mobile app interface 34 |
35 |
36 |
37 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Sections/ProcessStepsSection.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

How easy it is to begin

5 |

Get started in minutes with our simple onboarding process

6 |
7 | 8 |
9 |
10 |
11 | 1 12 |
13 |

Create Account

14 |

Sign up in seconds with just your email address and basic information.

15 |
16 | 17 |
18 |
19 | 2 20 |
21 |

Connect Data

22 |

Safely link your accounts and import your existing data with one click.

23 |
24 | 25 |
26 |
27 | 3 28 |
29 |

Start Growing

30 |

Begin managing and optimizing your business with powerful insights.

31 |
32 |
33 |
34 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Sections/FaqSection.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Frequently Asked Questions

5 |

Everything you need to know about our platform

6 |
7 | 8 |
9 |
10 |

How secure is my data?

11 |

Your data is protected with bank-grade encryption and we never store sensitive information. All connections are secured with industry-standard protocols.

12 |
13 | 14 |
15 |

Can I cancel anytime?

16 |

Yes, you can cancel your subscription at any time. There are no long-term contracts or hidden fees.

17 |
18 | 19 |
20 |

Do you offer customer support?

21 |

We offer 24/7 support for all paid plans. Free users get email support with responses within 24 hours.

22 |
23 | 24 |
25 |

Is there a free trial?

26 |

Yes, we offer a 14-day free trial for all new users. No credit card required to get started.

27 |
28 |
29 |
30 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Pages/BlogDetail.razor.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components; 2 | using Microsoft.JSInterop; 3 | using Nexus.Models; 4 | using Nexus.Services; 5 | 6 | namespace Nexus.Components.Pages; 7 | 8 | public partial class BlogDetail : ComponentBase, IDisposable 9 | { 10 | [Parameter] public string Slug { get; set; } = string.Empty; 11 | [Inject] private BlogService BlogService { get; set; } = null!; 12 | [Inject] private NavigationManager Navigation { get; set; } = null!; 13 | [Inject] private IJSRuntime JSRuntime { get; set; } = null!; 14 | [Inject] private ThemeService ThemeService { get; set; } = null!; 15 | 16 | private BlogPost? Post { get; set; } 17 | private List _tableOfContents = new(); 18 | private List _relatedPosts = new(); 19 | private bool IsLoading { get; set; } = true; 20 | 21 | protected override async Task OnParametersSetAsync() 22 | { 23 | await ThemeService.ReapplyThemeAsync(); 24 | await LoadPost(); 25 | } 26 | 27 | protected override async Task OnAfterRenderAsync(bool firstRender) 28 | { 29 | if (firstRender) 30 | { 31 | // Force scroll to top as a backup if FocusOnNavigate doesn't work 32 | await JSRuntime.InvokeVoidAsync("window.scrollTo", 0, 0); 33 | } 34 | 35 | await base.OnAfterRenderAsync(firstRender); 36 | } 37 | 38 | private async Task LoadPost() 39 | { 40 | IsLoading = true; 41 | 42 | try 43 | { 44 | Post = await BlogService.GetPostBySlugAsync(Slug); 45 | 46 | if (Post != null) 47 | { 48 | // Generate table of contents 49 | _tableOfContents = BlogService.GenerateTableOfContents(Post.FullContent); 50 | 51 | // Load related posts 52 | _relatedPosts = await BlogService.GetRelatedPostsAsync(Post.Slug, Post.Category, 3); 53 | } 54 | } 55 | catch (Exception) 56 | { 57 | Post = null; 58 | } 59 | finally 60 | { 61 | IsLoading = false; 62 | } 63 | } 64 | 65 | private void NavigateToBlob() 66 | { 67 | Navigation.NavigateTo("/blog"); 68 | } 69 | 70 | public void Dispose() 71 | { 72 | // Cleanup if needed 73 | } 74 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Sections/BlogHero.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

5 | Latest Insights 6 |

7 |

8 | Stay updated with industry trends, best practices, and actionable insights to grow your business. 9 |

10 |
11 | 12 | 13 |
14 |
15 | 21 | 28 |
29 |
30 |
31 |
32 | 33 | @code { 34 | [Parameter] public EventCallback OnSearch { get; set; } 35 | 36 | private string SearchTerm { get; set; } = string.Empty; 37 | 38 | private async Task HandleSearch() 39 | { 40 | if (OnSearch.HasDelegate) 41 | { 42 | await OnSearch.InvokeAsync(SearchTerm); 43 | } 44 | } 45 | 46 | private async Task HandleSearchKeyPress(KeyboardEventArgs e) 47 | { 48 | if (e.Key == "Enter") 49 | { 50 | await HandleSearch(); 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Shared/ScrollToTop.razor.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components; 2 | using Microsoft.JSInterop; 3 | 4 | namespace Nexus.Components.Shared; 5 | 6 | public partial class ScrollToTop : ComponentBase, IAsyncDisposable 7 | { 8 | [Inject] private IJSRuntime JSRuntime { get; set; } = null!; 9 | 10 | private bool _isVisible = false; 11 | private DotNetObjectReference? _dotNetRef; 12 | 13 | protected override async Task OnAfterRenderAsync(bool firstRender) 14 | { 15 | if (firstRender) 16 | { 17 | _dotNetRef = DotNetObjectReference.Create(this); 18 | await JSRuntime.InvokeVoidAsync("initializeScrollToTop", _dotNetRef); 19 | } 20 | } 21 | 22 | [JSInvokable] 23 | public async Task UpdateVisibility(bool isVisible) 24 | { 25 | if (_isVisible != isVisible) 26 | { 27 | _isVisible = isVisible; 28 | await InvokeAsync(StateHasChanged); 29 | } 30 | } 31 | 32 | private async Task ScrollToTopAsync() 33 | { 34 | try 35 | { 36 | await JSRuntime.InvokeVoidAsync("eval", "window.scrollTo({ top: 0, behavior: 'smooth' })"); 37 | } 38 | catch (JSDisconnectedException) 39 | { 40 | // Ignore - the circuit has disconnected 41 | } 42 | catch (Exception ex) 43 | { 44 | // ScrollToTop scroll error 45 | } 46 | } 47 | 48 | private string GetScrollToTopClass() 49 | { 50 | return _isVisible 51 | ? "fixed bottom-6 right-6 z-50 opacity-100 translate-y-0 transition-all duration-300 ease-out" 52 | : "fixed bottom-6 right-6 z-50 opacity-0 translate-y-4 pointer-events-none transition-all duration-300 ease-out"; 53 | } 54 | 55 | public async ValueTask DisposeAsync() 56 | { 57 | if (_dotNetRef != null) 58 | { 59 | try 60 | { 61 | await JSRuntime.InvokeVoidAsync("disposeScrollToTop"); 62 | } 63 | catch (JSDisconnectedException) 64 | { 65 | // Ignore - the circuit has disconnected, which is expected during navigation 66 | } 67 | catch (Exception ex) 68 | { 69 | // ScrollToTop dispose error 70 | } 71 | finally 72 | { 73 | _dotNetRef.Dispose(); 74 | } 75 | } 76 | } 77 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Shared/Button.razor.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components; 2 | using Microsoft.AspNetCore.Components.Web; 3 | 4 | namespace Nexus.Components.Shared; 5 | 6 | public partial class Button : ComponentBase 7 | { 8 | [Parameter] public RenderFragment? ChildContent { get; set; } 9 | [Parameter] public EventCallback OnClick { get; set; } 10 | [Parameter] public ButtonVariant Variant { get; set; } = ButtonVariant.Primary; 11 | [Parameter] public ButtonSize Size { get; set; } = ButtonSize.Medium; 12 | [Parameter] public bool Disabled { get; set; } = false; 13 | [Parameter] public string Type { get; set; } = "button"; 14 | [Parameter] public string AdditionalClasses { get; set; } = ""; 15 | 16 | private async Task HandleClick(MouseEventArgs args) 17 | { 18 | if (!Disabled && OnClick.HasDelegate) 19 | { 20 | await OnClick.InvokeAsync(args); 21 | } 22 | } 23 | 24 | private string GetButtonClasses() 25 | { 26 | var baseClasses = "inline-flex items-center justify-center font-semibold transition-all duration-300 focus:outline-none focus:ring-2 focus:ring-offset-2"; 27 | 28 | var variantClasses = Variant switch 29 | { 30 | ButtonVariant.Primary => "bg-nexus-blue text-white hover:bg-nexus-blue-dark focus:ring-nexus-blue hover:shadow-lg hover:-translate-y-1", 31 | ButtonVariant.Secondary => "bg-transparent text-nexus-blue border-2 border-nexus-blue hover:bg-nexus-blue hover:text-white dark:hover:text-white focus:ring-nexus-blue", 32 | ButtonVariant.White => "bg-white dark:bg-gray-800 text-nexus-blue dark:text-white hover:bg-gray-50 dark:hover:bg-gray-700 focus:ring-nexus-blue shadow-md", 33 | _ => "bg-nexus-blue text-white hover:bg-nexus-blue-dark focus:ring-nexus-blue" 34 | }; 35 | 36 | var sizeClasses = Size switch 37 | { 38 | ButtonSize.Small => "px-4 py-2 text-sm rounded-lg", 39 | ButtonSize.Medium => "px-6 py-3 text-base rounded-lg", 40 | ButtonSize.Large => "px-8 py-4 text-lg rounded-full", 41 | _ => "px-6 py-3 text-base rounded-lg" 42 | }; 43 | 44 | var disabledClasses = Disabled ? "opacity-50 cursor-not-allowed" : ""; 45 | 46 | return $"{baseClasses} {variantClasses} {sizeClasses} {disabledClasses} {AdditionalClasses}".Trim(); 47 | } 48 | } 49 | 50 | public enum ButtonVariant 51 | { 52 | Primary, 53 | Secondary, 54 | White 55 | } 56 | 57 | public enum ButtonSize 58 | { 59 | Small, 60 | Medium, 61 | Large 62 | } -------------------------------------------------------------------------------- /TAILWIND.md: -------------------------------------------------------------------------------- 1 | # Tailwind CSS Setup Guide 2 | 3 | This project uses Tailwind CSS with a proper build process instead of the CDN for better performance and optimization. 4 | 5 | ## Prerequisites 6 | 7 | - Node.js (version 16 or higher) 8 | - npm (comes with Node.js) 9 | 10 | ## Quick Start 11 | 12 | 1. **Install dependencies** (if not already done): 13 | ```bash 14 | npm install 15 | ``` 16 | 17 | 2. **Build CSS for production**: 18 | ```bash 19 | npm run build-css 20 | ``` 21 | 22 | 3. **Development with live CSS updates**: 23 | ```bash 24 | npm run watch-css 25 | ``` 26 | 27 | ## How It Works 28 | 29 | - **Input file**: `src/Nexus/wwwroot/css/input.css` contains Tailwind directives and custom CSS 30 | - **Output file**: `src/Nexus/wwwroot/css/app.css` (generated, don't edit directly) 31 | - **Configuration**: `tailwind.config.js` defines content paths and custom theme 32 | - **Build integration**: MSBuild automatically runs CSS build before .NET build/publish 33 | 34 | ## Troubleshooting 35 | 36 | ### Build Error: "npm run build-css exited with code 1" 37 | 38 | **Cause**: Node.js/npm not available in build environment 39 | 40 | **Solutions**: 41 | 1. **Install Node.js**: Download from https://nodejs.org/ 42 | 2. **Manual build**: Run `npm run build-css` manually before building the project 43 | 3. **Check PATH**: Ensure Node.js is in your system PATH 44 | 45 | ### Missing Styles 46 | 47 | **Cause**: CSS not built or output file not found 48 | 49 | **Solutions**: 50 | 1. Run `npm run build-css` 51 | 2. Check that `src/Nexus/wwwroot/css/app.css` exists 52 | 3. Verify `input.css` contains your styles 53 | 54 | ### Development Workflow 55 | 56 | For active development: 57 | 1. Run `npm run watch-css` in a terminal 58 | 2. Start your Blazor application in another terminal 59 | 3. Tailwind will automatically rebuild CSS when you modify classes 60 | 61 | ### Manual Build Process 62 | 63 | If automatic building isn't working: 64 | 1. `npm install` (ensure dependencies are installed) 65 | 2. `npm run build-css` (build CSS) 66 | 3. Build/run your Blazor project normally 67 | 68 | ## File Structure 69 | 70 | ``` 71 | nexus/ 72 | ├── package.json # npm configuration and scripts 73 | ├── tailwind.config.js # Tailwind configuration 74 | ├── postcss.config.js # PostCSS configuration 75 | └── src/Nexus/wwwroot/css/ 76 | ├── input.css # Source CSS with Tailwind directives 77 | └── app.css # Generated CSS (don't edit) 78 | ``` 79 | 80 | ## Customization 81 | 82 | - **Colors/Fonts**: Edit `tailwind.config.js` 83 | - **Custom CSS**: Add to `src/Nexus/wwwroot/css/input.css` 84 | - **Build process**: Modify scripts in `package.json` -------------------------------------------------------------------------------- /src/Nexus/Components/Sections/ArticleContent.razor: -------------------------------------------------------------------------------- 1 | @using Nexus.Models 2 | 3 |
4 |
5 | 6 |
7 |
8 | @((MarkupString)Post.FullContent) 9 |
10 | 11 | 12 |
13 |
14 |
15 | @Post.AuthorInitials 16 |
17 |
18 |

@Post.Author

19 |

20 | @GetAuthorBio(Post.Author) 21 |

22 |
23 | Follow on Twitter 24 | LinkedIn 25 |
26 |
27 |
28 |
29 |
30 | 31 | 32 | 33 |
34 |
35 | 36 | @code { 37 | [Parameter, EditorRequired] public BlogPost Post { get; set; } = null!; 38 | [Parameter] public List TableOfContents { get; set; } = new(); 39 | [Parameter] public List RelatedPosts { get; set; } = new(); 40 | 41 | private string GetAuthorBio(string authorName) 42 | { 43 | return authorName switch 44 | { 45 | "Sarah Chen" => "Senior Business Strategist with over 10 years of experience helping companies scale and optimize their operations for sustainable growth.", 46 | "Michael Rodriguez" => "Technology consultant and digital transformation expert who has led successful implementations across Fortune 500 companies.", 47 | "Jennifer Park" => "Data scientist and analytics expert specializing in helping businesses leverage data for strategic decision-making.", 48 | _ => "Experienced professional passionate about sharing insights and best practices to help businesses succeed in today's competitive landscape." 49 | }; 50 | } 51 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Sections/TrustedBySection.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Trusted by industry leaders

5 |
6 | 7 |
8 | 9 |
10 |
11 | TC 12 |
13 | TechCorp 14 |
15 | 16 |
17 |
18 | SX 19 |
20 | StartupXYZ 21 |
22 | 23 |
24 |
25 | GI 26 |
27 | GlobalInc 28 |
29 | 30 |
31 |
32 | IH 33 |
34 | InnovateHub 35 |
36 | 37 |
38 |
39 | BP 40 |
41 | BusinessPro 42 |
43 | 44 |
45 |
46 | SC 47 |
48 | ScaleCo 49 |
50 |
51 |
52 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Sections/ContactSection.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Get in Touch

5 |

Have questions? We'd love to hear from you.

6 |
7 | 8 |
9 |
10 |
11 | 12 | 15 |
16 |
17 | 18 | 21 |
22 |
23 | 24 |
25 | 26 | 29 |
30 | 31 |
32 | 33 | 36 |
37 | 38 |
39 | 40 | 43 |
44 | 45 | 48 |
49 |
50 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Sections/IntegrationsSection.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Powerful Integrations

5 |

Connect with all your favorite tools and services

6 |
7 | 8 |
9 |
10 |
11 |
12 | 💼 13 |
14 | Stripe 15 |
16 |
17 | 18 |
19 |
20 |
21 | 📊 22 |
23 | Analytics 24 |
25 |
26 | 27 |
28 |
29 |
30 | 🚀 31 |
32 | Slack 33 |
34 |
35 | 36 |
37 |
38 |
39 | 📧 40 |
41 | Mailchimp 42 |
43 |
44 | 45 |
46 |
47 |
48 | ☁️ 49 |
50 | AWS 51 |
52 |
53 | 54 |
55 |
56 |
57 | 📱 58 |
59 | API 60 |
61 |
62 |
63 |
64 |
-------------------------------------------------------------------------------- /src/Nexus/Nexus.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net8.0 5 | enable 6 | enable 7 | 8 | 9 | 10 | 11 | 12 | node 13 | node.exe 14 | npm 15 | npm.cmd 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | true 24 | false 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | $(MSBuildProjectDirectory)/../../ 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | true 44 | true 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | $(MSBuildProjectDirectory)/../../ 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | $(MSBuildProjectDirectory)/../../ 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/Nexus/Services/ThemeService.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.JSInterop; 2 | 3 | namespace Nexus.Services; 4 | 5 | public class ThemeService 6 | { 7 | private readonly IJSRuntime _jsRuntime; 8 | private static bool _isDarkMode = false; 9 | private static bool _isInitialized = false; 10 | 11 | public ThemeService(IJSRuntime jsRuntime) 12 | { 13 | _jsRuntime = jsRuntime; 14 | 15 | // If we have static state, immediately apply it to this instance 16 | // This ensures new service instances inherit the persisted theme 17 | } 18 | 19 | public bool IsDarkMode => _isDarkMode; 20 | 21 | public event Action? OnThemeChanged; 22 | 23 | public async Task InitializeAsync() 24 | { 25 | if (_isInitialized) return; 26 | 27 | try 28 | { 29 | var savedTheme = await _jsRuntime.InvokeAsync("localStorage.getItem", "theme"); 30 | _isDarkMode = savedTheme == "dark"; 31 | await ApplyThemeAsync(); 32 | _isInitialized = true; 33 | } 34 | catch (Exception ex) 35 | { 36 | _isDarkMode = false; 37 | _isInitialized = true; 38 | } 39 | } 40 | 41 | public async Task ReapplyThemeAsync() 42 | { 43 | if (_isInitialized) 44 | { 45 | // Add a small delay to ensure DOM is ready 46 | await Task.Delay(50); 47 | 48 | // We have static state, just apply it 49 | await ApplyThemeAsync(); 50 | } 51 | else 52 | { 53 | // First time initialization 54 | await InitializeAsync(); 55 | } 56 | } 57 | 58 | public async Task ToggleThemeAsync() 59 | { 60 | try 61 | { 62 | _isDarkMode = !_isDarkMode; 63 | 64 | await ApplyThemeAsync(); 65 | await SaveThemePreferenceAsync(); 66 | OnThemeChanged?.Invoke(); 67 | } 68 | catch (Exception ex) 69 | { 70 | // Revert the change if something went wrong 71 | _isDarkMode = !_isDarkMode; 72 | } 73 | } 74 | 75 | private async Task ApplyThemeAsync() 76 | { 77 | try 78 | { 79 | // Try coordinated approach first 80 | await _jsRuntime.InvokeVoidAsync("window.themeHelper.setTheme", _isDarkMode); 81 | } 82 | catch (JSDisconnectedException) 83 | { 84 | // JavaScript disconnected - theme will be applied on next render 85 | } 86 | catch (Exception ex) 87 | { 88 | // Fallback to direct DOM manipulation 89 | try 90 | { 91 | if (_isDarkMode) 92 | { 93 | await _jsRuntime.InvokeVoidAsync("eval", "document.documentElement.classList.add('dark')"); 94 | } 95 | else 96 | { 97 | await _jsRuntime.InvokeVoidAsync("eval", "document.documentElement.classList.remove('dark')"); 98 | } 99 | } 100 | catch (JSDisconnectedException) 101 | { 102 | // JavaScript disconnected during fallback 103 | } 104 | catch (Exception fallbackEx) 105 | { 106 | // Fallback failed 107 | } 108 | } 109 | } 110 | 111 | private async Task SaveThemePreferenceAsync() 112 | { 113 | try 114 | { 115 | var themeValue = _isDarkMode ? "dark" : "light"; 116 | await _jsRuntime.InvokeVoidAsync("localStorage.setItem", "theme", themeValue); 117 | } 118 | catch (Exception ex) 119 | { 120 | // Error saving theme preference 121 | } 122 | } 123 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Sections/ArticleHero.razor: -------------------------------------------------------------------------------- 1 | @using Nexus.Models 2 | 3 |
4 | 5 |
6 | @Post.Title 10 |
11 | 12 | 13 |
14 | 15 | @Post.Category 16 | 17 |
18 |
19 | 20 | 21 |
22 |
23 | 24 | 25 | 26 | 27 |

28 | @Post.Title 29 |

30 | 31 | 32 |
33 | 34 |
35 |
36 | @Post.Author 40 |
41 |
42 |
@Post.Author
43 |
Author
44 |
45 |
46 | 47 | 48 | 49 | 50 | 51 |
52 |
53 |
@Post.PublishedDate.ToString("MMMM dd, yyyy")
54 |
Published
55 |
56 |
57 |
@Post.ReadTimeMinutes min read
58 |
Reading time
59 |
60 |
61 |
62 | 63 | 64 | @if (Post.Tags.Any()) 65 | { 66 |
67 | @foreach (var tag in Post.Tags) 68 | { 69 | 70 | @tag 71 | 72 | } 73 |
74 | } 75 |
76 |
77 |
78 | 79 | @code { 80 | [Parameter, EditorRequired] public BlogPost Post { get; set; } = null!; 81 | 82 | private List GetBreadcrumbItems() 83 | { 84 | return new List 85 | { 86 | new() { Text = "Blog", Url = "/blog" }, 87 | new() { Text = Post.Title, Url = $"/blog/{Post.Slug}", IsActive = true } 88 | }; 89 | } 90 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Sections/FooterSection.razor: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/Nexus/Components/Sections/FeaturesSection.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Streamline Finance with Smart Features

5 |

6 | Everything you need to manage your business finances efficiently and grow with confidence. 7 |

8 |
9 | 10 |
11 |
12 |
13 | 14 | 15 | 16 |
17 |

Smart Analytics

18 |

Track performance with real-time insights and automated reporting.

19 |
20 | 21 |
22 |
23 | 24 | 25 | 26 |
27 |

Secure Platform

28 |

Bank-grade security with multi-layer encryption and fraud protection.

29 |
30 | 31 |
32 |
33 | 34 | 35 | 36 |
37 |

Easy Integration

38 |

Connect with your favorite tools and automate your workflow.

39 |
40 | 41 |
42 |
43 | 44 | 45 | 46 |
47 |

24/7 Support

48 |

Get help whenever you need it with our dedicated support team.

49 |
50 |
51 |
52 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Layout/NavMenu.razor: -------------------------------------------------------------------------------- 1 | @rendermode InteractiveServer 2 | 3 | 70 | 71 | -------------------------------------------------------------------------------- /src/Nexus/Components/Sections/ArticleSidebar.razor: -------------------------------------------------------------------------------- 1 | @using Nexus.Models 2 | 3 | 70 | 71 | @code { 72 | [Parameter, EditorRequired] public BlogPost Post { get; set; } = null!; 73 | [Parameter] public List TableOfContents { get; set; } = new(); 74 | [Parameter] public List RelatedPosts { get; set; } = new(); 75 | 76 | private string GetTocItemClass(int level) 77 | { 78 | return level switch 79 | { 80 | 2 => "text-sm font-medium", 81 | 3 => "text-sm pl-4", 82 | _ => "text-sm" 83 | }; 84 | } 85 | } -------------------------------------------------------------------------------- /src/Nexus/Components/Sections/BlogSection.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Latest Insights

5 |

Stay updated with the latest trends and best practices

6 |
7 | 8 |
9 |
10 |
11 | 10 Strategies to Scale Your Business in 2024 15 |
16 |
17 |
18 |
19 | Business Growth 20 | 21 | 5 min read 22 |
23 |

24 | 10 Strategies to Scale Your Business in 2024 25 |

26 |

27 | Discover proven methods to accelerate your business growth and reach new heights in the coming year. 28 |

29 | 30 | Read more → 31 | 32 |
33 |
34 | 35 |
36 |
37 | The Future of Digital Transformation 41 |
42 |
43 |
44 |
45 | Technology 46 | 47 | 7 min read 48 |
49 |

50 | The Future of Digital Transformation 51 |

52 |

53 | How emerging technologies are reshaping the way businesses operate and compete in the digital age. 54 |

55 | 56 | Read more → 57 | 58 |
59 |
60 | 61 |
62 |
63 | Making Data-Driven Decisions That Matter 67 |
68 |
69 |
70 |
71 | Analytics 72 | 73 | 6 min read 74 |
75 |

76 | Making Data-Driven Decisions That Matter 77 |

78 |

79 | Learn how to leverage analytics and insights to make smarter business decisions that drive results. 80 |

81 | 82 | Read more → 83 | 84 |
85 |
86 |
87 | 88 | 93 |
94 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Sections/PricingSection.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

Flexible Plans for Every Stage

5 |

Choose the perfect plan to grow your business

6 |
7 | 8 |
9 | 10 |
11 |
12 |

Starter

13 |
$19
14 |
per month
15 |
16 | 17 |
    18 |
  • 19 | 20 | 21 | 22 | Up to 3 projects 23 |
  • 24 |
  • 25 | 26 | 27 | 28 | Basic analytics 29 |
  • 30 |
  • 31 | 32 | 33 | 34 | Email support 35 |
  • 36 |
37 | 38 |
39 | 42 |
43 |
44 | 45 | 46 |
47 |
48 | Most Popular 49 |
50 | 51 |
52 |

Professional

53 |
$49
54 |
per month
55 |
56 | 57 |
    58 |
  • 59 | 60 | 61 | 62 | Unlimited projects 63 |
  • 64 |
  • 65 | 66 | 67 | 68 | Advanced analytics 69 |
  • 70 |
  • 71 | 72 | 73 | 74 | Priority support 75 |
  • 76 |
  • 77 | 78 | 79 | 80 | API access 81 |
  • 82 |
83 | 84 |
85 | 88 |
89 |
90 | 91 | 92 |
93 |
94 |

Enterprise

95 |
$99
96 |
per month
97 |
98 | 99 |
    100 |
  • 101 | 102 | 103 | 104 | Everything in Pro 105 |
  • 106 |
  • 107 | 108 | 109 | 110 | Custom integrations 111 |
  • 112 |
  • 113 | 114 | 115 | 116 | Dedicated support 117 |
  • 118 |
  • 119 | 120 | 121 | 122 | SLA guarantee 123 |
  • 124 |
125 | 126 |
127 | 130 |
131 |
132 |
133 |
134 |
-------------------------------------------------------------------------------- /src/Nexus/Components/Sections/TestimonialsSection.razor: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |

See What Our Users Think

5 |

Thousands of businesses trust Nexus to grow their success

6 |
7 | 8 |
9 |
10 |
11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 |
29 |

"Nexus has completely transformed how we manage our business operations. The insights are incredible and the platform is so easy to use."

30 |
31 |
32 | John Davis 36 |
37 |
38 |
John Davis
39 |
CEO, TechStart
40 |
41 |
42 |
43 | 44 |
45 |
46 |
47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 |
63 |
64 |

"The automation features have saved us countless hours every week. Our team can now focus on what really matters - growing the business."

65 |
66 |
67 | Sarah Mitchell 71 |
72 |
73 |
Sarah Mitchell
74 |
Operations Manager, GrowthCo
75 |
76 |
77 |
78 | 79 |
80 |
81 |
82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 |
98 |
99 |

"As a small business owner, I need tools that are powerful yet simple. Nexus delivers exactly that with excellent customer support."

100 |
101 |
102 | Mike Rodriguez 106 |
107 |
108 |
Mike Rodriguez
109 |
Founder, LocalBiz
110 |
111 |
112 |
113 |
114 |
115 |
-------------------------------------------------------------------------------- /src/Nexus/wwwroot/css/input.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | /* Custom CSS Variables */ 6 | :root { 7 | --bg-primary: #ffffff; 8 | --bg-secondary: #FAFBFC; 9 | --bg-tertiary: #F8FAFC; 10 | --bg-card: #ffffff; 11 | --text-primary: #0F172A; 12 | --text-secondary: #6B7280; 13 | --text-tertiary: #9CA3AF; 14 | --border-color: #E5E7EB; 15 | --border-light: #F3F4F6; 16 | --nexus-blue: #659BFF; 17 | --nexus-blue-dark: #4686FE; 18 | --nexus-blue-light: #E6F1FF; 19 | } 20 | 21 | .dark { 22 | --bg-primary: #0F172A; 23 | --bg-secondary: #1E293B; 24 | --bg-tertiary: #334155; 25 | --bg-card: #1E293B; 26 | --text-primary: #F1F5F9; 27 | --text-secondary: #CBD5E1; 28 | --text-tertiary: #94A3B8; 29 | --border-color: #334155; 30 | --border-light: #475569; 31 | --nexus-blue: #659BFF; 32 | --nexus-blue-dark: #4686FE; 33 | --nexus-blue-light: #1E3A5F; 34 | } 35 | 36 | @layer base { 37 | /* Smooth scrolling for the entire page */ 38 | html { 39 | scroll-behavior: smooth; 40 | } 41 | 42 | /* Dark mode body background */ 43 | body { 44 | background-color: var(--bg-primary); 45 | color: var(--text-primary); 46 | transition: background-color 0.3s ease, color 0.3s ease; 47 | } 48 | } 49 | 50 | @layer components { 51 | /* Blazor specific styles */ 52 | .valid.modified:not([type=checkbox]) { 53 | border-color: #10b981; 54 | } 55 | 56 | .dark .valid.modified:not([type=checkbox]) { 57 | border-color: #34d399; 58 | } 59 | 60 | .invalid { 61 | border-color: #ef4444; 62 | } 63 | 64 | .dark .invalid { 65 | border-color: #f87171; 66 | } 67 | 68 | .validation-message { 69 | color: #ef4444; 70 | font-size: 0.875rem; 71 | margin-top: 0.25rem; 72 | } 73 | 74 | .dark .validation-message { 75 | color: #f87171; 76 | } 77 | 78 | .blazor-error-boundary { 79 | background: #ef4444; 80 | padding: 1rem; 81 | color: white; 82 | border-radius: 0.5rem; 83 | margin: 1rem 0; 84 | } 85 | 86 | .dark .blazor-error-boundary { 87 | background: #991b1b; 88 | } 89 | 90 | .blazor-error-boundary::after { 91 | content: "An error has occurred. Please refresh the page."; 92 | } 93 | 94 | #blazor-error-ui { 95 | background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%); 96 | bottom: 0; 97 | box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); 98 | display: none; 99 | left: 0; 100 | padding: 1rem; 101 | position: fixed; 102 | width: 100%; 103 | z-index: 1000; 104 | color: white; 105 | text-align: center; 106 | } 107 | 108 | .dark #blazor-error-ui { 109 | background: linear-gradient(135deg, #1e293b 0%, #334155 100%); 110 | } 111 | 112 | #blazor-error-ui .dismiss { 113 | cursor: pointer; 114 | position: absolute; 115 | right: 1rem; 116 | top: 0.5rem; 117 | font-size: 1.5rem; 118 | } 119 | 120 | /* Blog-specific styles */ 121 | .blog-grid { 122 | display: grid; 123 | grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); 124 | gap: 2rem; 125 | } 126 | 127 | .blog-card { 128 | transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); 129 | background-color: var(--bg-card); 130 | border-color: var(--border-color); 131 | } 132 | 133 | .blog-card:hover { 134 | transform: translateY(-4px); 135 | box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); 136 | } 137 | 138 | .dark .blog-card:hover { 139 | box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5); 140 | } 141 | 142 | /* Category filter animations */ 143 | .category-filter { 144 | display: flex; 145 | flex-wrap: wrap; 146 | justify-content: center; 147 | gap: 0.75rem; 148 | margin-bottom: 2rem; 149 | } 150 | 151 | .category-button { 152 | transition: all 0.2s ease-in-out; 153 | border-radius: 9999px; 154 | padding: 0.75rem 1.5rem; 155 | font-weight: 500; 156 | border: 1px solid; 157 | } 158 | 159 | .category-button.active { 160 | background-color: var(--nexus-blue); 161 | color: white; 162 | border-color: var(--nexus-blue); 163 | box-shadow: 0 4px 14px 0 rgba(101, 155, 255, 0.4); 164 | } 165 | 166 | .dark .category-button.active { 167 | box-shadow: 0 4px 14px 0 rgba(101, 155, 255, 0.2); 168 | } 169 | 170 | .category-button:not(.active) { 171 | background-color: var(--bg-card); 172 | color: var(--text-secondary); 173 | border-color: var(--border-color); 174 | } 175 | 176 | .category-button:not(.active):hover { 177 | border-color: var(--nexus-blue); 178 | color: var(--nexus-blue); 179 | box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); 180 | } 181 | 182 | .dark .category-button:not(.active):hover { 183 | box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); 184 | } 185 | 186 | /* Article prose styles */ 187 | .prose-nexus { 188 | color: var(--text-secondary); 189 | line-height: 1.75; 190 | } 191 | 192 | .prose-nexus h2 { 193 | color: var(--text-primary); 194 | font-weight: 700; 195 | font-size: 1.875rem; 196 | margin-top: 2rem; 197 | margin-bottom: 1rem; 198 | line-height: 1.3; 199 | } 200 | 201 | .prose-nexus h3 { 202 | color: var(--text-primary); 203 | font-weight: 600; 204 | font-size: 1.5rem; 205 | margin-top: 1.5rem; 206 | margin-bottom: 0.75rem; 207 | line-height: 1.4; 208 | } 209 | 210 | .prose-nexus p { 211 | margin-bottom: 1.25rem; 212 | } 213 | 214 | .prose-nexus ul, .prose-nexus ol { 215 | margin-bottom: 1.25rem; 216 | padding-left: 1.5rem; 217 | } 218 | 219 | .prose-nexus li { 220 | margin-bottom: 0.5rem; 221 | } 222 | 223 | .prose-nexus blockquote { 224 | border-left: 4px solid var(--nexus-blue); 225 | padding-left: 1.5rem; 226 | margin: 2rem 0; 227 | font-style: italic; 228 | font-size: 1.125rem; 229 | color: var(--text-secondary); 230 | } 231 | 232 | .prose-nexus strong { 233 | color: var(--text-primary); 234 | font-weight: 600; 235 | } 236 | 237 | .prose-nexus a { 238 | color: var(--nexus-blue); 239 | text-decoration: none; 240 | } 241 | 242 | .prose-nexus a:hover { 243 | color: var(--nexus-blue-dark); 244 | text-decoration: underline; 245 | } 246 | } 247 | 248 | @layer utilities { 249 | /* Line clamp utility */ 250 | .line-clamp-2 { 251 | display: -webkit-box; 252 | -webkit-line-clamp: 2; 253 | -webkit-box-orient: vertical; 254 | overflow: hidden; 255 | } 256 | } 257 | 258 | /* Responsive adjustments for mobile */ 259 | @media (max-width: 768px) { 260 | /* iPhone mockup adjustments */ 261 | .w-80 { 262 | width: 16rem !important; 263 | } 264 | 265 | .h-\[640px\] { 266 | height: 32rem !important; 267 | } 268 | 269 | /* Hide floating elements on mobile for cleaner look */ 270 | .absolute.-left-8, 271 | .absolute.-left-16, 272 | .absolute.-right-12 { 273 | display: none; 274 | } 275 | 276 | /* Adjust hero text on mobile */ 277 | .text-5xl { 278 | font-size: 2.5rem !important; 279 | line-height: 1.1 !important; 280 | } 281 | 282 | .text-6xl { 283 | font-size: 3rem !important; 284 | line-height: 1.1 !important; 285 | } 286 | 287 | /* Better spacing on mobile */ 288 | .py-20 { 289 | padding-top: 3rem !important; 290 | padding-bottom: 3rem !important; 291 | } 292 | 293 | .lg\\:py-32 { 294 | padding-top: 3rem !important; 295 | padding-bottom: 3rem !important; 296 | } 297 | 298 | .blog-grid { 299 | grid-template-columns: repeat(2, 1fr); 300 | } 301 | } 302 | 303 | @media (min-width: 1024px) { 304 | .blog-grid { 305 | grid-template-columns: repeat(3, 1fr); 306 | } 307 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nexus - Modern Blazor SaaS Landing Page Template 2 | 3 | A professional, conversion-focused landing page template built with **Blazor Server** and **Tailwind CSS**. Perfect for SaaS startups, fintech companies, and modern web applications. 4 | 5 | ![Blazor](https://img.shields.io/badge/Blazor-512BD4?style=for-the-badge&logo=blazor&logoColor=white) 6 | ![.NET](https://img.shields.io/badge/.NET-8.0-512BD4?style=for-the-badge&logo=.net&logoColor=white) 7 | ![Tailwind CSS](https://img.shields.io/badge/Tailwind_CSS-38B2AC?style=for-the-badge&logo=tailwind-css&logoColor=white) 8 | 9 | ## ✨ Features 10 | 11 | ### 📄 **Complete Landing Page Sections** 12 | - **Hero Section** - Eye-catching hero with CTA buttons and mobile mockup 13 | - **Trusted By** - Company logos and social proof 14 | - **Features** - Highlight key product features with icons 15 | - **Process Steps** - How it works section with numbered steps 16 | - **Integrations** - Showcase third-party integrations 17 | - **Testimonials** - Customer reviews and social proof 18 | - **Pricing** - Professional pricing tables with alignment 19 | - **FAQ** - Expandable frequently asked questions 20 | - **Blog Preview** - Latest blog posts showcase 21 | - **Contact** - Contact form and information 22 | - **CTA Section** - Final call-to-action before footer 23 | 24 | ### 📝 **Blog System** 25 | - **Blog Listing Page** - Clean, responsive blog post grid 26 | - **Blog Detail Pages** - Full article pages with related posts 27 | - **Dynamic Content** - Sample blog posts with categories 28 | - **SEO-Friendly** - Proper meta tags and structure 29 | 30 | ### 🎨 **Modern Design** 31 | - **Responsive Design** - Mobile-first approach, works on all devices 32 | - **Clean Typography** - Inter font for professional appearance 33 | - **Smooth Animations** - CSS transitions and hover effects 34 | - **Brand Colors** - Customizable color scheme (Nexus Blue theme) 35 | 36 | ### ⚡ **Interactive Features** 37 | - **Smooth Scrolling** - Hash navigation with smooth scroll to sections 38 | - **Scroll to Top Widget** - Floating button that appears on scroll 39 | - **Mobile Navigation** - Hamburger menu for mobile devices 40 | - **Interactive Components** - Blazor Server components with real-time updates 41 | 42 | ### 🛠️ **Technical Excellence** 43 | - **.NET 8** - Latest .NET framework with modern C# features 44 | - **Blazor Server** - Server-side rendering with SignalR real-time updates 45 | - **Tailwind CSS** - Utility-first CSS framework via CDN 46 | - **Component Architecture** - Modular, reusable Blazor components 47 | - **Code-Behind Pattern** - Clean separation with `.razor.cs` files 48 | - **Type Safety** - Full C# type checking and IntelliSense support 49 | 50 | ## 🚀 Quick Start 51 | 52 | ### Prerequisites 53 | - [.NET 8.0 SDK](https://dotnet.microsoft.com/download/dotnet/8.0) or later 54 | - Any code editor (Visual Studio, VS Code, Rider) 55 | 56 | ### Installation 57 | 58 | 1. **Clone or download** the template 59 | ```bash 60 | # If using git 61 | git clone https://github.com/techfirst/BlazorMarket-Nexus.git 62 | cd nexus 63 | 64 | # Or extract the ZIP file and navigate to the folder 65 | ``` 66 | 67 | 2. **Navigate to the project directory** 68 | ```bash 69 | cd src/Nexus 70 | ``` 71 | 72 | 3. **Restore dependencies** 73 | ```bash 74 | dotnet restore 75 | ``` 76 | 77 | 4. **Run the application** 78 | ```bash 79 | # Development mode with hot reload 80 | dotnet watch run 81 | 82 | # Or standard run 83 | dotnet run 84 | ``` 85 | 86 | 5. **Open in browser** 87 | - Navigate to `https://localhost:7048` or `http://localhost:5048` 88 | - The template will be running with all features enabled 89 | 90 | ## 🎯 How to Customize 91 | 92 | ### 1. **Branding & Colors** 93 | Edit `src/Nexus/Components/App.razor` to customize the Tailwind color scheme: 94 | ```javascript 95 | colors: { 96 | 'nexus-blue': '#659BFF', // Primary blue 97 | 'nexus-blue-dark': '#4686FE', // Darker blue for hovers 98 | 'nexus-blue-light': '#E6F1FF', // Light blue backgrounds 99 | 'nexus-gray': '#FAFBFC', // Light gray backgrounds 100 | 'nexus-dark': '#0F172A', // Dark text color 101 | } 102 | ``` 103 | 104 | ### 2. **Content Updates** 105 | - **Hero Section**: Edit `src/Nexus/Components/Sections/HeroSection.razor` 106 | - **Features**: Update `src/Nexus/Components/Sections/FeaturesSection.razor` 107 | - **Pricing**: Modify `src/Nexus/Components/Sections/PricingSection.razor` 108 | - **Contact Info**: Update `src/Nexus/Components/Sections/ContactSection.razor` 109 | 110 | ### 3. **Images & Assets** 111 | - Replace logo and branding in `src/Nexus/wwwroot/images/` 112 | - Update favicon: Replace `src/Nexus/wwwroot/favicon.png` 113 | - Phone mockup: Replace `src/Nexus/wwwroot/images/phone2.png` 114 | 115 | ### 4. **Navigation & Routing** 116 | - Main navigation: `src/Nexus/Components/Layout/NavMenu.razor` 117 | - Add new pages: Create in `src/Nexus/Components/Pages/` 118 | - Update routing: Modify page `@page` directives 119 | 120 | ### 5. **Blog Content** 121 | - Blog posts: Edit sample data in `src/Nexus/Services/BlogService.cs` 122 | - Add real blog functionality by connecting to a CMS or database 123 | - Customize blog layout: `src/Nexus/Components/Pages/Blog.razor` and `src/Nexus/Components/Pages/BlogDetail.razor` 124 | 125 | ## 📁 Project Structure 126 | 127 | ``` 128 | nexus/ 129 | ├── Nexus.sln # Solution file 130 | ├── LICENSE # License file 131 | ├── README.md # This file 132 | └── src/ 133 | └── Nexus/ # Main project folder 134 | ├── Components/ 135 | │ ├── Layout/ # Layout components (NavMenu, MainLayout) 136 | │ ├── Pages/ # Routable page components 137 | │ ├── Sections/ # Landing page sections 138 | │ ├── Shared/ # Reusable UI components 139 | │ └── App.razor # Root application component 140 | ├── Models/ # Data models and DTOs 141 | ├── Services/ # Business logic services 142 | ├── wwwroot/ # Static assets (CSS, images, etc.) 143 | ├── Program.cs # Application configuration 144 | ├── appsettings.json # App configuration 145 | └── Nexus.csproj # Project file 146 | ``` 147 | 148 | ## 🔧 Development Commands 149 | 150 | ```bash 151 | # Navigate to project directory first 152 | cd src/Nexus 153 | 154 | # Build the project 155 | dotnet build 156 | 157 | # Run with hot reload (recommended for development) 158 | dotnet watch run 159 | 160 | # Run without hot reload 161 | dotnet run 162 | 163 | # Format code 164 | dotnet format 165 | 166 | # Add NuGet packages 167 | dotnet add package [PackageName] 168 | ``` 169 | 170 | ## 📱 Responsive Breakpoints 171 | 172 | - **Mobile**: < 768px 173 | - **Tablet**: 768px - 1023px 174 | - **Desktop**: 1024px+ 175 | 176 | All components are built mobile-first and scale up responsively. 177 | 178 | ## 🎨 Styling Architecture 179 | 180 | - **Tailwind CSS**: Utility-first CSS framework loaded via CDN 181 | - **Component Scoping**: Use `.razor.css` files for component-specific styles 182 | - **Custom Properties**: Tailwind config in `App.razor` for brand colors 183 | - **Responsive Design**: All components built with mobile-first approach 184 | 185 | ## 🚀 Deployment 186 | 187 | ### Development 188 | ```bash 189 | cd src/Nexus 190 | dotnet run --environment Development 191 | ``` 192 | 193 | ### Production 194 | ```bash 195 | cd src/Nexus 196 | dotnet run --environment Production 197 | ``` 198 | 199 | The template is ready for deployment to: 200 | - **Azure App Service** 201 | - **IIS** 202 | - **Docker containers** 203 | - **Any .NET 8 compatible hosting** 204 | 205 | ## 📋 Browser Support 206 | 207 | - **Chrome** (latest) 208 | - **Firefox** (latest) 209 | - **Safari** (latest) 210 | - **Edge** (latest) 211 | - **Mobile browsers** (iOS Safari, Chrome Mobile) 212 | 213 | ## 🤝 Support 214 | 215 | This template includes: 216 | - ✅ Complete source code 217 | - ✅ All assets and images 218 | - ✅ Documentation 219 | - ✅ Commercial usage rights 220 | 221 | For questions or customization needs, refer to the documentation or modify the code to fit your requirements. 222 | 223 | ## 📄 License 224 | 225 | This template is licensed under a Commercial Use License. See [LICENSE](LICENSE) for details. 226 | 227 | - ✅ Use for unlimited commercial projects 228 | - ✅ Modify and customize freely 229 | - ✅ No attribution required 230 | - ❌ Cannot resell or redistribute the template 231 | 232 | --- 233 | 234 | **Built with ❤️ using Blazor Server and Tailwind CSS** 235 | -------------------------------------------------------------------------------- /src/Nexus/Components/Pages/BlogDetail.razor: -------------------------------------------------------------------------------- 1 | @page "/blog/{slug}" 2 | @using Nexus.Components.Sections 3 | @using Nexus.Models 4 | @using Nexus.Services 5 | 6 | @if (IsLoading) 7 | { 8 |
9 |
10 |
11 |

Loading article...

12 |
13 |
14 | } 15 | else if (Post == null) 16 | { 17 |
18 |
19 | 20 | 21 | 22 |

Article Not Found

23 |

The article you're looking for doesn't exist or may have been moved.

24 | 27 |
28 |
29 | } 30 | else 31 | { 32 | @Post.Title | Nexus Blog 33 | 34 |
35 | 36 |
37 | 38 | 51 | 52 | 53 |
54 |

55 | @Post.Title 56 |

57 | 58 | 59 |
60 |
61 | @Post.Author 65 |
66 |
67 |
@Post.Author
68 |
@Post.AuthorJobTitle
69 |
70 |
71 |
@Post.PublishedDate.ToString("MMM dd, yyyy")
72 |
73 |
74 |
75 | 76 | 77 |
78 | @Post.Title 82 |
83 | 84 | 85 |
86 |

Starting with the User

87 |

88 | We began by talking directly with users to learn what they needed from their financial dashboards. Simplicity, speed, and flexibility topped the list. That feedback shaped every decision moving forward. 89 |

90 | 91 |
92 | @((MarkupString)Post.FullContent) 93 |
94 | 95 |

96 | The result is a dashboard that puts the user first, with clean interfaces that make complex financial data easy to understand and act upon. Every element serves a purpose, and nothing gets in the way of getting work done. 97 |

98 |
99 | 100 | 101 |
102 |
103 | 104 | ← Back to Blog 105 | 106 | 107 |
108 | Share this article: 109 |
110 | 115 | 120 | 125 |
126 |
127 |
128 |
129 |
130 | 131 | 132 | @if (_relatedPosts.Any()) 133 | { 134 |
135 |
136 |

Related Articles

137 |
138 | @foreach (var relatedPost in _relatedPosts) 139 | { 140 | 141 | } 142 |
143 |
144 |
145 | } 146 |
147 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Ll]og/ 33 | [Ll]ogs/ 34 | 35 | # Visual Studio 2015/2017 cache/options directory 36 | .vs/ 37 | # Uncomment if you have tasks that create the project's static files in wwwroot 38 | #wwwroot/ 39 | 40 | # Visual Studio 2017 auto generated files 41 | Generated\ Files/ 42 | 43 | # MSTest test Results 44 | [Tt]est[Rr]esult*/ 45 | [Bb]uild[Ll]og.* 46 | 47 | # NUnit 48 | *.VisualState.xml 49 | TestResult.xml 50 | nunit-*.xml 51 | 52 | # Build Results of an ATL Project 53 | [Dd]ebugPS/ 54 | [Rr]eleasePS/ 55 | dlldata.c 56 | 57 | # Benchmark Results 58 | BenchmarkDotNet.Artifacts/ 59 | 60 | # .NET 61 | project.lock.json 62 | project.fragment.lock.json 63 | artifacts/ 64 | 65 | # Tye 66 | .tye/ 67 | 68 | # ASP.NET Scaffolding 69 | ScaffoldingReadMe.txt 70 | 71 | # StyleCop 72 | StyleCopReport.xml 73 | 74 | # Files built by Visual Studio 75 | *_i.c 76 | *_p.c 77 | *_h.h 78 | *.ilk 79 | *.meta 80 | *.obj 81 | *.iobj 82 | *.pch 83 | *.pdb 84 | *.ipdb 85 | *.pgc 86 | *.pgd 87 | *.rsp 88 | *.sbr 89 | *.tlb 90 | *.tli 91 | *.tlh 92 | *.tmp 93 | *.tmp_proj 94 | *_wpftmp.csproj 95 | *.log 96 | *.tlog 97 | *.vspscc 98 | *.vssscc 99 | .builds 100 | *.pidb 101 | *.svclog 102 | *.scc 103 | 104 | # Chutzpah Test files 105 | _Chutzpah* 106 | 107 | # Visual C++ cache files 108 | ipch/ 109 | *.aps 110 | *.ncb 111 | *.opendb 112 | *.opensdf 113 | *.sdf 114 | *.cachefile 115 | *.VC.db 116 | *.VC.VC.opendb 117 | 118 | # Visual Studio profiler 119 | *.psess 120 | *.vsp 121 | *.vspx 122 | *.sap 123 | 124 | # Visual Studio Trace Files 125 | *.e2e 126 | 127 | # TFS 2012 Local Workspace 128 | $tf/ 129 | 130 | # Guidance Automation Toolkit 131 | *.gpState 132 | 133 | # ReSharper is a .NET coding add-in 134 | _ReSharper*/ 135 | *.[Rr]e[Ss]harper 136 | *.DotSettings.user 137 | 138 | # TeamCity is a build add-in 139 | _TeamCity* 140 | 141 | # DotCover is a Code Coverage Tool 142 | *.dotCover 143 | 144 | # AxoCover is a Code Coverage Tool 145 | .axoCover/* 146 | !.axoCover/settings.json 147 | 148 | # Coverlet is a free, cross platform Code Coverage Tool 149 | coverage*.json 150 | coverage*.xml 151 | coverage*.info 152 | 153 | # Visual Studio code coverage results 154 | *.coverage 155 | *.coveragexml 156 | 157 | # NCrunch 158 | _NCrunch_* 159 | .*crunch*.local.xml 160 | nCrunchTemp_* 161 | 162 | # MightyMoose 163 | *.mm.* 164 | AutoTest.Net/ 165 | 166 | # Web workbench (sass) 167 | .sass-cache/ 168 | 169 | # Installshield output folder 170 | [Ee]xpress/ 171 | 172 | # DocProject is a documentation generator add-in 173 | DocProject/buildhelp/ 174 | DocProject/Help/*.HxT 175 | DocProject/Help/*.HxC 176 | DocProject/Help/*.hhc 177 | DocProject/Help/*.hhk 178 | DocProject/Help/*.hhp 179 | DocProject/Help/Html2 180 | DocProject/Help/html 181 | 182 | # Click-Once directory 183 | publish/ 184 | 185 | # Publish Web Output 186 | *.[Pp]ublish.xml 187 | *.azurePubxml 188 | # Note: Comment the next line if you want to checkin your web deploy settings, 189 | # but database connection strings (with potential passwords) will be unencrypted 190 | *.pubxml 191 | *.publishproj 192 | 193 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 194 | # checkin your Azure Web App publish settings, but sensitive information contained 195 | # in these scripts will be unencrypted 196 | PublishScripts/ 197 | 198 | # NuGet Packages 199 | *.nupkg 200 | # NuGet Symbol Packages 201 | *.snupkg 202 | # The packages folder can be ignored because of Package Restore 203 | **/[Pp]ackages/* 204 | # except build/, which is used as an MSBuild target. 205 | !**/[Pp]ackages/build/ 206 | # Uncomment if necessary however generally it will be regenerated when needed 207 | #!**/[Pp]ackages/repositories.config 208 | # NuGet v3's project.json files produces more ignorable files 209 | *.nuget.props 210 | *.nuget.targets 211 | 212 | # Microsoft Azure Build Output 213 | csx/ 214 | *.build.csdef 215 | 216 | # Microsoft Azure Emulator 217 | ecf/ 218 | rcf/ 219 | 220 | # Windows Store app package directories and files 221 | AppPackages/ 222 | BundleArtifacts/ 223 | Package.StoreAssociation.xml 224 | _pkginfo.txt 225 | *.appx 226 | *.appxbundle 227 | *.appxupload 228 | 229 | # Visual Studio cache files 230 | # files ending in .cache can be ignored 231 | *.[Cc]ache 232 | # but keep track of directories ending in .cache 233 | !?*.[Cc]ache/ 234 | 235 | # Others 236 | ClientBin/ 237 | ~$* 238 | *~ 239 | *.dbmdl 240 | *.dbproj.schemaview 241 | *.jfm 242 | *.pfx 243 | *.publishsettings 244 | orleans.codegen.cs 245 | 246 | # Including strong name files can present a security risk 247 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 248 | #*.snk 249 | 250 | # Since there are multiple workflows, check out .gitignore for each of them 251 | # https://github.com/github/gitignore/blob/main/community/DotNet/core.gitignore 252 | 253 | # Orleans Configuration 254 | ClientConfiguration.config 255 | ServerConfiguration.config 256 | 257 | # RIA/Silverlight projects 258 | Generated_Code/ 259 | 260 | # Backup & report files from converting an old project file 261 | # to a newer Visual Studio version. Backup files are not needed, 262 | # because we have git ;-) 263 | _UpgradeReport_Files/ 264 | Backup*/ 265 | UpgradeLog*.XML 266 | UpgradeLog*.htm 267 | ServiceFabricBackup/ 268 | *.rptproj.bak 269 | 270 | # SQL Server files 271 | *.mdf 272 | *.ldf 273 | *.ndf 274 | 275 | # Business Intelligence projects 276 | *.rdl.data 277 | *.bim.layout 278 | *.bim_*.settings 279 | *.rptproj.rsuser 280 | *- [Bb]ackup.rdl 281 | *- [Bb]ackup ([0-9]).rdl 282 | *- [Bb]ackup ([0-9][0-9]).rdl 283 | 284 | # Microsoft Fakes 285 | FakesAssemblies/ 286 | 287 | # GhostDoc plugin setting file 288 | *.GhostDoc.xml 289 | 290 | # Node.js Tools for Visual Studio 291 | .ntvs_analysis.dat 292 | node_modules/ 293 | 294 | # Tailwind CSS generated files 295 | src/Nexus/wwwroot/css/app.css 296 | package-lock.json 297 | 298 | # Visual Studio 6 build log 299 | *.plg 300 | 301 | # Visual Studio 6 workspace options file 302 | *.opt 303 | 304 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 305 | *.vbw 306 | 307 | # Visual Studio 6 auto-generated project file (contains which files were open etc.) 308 | *.vbp 309 | 310 | # Visual Studio 6 workspace and project file (working project files containing files to include in project) 311 | *.dsw 312 | *.dsp 313 | 314 | # Visual Studio 6 technical files 315 | *.ncb 316 | *.aps 317 | 318 | # Visual Studio LightSwitch build output 319 | **/*.HTMLClient/GeneratedArtifacts 320 | **/*.DesktopClient/GeneratedArtifacts 321 | **/*.DesktopClient/ModelManifest.xml 322 | **/*.Server/GeneratedArtifacts 323 | **/*.Server/ModelManifest.xml 324 | _Pvt_Extensions 325 | 326 | # Paket dependency manager 327 | .paket/paket.exe 328 | paket-files/ 329 | 330 | # FAKE - F# Make 331 | .fake/ 332 | 333 | # CodeRush personal settings 334 | .cr/personal 335 | 336 | # Python Tools for Visual Studio (PTVS) 337 | __pycache__/ 338 | *.pyc 339 | 340 | # Cake - Uncomment if you are using it 341 | # tools/** 342 | # !tools/packages.config 343 | 344 | # Tabs Studio 345 | *.tss 346 | 347 | # Telerik's JustMock configuration file 348 | *.jmconfig 349 | 350 | # BizTalk build output 351 | *.btp.cs 352 | *.btm.cs 353 | *.odx.cs 354 | *.xsd.cs 355 | 356 | # OpenCover UI analysis results 357 | OpenCover/ 358 | 359 | # Azure Stream Analytics local run output 360 | ASALocalRun/ 361 | 362 | # MSBuild Binary and Structured Log 363 | *.binlog 364 | 365 | # NVidia Nsight GPU debugger configuration file 366 | *.nvuser 367 | 368 | # MFractors (Xamarin productivity tool) working folder 369 | .mfractor/ 370 | 371 | # Local History for Visual Studio 372 | .localhistory/ 373 | 374 | # Visual Studio History (VSHistory) files 375 | .vshistory/ 376 | 377 | # BeatPulse healthcheck temp database 378 | healthchecksdb 379 | 380 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 381 | MigrationBackup/ 382 | 383 | # Ionide (cross platform F# VS Code tools) working folder 384 | .ionide/ 385 | 386 | # Fody - auto-generated XML schema 387 | FodyWeavers.xsd 388 | 389 | # VS Code files for those working on multiple tools 390 | .vscode/* 391 | !.vscode/settings.json 392 | !.vscode/tasks.json 393 | !.vscode/launch.json 394 | !.vscode/extensions.json 395 | *.code-workspace 396 | 397 | # Local History for Visual Studio Code 398 | .history/ 399 | 400 | # Windows Installer files from build outputs 401 | *.cab 402 | *.msi 403 | *.msix 404 | *.msm 405 | *.msp 406 | 407 | # JetBrains Rider 408 | *.sln.iml 409 | .idea/ 410 | 411 | # macOS 412 | .DS_Store 413 | .AppleDouble 414 | .LSOverride 415 | 416 | # Thumbnails 417 | ._* 418 | 419 | # Files that might appear in the root of a volume 420 | .DocumentRevisions-V100 421 | .fseventsd 422 | .Spotlight-V100 423 | .TemporaryItems 424 | .Trashes 425 | .VolumeIcon.icns 426 | .com.apple.timemachine.donotpresent 427 | 428 | # Directories potentially created on remote AFP share 429 | .AppleDB 430 | .AppleDesktop 431 | Network Trash Folder 432 | Temporary Items 433 | .apdisk 434 | 435 | # Linux 436 | *~ 437 | 438 | # temporary files which can be created if a process still has a handle open of a deleted file 439 | .fuse_hidden* 440 | 441 | # KDE directory preferences 442 | .directory 443 | 444 | # Linux trash folder which might appear on any partition or disk 445 | .Trash-* 446 | 447 | # .nfs files are created when an open file is removed but is still being accessed 448 | .nfs* 449 | 450 | # Claude Code configuration 451 | .claude/ -------------------------------------------------------------------------------- /src/Nexus/Components/App.razor: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 250 | 251 | 252 | 253 | -------------------------------------------------------------------------------- /src/Nexus/Services/BlogService.cs: -------------------------------------------------------------------------------- 1 | using Nexus.Models; 2 | 3 | namespace Nexus.Services; 4 | 5 | public class BlogService 6 | { 7 | private readonly List _blogPosts; 8 | 9 | public BlogService() 10 | { 11 | _blogPosts = GenerateSampleBlogPosts(); 12 | } 13 | 14 | public async Task> GetAllPostsAsync() 15 | { 16 | await Task.Delay(50); // Simulate async operation 17 | return _blogPosts.OrderByDescending(p => p.PublishedDate).ToList(); 18 | } 19 | 20 | public async Task> GetPostsByCategoryAsync(string category) 21 | { 22 | await Task.Delay(50); 23 | 24 | if (category == BlogCategories.All) 25 | return await GetAllPostsAsync(); 26 | 27 | return _blogPosts 28 | .Where(p => p.Category == category) 29 | .OrderByDescending(p => p.PublishedDate) 30 | .ToList(); 31 | } 32 | 33 | public async Task> SearchPostsAsync(string searchTerm) 34 | { 35 | await Task.Delay(50); 36 | 37 | if (string.IsNullOrWhiteSpace(searchTerm)) 38 | return await GetAllPostsAsync(); 39 | 40 | return _blogPosts 41 | .Where(p => p.Title.Contains(searchTerm, StringComparison.OrdinalIgnoreCase) || 42 | p.Excerpt.Contains(searchTerm, StringComparison.OrdinalIgnoreCase) || 43 | p.Category.Contains(searchTerm, StringComparison.OrdinalIgnoreCase)) 44 | .OrderByDescending(p => p.PublishedDate) 45 | .ToList(); 46 | } 47 | 48 | public async Task GetPostBySlugAsync(string slug) 49 | { 50 | await Task.Delay(50); 51 | return _blogPosts.FirstOrDefault(p => p.Slug == slug); 52 | } 53 | 54 | public async Task> GetRelatedPostsAsync(string currentSlug, string category, int count = 3) 55 | { 56 | await Task.Delay(50); 57 | 58 | return _blogPosts 59 | .Where(p => p.Slug != currentSlug && p.Category == category) 60 | .OrderByDescending(p => p.PublishedDate) 61 | .Take(count) 62 | .ToList(); 63 | } 64 | 65 | public List GenerateTableOfContents(string content) 66 | { 67 | // Simple mock implementation - in real app would parse HTML content 68 | return new List 69 | { 70 | new() { Id = "introduction", Title = "Introduction", Level = 2 }, 71 | new() { Id = "key-features", Title = "Key Features", Level = 2 }, 72 | new() { Id = "implementation", Title = "Implementation Details", Level = 2 }, 73 | new() { Id = "best-practices", Title = "Best Practices", Level = 3 }, 74 | new() { Id = "conclusion", Title = "Conclusion", Level = 2 } 75 | }; 76 | } 77 | 78 | public int CalculateReadingTime(string content) 79 | { 80 | // Rough calculation: 200 words per minute 81 | var wordCount = content.Split(' ', StringSplitOptions.RemoveEmptyEntries).Length; 82 | return Math.Max(1, (int)Math.Ceiling(wordCount / 200.0)); 83 | } 84 | 85 | public List GetAllCategories() 86 | { 87 | return new List 88 | { 89 | BlogCategories.All, 90 | BlogCategories.BusinessGrowth, 91 | BlogCategories.Technology, 92 | BlogCategories.Analytics, 93 | BlogCategories.Strategy, 94 | BlogCategories.Insights 95 | }; 96 | } 97 | 98 | private static List GenerateSampleBlogPosts() 99 | { 100 | return new List 101 | { 102 | new() 103 | { 104 | Id = 1, 105 | Title = "10 Strategies to Scale Your Business in 2024", 106 | Slug = "10-strategies-scale-business-2024", 107 | Excerpt = "Discover proven methods to accelerate your business growth and reach new heights in the coming year with these actionable strategies.", 108 | Content = "Content for scaling business strategies...", 109 | FullContent = GenerateSampleContent("scaling", "business strategies"), 110 | Category = BlogCategories.BusinessGrowth, 111 | Author = "Sarah Chen", 112 | AuthorInitials = "SC", 113 | AuthorJobTitle = "Lead Growth Strategist", 114 | PublishedDate = DateTime.Now.AddDays(-2), 115 | ReadTimeMinutes = 8, 116 | FeaturedImageGradient = "from-nexus-blue to-nexus-blue-dark", 117 | IsFeatured = true, 118 | Tags = new() { "Growth", "Strategy", "Scaling" } 119 | }, 120 | new() 121 | { 122 | Id = 2, 123 | Title = "The Future of Digital Transformation", 124 | Slug = "future-digital-transformation", 125 | Excerpt = "How emerging technologies are reshaping the way businesses operate and compete in the digital age.", 126 | Content = "Content about digital transformation...", 127 | FullContent = GenerateSampleContent("digital transformation", "emerging technologies"), 128 | Category = BlogCategories.Technology, 129 | Author = "Michael Rodriguez", 130 | AuthorInitials = "MR", 131 | AuthorJobTitle = "Senior Technology Consultant", 132 | PublishedDate = DateTime.Now.AddDays(-5), 133 | ReadTimeMinutes = 12, 134 | FeaturedImageGradient = "from-green-400 to-blue-500", 135 | IsFeatured = false, 136 | Tags = new() { "Digital", "Technology", "Innovation" } 137 | }, 138 | new() 139 | { 140 | Id = 3, 141 | Title = "Making Data-Driven Decisions That Matter", 142 | Slug = "data-driven-decisions-matter", 143 | Excerpt = "Learn how to leverage analytics and insights to make smarter business decisions that drive real results.", 144 | Content = "Content about data-driven decisions...", 145 | FullContent = GenerateSampleContent("data analytics", "business intelligence"), 146 | Category = BlogCategories.Analytics, 147 | Author = "Jennifer Park", 148 | AuthorInitials = "JP", 149 | AuthorJobTitle = "Data Analytics Director", 150 | PublishedDate = DateTime.Now.AddDays(-7), 151 | ReadTimeMinutes = 6, 152 | FeaturedImageGradient = "from-purple-400 to-pink-500", 153 | IsFeatured = false, 154 | Tags = new() { "Data", "Analytics", "Decision Making" } 155 | }, 156 | new() 157 | { 158 | Id = 4, 159 | Title = "Building a Customer-Centric Culture", 160 | Slug = "building-customer-centric-culture", 161 | Excerpt = "Transform your organization by putting customers at the heart of everything you do. Learn practical steps to build lasting relationships.", 162 | Content = "Content about customer-centric culture...", 163 | Category = BlogCategories.Strategy, 164 | Author = "David Kim", 165 | AuthorInitials = "DK", 166 | AuthorJobTitle = "Customer Experience Manager", 167 | PublishedDate = DateTime.Now.AddDays(-10), 168 | ReadTimeMinutes = 10, 169 | FeaturedImageGradient = "from-orange-400 to-red-500", 170 | IsFeatured = false, 171 | Tags = new() { "Customer", "Culture", "Strategy" } 172 | }, 173 | new() 174 | { 175 | Id = 5, 176 | Title = "The Rise of Remote Work: Best Practices", 177 | Slug = "rise-remote-work-best-practices", 178 | Excerpt = "Navigate the future of work with proven strategies for building effective remote teams and maintaining productivity.", 179 | Content = "Content about remote work practices...", 180 | Category = BlogCategories.Insights, 181 | Author = "Emily Watson", 182 | AuthorInitials = "EW", 183 | AuthorJobTitle = "Remote Work Specialist", 184 | PublishedDate = DateTime.Now.AddDays(-12), 185 | ReadTimeMinutes = 9, 186 | FeaturedImageGradient = "from-teal-400 to-green-500", 187 | IsFeatured = false, 188 | Tags = new() { "Remote Work", "Productivity", "Teams" } 189 | }, 190 | new() 191 | { 192 | Id = 6, 193 | Title = "AI and Machine Learning in Small Business", 194 | Slug = "ai-machine-learning-small-business", 195 | Excerpt = "Discover how artificial intelligence and machine learning can transform small businesses without breaking the budget.", 196 | Content = "Content about AI in small business...", 197 | Category = BlogCategories.Technology, 198 | Author = "Alex Thompson", 199 | AuthorInitials = "AT", 200 | AuthorJobTitle = "AI Solutions Architect", 201 | PublishedDate = DateTime.Now.AddDays(-15), 202 | ReadTimeMinutes = 11, 203 | FeaturedImageGradient = "from-indigo-400 to-purple-500", 204 | IsFeatured = false, 205 | Tags = new() { "AI", "Machine Learning", "Small Business" } 206 | }, 207 | new() 208 | { 209 | Id = 7, 210 | Title = "Understanding Your Market: Research Methods", 211 | Slug = "understanding-market-research-methods", 212 | Excerpt = "Master the art of market research with these proven methods to understand your customers and competition better.", 213 | Content = "Content about market research...", 214 | Category = BlogCategories.Analytics, 215 | Author = "Lisa Zhang", 216 | AuthorInitials = "LZ", 217 | AuthorJobTitle = "Market Research Analyst", 218 | PublishedDate = DateTime.Now.AddDays(-18), 219 | ReadTimeMinutes = 7, 220 | FeaturedImageGradient = "from-pink-400 to-rose-500", 221 | IsFeatured = false, 222 | Tags = new() { "Market Research", "Analytics", "Competition" } 223 | }, 224 | new() 225 | { 226 | Id = 8, 227 | Title = "Sustainable Business Practices for Growth", 228 | Slug = "sustainable-business-practices-growth", 229 | Excerpt = "Learn how sustainable business practices can drive long-term growth while making a positive impact on society.", 230 | Content = "Content about sustainable practices...", 231 | Category = BlogCategories.BusinessGrowth, 232 | Author = "Robert Johnson", 233 | AuthorInitials = "RJ", 234 | PublishedDate = DateTime.Now.AddDays(-20), 235 | ReadTimeMinutes = 8, 236 | FeaturedImageGradient = "from-green-500 to-emerald-600", 237 | IsFeatured = false, 238 | Tags = new() { "Sustainability", "Growth", "Impact" } 239 | }, 240 | new() 241 | { 242 | Id = 9, 243 | Title = "The Art of Strategic Planning", 244 | Slug = "art-strategic-planning", 245 | Excerpt = "Develop winning strategies with our comprehensive guide to strategic planning that delivers measurable results.", 246 | Content = "Content about strategic planning...", 247 | Category = BlogCategories.Strategy, 248 | Author = "Maria Garcia", 249 | AuthorInitials = "MG", 250 | PublishedDate = DateTime.Now.AddDays(-22), 251 | ReadTimeMinutes = 13, 252 | FeaturedImageGradient = "from-blue-500 to-indigo-600", 253 | IsFeatured = false, 254 | Tags = new() { "Planning", "Strategy", "Results" } 255 | }, 256 | new() 257 | { 258 | Id = 10, 259 | Title = "Digital Marketing Trends for 2024", 260 | Slug = "digital-marketing-trends-2024", 261 | Excerpt = "Stay ahead of the curve with the latest digital marketing trends that will shape customer engagement in 2024.", 262 | Content = "Content about marketing trends...", 263 | Category = BlogCategories.Insights, 264 | Author = "James Wilson", 265 | AuthorInitials = "JW", 266 | PublishedDate = DateTime.Now.AddDays(-25), 267 | ReadTimeMinutes = 9, 268 | FeaturedImageGradient = "from-yellow-400 to-orange-500", 269 | IsFeatured = false, 270 | Tags = new() { "Marketing", "Trends", "Engagement" } 271 | }, 272 | new() 273 | { 274 | Id = 11, 275 | Title = "Building High-Performance Teams", 276 | Slug = "building-high-performance-teams", 277 | Excerpt = "Create teams that consistently deliver exceptional results with these proven leadership and management techniques.", 278 | Content = "Content about high-performance teams...", 279 | Category = BlogCategories.Strategy, 280 | Author = "Rachel Adams", 281 | AuthorInitials = "RA", 282 | PublishedDate = DateTime.Now.AddDays(-28), 283 | ReadTimeMinutes = 10, 284 | FeaturedImageGradient = "from-cyan-400 to-blue-500", 285 | IsFeatured = false, 286 | Tags = new() { "Teams", "Leadership", "Performance" } 287 | }, 288 | new() 289 | { 290 | Id = 12, 291 | Title = "Financial Planning for Business Success", 292 | Slug = "financial-planning-business-success", 293 | Excerpt = "Master the fundamentals of business financial planning to ensure long-term success and sustainable growth.", 294 | Content = "Content about financial planning...", 295 | Category = BlogCategories.BusinessGrowth, 296 | Author = "Kevin Martinez", 297 | AuthorInitials = "KM", 298 | PublishedDate = DateTime.Now.AddDays(-30), 299 | ReadTimeMinutes = 11, 300 | FeaturedImageGradient = "from-slate-500 to-gray-600", 301 | IsFeatured = false, 302 | Tags = new() { "Finance", "Planning", "Success" } 303 | } 304 | }; 305 | } 306 | 307 | private static string GenerateSampleContent(string topic, string context) 308 | { 309 | return $@" 310 |

Introduction

311 |

In today's rapidly evolving business landscape, understanding {topic} has become more crucial than ever. Organizations worldwide are recognizing the importance of {context} in driving sustainable growth and maintaining competitive advantage.

312 | 313 |

This comprehensive guide explores the latest trends, proven strategies, and actionable insights that can help your business thrive in an increasingly complex market environment.

314 | 315 |

Key Features

316 |

When implementing {context}, there are several key features that distinguish successful approaches from less effective ones:

317 | 318 |
    319 |
  • Strategic Planning: Developing a clear roadmap that aligns with your business objectives
  • 320 |
  • Data-Driven Decisions: Leveraging analytics to inform strategic choices
  • 321 |
  • Scalable Solutions: Building systems that grow with your business
  • 322 |
  • Customer Focus: Placing customer needs at the center of all initiatives
  • 323 |
324 | 325 |

Implementation Details

326 |

Successfully implementing {context} requires a systematic approach that takes into account your organization's unique needs and constraints. The process typically involves several phases:

327 | 328 |

Best Practices

329 |

Drawing from industry experience and research, here are the best practices that consistently deliver results:

330 | 331 |
    332 |
  1. Start with a clear understanding of your current state
  2. 333 |
  3. Define specific, measurable objectives
  4. 334 |
  5. Engage stakeholders throughout the process
  6. 335 |
  7. Monitor progress and adjust strategies as needed
  8. 336 |
  9. Celebrate milestones and learn from setbacks
  10. 337 |
338 | 339 |

These practices have been validated across numerous successful implementations and represent the collective wisdom of industry leaders.

340 | 341 |

Conclusion

342 |

The journey of {topic} is ongoing and requires continuous adaptation to changing market conditions. By focusing on {context} and following proven methodologies, organizations can position themselves for long-term success.

343 | 344 |

Remember that success in this area isn't just about implementing the right tools or processes—it's about creating a culture that embraces change and innovation while staying true to core business values.

345 | 346 |
347 |

""The future belongs to organizations that can adapt quickly while maintaining focus on what matters most to their customers.""

348 |
349 | 350 |

As you embark on or continue your journey with {context}, keep these principles in mind and don't hesitate to seek guidance from experts who have navigated similar challenges.

351 | "; 352 | } 353 | } --------------------------------------------------------------------------------