├── .gitignore
├── Chapter02
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── Pages
│ │ │ └── Counter.razor
│ │ ├── Program.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ ├── Home.razor
│ │ │ └── Weather.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ └── MyBlog.sln
├── Chapter03
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── Pages
│ │ │ └── Counter.razor
│ │ ├── Program.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ ├── Home.razor
│ │ │ └── Weather.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── Data.Models
│ ├── BlogPost.cs
│ ├── Category.cs
│ ├── Comment.cs
│ ├── Data.Models.csproj
│ ├── Interfaces
│ │ └── IBlogApi.cs
│ └── Tag.cs
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ ├── Data
│ ├── BlogApiJsonDirectAccess.cs
│ ├── BlogApiJsonDirectAccessSetting.cs
│ └── Data.csproj
│ ├── EntityFramework
│ ├── Data.Tests
│ │ ├── BlogApiTestsUsingEntityFramework.cs
│ │ ├── Data.Tests.csproj
│ │ ├── Data
│ │ │ ├── Blogposts
│ │ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ │ ├── Categories
│ │ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ │ ├── Comments
│ │ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ │ └── Tags
│ │ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ │ ├── DataTestFixture.cs
│ │ └── GlobalUsings.cs
│ └── Data
│ │ ├── BlogApiEntityFrameworkDirectAccess.cs
│ │ ├── Data.csproj
│ │ ├── Entities
│ │ ├── BlogDbContext.cs
│ │ ├── BlogPost.cs
│ │ ├── Category.cs
│ │ ├── Comment.cs
│ │ └── Tag.cs
│ │ ├── Migrations
│ │ ├── 20231109113913_InitialCreate.Designer.cs
│ │ ├── 20231109113913_InitialCreate.cs
│ │ └── BlogDbContextModelSnapshot.cs
│ │ └── Nuget.config
│ ├── MyBlog.sln
│ └── RavenDb
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ └── Data
│ ├── BlogApiRavenDbDirectAccess.cs
│ └── Data.csproj
├── Chapter04
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── Pages
│ │ │ └── Counter.razor
│ │ ├── Program.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ └── Weather.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── Data.Models
│ ├── BlogPost.cs
│ ├── Category.cs
│ ├── Comment.cs
│ ├── Data.Models.csproj
│ ├── Interfaces
│ │ └── IBlogApi.cs
│ └── Tag.cs
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ ├── Data
│ ├── BlogApiJsonDirectAccess.cs
│ ├── BlogApiJsonDirectAccessSetting.cs
│ └── Data.csproj
│ ├── Examples
│ ├── CounterWithoutRazor.cs
│ ├── WeatherWithCodeBehind.razor
│ ├── WeatherWithCodeBehind.razor.cs
│ ├── WeatherWithInherits.razor
│ └── WeatherWithInheritsModel.cs
│ ├── MyBlog.sln
│ └── SharedComponents
│ ├── Nuget.config
│ ├── Pages
│ └── Home.razor
│ ├── SharedComponents.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ ├── background.png
│ └── exampleJsInterop.js
├── Chapter05
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── Pages
│ │ │ └── Counter.razor
│ │ ├── Program.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── CounterWithParameterAndEvent.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ └── Weather.razor
│ │ ├── ParentCounter.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── Data.Models
│ ├── BlogPost.cs
│ ├── Category.cs
│ ├── Comment.cs
│ ├── Data.Models.csproj
│ ├── Interfaces
│ │ └── IBlogApi.cs
│ └── Tag.cs
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ ├── Data
│ ├── BlogApiJsonDirectAccess.cs
│ ├── BlogApiJsonDirectAccessSetting.cs
│ └── Data.csproj
│ ├── Examples
│ ├── CounterWithoutRazor.cs
│ ├── WeatherWithCodeBehind.razor
│ ├── WeatherWithCodeBehind.razor.cs
│ ├── WeatherWithInherits.razor
│ └── WeatherWithInheritsModel.cs
│ ├── MyBlog.sln
│ ├── SharedComponents
│ ├── ErrorBoundaryDemo
│ │ ├── ComponentWithError.razor
│ │ ├── CustomErrorBoundaryDemo.razor
│ │ └── ErrorBoundaryDemo.razor
│ ├── Nuget.config
│ ├── Pages
│ │ ├── AlertTest.razor
│ │ ├── ErrorBoundaryTest.razor
│ │ ├── Home.razor
│ │ ├── Post.razor
│ │ ├── RenderFragmentTest.razor
│ │ └── SetFocus.razor
│ ├── ReusableComponents
│ │ └── Alert.razor
│ ├── SharedComponents.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── background.png
│ │ └── exampleJsInterop.js
│ └── Snippets
│ └── builder.snippet
├── Chapter06
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── Pages
│ │ │ ├── Admin
│ │ │ │ └── TagList.razor
│ │ │ └── Counter.razor
│ │ ├── Program.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── CounterWithParameterAndEvent.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ └── Weather.razor
│ │ ├── ParentCounter.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── Data.Models
│ ├── BlogPost.cs
│ ├── Category.cs
│ ├── Comment.cs
│ ├── Data.Models.csproj
│ ├── Interfaces
│ │ └── IBlogApi.cs
│ └── Tag.cs
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ ├── Data
│ ├── BlogApiJsonDirectAccess.cs
│ ├── BlogApiJsonDirectAccessSetting.cs
│ └── Data.csproj
│ ├── Examples
│ ├── CounterWithoutRazor.cs
│ ├── WeatherWithCodeBehind.razor
│ ├── WeatherWithCodeBehind.razor.cs
│ ├── WeatherWithInherits.razor
│ └── WeatherWithInheritsModel.cs
│ ├── MyBlog.sln
│ ├── SharedComponents
│ ├── BootstrapFieldCssClassProvider.cs
│ ├── CustomCssClassProvider.cs
│ ├── ErrorBoundaryDemo
│ │ ├── ComponentWithError.razor
│ │ ├── CustomErrorBoundaryDemo.razor
│ │ └── ErrorBoundaryDemo.razor
│ ├── InputTextAreaOnInput.cs
│ ├── ItemList.razor
│ ├── Nuget.config
│ ├── Pages
│ │ ├── Admin
│ │ │ ├── BlogPostEdit.razor
│ │ │ ├── BlogPostList.razor
│ │ │ └── CategoryList.razor
│ │ ├── AlertTest.razor
│ │ ├── Comments.razor
│ │ ├── ErrorBoundaryTest.razor
│ │ ├── Home.razor
│ │ ├── Post.razor
│ │ ├── RenderFragmentTest.razor
│ │ └── SetFocus.razor
│ ├── ReusableComponents
│ │ ├── Alert.razor
│ │ ├── BlogButton.razor
│ │ ├── BlogInputText.razor
│ │ └── BlogNavigationLock.razor
│ ├── SharedComponents.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── background.png
│ │ └── exampleJsInterop.js
│ └── Snippets
│ └── builder.snippet
├── Chapter07
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── BlogApiWebClient.cs
│ │ ├── Pages
│ │ │ ├── Admin
│ │ │ │ └── TagList.razor
│ │ │ └── Counter.razor
│ │ ├── Program.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── CounterWithParameterAndEvent.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ └── Weather.razor
│ │ ├── ParentCounter.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Endpoints
│ │ ├── BlogPostEndpoints.cs
│ │ ├── CategoryEndpoints.cs
│ │ ├── CommentEndpoints.cs
│ │ └── TagEndpoints.cs
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── Data.Models
│ ├── BlogPost.cs
│ ├── Category.cs
│ ├── Comment.cs
│ ├── Data.Models.csproj
│ ├── Interfaces
│ │ └── IBlogApi.cs
│ └── Tag.cs
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ ├── Data
│ ├── BlogApiJsonDirectAccess.cs
│ ├── BlogApiJsonDirectAccessSetting.cs
│ └── Data.csproj
│ ├── Examples
│ ├── CounterWithoutRazor.cs
│ ├── WeatherWithCodeBehind.razor
│ ├── WeatherWithCodeBehind.razor.cs
│ ├── WeatherWithInherits.razor
│ └── WeatherWithInheritsModel.cs
│ ├── MyBlog.sln
│ ├── SharedComponents
│ ├── BootstrapFieldCssClassProvider.cs
│ ├── CustomCssClassProvider.cs
│ ├── ErrorBoundaryDemo
│ │ ├── ComponentWithError.razor
│ │ ├── CustomErrorBoundaryDemo.razor
│ │ └── ErrorBoundaryDemo.razor
│ ├── InputTextAreaOnInput.cs
│ ├── ItemList.razor
│ ├── Nuget.config
│ ├── Pages
│ │ ├── Admin
│ │ │ ├── BlogPostEdit.razor
│ │ │ ├── BlogPostList.razor
│ │ │ └── CategoryList.razor
│ │ ├── AlertTest.razor
│ │ ├── Comments.razor
│ │ ├── ErrorBoundaryTest.razor
│ │ ├── Home.razor
│ │ ├── Post.razor
│ │ ├── RenderFragmentTest.razor
│ │ └── SetFocus.razor
│ ├── ReusableComponents
│ │ ├── Alert.razor
│ │ ├── BlogButton.razor
│ │ ├── BlogInputText.razor
│ │ └── BlogNavigationLock.razor
│ ├── SharedComponents.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── background.png
│ │ └── exampleJsInterop.js
│ └── Snippets
│ └── builder.snippet
├── Chapter08
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── BlogApiWebClient.cs
│ │ ├── Pages
│ │ │ ├── Admin
│ │ │ │ └── TagList.razor
│ │ │ └── Counter.razor
│ │ ├── PersistentAuthenticationStateProvider.cs
│ │ ├── Program.cs
│ │ ├── UserInfo.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── CounterWithParameterAndEvent.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── LoginStatus.razor
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ └── Weather.razor
│ │ ├── ParentCounter.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Endpoints
│ │ ├── BlogPostEndpoints.cs
│ │ ├── CategoryEndpoints.cs
│ │ ├── CommentEndpoints.cs
│ │ └── TagEndpoints.cs
│ │ ├── PersistingServerAuthenticationStateProvider.cs
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── Data.Models
│ ├── BlogPost.cs
│ ├── Category.cs
│ ├── Comment.cs
│ ├── Data.Models.csproj
│ ├── Interfaces
│ │ └── IBlogApi.cs
│ └── Tag.cs
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ ├── Data
│ ├── BlogApiJsonDirectAccess.cs
│ ├── BlogApiJsonDirectAccessSetting.cs
│ └── Data.csproj
│ ├── Examples
│ ├── CounterWithoutRazor.cs
│ ├── WeatherWithCodeBehind.razor
│ ├── WeatherWithCodeBehind.razor.cs
│ ├── WeatherWithInherits.razor
│ └── WeatherWithInheritsModel.cs
│ ├── MyBlog.sln
│ ├── SharedComponents
│ ├── BootstrapFieldCssClassProvider.cs
│ ├── CustomCssClassProvider.cs
│ ├── ErrorBoundaryDemo
│ │ ├── ComponentWithError.razor
│ │ ├── CustomErrorBoundaryDemo.razor
│ │ └── ErrorBoundaryDemo.razor
│ ├── InputTextAreaOnInput.cs
│ ├── ItemList.razor
│ ├── Nuget.config
│ ├── Pages
│ │ ├── Admin
│ │ │ ├── BlogPostEdit.razor
│ │ │ ├── BlogPostList.razor
│ │ │ └── CategoryList.razor
│ │ ├── AlertTest.razor
│ │ ├── Comments.razor
│ │ ├── ErrorBoundaryTest.razor
│ │ ├── Home.razor
│ │ ├── Post.razor
│ │ ├── RenderFragmentTest.razor
│ │ └── SetFocus.razor
│ ├── ReusableComponents
│ │ ├── Alert.razor
│ │ ├── BlogButton.razor
│ │ ├── BlogInputText.razor
│ │ └── BlogNavigationLock.razor
│ ├── SharedComponents.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── background.png
│ │ └── exampleJsInterop.js
│ └── Snippets
│ └── builder.snippet
├── Chapter09
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── BlogApiWebClient.cs
│ │ ├── Pages
│ │ │ ├── Admin
│ │ │ │ ├── TagList.razor
│ │ │ │ └── TagList.razor.bak
│ │ │ └── Counter.razor
│ │ ├── PersistentAuthenticationStateProvider.cs
│ │ ├── Program.cs
│ │ ├── Program.cs.bak
│ │ ├── UserInfo.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── CounterWithParameterAndEvent.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── LoginStatus.razor
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ └── Weather.razor
│ │ ├── ParentCounter.razor
│ │ ├── Routes.razor
│ │ ├── Routes.razor.bak
│ │ └── _Imports.razor
│ │ ├── Endpoints
│ │ ├── BlogPostEndpoints.cs
│ │ ├── CategoryEndpoints.cs
│ │ ├── CommentEndpoints.cs
│ │ └── TagEndpoints.cs
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── Data.Models
│ ├── BlogPost.cs
│ ├── Category.cs
│ ├── Comment.cs
│ ├── Data.Models.csproj
│ ├── Interfaces
│ │ └── IBlogApi.cs
│ └── Tag.cs
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ ├── Data
│ ├── BlogApiJsonDirectAccess.cs
│ ├── BlogApiJsonDirectAccessSetting.cs
│ └── Data.csproj
│ ├── Examples
│ ├── CounterWithoutRazor.cs
│ ├── WeatherWithCodeBehind.razor
│ ├── WeatherWithCodeBehind.razor.cs
│ ├── WeatherWithInherits.razor
│ └── WeatherWithInheritsModel.cs
│ ├── MyBlog.sln
│ ├── SharedComponents
│ ├── BootstrapFieldCssClassProvider.cs
│ ├── CustomCssClassProvider.cs
│ ├── ErrorBoundaryDemo
│ │ ├── ComponentWithError.razor
│ │ ├── CustomErrorBoundaryDemo.razor
│ │ └── ErrorBoundaryDemo.razor
│ ├── InputTextAreaOnInput.cs
│ ├── ItemList.razor
│ ├── Nuget.config
│ ├── Pages
│ │ ├── Admin
│ │ │ ├── BlogPostEdit.razor
│ │ │ ├── BlogPostList.razor
│ │ │ └── CategoryList.razor
│ │ ├── AlertTest.razor
│ │ ├── Comments.razor
│ │ ├── ErrorBoundaryTest.razor
│ │ ├── Home.razor
│ │ ├── Post.razor
│ │ ├── RenderFragmentTest.razor
│ │ └── SetFocus.razor
│ ├── ReusableComponents
│ │ ├── Alert.razor
│ │ ├── BlogButton.razor
│ │ ├── BlogInputText.razor
│ │ └── BlogNavigationLock.razor
│ ├── SharedComponents.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── background.png
│ │ ├── bootstrap.min.css
│ │ └── exampleJsInterop.js
│ └── Snippets
│ └── builder.snippet
├── Chapter10
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── BlogApiWebClient.cs
│ │ ├── Pages
│ │ │ ├── Admin
│ │ │ │ └── TagList.razor
│ │ │ └── Counter.razor
│ │ ├── PersistentAuthenticationStateProvider.cs
│ │ ├── Program.cs
│ │ ├── UserInfo.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── CounterWithParameterAndEvent.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── LoginStatus.razor
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ └── Weather.razor
│ │ ├── ParentCounter.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Endpoints
│ │ ├── BlogPostEndpoints.cs
│ │ ├── CategoryEndpoints.cs
│ │ ├── CommentEndpoints.cs
│ │ └── TagEndpoints.cs
│ │ ├── PersistingServerAuthenticationStateProvider.cs
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── Data.Models
│ ├── BlogPost.cs
│ ├── Category.cs
│ ├── Comment.cs
│ ├── Data.Models.csproj
│ ├── Interfaces
│ │ └── IBlogApi.cs
│ └── Tag.cs
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ ├── Data
│ ├── BlogApiJsonDirectAccess.cs
│ ├── BlogApiJsonDirectAccessSetting.cs
│ └── Data.csproj
│ ├── Examples
│ ├── CounterWithoutRazor.cs
│ ├── WeatherWithCodeBehind.razor
│ ├── WeatherWithCodeBehind.razor.cs
│ ├── WeatherWithInherits.razor
│ └── WeatherWithInheritsModel.cs
│ ├── MyBlog.sln
│ ├── SharedComponents
│ ├── BootstrapFieldCssClassProvider.cs
│ ├── CustomCssClassProvider.cs
│ ├── Demo
│ │ ├── HighChart.razor
│ │ ├── HighChart.razor.js
│ │ ├── HighChartTest.razor
│ │ ├── JSInteropSamples
│ │ │ ├── JSToReferenceNET.razor
│ │ │ ├── JSToReferenceNET.razor.js
│ │ │ ├── JSToStaticNET.razor
│ │ │ ├── JSToStaticNET.razor.js
│ │ │ ├── NetToJS.razor
│ │ │ └── NetToJS.razor.js
│ │ └── JSInteropSamplesWasm
│ │ │ ├── JSToStaticNET.razor
│ │ │ ├── JSToStaticNET.razor.cs
│ │ │ ├── JSToStaticNET.razor.js
│ │ │ ├── NetToJS.razor
│ │ │ ├── NetToJS.razor.cs
│ │ │ └── NetToJS.razor.js
│ ├── ErrorBoundaryDemo
│ │ ├── ComponentWithError.razor
│ │ ├── CustomErrorBoundaryDemo.razor
│ │ └── ErrorBoundaryDemo.razor
│ ├── InputTextAreaOnInput.cs
│ ├── ItemList.razor
│ ├── Nuget.config
│ ├── Pages
│ │ ├── Admin
│ │ │ ├── BlogPostEdit.razor
│ │ │ ├── BlogPostList.razor
│ │ │ └── CategoryList.razor
│ │ ├── AlertTest.razor
│ │ ├── Comments.razor
│ │ ├── ErrorBoundaryTest.razor
│ │ ├── Home.razor
│ │ ├── Post.razor
│ │ ├── RenderFragmentTest.razor
│ │ └── SetFocus.razor
│ ├── ReusableComponents
│ │ ├── Alert.razor
│ │ ├── BlogButton.razor
│ │ ├── BlogButton.razor.js
│ │ ├── BlogInputText.razor
│ │ └── BlogNavigationLock.razor
│ ├── SharedComponents.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── background.png
│ │ ├── bootstrap.min.css
│ │ └── exampleJsInterop.js
│ └── Snippets
│ └── builder.snippet
├── Chapter11
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── BlogApiWebClient.cs
│ │ ├── Pages
│ │ │ ├── Admin
│ │ │ │ └── TagList.razor
│ │ │ └── Counter.razor
│ │ ├── PersistentAuthenticationStateProvider.cs
│ │ ├── Program.cs
│ │ ├── Services
│ │ │ ├── BlazorWebAssemblyBlogNotificationService.cs
│ │ │ └── BlogBrowserStorage.cs
│ │ ├── UserInfo.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── CounterWithParameterAndEvent.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── LoginStatus.razor
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ └── Weather.razor
│ │ ├── ParentCounter.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Endpoints
│ │ ├── BlogPostEndpoints.cs
│ │ ├── CategoryEndpoints.cs
│ │ ├── CommentEndpoints.cs
│ │ └── TagEndpoints.cs
│ │ ├── Hubs
│ │ └── BlogNotificationHub.cs
│ │ ├── PersistingServerAuthenticationStateProvider.cs
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── Services
│ │ ├── BlazorServerBlogNotificationService.cs
│ │ └── BlogProtectedBrowserStorage.cs
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── Data.Models
│ ├── BlogPost.cs
│ ├── Category.cs
│ ├── Comment.cs
│ ├── Data.Models.csproj
│ ├── Interfaces
│ │ └── IBlogApi.cs
│ └── Tag.cs
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ ├── Data
│ ├── BlogApiJsonDirectAccess.cs
│ ├── BlogApiJsonDirectAccessSetting.cs
│ └── Data.csproj
│ ├── Examples
│ ├── CounterWithoutRazor.cs
│ ├── WeatherWithCodeBehind.razor
│ ├── WeatherWithCodeBehind.razor.cs
│ ├── WeatherWithInherits.razor
│ └── WeatherWithInheritsModel.cs
│ ├── MyBlog.sln
│ ├── RootLevelCascadingValueDemo
│ ├── RootLevelCascadingValueDemo.Client
│ │ ├── CascadingValueDemo.razor
│ │ ├── Pages
│ │ │ └── Counter.razor
│ │ ├── Preferences.cs
│ │ ├── Program.cs
│ │ ├── RootLevelCascadingValueDemo.Client.csproj
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ └── RootLevelCascadingValueDemo
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ ├── Home.razor
│ │ │ └── Weather.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── RootLevelCascadingValueDemo.csproj
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── SharedComponents
│ ├── BootstrapFieldCssClassProvider.cs
│ ├── CustomCssClassProvider.cs
│ ├── Demo
│ │ ├── HighChart.razor
│ │ ├── HighChart.razor.js
│ │ ├── HighChartTest.razor
│ │ ├── JSInteropSamples
│ │ │ ├── JSToReferenceNET.razor
│ │ │ ├── JSToReferenceNET.razor.js
│ │ │ ├── JSToStaticNET.razor
│ │ │ ├── JSToStaticNET.razor.js
│ │ │ ├── NetToJS.razor
│ │ │ └── NetToJS.razor.js
│ │ └── JSInteropSamplesWasm
│ │ │ ├── JSToStaticNET.razor
│ │ │ ├── JSToStaticNET.razor.cs
│ │ │ ├── JSToStaticNET.razor.js
│ │ │ ├── NetToJS.razor
│ │ │ ├── NetToJS.razor.cs
│ │ │ └── NetToJS.razor.js
│ ├── ErrorBoundaryDemo
│ │ ├── ComponentWithError.razor
│ │ ├── CustomErrorBoundaryDemo.razor
│ │ └── ErrorBoundaryDemo.razor
│ ├── InputTextAreaOnInput.cs
│ ├── Interfaces
│ │ ├── IBlogNotificationService.cs
│ │ └── IBrowserStorage.cs
│ ├── ItemList.razor
│ ├── Nuget.config
│ ├── Pages
│ │ ├── Admin
│ │ │ ├── BlogPostEdit.razor
│ │ │ ├── BlogPostList.razor
│ │ │ └── CategoryList.razor
│ │ ├── AlertTest.razor
│ │ ├── Comments.razor
│ │ ├── ErrorBoundaryTest.razor
│ │ ├── Home.razor
│ │ ├── Post.razor
│ │ ├── RenderFragmentTest.razor
│ │ └── SetFocus.razor
│ ├── ReusableComponents
│ │ ├── Alert.razor
│ │ ├── BlogButton.razor
│ │ ├── BlogButton.razor.js
│ │ ├── BlogInputText.razor
│ │ └── BlogNavigationLock.razor
│ ├── SharedComponents.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── background.png
│ │ ├── bootstrap.min.css
│ │ └── exampleJsInterop.js
│ └── Snippets
│ └── builder.snippet
├── Chapter12
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── BlogApiWebClient.cs
│ │ ├── Pages
│ │ │ ├── Admin
│ │ │ │ └── TagList.razor
│ │ │ └── Counter.razor
│ │ ├── PersistentAuthenticationStateProvider.cs
│ │ ├── Program.cs
│ │ ├── Services
│ │ │ ├── BlazorWebAssemblyBlogNotificationService.cs
│ │ │ └── BlogBrowserStorage.cs
│ │ ├── UserInfo.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── CounterWithParameterAndEvent.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── LoginStatus.razor
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ └── Weather.razor
│ │ ├── ParentCounter.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Endpoints
│ │ ├── BlogPostEndpoints.cs
│ │ ├── CategoryEndpoints.cs
│ │ ├── CommentEndpoints.cs
│ │ └── TagEndpoints.cs
│ │ ├── Hubs
│ │ └── BlogNotificationHub.cs
│ │ ├── PersistingServerAuthenticationStateProvider.cs
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── Services
│ │ ├── BlazorServerBlogNotificationService.cs
│ │ └── BlogProtectedBrowserStorage.cs
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── BlazorWebAssemblyApp
│ ├── App.razor
│ ├── BlazorWebAssemblyApp.csproj
│ ├── Layout
│ │ ├── MainLayout.razor
│ │ ├── MainLayout.razor.css
│ │ ├── NavMenu.razor
│ │ └── NavMenu.razor.css
│ ├── Pages
│ │ ├── Counter.razor
│ │ ├── Home.razor
│ │ ├── ThrowException.razor
│ │ └── Weather.razor
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── css
│ │ ├── app.css
│ │ └── bootstrap
│ │ │ ├── bootstrap.min.css
│ │ │ └── bootstrap.min.css.map
│ │ ├── favicon.png
│ │ ├── icon-192.png
│ │ ├── index.html
│ │ └── sample-data
│ │ └── weather.json
│ ├── Data.Models
│ ├── BlogPost.cs
│ ├── Category.cs
│ ├── Comment.cs
│ ├── Data.Models.csproj
│ ├── Interfaces
│ │ └── IBlogApi.cs
│ └── Tag.cs
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ ├── Data
│ ├── BlogApiJsonDirectAccess.cs
│ ├── BlogApiJsonDirectAccessSetting.cs
│ └── Data.csproj
│ ├── Examples
│ ├── CounterWithoutRazor.cs
│ ├── WeatherWithCodeBehind.razor
│ ├── WeatherWithCodeBehind.razor.cs
│ ├── WeatherWithInherits.razor
│ └── WeatherWithInheritsModel.cs
│ ├── MyBlog.sln
│ ├── SharedComponents
│ ├── BootstrapFieldCssClassProvider.cs
│ ├── CustomCssClassProvider.cs
│ ├── Demo
│ │ ├── HighChart.razor
│ │ ├── HighChart.razor.js
│ │ ├── HighChartTest.razor
│ │ ├── JSInteropSamples
│ │ │ ├── JSToReferenceNET.razor
│ │ │ ├── JSToReferenceNET.razor.js
│ │ │ ├── JSToStaticNET.razor
│ │ │ ├── JSToStaticNET.razor.js
│ │ │ ├── NetToJS.razor
│ │ │ └── NetToJS.razor.js
│ │ └── JSInteropSamplesWasm
│ │ │ ├── JSToStaticNET.razor
│ │ │ ├── JSToStaticNET.razor.cs
│ │ │ ├── JSToStaticNET.razor.js
│ │ │ ├── NetToJS.razor
│ │ │ ├── NetToJS.razor.cs
│ │ │ └── NetToJS.razor.js
│ ├── ErrorBoundaryDemo
│ │ ├── ComponentWithError.razor
│ │ ├── CustomErrorBoundaryDemo.razor
│ │ └── ErrorBoundaryDemo.razor
│ ├── InputTextAreaOnInput.cs
│ ├── Interfaces
│ │ ├── IBlogNotificationService.cs
│ │ └── IBrowserStorage.cs
│ ├── ItemList.razor
│ ├── Nuget.config
│ ├── Pages
│ │ ├── Admin
│ │ │ ├── BlogPostEdit.razor
│ │ │ ├── BlogPostList.razor
│ │ │ └── CategoryList.razor
│ │ ├── AlertTest.razor
│ │ ├── Comments.razor
│ │ ├── ErrorBoundaryTest.razor
│ │ ├── Home.razor
│ │ ├── Post.razor
│ │ ├── RenderFragmentTest.razor
│ │ ├── SetFocus.razor
│ │ └── ThrowException.razor
│ ├── ReusableComponents
│ │ ├── Alert.razor
│ │ ├── BlogButton.razor
│ │ ├── BlogButton.razor.js
│ │ ├── BlogInputText.razor
│ │ └── BlogNavigationLock.razor
│ ├── SharedComponents.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── background.png
│ │ ├── bootstrap.min.css
│ │ └── exampleJsInterop.js
│ └── Snippets
│ └── builder.snippet
├── Chapter13
└── MyBlog
│ ├── BlazorWebApp
│ ├── BlazorWebApp.Client
│ │ ├── BlazorWebApp.Client.csproj
│ │ ├── BlogApiWebClient.cs
│ │ ├── Pages
│ │ │ ├── Admin
│ │ │ │ └── TagList.razor
│ │ │ └── Counter.razor
│ │ ├── PersistentAuthenticationStateProvider.cs
│ │ ├── Program.cs
│ │ ├── Services
│ │ │ ├── BlazorWebAssemblyBlogNotificationService.cs
│ │ │ └── BlogBrowserStorage.cs
│ │ ├── UserInfo.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ ├── BlazorWebApp.sln
│ └── BlazorWebApp
│ │ ├── BlazorWebApp.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── CounterWithParameterAndEvent.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── LoginStatus.razor
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ └── Weather.razor
│ │ ├── ParentCounter.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Endpoints
│ │ ├── BlogPostEndpoints.cs
│ │ ├── CategoryEndpoints.cs
│ │ ├── CommentEndpoints.cs
│ │ └── TagEndpoints.cs
│ │ ├── Hubs
│ │ └── BlogNotificationHub.cs
│ │ ├── PersistingServerAuthenticationStateProvider.cs
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── Services
│ │ ├── BlazorServerBlogNotificationService.cs
│ │ └── BlogProtectedBrowserStorage.cs
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
│ ├── BlazorWebAssemblyApp
│ ├── App.razor
│ ├── BlazorWebAssemblyApp.csproj
│ ├── Layout
│ │ ├── MainLayout.razor
│ │ ├── MainLayout.razor.css
│ │ ├── NavMenu.razor
│ │ └── NavMenu.razor.css
│ ├── Pages
│ │ ├── Counter.razor
│ │ ├── Home.razor
│ │ ├── ThrowException.razor
│ │ └── Weather.razor
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── css
│ │ ├── app.css
│ │ └── bootstrap
│ │ │ ├── bootstrap.min.css
│ │ │ └── bootstrap.min.css.map
│ │ ├── favicon.png
│ │ ├── icon-192.png
│ │ ├── index.html
│ │ └── sample-data
│ │ └── weather.json
│ ├── Data.Models
│ ├── BlogPost.cs
│ ├── Category.cs
│ ├── Comment.cs
│ ├── Data.Models.csproj
│ ├── Interfaces
│ │ └── IBlogApi.cs
│ └── Tag.cs
│ ├── Data.Tests
│ ├── BlogApiTests.cs
│ ├── Data.Tests.csproj
│ ├── Data
│ │ ├── Blogposts
│ │ │ ├── 311e92e9-36e4-45dc-8822-1935deb0231e.json
│ │ │ └── 9618318e-9df8-41f9-8148-27d677e269cc.json
│ │ ├── Categories
│ │ │ ├── bebb96a0-3110-4f46-a59d-b99bc3b531e6.json
│ │ │ ├── edf7eda7-1f58-4e89-b9d0-18cdf596bd91.json
│ │ │ └── fc5fa554-4333-4bae-846a-36e0a975d321.json
│ │ ├── Comments
│ │ │ ├── db97df73-65ce-4921-acdd-35e3f08752ab.json
│ │ │ └── fe5e0efb-77b2-471c-ab64-164bad1cf9e9.json
│ │ └── Tags
│ │ │ ├── 0b6df322-5dee-4901-90a1-bf07e4e0de01.json
│ │ │ ├── d568c4ab-2130-4caf-a653-95176c909c07.json
│ │ │ └── fa29eec2-495a-4441-8968-5e9d6310688f.json
│ ├── DataTestFixture.cs
│ └── GlobalUsings.cs
│ ├── Data
│ ├── BlogApiJsonDirectAccess.cs
│ ├── BlogApiJsonDirectAccessSetting.cs
│ └── Data.csproj
│ ├── Examples
│ ├── CounterWithoutRazor.cs
│ ├── WeatherWithCodeBehind.razor
│ ├── WeatherWithCodeBehind.razor.cs
│ ├── WeatherWithInherits.razor
│ └── WeatherWithInheritsModel.cs
│ ├── MyBlog.Tests
│ ├── BlogApiMock.cs
│ ├── MyBlog.Tests.csproj
│ ├── Pages
│ │ ├── AlertTest.razor
│ │ ├── BlogButtonTests.razor
│ │ ├── HomeTest.razor
│ │ └── LoginStatusTest.razor
│ └── _Imports.razor
│ ├── MyBlog.sln
│ ├── SharedComponents
│ ├── BootstrapFieldCssClassProvider.cs
│ ├── CustomCssClassProvider.cs
│ ├── Demo
│ │ ├── HighChart.razor
│ │ ├── HighChart.razor.js
│ │ ├── HighChartTest.razor
│ │ ├── JSInteropSamples
│ │ │ ├── JSToReferenceNET.razor
│ │ │ ├── JSToReferenceNET.razor.js
│ │ │ ├── JSToStaticNET.razor
│ │ │ ├── JSToStaticNET.razor.js
│ │ │ ├── NetToJS.razor
│ │ │ └── NetToJS.razor.js
│ │ └── JSInteropSamplesWasm
│ │ │ ├── JSToStaticNET.razor
│ │ │ ├── JSToStaticNET.razor.cs
│ │ │ ├── JSToStaticNET.razor.js
│ │ │ ├── NetToJS.razor
│ │ │ ├── NetToJS.razor.cs
│ │ │ └── NetToJS.razor.js
│ ├── ErrorBoundaryDemo
│ │ ├── ComponentWithError.razor
│ │ ├── CustomErrorBoundaryDemo.razor
│ │ └── ErrorBoundaryDemo.razor
│ ├── InputTextAreaOnInput.cs
│ ├── Interfaces
│ │ ├── IBlogNotificationService.cs
│ │ └── IBrowserStorage.cs
│ ├── ItemList.razor
│ ├── Nuget.config
│ ├── Pages
│ │ ├── Admin
│ │ │ ├── BlogPostEdit.razor
│ │ │ ├── BlogPostList.razor
│ │ │ └── CategoryList.razor
│ │ ├── AlertTest.razor
│ │ ├── Comments.razor
│ │ ├── ErrorBoundaryTest.razor
│ │ ├── Home.razor
│ │ ├── Post.razor
│ │ ├── RenderFragmentTest.razor
│ │ ├── SetFocus.razor
│ │ └── ThrowException.razor
│ ├── ReusableComponents
│ │ ├── Alert.razor
│ │ ├── BlogButton.razor
│ │ ├── BlogButton.razor.js
│ │ ├── BlogInputText.razor
│ │ └── BlogNavigationLock.razor
│ ├── SharedComponents.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── background.png
│ │ ├── bootstrap.min.css
│ │ └── exampleJsInterop.js
│ └── Snippets
│ └── builder.snippet
├── Chapter15
└── CustomElements
│ ├── AngularProject
│ ├── AngularProject.Server
│ │ ├── AngularProject.Server.csproj
│ │ ├── AngularProject.Server.http
│ │ ├── Program.cs
│ │ ├── Properties
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ └── angularproject.client
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .vscode
│ │ ├── extensions.json
│ │ ├── launch.json
│ │ └── tasks.json
│ │ ├── README.md
│ │ ├── angular.json
│ │ ├── angularproject.client.esproj
│ │ ├── aspnetcore-https.js
│ │ ├── karma.conf.js
│ │ ├── nuget.config
│ │ ├── package-lock.json
│ │ ├── package.json
│ │ ├── src
│ │ ├── app
│ │ │ ├── app-routing.module.ts
│ │ │ ├── app.component.css
│ │ │ ├── app.component.html
│ │ │ ├── app.component.spec.ts
│ │ │ ├── app.component.ts
│ │ │ └── app.module.ts
│ │ ├── assets
│ │ │ └── .gitkeep
│ │ ├── favicon.ico
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── proxy.conf.js
│ │ └── styles.css
│ │ ├── tsconfig.app.json
│ │ ├── tsconfig.json
│ │ └── tsconfig.spec.json
│ ├── BlazorCustomElements
│ ├── BlazorCustomElements.csproj
│ ├── Counter.razor
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ └── _Imports.razor
│ ├── BlazorProject
│ ├── BlazorProject.Client
│ │ ├── BlazorProject.Client.csproj
│ │ ├── Pages
│ │ │ ├── Counter.razor
│ │ │ └── MarkdownDemo.razor
│ │ ├── Program.cs
│ │ ├── _Imports.razor
│ │ ├── package-lock.json
│ │ ├── package.json
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ └── BlazorProject
│ │ ├── BlazorProject.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ ├── Home.razor
│ │ │ └── Weather.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ ├── favicon.png
│ │ └── markdown-toolbar-element
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── dist
│ │ ├── index.d.ts
│ │ └── index.js
│ │ └── package.json
│ ├── CustomElements.sln
│ ├── RazorPagesProject
│ ├── Pages
│ │ ├── Error.cshtml
│ │ ├── Error.cshtml.cs
│ │ ├── Index.cshtml
│ │ ├── Index.cshtml.cs
│ │ ├── Privacy.cshtml
│ │ ├── Privacy.cshtml.cs
│ │ ├── Shared
│ │ │ ├── _Layout.cshtml
│ │ │ ├── _Layout.cshtml.css
│ │ │ └── _ValidationScriptsPartial.cshtml
│ │ ├── _ViewImports.cshtml
│ │ └── _ViewStart.cshtml
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── RazorPagesProject.csproj
│ ├── appsettings.Development.json
│ ├── appsettings.json
│ └── wwwroot
│ │ ├── css
│ │ └── site.css
│ │ ├── favicon.ico
│ │ ├── js
│ │ └── site.js
│ │ └── lib
│ │ ├── bootstrap
│ │ ├── LICENSE
│ │ └── dist
│ │ │ ├── css
│ │ │ ├── bootstrap-grid.css
│ │ │ ├── bootstrap-grid.css.map
│ │ │ ├── bootstrap-grid.min.css
│ │ │ ├── bootstrap-grid.min.css.map
│ │ │ ├── bootstrap-grid.rtl.css
│ │ │ ├── bootstrap-grid.rtl.css.map
│ │ │ ├── bootstrap-grid.rtl.min.css
│ │ │ ├── bootstrap-grid.rtl.min.css.map
│ │ │ ├── bootstrap-reboot.css
│ │ │ ├── bootstrap-reboot.css.map
│ │ │ ├── bootstrap-reboot.min.css
│ │ │ ├── bootstrap-reboot.min.css.map
│ │ │ ├── bootstrap-reboot.rtl.css
│ │ │ ├── bootstrap-reboot.rtl.css.map
│ │ │ ├── bootstrap-reboot.rtl.min.css
│ │ │ ├── bootstrap-reboot.rtl.min.css.map
│ │ │ ├── bootstrap-utilities.css
│ │ │ ├── bootstrap-utilities.css.map
│ │ │ ├── bootstrap-utilities.min.css
│ │ │ ├── bootstrap-utilities.min.css.map
│ │ │ ├── bootstrap-utilities.rtl.css
│ │ │ ├── bootstrap-utilities.rtl.css.map
│ │ │ ├── bootstrap-utilities.rtl.min.css
│ │ │ ├── bootstrap-utilities.rtl.min.css.map
│ │ │ ├── bootstrap.css
│ │ │ ├── bootstrap.css.map
│ │ │ ├── bootstrap.min.css
│ │ │ ├── bootstrap.min.css.map
│ │ │ ├── bootstrap.rtl.css
│ │ │ ├── bootstrap.rtl.css.map
│ │ │ ├── bootstrap.rtl.min.css
│ │ │ └── bootstrap.rtl.min.css.map
│ │ │ └── js
│ │ │ ├── bootstrap.bundle.js
│ │ │ ├── bootstrap.bundle.js.map
│ │ │ ├── bootstrap.bundle.min.js
│ │ │ ├── bootstrap.bundle.min.js.map
│ │ │ ├── bootstrap.esm.js
│ │ │ ├── bootstrap.esm.js.map
│ │ │ ├── bootstrap.esm.min.js
│ │ │ ├── bootstrap.esm.min.js.map
│ │ │ ├── bootstrap.js
│ │ │ ├── bootstrap.js.map
│ │ │ ├── bootstrap.min.js
│ │ │ └── bootstrap.min.js.map
│ │ ├── jquery-validation-unobtrusive
│ │ ├── LICENSE.txt
│ │ ├── jquery.validate.unobtrusive.js
│ │ └── jquery.validate.unobtrusive.min.js
│ │ ├── jquery-validation
│ │ ├── LICENSE.md
│ │ └── dist
│ │ │ ├── additional-methods.js
│ │ │ ├── additional-methods.min.js
│ │ │ ├── jquery.validate.js
│ │ │ └── jquery.validate.min.js
│ │ └── jquery
│ │ ├── LICENSE.txt
│ │ └── dist
│ │ ├── jquery.js
│ │ ├── jquery.min.js
│ │ └── jquery.min.map
│ └── ReactProject
│ ├── ReactProject.Server
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── ReactProject.Server.csproj
│ ├── ReactProject.Server.http
│ ├── appsettings.Development.json
│ └── appsettings.json
│ └── reactproject.client
│ ├── .eslintrc.cjs
│ ├── .gitignore
│ ├── README.md
│ ├── index.html
│ ├── nuget.config
│ ├── package-lock.json
│ ├── package.json
│ ├── public
│ └── vite.svg
│ ├── reactproject.client.esproj
│ ├── src
│ ├── App.css
│ ├── App.tsx
│ ├── assets
│ │ └── react.svg
│ ├── index.css
│ ├── main.tsx
│ └── vite-env.d.ts
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ └── vite.config.ts
├── Chapter16
├── BlazorPrerender
│ ├── BlazorPrerender.Client
│ │ ├── BlazorPrerender.Client.csproj
│ │ ├── Pages
│ │ │ ├── Counter.razor
│ │ │ └── Weather.razor
│ │ ├── Program.cs
│ │ ├── _Imports.razor
│ │ └── wwwroot
│ │ │ ├── appsettings.Development.json
│ │ │ └── appsettings.json
│ └── BlazorPrerender
│ │ ├── BlazorPrerender.csproj
│ │ ├── Components
│ │ ├── App.razor
│ │ ├── Layout
│ │ │ ├── MainLayout.razor
│ │ │ ├── MainLayout.razor.css
│ │ │ ├── NavMenu.razor
│ │ │ └── NavMenu.razor.css
│ │ ├── Pages
│ │ │ ├── Error.razor
│ │ │ └── Home.razor
│ │ ├── Routes.razor
│ │ └── _Imports.razor
│ │ ├── Program.cs
│ │ ├── Properties
│ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.json
│ │ └── wwwroot
│ │ ├── app.css
│ │ ├── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ │ └── favicon.png
└── BlazorWebAssembly
│ ├── BlazorWebAssembly.sln
│ ├── BlazorWebAssembly
│ ├── App.razor
│ ├── BlazorWebAssembly.csproj
│ ├── Layout
│ │ ├── MainLayout.razor
│ │ ├── MainLayout.razor.css
│ │ ├── NavMenu.razor
│ │ └── NavMenu.razor.css
│ ├── Pages
│ │ ├── Counter.razor
│ │ ├── Home.razor
│ │ └── Weather.razor
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── css
│ │ ├── app.css
│ │ └── bootstrap
│ │ │ ├── bootstrap.min.css
│ │ │ └── bootstrap.min.css.map
│ │ ├── favicon.png
│ │ ├── icon-192.png
│ │ ├── index.html
│ │ └── sample-data
│ │ └── weather.json
│ ├── RunningCode
│ ├── App.razor
│ ├── Layout
│ │ ├── MainLayout.razor
│ │ ├── MainLayout.razor.css
│ │ ├── NavMenu.razor
│ │ └── NavMenu.razor.css
│ ├── Pages
│ │ ├── Counter.razor
│ │ ├── Home.razor
│ │ └── Weather.razor
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── RunningCode.csproj
│ ├── Test.c
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── css
│ │ ├── app.css
│ │ └── bootstrap
│ │ │ ├── bootstrap.min.css
│ │ │ └── bootstrap.min.css.map
│ │ ├── favicon.png
│ │ ├── icon-192.png
│ │ ├── index.html
│ │ └── sample-data
│ │ └── weather.json
│ └── SkiaSharpDemo
│ ├── App.razor
│ ├── Layout
│ ├── MainLayout.razor
│ ├── MainLayout.razor.css
│ ├── NavMenu.razor
│ └── NavMenu.razor.css
│ ├── Pages
│ ├── Counter.razor
│ ├── Home.razor
│ └── Weather.razor
│ ├── Program.cs
│ ├── Properties
│ └── launchSettings.json
│ ├── SkiaSharpDemo.csproj
│ ├── _Imports.razor
│ └── wwwroot
│ ├── css
│ ├── app.css
│ └── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ ├── favicon.png
│ ├── icon-192.png
│ ├── index.html
│ └── sample-data
│ └── weather.json
├── Chapter17
└── SourceGeneratorDemo
│ ├── BlazorWebAssembly
│ ├── App.razor
│ ├── BlazorWebAssembly.csproj
│ ├── InterfaceGeneratorDemo
│ │ └── SampleService.cs
│ ├── Layout
│ │ ├── MainLayout.razor
│ │ ├── MainLayout.razor.css
│ │ ├── NavMenu.razor
│ │ └── NavMenu.razor.css
│ ├── Pages
│ │ ├── Counter.razor
│ │ ├── Home.razor
│ │ └── Weather.razor
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── css
│ │ ├── app.css
│ │ └── bootstrap
│ │ │ ├── bootstrap.min.css
│ │ │ └── bootstrap.min.css.map
│ │ ├── favicon.png
│ │ ├── icon-192.png
│ │ ├── index.html
│ │ └── sample-data
│ │ └── weather.json
│ ├── BlazorWebAssemblyApp
│ ├── App.razor
│ ├── BlazorWebAssemblyApp.csproj
│ ├── InterfaceGeneratorDemo
│ │ └── SampleService.cs
│ ├── Pages
│ │ ├── Counter.razor
│ │ ├── FetchData.razor
│ │ └── Index.razor
│ ├── Program.cs
│ ├── Properties
│ │ └── launchSettings.json
│ ├── Shared
│ │ ├── MainLayout.razor
│ │ ├── MainLayout.razor.css
│ │ ├── NavMenu.razor
│ │ ├── NavMenu.razor.css
│ │ └── SurveyPrompt.razor
│ ├── _Imports.razor
│ └── wwwroot
│ │ ├── css
│ │ ├── app.css
│ │ ├── bootstrap
│ │ │ ├── bootstrap.min.css
│ │ │ └── bootstrap.min.css.map
│ │ └── open-iconic
│ │ │ ├── FONT-LICENSE
│ │ │ ├── ICON-LICENSE
│ │ │ ├── README.md
│ │ │ └── font
│ │ │ ├── css
│ │ │ └── open-iconic-bootstrap.min.css
│ │ │ └── fonts
│ │ │ ├── open-iconic.eot
│ │ │ ├── open-iconic.otf
│ │ │ ├── open-iconic.svg
│ │ │ ├── open-iconic.ttf
│ │ │ └── open-iconic.woff
│ │ ├── favicon.png
│ │ ├── icon-192.png
│ │ ├── index.html
│ │ └── sample-data
│ │ └── weather.json
│ ├── SourceGenerator
│ ├── HelloSourceGenerator.cs
│ └── SourceGenerator.csproj
│ └── SourceGeneratorDemo.sln
├── Chapter18
└── BlazorHybridApp
│ ├── BlazorHybridApp.sln
│ └── BlazorHybridApp
│ ├── App.xaml
│ ├── App.xaml.cs
│ ├── BlazorHybridApp.csproj
│ ├── Components
│ ├── Layout
│ │ ├── MainLayout.razor
│ │ ├── MainLayout.razor.css
│ │ ├── NavMenu.razor
│ │ └── NavMenu.razor.css
│ └── Pages
│ │ ├── Counter.razor
│ │ ├── Home.razor
│ │ └── Weather.razor
│ ├── MainPage.xaml
│ ├── MainPage.xaml.cs
│ ├── MauiProgram.cs
│ ├── Platforms
│ ├── Android
│ │ ├── AndroidManifest.xml
│ │ ├── MainActivity.cs
│ │ ├── MainApplication.cs
│ │ └── Resources
│ │ │ └── values
│ │ │ └── colors.xml
│ ├── MacCatalyst
│ │ ├── AppDelegate.cs
│ │ ├── Entitlements.plist
│ │ ├── Info.plist
│ │ └── Program.cs
│ ├── Tizen
│ │ ├── Main.cs
│ │ └── tizen-manifest.xml
│ ├── Windows
│ │ ├── App.xaml
│ │ ├── App.xaml.cs
│ │ ├── Package.appxmanifest
│ │ └── app.manifest
│ └── iOS
│ │ ├── AppDelegate.cs
│ │ ├── Info.plist
│ │ └── Program.cs
│ ├── Properties
│ └── launchSettings.json
│ ├── Resources
│ ├── AppIcon
│ │ ├── appicon.svg
│ │ └── appiconfg.svg
│ ├── Fonts
│ │ └── OpenSans-Regular.ttf
│ ├── Images
│ │ └── dotnet_bot.svg
│ ├── Raw
│ │ └── AboutAssets.txt
│ └── Splash
│ │ └── splash.svg
│ ├── Routes.razor
│ ├── _Imports.razor
│ └── wwwroot
│ ├── css
│ ├── app.css
│ └── bootstrap
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.css.map
│ ├── favicon.png
│ └── index.html
├── Data
├── Blogposts
│ ├── BellaGreenHaven.json
│ ├── BellaGreenHaven_Story.json
│ ├── EllieRainbowBrush_Story.json
│ ├── JasperCityLightsAdventure_Story.json
│ ├── OliverStarryQuest_Story.json
│ ├── RickyTheRaccoon_Story.json
│ ├── RockyTheHeroRaccoon_Story.json
│ ├── RoxieTheMusicalRaccoon_Story.json
│ └── WhiskersSecretGarden_Story.json
├── Categories
│ ├── Category1.json
│ └── f23ad71a-6b8c-4f25-9e0f-667211bf29df.json
├── Comments
│ ├── 22ecaf2f-e056-4930-adb6-c2821ba3d54d.json
│ ├── 30102fc1-6181-48d8-ac74-14ad0408c5f7.json
│ ├── 5233b24f-0d62-4353-b956-43cde805d478.json
│ ├── 719c89e1-106d-48f2-a9ed-6cc77ccd29d3.json
│ ├── 84f95c0c-0d3b-432f-b528-4b183a52f4fc.json
│ ├── 97c702a2-5a73-4ba5-ab9f-e8ec5c7bc891.json
│ └── ea40b9e5-0db4-46dd-89f6-94759dc169a4.json
└── Tags
│ ├── f19cd19f-d0f7-4198-9a6e-98028b98104c.json
│ └── f96aafe5-8369-4fc9-b169-70b93d962cc8.json
├── ExampleData
├── Blogposts
│ ├── BellaGreenHaven_Story.json
│ ├── EllieRainbowBrush_Story.json
│ ├── JasperCityLightsAdventure_Story.json
│ ├── OliverStarryQuest_Story.json
│ ├── RickyTheRaccoon_Story.json
│ ├── RockyTheHeroRaccoon_Story.json
│ ├── RoxieTheMusicalRaccoon_Story.json
│ └── WhiskersSecretGarden_Story.json
├── Categories
│ └── Category1.json
├── Images
│ ├── BellaGreenHaven_Story.webp
│ ├── EllieRainbowBrush_Story.webp
│ ├── JasperCityLightsAdventure_Story.webp
│ ├── OliverStarryQuest_Story.webp
│ ├── RickyTheRaccoon_Story.webp
│ ├── RockyTheHeroRaccoon_Story.webp
│ ├── RoxieTheMusicalRaccoon_Story.webp
│ └── WhiskersSecretGarden_Story.webp
└── Tags
│ └── Tag1.json
├── LICENSE
└── README.md
/Chapter02/MyBlog/BlazorWebApp/BlazorWebApp.Client/Program.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
2 |
3 | var builder = WebAssemblyHostBuilder.CreateDefault(args);
4 |
5 | await builder.Build().RunAsync();
6 |
--------------------------------------------------------------------------------
/Chapter02/MyBlog/BlazorWebApp/BlazorWebApp.Client/_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 BlazorWebApp.Client
10 |
--------------------------------------------------------------------------------
/Chapter02/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.Development.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft.AspNetCore": "Warning"
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Chapter02/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "Logging": {
3 | "LogLevel": {
4 | "Default": "Information",
5 | "Microsoft.AspNetCore": "Warning"
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/Chapter02/MyBlog/BlazorWebApp/BlazorWebApp/Components/Pages/Home.razor:
--------------------------------------------------------------------------------
1 | @page "/"
2 |
3 |
@(1/zero)
5 |This is a render fragment @number
; 13 | } 14 | } -------------------------------------------------------------------------------- /Chapter05/MyBlog/SharedComponents/Pages/SetFocus.razor: -------------------------------------------------------------------------------- 1 | @page "/setfocus" 2 | 3 | 4 | 5 | 6 | @code { 7 | ElementReference textInput; 8 | } -------------------------------------------------------------------------------- /Chapter05/MyBlog/SharedComponents/_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 Microsoft.AspNetCore.Components.Sections 10 | -------------------------------------------------------------------------------- /Chapter05/MyBlog/SharedComponents/wwwroot/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter05/MyBlog/SharedComponents/wwwroot/background.png -------------------------------------------------------------------------------- /Chapter05/MyBlog/SharedComponents/wwwroot/exampleJsInterop.js: -------------------------------------------------------------------------------- 1 | // This is a JavaScript module that is loaded on demand. It can export any number of 2 | // functions, and may import other JavaScript modules if required. 3 | 4 | export function showPrompt(message) { 5 | return prompt(message, 'Type anything here'); 6 | } 7 | -------------------------------------------------------------------------------- /Chapter06/MyBlog/BlazorWebApp/BlazorWebApp.Client/Program.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 2 | 3 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 4 | await builder.Build().RunAsync(); 5 | -------------------------------------------------------------------------------- /Chapter06/MyBlog/BlazorWebApp/BlazorWebApp.Client/_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 BlazorWebApp.Client 10 | -------------------------------------------------------------------------------- /Chapter06/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter06/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter06/MyBlog/BlazorWebApp/BlazorWebApp/Components/ParentCounter.razor: -------------------------------------------------------------------------------- 1 | @page "/parentcounter" 2 |@(1/zero)
5 |This is a render fragment @number
; 13 | } 14 | } -------------------------------------------------------------------------------- /Chapter06/MyBlog/SharedComponents/Pages/SetFocus.razor: -------------------------------------------------------------------------------- 1 | @page "/setfocus" 2 | 3 | 4 | 5 | 6 | @code { 7 | ElementReference textInput; 8 | } -------------------------------------------------------------------------------- /Chapter06/MyBlog/SharedComponents/wwwroot/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter06/MyBlog/SharedComponents/wwwroot/background.png -------------------------------------------------------------------------------- /Chapter06/MyBlog/SharedComponents/wwwroot/exampleJsInterop.js: -------------------------------------------------------------------------------- 1 | // This is a JavaScript module that is loaded on demand. It can export any number of 2 | // functions, and may import other JavaScript modules if required. 3 | 4 | export function showPrompt(message) { 5 | return prompt(message, 'Type anything here'); 6 | } 7 | -------------------------------------------------------------------------------- /Chapter07/MyBlog/BlazorWebApp/BlazorWebApp.Client/Program.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 2 | 3 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 4 | await builder.Build().RunAsync(); 5 | -------------------------------------------------------------------------------- /Chapter07/MyBlog/BlazorWebApp/BlazorWebApp.Client/_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 BlazorWebApp.Client 10 | -------------------------------------------------------------------------------- /Chapter07/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter07/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter07/MyBlog/BlazorWebApp/BlazorWebApp/Components/ParentCounter.razor: -------------------------------------------------------------------------------- 1 | @page "/parentcounter" 2 |@(1/zero)
5 |This is a render fragment @number
; 13 | } 14 | } -------------------------------------------------------------------------------- /Chapter07/MyBlog/SharedComponents/Pages/SetFocus.razor: -------------------------------------------------------------------------------- 1 | @page "/setfocus" 2 | 3 | 4 | 5 | 6 | @code { 7 | ElementReference textInput; 8 | } -------------------------------------------------------------------------------- /Chapter07/MyBlog/SharedComponents/wwwroot/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter07/MyBlog/SharedComponents/wwwroot/background.png -------------------------------------------------------------------------------- /Chapter07/MyBlog/SharedComponents/wwwroot/exampleJsInterop.js: -------------------------------------------------------------------------------- 1 | // This is a JavaScript module that is loaded on demand. It can export any number of 2 | // functions, and may import other JavaScript modules if required. 3 | 4 | export function showPrompt(message) { 5 | return prompt(message, 'Type anything here'); 6 | } 7 | -------------------------------------------------------------------------------- /Chapter08/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter08/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter08/MyBlog/BlazorWebApp/BlazorWebApp/Components/LoginStatus.razor: -------------------------------------------------------------------------------- 1 | @(1/zero)
5 |This is a render fragment @number
; 13 | } 14 | } -------------------------------------------------------------------------------- /Chapter08/MyBlog/SharedComponents/Pages/SetFocus.razor: -------------------------------------------------------------------------------- 1 | @page "/setfocus" 2 | 3 | 4 | 5 | 6 | @code { 7 | ElementReference textInput; 8 | } -------------------------------------------------------------------------------- /Chapter08/MyBlog/SharedComponents/wwwroot/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter08/MyBlog/SharedComponents/wwwroot/background.png -------------------------------------------------------------------------------- /Chapter08/MyBlog/SharedComponents/wwwroot/exampleJsInterop.js: -------------------------------------------------------------------------------- 1 | // This is a JavaScript module that is loaded on demand. It can export any number of 2 | // functions, and may import other JavaScript modules if required. 3 | 4 | export function showPrompt(message) { 5 | return prompt(message, 'Type anything here'); 6 | } 7 | -------------------------------------------------------------------------------- /Chapter09/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter09/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter09/MyBlog/BlazorWebApp/BlazorWebApp/Components/LoginStatus.razor: -------------------------------------------------------------------------------- 1 | @(1/zero)
5 |This is a render fragment @number
; 13 | } 14 | } -------------------------------------------------------------------------------- /Chapter09/MyBlog/SharedComponents/Pages/SetFocus.razor: -------------------------------------------------------------------------------- 1 | @page "/setfocus" 2 | 3 | 4 | 5 | 6 | @code { 7 | ElementReference textInput; 8 | } -------------------------------------------------------------------------------- /Chapter09/MyBlog/SharedComponents/wwwroot/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter09/MyBlog/SharedComponents/wwwroot/background.png -------------------------------------------------------------------------------- /Chapter09/MyBlog/SharedComponents/wwwroot/exampleJsInterop.js: -------------------------------------------------------------------------------- 1 | // This is a JavaScript module that is loaded on demand. It can export any number of 2 | // functions, and may import other JavaScript modules if required. 3 | 4 | export function showPrompt(message) { 5 | return prompt(message, 'Type anything here'); 6 | } 7 | -------------------------------------------------------------------------------- /Chapter10/MyBlog/BlazorWebApp/BlazorWebApp.Client/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorWebApp.Client; 2 | 3 | // Add properties to this class and update the server and client AuthenticationStateProviders 4 | // to expose more information about the authenticated user to the client. 5 | public class UserInfo 6 | { 7 | public required string UserId { get; set; } 8 | public required string Email { get; set; } 9 | } 10 | -------------------------------------------------------------------------------- /Chapter10/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter10/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter10/MyBlog/BlazorWebApp/BlazorWebApp/Components/LoginStatus.razor: -------------------------------------------------------------------------------- 1 | @(1/zero)
5 |This is a render fragment @number
; 13 | } 14 | } -------------------------------------------------------------------------------- /Chapter10/MyBlog/SharedComponents/Pages/SetFocus.razor: -------------------------------------------------------------------------------- 1 | @page "/setfocus" 2 | 3 | 4 | 5 | 6 | @code { 7 | ElementReference textInput; 8 | } -------------------------------------------------------------------------------- /Chapter10/MyBlog/SharedComponents/ReusableComponents/BlogButton.razor.js: -------------------------------------------------------------------------------- 1 | export function showConfirm(message) { 2 | return confirm(message); 3 | } 4 | -------------------------------------------------------------------------------- /Chapter10/MyBlog/SharedComponents/wwwroot/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter10/MyBlog/SharedComponents/wwwroot/background.png -------------------------------------------------------------------------------- /Chapter10/MyBlog/SharedComponents/wwwroot/exampleJsInterop.js: -------------------------------------------------------------------------------- 1 | // This is a JavaScript module that is loaded on demand. It can export any number of 2 | // functions, and may import other JavaScript modules if required. 3 | 4 | export function showPrompt(message) { 5 | return prompt(message, 'Type anything here'); 6 | } 7 | -------------------------------------------------------------------------------- /Chapter11/MyBlog/BlazorWebApp/BlazorWebApp.Client/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorWebApp.Client; 2 | 3 | // Add properties to this class and update the server and client AuthenticationStateProviders 4 | // to expose more information about the authenticated user to the client. 5 | public class UserInfo 6 | { 7 | public required string UserId { get; set; } 8 | public required string Email { get; set; } 9 | } 10 | -------------------------------------------------------------------------------- /Chapter11/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter11/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter11/MyBlog/BlazorWebApp/BlazorWebApp/Components/LoginStatus.razor: -------------------------------------------------------------------------------- 1 | @(1/zero)
5 |This is a render fragment @number
; 13 | } 14 | } -------------------------------------------------------------------------------- /Chapter11/MyBlog/SharedComponents/Pages/SetFocus.razor: -------------------------------------------------------------------------------- 1 | @page "/setfocus" 2 | 3 | 4 | 5 | 6 | @code { 7 | ElementReference textInput; 8 | } -------------------------------------------------------------------------------- /Chapter11/MyBlog/SharedComponents/ReusableComponents/BlogButton.razor.js: -------------------------------------------------------------------------------- 1 | export function showConfirm(message) { 2 | return confirm(message); 3 | } 4 | -------------------------------------------------------------------------------- /Chapter11/MyBlog/SharedComponents/wwwroot/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter11/MyBlog/SharedComponents/wwwroot/background.png -------------------------------------------------------------------------------- /Chapter11/MyBlog/SharedComponents/wwwroot/exampleJsInterop.js: -------------------------------------------------------------------------------- 1 | // This is a JavaScript module that is loaded on demand. It can export any number of 2 | // functions, and may import other JavaScript modules if required. 3 | 4 | export function showPrompt(message) { 5 | return prompt(message, 'Type anything here'); 6 | } 7 | -------------------------------------------------------------------------------- /Chapter12/MyBlog/BlazorWebApp/BlazorWebApp.Client/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorWebApp.Client; 2 | 3 | // Add properties to this class and update the server and client AuthenticationStateProviders 4 | // to expose more information about the authenticated user to the client. 5 | public class UserInfo 6 | { 7 | public required string UserId { get; set; } 8 | public required string Email { get; set; } 9 | } 10 | -------------------------------------------------------------------------------- /Chapter12/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter12/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter12/MyBlog/BlazorWebApp/BlazorWebApp/Components/LoginStatus.razor: -------------------------------------------------------------------------------- 1 | Current count: @currentCount
8 | 9 | 10 | 11 | @code { 12 | private int currentCount = 0; 13 | 14 | private void IncrementCount() 15 | { 16 | currentCount++; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Chapter12/MyBlog/BlazorWebAssemblyApp/Pages/Home.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | 3 |@(1/zero)
5 |This is a render fragment @number
; 13 | } 14 | } -------------------------------------------------------------------------------- /Chapter12/MyBlog/SharedComponents/Pages/SetFocus.razor: -------------------------------------------------------------------------------- 1 | @page "/setfocus" 2 | 3 | 4 | 5 | 6 | @code { 7 | ElementReference textInput; 8 | } -------------------------------------------------------------------------------- /Chapter12/MyBlog/SharedComponents/Pages/ThrowException.razor: -------------------------------------------------------------------------------- 1 | @page "/ThrowException" 2 | @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) 3 | 4 | -------------------------------------------------------------------------------- /Chapter12/MyBlog/SharedComponents/ReusableComponents/BlogButton.razor.js: -------------------------------------------------------------------------------- 1 | export function showConfirm(message) { 2 | return confirm(message); 3 | } 4 | -------------------------------------------------------------------------------- /Chapter12/MyBlog/SharedComponents/wwwroot/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter12/MyBlog/SharedComponents/wwwroot/background.png -------------------------------------------------------------------------------- /Chapter12/MyBlog/SharedComponents/wwwroot/exampleJsInterop.js: -------------------------------------------------------------------------------- 1 | // This is a JavaScript module that is loaded on demand. It can export any number of 2 | // functions, and may import other JavaScript modules if required. 3 | 4 | export function showPrompt(message) { 5 | return prompt(message, 'Type anything here'); 6 | } 7 | -------------------------------------------------------------------------------- /Chapter13/MyBlog/BlazorWebApp/BlazorWebApp.Client/UserInfo.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorWebApp.Client; 2 | 3 | // Add properties to this class and update the server and client AuthenticationStateProviders 4 | // to expose more information about the authenticated user to the client. 5 | public class UserInfo 6 | { 7 | public required string UserId { get; set; } 8 | public required string Email { get; set; } 9 | } 10 | -------------------------------------------------------------------------------- /Chapter13/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter13/MyBlog/BlazorWebApp/BlazorWebApp.Client/wwwroot/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter13/MyBlog/BlazorWebApp/BlazorWebApp/Components/LoginStatus.razor: -------------------------------------------------------------------------------- 1 | Current count: @currentCount
8 | 9 | 10 | 11 | @code { 12 | private int currentCount = 0; 13 | 14 | private void IncrementCount() 15 | { 16 | currentCount++; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Chapter13/MyBlog/BlazorWebAssemblyApp/Pages/Home.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | 3 |@(1/zero)
5 |This is a render fragment @number
; 13 | } 14 | } -------------------------------------------------------------------------------- /Chapter13/MyBlog/SharedComponents/Pages/SetFocus.razor: -------------------------------------------------------------------------------- 1 | @page "/setfocus" 2 | 3 | 4 | 5 | 6 | @code { 7 | ElementReference textInput; 8 | } -------------------------------------------------------------------------------- /Chapter13/MyBlog/SharedComponents/Pages/ThrowException.razor: -------------------------------------------------------------------------------- 1 | @page "/ThrowException" 2 | @rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false)) 3 | 4 | -------------------------------------------------------------------------------- /Chapter13/MyBlog/SharedComponents/ReusableComponents/BlogButton.razor.js: -------------------------------------------------------------------------------- 1 | export function showConfirm(message) { 2 | return confirm(message); 3 | } 4 | -------------------------------------------------------------------------------- /Chapter13/MyBlog/SharedComponents/wwwroot/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter13/MyBlog/SharedComponents/wwwroot/background.png -------------------------------------------------------------------------------- /Chapter13/MyBlog/SharedComponents/wwwroot/exampleJsInterop.js: -------------------------------------------------------------------------------- 1 | // This is a JavaScript module that is loaded on demand. It can export any number of 2 | // functions, and may import other JavaScript modules if required. 3 | 4 | export function showPrompt(message) { 5 | return prompt(message, 'Type anything here'); 6 | } 7 | -------------------------------------------------------------------------------- /Chapter15/CustomElements/AngularProject/AngularProject.Server/AngularProject.Server.http: -------------------------------------------------------------------------------- 1 | @AngularProject.Server_HostAddress = http://localhost:5131 2 | 3 | GET {{AngularProject.Server_HostAddress}}/weatherforecast/ 4 | Accept: application/json 5 | 6 | ### 7 | -------------------------------------------------------------------------------- /Chapter15/CustomElements/AngularProject/AngularProject.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Chapter15/CustomElements/AngularProject/AngularProject.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft.AspNetCore": "Warning" 6 | } 7 | }, 8 | "AllowedHosts": "*" 9 | } 10 | -------------------------------------------------------------------------------- /Chapter15/CustomElements/AngularProject/angularproject.client/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /Chapter15/CustomElements/AngularProject/angularproject.client/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846 3 | "recommendations": ["angular.ng-template"] 4 | } 5 | -------------------------------------------------------------------------------- /Chapter15/CustomElements/AngularProject/angularproject.client/nuget.config: -------------------------------------------------------------------------------- 1 | 2 |Learn about building Web apps with ASP.NET Core.
10 |Use this page to detail your site's privacy policy.
9 | -------------------------------------------------------------------------------- /Chapter15/CustomElements/RazorPagesProject/Pages/Shared/_ValidationScriptsPartial.cshtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /Chapter15/CustomElements/RazorPagesProject/Pages/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @using RazorPagesProject 2 | @namespace RazorPagesProject.Pages 3 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 4 | -------------------------------------------------------------------------------- /Chapter15/CustomElements/RazorPagesProject/Pages/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "_Layout"; 3 | } 4 | -------------------------------------------------------------------------------- /Chapter15/CustomElements/RazorPagesProject/RazorPagesProject.csproj: -------------------------------------------------------------------------------- 1 |Current count: @currentCount
8 | 9 | 10 | 11 | @code { 12 | private int currentCount = 0; 13 | 14 | private void IncrementCount() 15 | { 16 | currentCount++; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Chapter16/BlazorWebAssembly/BlazorWebAssembly/Pages/Home.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | 3 |Current count: @currentCount
8 | 9 | 10 | 11 | @code { 12 | private int currentCount = 0; 13 | 14 | private void IncrementCount() 15 | { 16 | currentCount++; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Chapter16/BlazorWebAssembly/RunningCode/Pages/Home.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | @using System.Runtime.InteropServices 3 | 4 |9 | @@fact(3) result: @fact(3) 10 |
11 | 12 | @code { 13 | [DllImport("Test")] 14 | static extern int fact(int n); 15 | } -------------------------------------------------------------------------------- /Chapter16/BlazorWebAssembly/RunningCode/Test.c: -------------------------------------------------------------------------------- 1 | int fact(int n) 2 | { 3 | if (n == 0) return 1; 4 | return n * fact(n - 1); 5 | } -------------------------------------------------------------------------------- /Chapter16/BlazorWebAssembly/RunningCode/wwwroot/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter16/BlazorWebAssembly/RunningCode/wwwroot/favicon.png -------------------------------------------------------------------------------- /Chapter16/BlazorWebAssembly/RunningCode/wwwroot/icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter16/BlazorWebAssembly/RunningCode/wwwroot/icon-192.png -------------------------------------------------------------------------------- /Chapter16/BlazorWebAssembly/SkiaSharpDemo/Pages/Counter.razor: -------------------------------------------------------------------------------- 1 | @page "/counter" 2 | 3 |Current count: @currentCount
8 | 9 | 10 | 11 | @code { 12 | private int currentCount = 0; 13 | 14 | private void IncrementCount() 15 | { 16 | currentCount++; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Chapter16/BlazorWebAssembly/SkiaSharpDemo/wwwroot/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter16/BlazorWebAssembly/SkiaSharpDemo/wwwroot/favicon.png -------------------------------------------------------------------------------- /Chapter16/BlazorWebAssembly/SkiaSharpDemo/wwwroot/icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PacktPublishing/Web-Development-with-Blazor-Third-Edition/39418e9c607d9a221e4ada2bff39b638c3f6c271/Chapter16/BlazorWebAssembly/SkiaSharpDemo/wwwroot/icon-192.png -------------------------------------------------------------------------------- /Chapter17/SourceGeneratorDemo/BlazorWebAssembly/InterfaceGeneratorDemo/SampleService.cs: -------------------------------------------------------------------------------- 1 | namespace BlazorWebAssemblyApp.InterfaceGeneratorDemo; 2 | using InterfaceGenerator; 3 | 4 | [GenerateAutoInterface] 5 | public class SampleService: ISampleService 6 | { 7 | public double Multiply(double x, double y) 8 | { 9 | return x * y; 10 | } 11 | 12 | public int NiceNumber => 69; 13 | } 14 | -------------------------------------------------------------------------------- /Chapter17/SourceGeneratorDemo/BlazorWebAssembly/Pages/Counter.razor: -------------------------------------------------------------------------------- 1 | @page "/counter" 2 | 3 |Current count: @currentCount
8 | 9 | 10 | 11 | @code { 12 | private int currentCount = 0; 13 | 14 | private void IncrementCount() 15 | { 16 | currentCount++; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Chapter17/SourceGeneratorDemo/BlazorWebAssembly/Pages/Home.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | @inject GeneratedService service 3 |Current count: @currentCount
8 | 9 | 10 | 11 | @code { 12 | private int currentCount = 0; 13 | 14 | private void IncrementCount() 15 | { 16 | currentCount++; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Chapter17/SourceGeneratorDemo/BlazorWebAssemblyApp/Pages/Index.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | @inject GeneratedService service 3 |Current count: @currentCount
6 | 7 | 8 | 9 | @code { 10 | private int currentCount = 0; 11 | 12 | private void IncrementCount() 13 | { 14 | currentCount++; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Chapter18/BlazorHybridApp/BlazorHybridApp/Components/Pages/Home.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | 3 |