diff --git a/.editorconfig b/.editorconfig index b5f39e6..29eda3d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,6 +4,15 @@ root = true [*] indent_style = space +# Razor files +[*.razor] +indent_size = 2 +indent_style = space + +[*.css] +indent_size = 2 +indent_style = space + # Xml files [*.xml] indent_size = 2 @@ -14,8 +23,8 @@ indent_size = 2 #### Core EditorConfig Options #### # Indentation and spacing -indent_size = 4 -tab_width = 4 +indent_size = 2 +tab_width = 2 # New line preferences end_of_line = crlf diff --git a/.gitignore b/.gitignore index da23f7f..e2aa736 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ appsettings*.json # dotenv files -.env +.env* # User-specific files *.rsuser diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7301fa2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "cSpell.words": [ + "Antiforgery", + "blazor", + "Hsts" + ] +} \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..e5beb81 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,19 @@ +version: '3.8' +name: blog-development +services: + blog: + container_name: blog.stevanfreeborn.com-development + build: + target: development-stage + context: ./src/Blog/ + dockerfile: Dockerfile + volumes: + - ./src/Blog:/app + - '~/.aspnet/https:/root/.aspnet/https' + ports: + - '4500:4500' + - '4501:4501' + - '1234:5555' + restart: unless-stopped + env_file: + - ./src/Blog/.env.development diff --git a/src/Blog/.dockerignore b/src/Blog/.dockerignore index e69de29..5e21354 100644 --- a/src/Blog/.dockerignore +++ b/src/Blog/.dockerignore @@ -0,0 +1,15 @@ +!.env.vault +**/.dockerignore +**/.env +**/.project +**/.settings +**/.vs +**/.vscode +**/*.*proj.user +**/logs +**/bin +**/Dockerfile* +**/obj +.env* +.flaskenv* +!.env.project \ No newline at end of file diff --git a/src/Blog/Blog.csproj b/src/Blog/Blog.csproj index cbc473a..420ef61 100644 --- a/src/Blog/Blog.csproj +++ b/src/Blog/Blog.csproj @@ -1,9 +1,10 @@ - + net8.0 enable enable + 16b1dba7-29d0-466e-bd34-16d8018898eb diff --git a/src/Blog/Components/App.razor b/src/Blog/Components/App.razor index 962a6b1..1f3f9ab 100644 --- a/src/Blog/Components/App.razor +++ b/src/Blog/Components/App.razor @@ -2,17 +2,17 @@ - - - - - - + + + + + + - - + + diff --git a/src/Blog/Components/Layout/MainLayout.razor b/src/Blog/Components/Layout/MainLayout.razor index 0fd1b20..0d3d3af 100644 --- a/src/Blog/Components/Layout/MainLayout.razor +++ b/src/Blog/Components/Layout/MainLayout.razor @@ -3,7 +3,7 @@ @Body
- An unhandled error has occurred. - Reload - 🗙 + An unhandled error has occurred. + Reload + 🗙
diff --git a/src/Blog/Components/Layout/MainLayout.razor.css b/src/Blog/Components/Layout/MainLayout.razor.css index 0d26cfc..21a8d24 100644 --- a/src/Blog/Components/Layout/MainLayout.razor.css +++ b/src/Blog/Components/Layout/MainLayout.razor.css @@ -1,18 +1,18 @@ #blazor-error-ui { - background: lightyellow; - bottom: 0; - box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); - display: none; - left: 0; - padding: 0.6rem 1.25rem 0.7rem 1.25rem; - position: fixed; - width: 100%; - z-index: 1000; + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; } #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; } diff --git a/src/Blog/Components/Routes.razor b/src/Blog/Components/Routes.razor index f756e19..3b4a0a0 100644 --- a/src/Blog/Components/Routes.razor +++ b/src/Blog/Components/Routes.razor @@ -1,6 +1,6 @@  - - - - + + + + diff --git a/src/Blog/Dockerfile b/src/Blog/Dockerfile index e69de29..b258056 100644 --- a/src/Blog/Dockerfile +++ b/src/Blog/Dockerfile @@ -0,0 +1,19 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS setup-stage +WORKDIR /app +COPY *.csproj ./ +RUN dotnet restore +COPY . . + +FROM setup-stage as development-stage +RUN apt-get update +RUN apt-get install -y unzip +RUN curl -sSL https://aka.ms/getvsdbgsh | /bin/sh /dev/stdin -v latest -l ~/vsdbg +CMD ["dotnet", "watch"] + +FROM setup-stage as build-stage +RUN dotnet publish -c Release -o dist + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS production-stage +WORKDIR /app +COPY --from=build-stage /app/dist ./ +ENTRYPOINT ["dotnet", "Blog.dll"] \ No newline at end of file diff --git a/src/Blog/Program.cs b/src/Blog/Program.cs index 28d1bd6..a2d5151 100644 --- a/src/Blog/Program.cs +++ b/src/Blog/Program.cs @@ -2,18 +2,16 @@ using Blog.Components; var builder = WebApplication.CreateBuilder(args); -// Add services to the container. -builder.Services.AddRazorComponents() - .AddInteractiveServerComponents(); +builder.Services + .AddRazorComponents() + .AddInteractiveServerComponents(); var app = builder.Build(); -// Configure the HTTP request pipeline. -if (!app.Environment.IsDevelopment()) +if (app.Environment.IsProduction()) { - app.UseExceptionHandler("/Error", createScopeForErrors: true); - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts(); + app.UseExceptionHandler("/Error", createScopeForErrors: true); + app.UseHsts(); } app.UseHttpsRedirection(); @@ -21,7 +19,8 @@ app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseAntiforgery(); -app.MapRazorComponents() - .AddInteractiveServerRenderMode(); +app + .MapRazorComponents() + .AddInteractiveServerRenderMode(); -app.Run(); +app.Run(); \ No newline at end of file diff --git a/src/Blog/Properties/launchSettings.json b/src/Blog/Properties/launchSettings.json index 6a5b945..70c7a6e 100644 --- a/src/Blog/Properties/launchSettings.json +++ b/src/Blog/Properties/launchSettings.json @@ -12,8 +12,7 @@ "http": { "commandName": "Project", "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "http://localhost:5288", + "applicationUrl": "http://0.0.0.0:4501", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } @@ -21,8 +20,7 @@ "https": { "commandName": "Project", "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "https://localhost:7268;http://localhost:5288", + "applicationUrl": "https://0.0.0.0:9000;http://0.0.0.0:4501", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/src/Blog/wwwroot/app.css b/src/Blog/wwwroot/app.css index 3833800..795e36b 100644 --- a/src/Blog/wwwroot/app.css +++ b/src/Blog/wwwroot/app.css @@ -1,9 +1,13 @@ +h1:focus { + outline: none; +} + .blazor-error-boundary { - background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; - padding: 1rem 1rem 1rem 3.7rem; - color: white; + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; } .blazor-error-boundary::after { - content: "An error has occurred." + content: "An error has occurred." } diff --git a/test/Blog.Tests/UnitTest1.cs b/test/Blog.Tests/UnitTest1.cs deleted file mode 100644 index 73b2f3b..0000000 --- a/test/Blog.Tests/UnitTest1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Blog.Tests; - -public class UnitTest1 -{ - [Fact] - public void Test1() - { - - } -} \ No newline at end of file