Changelog
February 15, 2026 ยท View on GitHub
All notable changes to Blazouter will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Added
- WASM Assembly Lazy Loading: Support for lazy-loading Razor Class Library (RCL) assemblies in Blazor WebAssembly
OnNavigateAsyncparameter on Router component for intercepting navigation and loading assemblies on demandAdditionalAssembliesparameter on Router component for registering dynamically loaded assemblies for route discoveryBlazouterNavigationContextmodel providing navigation path and cancellation token to the callback- Cancellation support for in-flight
OnNavigateAsynccallbacks when rapid navigation occurs - Path-based guard preventing redundant
OnNavigateAsyncinvocations during render cycles - New
Blazouter.LazyModule.Sampleproject demonstrating lazy-loaded RCL assembly usage
1.0.13 - 2025-12-23
Added
-
TypeScript-Based JavaScript Interop Infrastructure: Comprehensive type-safe browser API access
- TypeScript compilation pipeline with
.d.tsgeneration for IntelliSense support - Global namespace exposure pattern for C# interop:
window.blazouterNavigation,window.blazouterDocument,window.blazouterStorage,window.blazouterViewport,window.blazouterClipboard - Separate
Blazouter.TypeScriptproject atsrc/Blazouter.TypeScript/for TypeScript source files - NPM package with TypeScript compiler configuration (tsconfig.json)
- Compiled JavaScript modules with source maps and type definitions in
src/Blazouter/wwwroot/js/
- TypeScript compilation pipeline with
-
NavigationInterop Service: Browser history and navigation API wrapper
- History API:
GoBackAsync(),GoForwardAsync(),GoAsync(),GetHistoryLengthAsync(),GetHistoryStateAsync() - URL helpers:
GetCurrentUrlAsync(),GetPathnameAsync() - Hash navigation:
GetHashAsync(),SetHashAsync() - Query parameters:
GetQueryStringAsync(),GetQueryParamAsync(),GetAllQueryParamsAsync() - Page control:
ReloadAsync() - Integration with
RouterNavigationServiceprovidingGoBackAsync(),GoForwardAsync(),CanGoBackAsync()
- History API:
-
DocumentInterop Service: Document manipulation and SEO support
- Title management:
SetTitleAsync(),GetTitleAsync() - Meta tags:
SetMetaTagAsync(),GetMetaTagAsync(),RemoveMetaTagAsync() - Open Graph support:
SetOpenGraphTagAsync() - Canonical URLs:
SetCanonicalUrlAsync(),GetCanonicalUrlAsync() - Scroll control:
ScrollToTopAsync(),ScrollToBottomAsync(),ScrollToElementAsync(),GetScrollPositionAsync(),SetScrollPositionAsync() - Element management:
FocusElementAsync(),IsElementVisibleAsync() - CSS classes:
AddClassAsync(),RemoveClassAsync(),ToggleClassAsync() - Document state:
GetReadyStateAsync(),IsDocumentReadyAsync()
- Title management:
-
StorageInterop Service: Type-safe localStorage and sessionStorage access
- LocalStorage operations:
SetLocalStorageAsync<T>(),GetLocalStorageAsync<T>(),RemoveLocalStorageAsync(),ClearLocalStorageAsync(),GetLocalStorageKeysAsync(),HasLocalStorageAsync() - SessionStorage operations:
SetSessionStorageAsync<T>(),GetSessionStorageAsync<T>(),RemoveSessionStorageAsync(),ClearSessionStorageAsync(),GetSessionStorageKeysAsync(),HasSessionStorageAsync() - Generic type support with automatic JSON serialization/deserialization
- LocalStorage operations:
-
ViewportInterop Service: Viewport, screen, and device detection
- Viewport dimensions:
GetViewportSizeAsync()returningSizerecord with width and height - Screen information:
GetScreenSizeAsync() - Device pixel ratio:
GetPixelRatioAsync() - Orientation:
IsPortraitAsync(),IsLandscapeAsync(),GetOrientationAsync() - Device type detection:
IsMobileAsync(),IsTabletAsync(),IsDesktopAsync(),GetDeviceTypeAsync() - Fullscreen API:
IsFullscreenAsync(),RequestFullscreenAsync(),ExitFullscreenAsync()
- Viewport dimensions:
-
ClipboardInterop Service: Clipboard operations with permission support
- Text operations:
CopyTextAsync(),ReadTextAsync() - Feature detection:
IsClipboardSupportedAsync() - Permission checks:
HasClipboardReadPermissionAsync(),HasClipboardWritePermissionAsync() - Fallback support for older browsers in
copyText()implementation
- Text operations:
-
Service Organization: All interop services in
Blazouter.Interopsnamespace- Located at
src/Blazouter/Interops/folder AddBlazouterInterop()extension method for DI registration (optional, non-breaking)- Services injected as nullable dependencies for backward compatibility
- Located at
-
Documentation: Comprehensive guides and API references
TYPESCRIPT_INTEGRATION.md: Complete documentation with usage examples, API references, migration guide, and hosting-specific instructions for WebAssembly, Hybrid, and Server modelsFEATURES.md: Feature #13 with detailed descriptions of all 5 interop services and their capabilitiesREADME.md: Installation instructions with JavaScript module import requirement, updated Project Structuresrc/Blazouter/README.md(NuGet): Concise TypeScript Integration section for package consumers- All documentation includes required module import:
<script type="module" src="_content/Blazouter/js/index.js"></script>
-
Route Caching System: Sophisticated caching layer for optimal navigation performance
IRouteCacheServiceinterface defining cache operationsRouteCacheServiceimplementation with thread-safe concurrent operationsCachedRouteMatcherServicedecorator pattern wrappingRouteMatcherServicewith cachingCacheOptionsmodel for configuring cache behavior:EnableRouteMatchCache: Enable/disable route match caching (default: true)EnableComponentTypeCache: Enable/disable component type caching (default: true)MaxRouteMatchCacheSize: Maximum cache entries (default: 100)MaxComponentTypeCacheSize: Maximum component cache entries (default: 50)RouteMatchCacheTTLSeconds: Time-to-live for cache entries (default: 0 = no expiration)EnableStatistics: Enable cache performance tracking
CacheStatisticsmodel providing performance metrics: TotalRequests, CacheHits, CacheMisses, HitRate- LRU (Least Recently Used) eviction policy for route matches
- FIFO (First In First Out) eviction policy for component types
- 10-100x faster subsequent navigations through cache hits
RouteCacheExtensionswithGetFormattedStatistics()helper method
-
Per-Route Cache Control: Fine-grained cache control at route level
RouteConfig.EnableCacheproperty for per-route cache control (true/false/null)[RouteCache]attribute for declarative cache configuration on components- Attribute coverage increased from 83% to 92% (11/12 RouteConfig properties)
- Sample
CacheExample.razorpage demonstrating attribute-based cache control
-
Cache Documentation: Comprehensive caching documentation
CACHING.md: Complete documentation covering architecture, configuration, usage examples, best practices, and troubleshootingATTRIBUTE_ROUTING.md: Updated with[RouteCache]attribute documentation and feature matrix
Changed
- Project structure updated to include:
src/Blazouter.TypeScript/- Separate project for TypeScript source filessrc/Blazouter/Interops/- All interop service implementationssrc/Blazouter/wwwroot/js/- Compiled JavaScript modules (.js, .d.ts, .js.map files)
RouterNavigationServiceenhanced with navigation interop integration- Service registration extended via
AddBlazouterInterop()method
Technical Details
- TypeScript source files: navigation.ts, document.ts, storage.ts, viewport.ts, clipboard.ts, index.ts
- ES module format with explicit .js extensions for browser compatibility
- TypeScript compilation generates declaration files for IntelliSense
- JavaScript modules exposed via window object for C# JSRuntime interop
- Optional module import - services gracefully handle missing JavaScript modules
- Backward compatible - existing applications continue working without changes
1.0.12 - 2025-11-25
Added
- Route Middleware System: Comprehensive middleware pipeline for cross-cutting concerns
IRouteMiddlewareinterface for implementing custom route middlewareRouteMiddlewareContextmodel providing access to route match, path, and shared data dictionaryRouteMiddlewareAttributefor declarative middleware configuration on components- Pipeline execution pattern with
InvokeAsync(context, next)method signature - Support for before/after navigation logic by placing code around the
next()delegate call - Ability to short-circuit navigation by not calling
next() AbortandRedirectPathproperties for conditional navigation controlDatadictionary for sharing state between middleware and components- Middleware instantiation via dependency injection or
Activator.CreateInstancefallback - Execution order: Middleware runs before route guards in the navigation pipeline
- Multiple middleware support with ordered execution based on declaration order
RouterErrorType.MiddlewareExecutionerror type for middleware-specific error handling- Common use cases: logging, analytics, performance monitoring, data preloading, caching, feature flags, A/B testing, session management, error tracking
Changed
- Router component now executes middleware pipeline before guard evaluation
- Enhanced
RouteConfig.Middlewareproperty with comprehensive XML documentation - Updated project structure to include Middleware directory
1.0.11 - 2025-11-24
Added
- Query String Helpers and Utilities: Comprehensive type-safe query string manipulation
QueryStringBuilderclass with fluent API for building query strings- 15 type-safe
Add()method overloads supporting string, int, long, decimal, double, bool, DateTime, Guid, enum, and nullable variants - 15 type-safe
Set()method overloads for replacing values (prevents duplicates) RouterStateExtensionswith typed query parameter parsing methods:GetQueryInt(),GetQueryBool(),GetQueryDateTime(), etc.GetAllQueryParams()method to retrieve all query parameters as a dictionaryRouterNavigationExtensionsfor enhanced navigation with query stringsNavigateToWithQuery()for fluent query string building during navigationNavigateToWithUpdatedQuery()for updating specific parameters while preserving othersNavigateToWithRemovedQuery()andNavigateToWithClearedQuery()for parameter removalNavigateToWithSingleQuery()convenience methods for single parameter navigation- Automatic URL encoding via
Uri.EscapeDataString - Safe parsing with
TryParseand default value support - Comprehensive XML documentation with usage examples
Changed
- Updated README.md with Query String Utilities documentation and usage examples
- Enhanced UserList sample component to display all query parameters using
GetAllQueryParams() - Updated project structure documentation to reflect new Utilities directory
1.0.10 - 2025-11-19
Added
- Enhanced Route Transitions: Expanded from 4 to 14 built-in transition types
- Added:
None,Pop,Blur,Reveal,Rotate,Curtain,SlideFade,Spotlight,Swipe,Lift - All transitions are GPU-accelerated for smooth performance
- Respects
prefers-reduced-motionaccessibility preference - Comprehensive XML documentation for each transition type with use cases and best practices
- Added:
- Attribute-Based Routing System: Complete declarative routing configuration
- 8 attribute types:
[Route],[RouteGuard],[RouteTransition],[RouteLayout],[RouteTitle],[RouteData],[RouteRedirect],[RouteExact] RouteAttributeDiscoveryServicefor automatic route discovery via assembly scanningAddAttributeRoutes()extension method for mixing programmatic and attribute-based routesFromAttributes()static method for pure attribute-based configuration- Full support for nested routes and complex configurations via attributes
- Detailed documentation in ATTRIBUTE_ROUTING.md
- 8 attribute types:
- Comprehensive Error Handling System
IRouterErrorHandlerinterface for custom error handling implementationsDefaultRouterErrorHandlerwith built-in console loggingRouterErrorContextproviding detailed error information and contextRouterErrorTypeenum with error categories:ComponentLoadFailed,GuardRejected,NavigationFailed,InvalidRouteErrorContentRenderFragment parameter in Router component for custom error UI- Retry mechanism support for failed operations
- Error event notifications throughout routing lifecycle
AddBlazouterErrorHandler<T>()extension method for registering custom error handlers
- Enhanced Layout System
DefaultLayoutparameter on Router component for application-wide layouts- Per-route layout override via
RouteConfig.Layoutproperty - Support for no-layout routes by explicitly setting
Layout = null - Layout priority system: Route.Layout > Router.DefaultLayout > No Layout
HasExplicitLayoutinternal flag for proper layout resolution- Seamless layout switching during navigation with state preservation
- Additional Components and Services
BlankLayoutcomponent for routes requiring no layout structure- Enhanced
RouteMatcherServicewith improved pattern matching RouterStateServicewith parameter change notifications- Loading state support with
<Loading>RenderFragment parameter in Router - Component caching for lazy-loaded routes after first load
Changed
- Documentation Overhaul
- README.md: Updated to reflect all 14 transitions, added error handling section, enhanced project structure
- FEATURES.md: Expanded from 8 to 10 features with detailed implementation descriptions
- All sample applications updated to showcase 14 transitions instead of 4
- Added comprehensive comparison table showing Blazouter advantages over traditional Blazor routing
- Project Structure section now includes all folders: Attributes/, Extensions/, Resources/, Components/Layouts/
- Enhanced RouteConfig Model
- Added
HasExplicitLayoutproperty for proper layout handling - Improved XML documentation for all properties
- Better support for complex nested route scenarios
- Added
- Sample Applications
- All 4 sample apps (WebAssembly, Server, Hybrid, Web) updated with transition demos
- Added demo pages for all 14 transition types with descriptions and code examples
- Enhanced Home.razor with accurate feature showcase
- Added Transitions.razor pages demonstrating all transition types
Fixed
- Layout handling when explicitly set to null vs. not set
- Documentation inconsistencies between README.md and FEATURES.md
- Sample applications showing outdated feature counts
1.0.9 - 2025-11-18
Changed
- Documentation links updated to reflect new repository location
1.0.6-1.0.8 - 2025-11-16 to 2025-11-17
Note
- Internal version increments for package stability and distribution
- Minor bug fixes and improvements
Deprecated
- Blazouter.Web package: The
Blazouter.Webpackage has been deprecated in favor of usingBlazouter.ServerandBlazouter.WebAssemblyfor Blazor Web Applications. This provides a clearer, more consistent package structure where:- Server project uses:
Blazouter.Server - Client project uses:
Blazouter.WebAssembly
- Server project uses:
Changed
- Documentation updated: All documentation (README.md, FEATURES.md, package READMEs) updated to reflect the deprecated status of
Blazouter.Weband provide guidance on usingBlazouter.Server+Blazouter.WebAssemblyfor Blazor Web Applications - Sample application: Blazor Web sample now uses
Blazouter.Serverfor server project andBlazouter.WebAssemblyfor client project
1.0.5 - 2025-11-16
Added
- Multiple NuGet Packages: Split into 4 specialized packages for better modularity
Blazouter: Core library (required for all hosting models)Blazouter.Hybrid: MAUI/Hybrid support for iOS, Android, macOS, and WindowsBlazouter.Server: Server-side Blazor extensions withAddBlazouterSupport()Blazouter.WebAssembly: WebAssembly-specific optimizations
- Professional NuGet package metadata for all packages
- Package-specific README files
- Optimized package icons
- Comprehensive descriptions and tags
- SourceLink support for debugging
- Symbol packages (.snupkg) for all packages
- Multi-framework targeting:
- Core library: net6.0, net7.0, net8.0, net9.0, net10.0
- Server: net8.0, net9.0, net10.0
- Hybrid: net9.0, net10.0 (platform-specific)
- WebAssembly: net6.0, net7.0, net8.0, net9.0, net10.0
Changed
- Project structure reorganized into multiple packages
- Documentation updated to reflect 4-package architecture
- README files now specific to each package's features and use cases
1.0.2 - 2025-11-15
Added
- Type-safe
RouteTransitionenum for better IntelliSense and compile-time safety - Enhanced sample application with comprehensive demos:
- Professional home page with feature showcase
- Navigation demo page with programmatic navigation examples
- Transitions demo page showcasing all 4 transition types
- Loading state for lazy-loaded routes to prevent 404 flash
- XML documentation comments for better IDE support
Fixed
- Component re-rendering issue when navigating between routes with same component but different parameters
- Lazy-loaded routes showing 404 page briefly before component loads
- Visual Studio IntelliSense warnings for multiple RenderFragment parameters
Changed
- Improved sample application UI/UX with modern gradient design
- Enhanced documentation with more examples and use cases
1.0.1 - 2025-11-14
Added
- Initial release of Blazouter
- Core routing components (Router, RouterLink, RouterOutlet)
- Nested routes support
- Route guards for authentication/authorization
- Lazy loading with ComponentLoader
- Route transitions (fade, slide, slide-up, scale)
- Programmatic navigation service
- Dynamic route parameters
- Query string support
- Active link state management
Documentation
- Comprehensive README with examples
- FEATURES.md detailing all capabilities
- Sample application demonstrating key features