From 1d1aefcd960e5274378d33358045ffecf652ad25 Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Sun, 25 Feb 2024 20:15:02 -0600 Subject: [PATCH 01/14] cleanup old images after build --- .forgejo/workflows/build.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/build.yaml b/.forgejo/workflows/build.yaml index 25397c9..520101f 100644 --- a/.forgejo/workflows/build.yaml +++ b/.forgejo/workflows/build.yaml @@ -13,4 +13,6 @@ jobs: steps: - uses: actions/checkout@v4 - name: docker build - run: docker build -t nseguin42/website:${{ github.sha }} . \ No newline at end of file + run: docker build -t nseguin42/website:${{ github.sha }} . + - name: cleanup old images + run: docker image prune -f --filter "until=24h" \ No newline at end of file -- 2.45.2 From d244292ef8171267be1e11194c8b147eff74f400 Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Sun, 25 Feb 2024 23:27:24 -0600 Subject: [PATCH 02/14] add attributions page --- .../Components/Pages/Attributions.razor | 81 +++++++++++++++++++ .../Components/Pages/Authentication.razor | 1 + src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj | 7 ++ .../NSeguin.Dev.Web.csproj.DotSettings | 2 + src/NSeguin.Dev.Web/Program.cs | 2 + src/NSeguin.Dev.Web/wwwroot/css/styles.css | 2 +- .../wwwroot/static/LICENSE.txt | 22 +++++ .../wwwroot/static/attributions.json | 2 + 8 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 src/NSeguin.Dev.Web/Components/Pages/Attributions.razor create mode 100644 src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj.DotSettings create mode 100644 src/NSeguin.Dev.Web/wwwroot/static/LICENSE.txt create mode 100644 src/NSeguin.Dev.Web/wwwroot/static/attributions.json diff --git a/src/NSeguin.Dev.Web/Components/Pages/Attributions.razor b/src/NSeguin.Dev.Web/Components/Pages/Attributions.razor new file mode 100644 index 0000000..05499e3 --- /dev/null +++ b/src/NSeguin.Dev.Web/Components/Pages/Attributions.razor @@ -0,0 +1,81 @@ +@page "/attributions" +@using System.Text.Json +@layout SimpleLayout + +Attributions + + + +
+
+

+ Attributions +

+ +

+ The source code for this website is available on + Forgejo (git.nseguin.dev). +

+ +

+ It is licensed under the MIT License. +

+ +
    + @if (AttributionsList != null) + { + @foreach (var attribution in AttributionsList) + { +
  • +

    @attribution.Name

    + @if (!string.IsNullOrWhiteSpace(attribution.Url?.ToString())) + { +

    URL: @attribution.Url

    + } + @if (attribution.Authors?.Any() ?? false) + { +

    Author(s): @string.Join(", ", attribution.Authors)

    + } + @if (!string.IsNullOrWhiteSpace(attribution.License)) + { +

    License: @attribution.License

    + } +
  • + } + } +
+
+
+ +@code { + + public record Attribution(string Name, Uri Url, string? License, Uri? LicenseUrl, string[]? Authors); + + private string? AttributionsJson { get; set; } + + private List? AttributionsList { get; set; } + + private string? LicenseUrl => "static/LICENSE.txt"; + + [Inject] + private IWebHostEnvironment HostEnvironment { get; set; } + + protected override async Task OnInitializedAsync() + { + var attributionsFile = HostEnvironment.WebRootFileProvider.GetFileInfo("static/attributions.json"); + using var reader = new StreamReader(attributionsFile.CreateReadStream()); + AttributionsJson = await reader.ReadToEndAsync(); + AttributionsList = JsonSerializer.Deserialize>(AttributionsJson); + await base.OnInitializedAsync(); + } + +} \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/Components/Pages/Authentication.razor b/src/NSeguin.Dev.Web/Components/Pages/Authentication.razor index 06c91ca..2693a54 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/Authentication.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/Authentication.razor @@ -1,5 +1,6 @@ @page "/authentication/{action}" @using System.Security.Claims +@layout SimpleLayout @code{ private const string Login = "login"; diff --git a/src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj b/src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj index 1e5e653..0072c50 100644 --- a/src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj +++ b/src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj @@ -38,6 +38,12 @@ + + PreserveNewest + + + PreserveNewest + @@ -45,6 +51,7 @@ + diff --git a/src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj.DotSettings b/src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj.DotSettings new file mode 100644 index 0000000..c6628c6 --- /dev/null +++ b/src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/Program.cs b/src/NSeguin.Dev.Web/Program.cs index 41f49a0..e7d802d 100644 --- a/src/NSeguin.Dev.Web/Program.cs +++ b/src/NSeguin.Dev.Web/Program.cs @@ -1,6 +1,7 @@ using Azure.Identity; using Microsoft.AspNetCore.Authentication.OpenIdConnect; +using Microsoft.Extensions.FileProviders; using Microsoft.Identity.Web; using Microsoft.Identity.Web.UI; using Microsoft.IdentityModel.Protocols.OpenIdConnect; @@ -91,6 +92,7 @@ app.UseHttpLogging(); app.UseHttpsRedirection(); app.UseBlazorFrameworkFiles(); app.UseStaticFiles(new StaticFileOptions {ServeUnknownFileTypes = true}); + app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); diff --git a/src/NSeguin.Dev.Web/wwwroot/css/styles.css b/src/NSeguin.Dev.Web/wwwroot/css/styles.css index 06d3b60..d1ba582 100644 --- a/src/NSeguin.Dev.Web/wwwroot/css/styles.css +++ b/src/NSeguin.Dev.Web/wwwroot/css/styles.css @@ -1 +1 @@ -/*! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,Helvetica Neue,Helvetica,Open Sans,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:Iosevka,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#5b85ae80;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.left-\[40rem\]{left:40rem}.right-0{right:0}.z-0{z-index:0}.mx-auto{margin-left:auto;margin-right:auto}.mb-10{margin-bottom:2.5rem}.mb-4{margin-bottom:1rem}.ml-3{margin-left:.75rem}.mt-10{margin-top:2.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.items-center{align-items:center}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-4{row-gap:1rem}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-blue-700{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(91 133 174/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(69 105 141/var(--tw-bg-opacity))}.bg-brand\/5{background-color:#4c566a0d}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(244 244 244/var(--tw-bg-opacity))}.fill-blue-600{fill:#45698d}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[0\.8125rem\]{font-size:.8125rem}.text-\[2rem\]{font-size:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-10{line-height:2.5rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.tracking-tighter{letter-spacing:-.05em}.text-blue-500{--tw-text-opacity:1;color:rgb(91 133 174/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(69 105 141/var(--tw-text-opacity))}.text-brand{--tw-text-opacity:1;color:rgb(76 86 106/var(--tw-text-opacity))}.text-green{--tw-text-opacity:1;color:rgb(106 139 79/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(134 170 104/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(191 97 106/var(--tw-text-opacity))}.text-slate{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-50{--tw-text-opacity:1;color:rgb(244 244 244/var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(46 52 64/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(227 182 91/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.shadow-blue-100{--tw-shadow-color:#d8dee9;--tw-shadow:var(--tw-shadow-colored)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}:root{scrollbar-gutter:stable}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(51 77 103/var(--tw-bg-opacity))}.focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.group:hover .group-hover\:bg-slate-100{--tw-bg-opacity:1;background-color:rgb(236 239 244/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:w-auto{width:auto}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-col{flex-direction:column}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-28{padding-top:7rem;padding-bottom:7rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.group:hover .sm\:group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-5xl{font-size:3rem;line-height:1}}@media (min-width:1024px){.lg\:mx-0{margin-left:0;margin-right:0}.lg\:ms-auto{margin-inline-start:auto}.lg\:block{display:block}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width:1280px){.xl\:left-\[50rem\]{left:50rem}.xl\:px-28{padding-left:7rem;padding-right:7rem}.xl\:py-32{padding-top:8rem;padding-bottom:8rem}} \ No newline at end of file +/*! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,Helvetica Neue,Helvetica,Open Sans,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:Iosevka,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#5b85ae80;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.left-\[40rem\]{left:40rem}.right-0{right:0}.z-0{z-index:0}.mx-auto{margin-left:auto;margin-right:auto}.mb-10{margin-bottom:2.5rem}.mb-4{margin-bottom:1rem}.ml-3{margin-left:.75rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.items-center{align-items:center}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-4{row-gap:1rem}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-blue-700{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(91 133 174/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(69 105 141/var(--tw-bg-opacity))}.bg-brand\/5{background-color:#4c566a0d}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(244 244 244/var(--tw-bg-opacity))}.fill-blue-600{fill:#45698d}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[0\.8125rem\]{font-size:.8125rem}.text-\[2rem\]{font-size:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-10{line-height:2.5rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.tracking-tighter{letter-spacing:-.05em}.text-blue-500{--tw-text-opacity:1;color:rgb(91 133 174/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(69 105 141/var(--tw-text-opacity))}.text-brand{--tw-text-opacity:1;color:rgb(76 86 106/var(--tw-text-opacity))}.text-green{--tw-text-opacity:1;color:rgb(106 139 79/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(134 170 104/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(191 97 106/var(--tw-text-opacity))}.text-slate{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-50{--tw-text-opacity:1;color:rgb(244 244 244/var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(46 52 64/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(227 182 91/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.shadow-blue-100{--tw-shadow-color:#d8dee9;--tw-shadow:var(--tw-shadow-colored)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}:root{scrollbar-gutter:stable}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(51 77 103/var(--tw-bg-opacity))}.focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.group:hover .group-hover\:bg-slate-100{--tw-bg-opacity:1;background-color:rgb(236 239 244/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:w-auto{width:auto}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-col{flex-direction:column}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-28{padding-top:7rem;padding-bottom:7rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.group:hover .sm\:group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-5xl{font-size:3rem;line-height:1}}@media (min-width:1024px){.lg\:mx-0{margin-left:0;margin-right:0}.lg\:ms-auto{margin-inline-start:auto}.lg\:block{display:block}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width:1280px){.xl\:left-\[50rem\]{left:50rem}.xl\:px-28{padding-left:7rem;padding-right:7rem}.xl\:py-32{padding-top:8rem;padding-bottom:8rem}} \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/wwwroot/static/LICENSE.txt b/src/NSeguin.Dev.Web/wwwroot/static/LICENSE.txt new file mode 100644 index 0000000..cd1db37 --- /dev/null +++ b/src/NSeguin.Dev.Web/wwwroot/static/LICENSE.txt @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2023 Nicholas Seguin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/src/NSeguin.Dev.Web/wwwroot/static/attributions.json b/src/NSeguin.Dev.Web/wwwroot/static/attributions.json new file mode 100644 index 0000000..32960f8 --- /dev/null +++ b/src/NSeguin.Dev.Web/wwwroot/static/attributions.json @@ -0,0 +1,2 @@ +[ +] \ No newline at end of file -- 2.45.2 From 5450522e37b018f07b93c33f94347d6a853f7d36 Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Sun, 25 Feb 2024 23:33:37 -0600 Subject: [PATCH 03/14] move some styling into SimpleLayout.razor --- .../Components/Layout/SimpleLayout.razor | 25 +++- .../Components/Layout/SimpleLayout.razor.css | 8 +- .../Components/Pages/Attributions.razor | 77 +++++------ .../Components/Pages/Home.razor | 127 ++++++++---------- 4 files changed, 109 insertions(+), 128 deletions(-) diff --git a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor index 7075424..16f6f2f 100644 --- a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor +++ b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor @@ -1,13 +1,26 @@ @inherits LayoutComponentBase -
-
-
- @Body -
-
+ +
+
+
+
+ @Body +
+
+
+
+
An unhandled error has occurred. Reload diff --git a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css index 86c891c..d5914c2 100644 --- a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css +++ b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css @@ -1,11 +1,9 @@ -.page { - position: relative; - display: flex; - flex-direction: column; -} main { flex: 1; + position: relative; + display: flex; + flex-direction: column; } .top-row { diff --git a/src/NSeguin.Dev.Web/Components/Pages/Attributions.razor b/src/NSeguin.Dev.Web/Components/Pages/Attributions.razor index 05499e3..5b215c6 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/Attributions.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/Attributions.razor @@ -4,57 +4,42 @@ Attributions - +

+ Attributions +

-
-
-

- Attributions -

+

+ The source code for this website is available on + Forgejo (git.nseguin.dev). +

-

- The source code for this website is available on - Forgejo (git.nseguin.dev). -

+

+ It is licensed under the MIT License. +

-

- It is licensed under the MIT License. -

- -
    - @if (AttributionsList != null) - { - @foreach (var attribution in AttributionsList) +
      + @if (AttributionsList != null) + { + @foreach (var attribution in AttributionsList) + { +
    • +

      @attribution.Name

      + @if (!string.IsNullOrWhiteSpace(attribution.Url?.ToString())) { -
    • -

      @attribution.Name

      - @if (!string.IsNullOrWhiteSpace(attribution.Url?.ToString())) - { -

      URL: @attribution.Url

      - } - @if (attribution.Authors?.Any() ?? false) - { -

      Author(s): @string.Join(", ", attribution.Authors)

      - } - @if (!string.IsNullOrWhiteSpace(attribution.License)) - { -

      License: @attribution.License

      - } -
    • +

      URL: @attribution.Url

      } - } -
    -
-
+ @if (attribution.Authors?.Any() ?? false) + { +

Author(s): @string.Join(", ", attribution.Authors)

+ } + @if (!string.IsNullOrWhiteSpace(attribution.License)) + { +

License: @attribution.License

+ } + + } + } + @code { diff --git a/src/NSeguin.Dev.Web/Components/Pages/Home.razor b/src/NSeguin.Dev.Web/Components/Pages/Home.razor index ac49798..c8fa8e6 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/Home.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/Home.razor @@ -5,80 +5,65 @@ Home - +

+ nseguin/website + + +

-
-
-

- nseguin/website - - -

+

+ Nick Seguin +

-

- Nick Seguin -

+

+ I'm a software developer based in Iowa. + I'm currently working on a few projects, including this website. + Thanks for visiting! +

-

- I'm a software developer based in Iowa. - I'm currently working on a few projects, including this website. - Thanks for visiting! -

- -
- + \ No newline at end of file -- 2.45.2 From 57e3fb1a7e2f83521efaa2a1465da8707a1967a1 Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Tue, 27 Feb 2024 17:45:57 -0600 Subject: [PATCH 04/14] cleanup autofocus --- src/NSeguin.Dev.Web/Components/Shared/AutoFocus.razor | 9 ++++++++- src/NSeguin.Dev.Web/wwwroot/js/app.js | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/NSeguin.Dev.Web/Components/Shared/AutoFocus.razor b/src/NSeguin.Dev.Web/Components/Shared/AutoFocus.razor index 3b33c9f..b750957 100644 --- a/src/NSeguin.Dev.Web/Components/Shared/AutoFocus.razor +++ b/src/NSeguin.Dev.Web/Components/Shared/AutoFocus.razor @@ -1,14 +1,21 @@ @inject IJSRuntime JSRuntime + @code { + [Parameter] - public Func GetControl { get; set; } + public Func? GetControl { get; set; } protected override async Task OnAfterRenderAsync(bool firstRender) { if (GetControl is null) + { throw new ArgumentNullException(nameof(GetControl)); + } if (firstRender) + { await JSRuntime.InvokeVoidAsync("App.scrollIntoView", GetControl(), true); + } } + } \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/wwwroot/js/app.js b/src/NSeguin.Dev.Web/wwwroot/js/app.js index 47b2a43..ea402e9 100644 --- a/src/NSeguin.Dev.Web/wwwroot/js/app.js +++ b/src/NSeguin.Dev.Web/wwwroot/js/app.js @@ -1,9 +1,15 @@ -var App = App || {}; +const App = App || {}; App.setFocus = function (element) { element.focus(); } App.scrollIntoView = function (element, args) { + if (element === undefined) { + console.error('Element is undefined'); + } else if (element === null) { + console.error('Element is null'); + } + element.scrollIntoView(args); } \ No newline at end of file -- 2.45.2 From a7e21abe79e15e0dfd202e30ee4f986b59972a26 Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Tue, 27 Feb 2024 17:46:59 -0600 Subject: [PATCH 05/14] remove leftover authentication components --- .../Components/Shared/LoginDisplay.razor | 20 ------------------- .../Components/Shared/RedirectToLogin.razor | 10 ---------- 2 files changed, 30 deletions(-) delete mode 100644 src/NSeguin.Dev.Web/Components/Shared/LoginDisplay.razor delete mode 100644 src/NSeguin.Dev.Web/Components/Shared/RedirectToLogin.razor diff --git a/src/NSeguin.Dev.Web/Components/Shared/LoginDisplay.razor b/src/NSeguin.Dev.Web/Components/Shared/LoginDisplay.razor deleted file mode 100644 index 7ac0fa6..0000000 --- a/src/NSeguin.Dev.Web/Components/Shared/LoginDisplay.razor +++ /dev/null @@ -1,20 +0,0 @@ -@inject NavigationManager Navigation - - - - Hello, @context.User.Identity?.Name! - - - - Log in - - - -@code{ - - private void BeginLogout(MouseEventArgs args) - { - Navigation.NavigateTo("authentication/logout"); - } - -} \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/Components/Shared/RedirectToLogin.razor b/src/NSeguin.Dev.Web/Components/Shared/RedirectToLogin.razor deleted file mode 100644 index df41723..0000000 --- a/src/NSeguin.Dev.Web/Components/Shared/RedirectToLogin.razor +++ /dev/null @@ -1,10 +0,0 @@ -@inject NavigationManager Navigation - -@code { - - protected override void OnInitialized() - { - Navigation.NavigateTo($"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}"); - } - -} \ No newline at end of file -- 2.45.2 From 173aa9a3ed094620e93b326629cb7df3cbc79a9c Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Tue, 27 Feb 2024 17:53:40 -0600 Subject: [PATCH 06/14] add standard tailwind plugins, remove unused dev dependency --- src/NSeguin.Dev.Web/package.json | 9 ++- src/NSeguin.Dev.Web/pnpm-lock.yaml | 83 +++++++++++++++++++++++--- src/NSeguin.Dev.Web/tailwind.config.ts | 6 +- 3 files changed, 85 insertions(+), 13 deletions(-) diff --git a/src/NSeguin.Dev.Web/package.json b/src/NSeguin.Dev.Web/package.json index 875d58a..8afdf06 100644 --- a/src/NSeguin.Dev.Web/package.json +++ b/src/NSeguin.Dev.Web/package.json @@ -2,7 +2,6 @@ "name": "nseguin.dev.web", "type": "module", "devDependencies": { - "bun-types": "latest" }, "peerDependencies": { "typescript": "^5.0.0" @@ -12,7 +11,11 @@ "css:watch": "pnpm tailwindcss -i ./wwwroot/css/site.css -o ./wwwroot/css/styles.css -c ./tailwind.config.ts --watch" }, "dependencies": { - "tailwind-nord": "^1.3.0", - "tailwindcss": "^3.4.1" + "tailwindcss": "^3.4.1", + "@tailwindcss/typography": "^0.5.10", + "@tailwindcss/forms": "^0.5.7", + "@tailwindcss/aspect-ratio": "^0.4.2", + "@tailwindcss/container-queries": "^0.1.1", + "tailwind-nord": "^1.3.0" } } \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/pnpm-lock.yaml b/src/NSeguin.Dev.Web/pnpm-lock.yaml index d29a062..bcd2735 100644 --- a/src/NSeguin.Dev.Web/pnpm-lock.yaml +++ b/src/NSeguin.Dev.Web/pnpm-lock.yaml @@ -5,6 +5,18 @@ settings: excludeLinksFromLockfile: false dependencies: + '@tailwindcss/aspect-ratio': + specifier: ^0.4.2 + version: 0.4.2(tailwindcss@3.4.1) + '@tailwindcss/container-queries': + specifier: ^0.1.1 + version: 0.1.1(tailwindcss@3.4.1) + '@tailwindcss/forms': + specifier: ^0.5.7 + version: 0.5.7(tailwindcss@3.4.1) + '@tailwindcss/typography': + specifier: ^0.5.10 + version: 0.5.10(tailwindcss@3.4.1) tailwind-nord: specifier: ^1.3.0 version: 1.3.0 @@ -15,11 +27,6 @@ dependencies: specifier: ^5.0.0 version: 5.3.3 -devDependencies: - bun-types: - specifier: latest - version: 1.0.15 - packages: /@alloc/quick-lru@5.2.0: @@ -78,6 +85,43 @@ packages: fastq: 1.15.0 dev: false + /@tailwindcss/aspect-ratio@0.4.2(tailwindcss@3.4.1): + resolution: {integrity: sha512-8QPrypskfBa7QIMuKHg2TA7BqES6vhBrDLOv8Unb6FcFyd3TjKbc6lcmb9UPQHxfl24sXoJ41ux/H7qQQvfaSQ==} + peerDependencies: + tailwindcss: '>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1' + dependencies: + tailwindcss: 3.4.1 + dev: false + + /@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.1): + resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==} + peerDependencies: + tailwindcss: '>=3.2.0' + dependencies: + tailwindcss: 3.4.1 + dev: false + + /@tailwindcss/forms@0.5.7(tailwindcss@3.4.1): + resolution: {integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.4.1 + dev: false + + /@tailwindcss/typography@0.5.10(tailwindcss@3.4.1): + resolution: {integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.1 + dev: false + /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: false @@ -117,10 +161,6 @@ packages: fill-range: 7.0.1 dev: false - /bun-types@1.0.15: - resolution: {integrity: sha512-XkEvWLV1JIhcVIpf2Lu6FXnZUxRUkQVJmgY+VT7os6Tk5X1nkXx11q4Rtu6txsqpDJZfUeZXblnnD59K+6wsVA==} - dev: true - /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -296,6 +336,18 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: false + /lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: false + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -309,6 +361,11 @@ packages: picomatch: 2.3.1 dev: false + /mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + dev: false + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -427,6 +484,14 @@ packages: postcss-selector-parser: 6.0.13 dev: false + /postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + /postcss-selector-parser@6.0.13: resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} engines: {node: '>=4'} diff --git a/src/NSeguin.Dev.Web/tailwind.config.ts b/src/NSeguin.Dev.Web/tailwind.config.ts index d65b8dd..9d6d9ac 100644 --- a/src/NSeguin.Dev.Web/tailwind.config.ts +++ b/src/NSeguin.Dev.Web/tailwind.config.ts @@ -145,7 +145,11 @@ export default { } }, plugins: [ - require('tailwind-nord') + require('tailwind-nord'), + require('@tailwindcss/typography'), + require('@tailwindcss/forms'), + require('@tailwindcss/aspect-ratio'), + require('@tailwindcss/container-queries') ] } } satisfies Config \ No newline at end of file -- 2.45.2 From eb7a0007330b9d7d41053334a06b04f722c05442 Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Tue, 27 Feb 2024 17:55:03 -0600 Subject: [PATCH 07/14] remove leftover bootstrap css config --- .../Components/Layout/SimpleLayout.razor | 2 +- .../Components/Layout/SimpleLayout.razor.css | 72 ------------------- 2 files changed, 1 insertion(+), 73 deletions(-) diff --git a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor index 16f6f2f..4f6ca74 100644 --- a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor +++ b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor @@ -14,7 +14,7 @@
-
+
@Body
diff --git a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css index d5914c2..9f13e57 100644 --- a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css +++ b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css @@ -1,75 +1,3 @@ - -main { - flex: 1; - position: relative; - display: flex; - flex-direction: column; -} - -.top-row { - background-color: #f7f7f7; - border-bottom: 1px solid #d6d5d5; - justify-content: flex-end; - height: 3.5rem; - display: flex; - align-items: center; -} - -.top-row ::deep a, .top-row ::deep .btn-link { - white-space: nowrap; - margin-left: 1.5rem; - text-decoration: none; -} - -.top-row ::deep a:hover, .top-row ::deep .btn-link:hover { - text-decoration: underline; -} - -.top-row ::deep a:first-child { - overflow: hidden; - text-overflow: ellipsis; -} - -@media (max-width: 640.98px) { - .top-row { - justify-content: space-between; - } - - .top-row ::deep a, .top-row ::deep .btn-link { - margin-left: 0; - } -} - -@media (min-width: 641px) { - .page { - flex-direction: row; - } - - .sidebar { - width: 250px; - height: 100vh; - position: sticky; - top: 0; - } - - .top-row { - position: sticky; - top: 0; - z-index: 1; - } - - .top-row.auth ::deep a:first-child { - flex: 1; - text-align: right; - width: 0; - } - - .top-row, article { - padding-left: 2rem !important; - padding-right: 1.5rem !important; - } -} - #blazor-error-ui { background: lightyellow; bottom: 0; -- 2.45.2 From 9078b50298da3b66f48e17e380130a052b770032 Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Tue, 27 Feb 2024 17:59:20 -0600 Subject: [PATCH 08/14] Recreate blazor error ui in tailwind --- .../Components/Layout/SimpleLayout.razor | 9 ++++++--- .../Components/Layout/SimpleLayout.razor.css | 18 ------------------ .../Components/Pages/Home.razor | 14 +++++++++++++- src/NSeguin.Dev.Web/wwwroot/css/styles.css | 2 +- 4 files changed, 20 insertions(+), 23 deletions(-) delete mode 100644 src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css diff --git a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor index 4f6ca74..8f9ef10 100644 --- a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor +++ b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor @@ -21,8 +21,11 @@
-
+ \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css deleted file mode 100644 index 9f13e57..0000000 --- a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor.css +++ /dev/null @@ -1,18 +0,0 @@ -#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; -} - -#blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; -} \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/Components/Pages/Home.razor b/src/NSeguin.Dev.Web/Components/Pages/Home.razor index c8fa8e6..baf493d 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/Home.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/Home.razor @@ -21,6 +21,11 @@ Thanks for visiting!

+

+ Click this button to throw an error: + +

+
@@ -66,4 +71,11 @@
-
\ No newline at end of file +
+ +@code { + private void ThrowError() + { + throw new Exception("This is a test exception"); + } +} \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/wwwroot/css/styles.css b/src/NSeguin.Dev.Web/wwwroot/css/styles.css index d1ba582..82e4bcd 100644 --- a/src/NSeguin.Dev.Web/wwwroot/css/styles.css +++ b/src/NSeguin.Dev.Web/wwwroot/css/styles.css @@ -1 +1 @@ -/*! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,Helvetica Neue,Helvetica,Open Sans,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:Iosevka,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#5b85ae80;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.left-\[40rem\]{left:40rem}.right-0{right:0}.z-0{z-index:0}.mx-auto{margin-left:auto;margin-right:auto}.mb-10{margin-bottom:2.5rem}.mb-4{margin-bottom:1rem}.ml-3{margin-left:.75rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.items-center{align-items:center}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-4{row-gap:1rem}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-blue-700{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(91 133 174/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(69 105 141/var(--tw-bg-opacity))}.bg-brand\/5{background-color:#4c566a0d}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(244 244 244/var(--tw-bg-opacity))}.fill-blue-600{fill:#45698d}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[0\.8125rem\]{font-size:.8125rem}.text-\[2rem\]{font-size:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-10{line-height:2.5rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.tracking-tighter{letter-spacing:-.05em}.text-blue-500{--tw-text-opacity:1;color:rgb(91 133 174/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(69 105 141/var(--tw-text-opacity))}.text-brand{--tw-text-opacity:1;color:rgb(76 86 106/var(--tw-text-opacity))}.text-green{--tw-text-opacity:1;color:rgb(106 139 79/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(134 170 104/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(191 97 106/var(--tw-text-opacity))}.text-slate{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-50{--tw-text-opacity:1;color:rgb(244 244 244/var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(46 52 64/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(227 182 91/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.shadow-blue-100{--tw-shadow-color:#d8dee9;--tw-shadow:var(--tw-shadow-colored)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}:root{scrollbar-gutter:stable}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(51 77 103/var(--tw-bg-opacity))}.focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.group:hover .group-hover\:bg-slate-100{--tw-bg-opacity:1;background-color:rgb(236 239 244/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:w-auto{width:auto}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-col{flex-direction:column}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-28{padding-top:7rem;padding-bottom:7rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.group:hover .sm\:group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-5xl{font-size:3rem;line-height:1}}@media (min-width:1024px){.lg\:mx-0{margin-left:0;margin-right:0}.lg\:ms-auto{margin-inline-start:auto}.lg\:block{display:block}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width:1280px){.xl\:left-\[50rem\]{left:50rem}.xl\:px-28{padding-left:7rem;padding-right:7rem}.xl\:py-32{padding-top:8rem;padding-bottom:8rem}} \ No newline at end of file +/*! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,Helvetica Neue,Helvetica,Open Sans,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:Iosevka,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#5b85ae80;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-\[40rem\]{left:40rem}.right-0{right:0}.z-0{z-index:0}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-10{margin-bottom:2.5rem}.mb-4{margin-bottom:1rem}.ml-3{margin-left:.75rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.items-center{align-items:center}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-4{row-gap:1rem}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-blue-700{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(91 133 174/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(69 105 141/var(--tw-bg-opacity))}.bg-brand{--tw-bg-opacity:1;background-color:rgb(76 86 106/var(--tw-bg-opacity))}.bg-brand\/5{background-color:#4c566a0d}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(244 244 244/var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(235 203 139/var(--tw-bg-opacity))}.fill-blue-600{fill:#45698d}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[0\.8125rem\]{font-size:.8125rem}.text-\[2rem\]{font-size:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-10{line-height:2.5rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.tracking-tighter{letter-spacing:-.05em}.text-blue-500{--tw-text-opacity:1;color:rgb(91 133 174/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(69 105 141/var(--tw-text-opacity))}.text-brand{--tw-text-opacity:1;color:rgb(76 86 106/var(--tw-text-opacity))}.text-green{--tw-text-opacity:1;color:rgb(106 139 79/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(134 170 104/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(191 97 106/var(--tw-text-opacity))}.text-slate{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-50{--tw-text-opacity:1;color:rgb(244 244 244/var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(46 52 64/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(227 182 91/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-blue-100{--tw-shadow-color:#d8dee9;--tw-shadow:var(--tw-shadow-colored)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}:root{scrollbar-gutter:stable}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(51 77 103/var(--tw-bg-opacity))}.focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.group:hover .group-hover\:bg-slate-100{--tw-bg-opacity:1;background-color:rgb(236 239 244/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:w-auto{width:auto}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-col{flex-direction:column}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-28{padding-top:7rem;padding-bottom:7rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.group:hover .sm\:group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-5xl{font-size:3rem;line-height:1}}@media (min-width:1024px){.lg\:mx-0{margin-left:0;margin-right:0}.lg\:ms-auto{margin-inline-start:auto}.lg\:block{display:block}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width:1280px){.xl\:left-\[50rem\]{left:50rem}.xl\:px-28{padding-left:7rem;padding-right:7rem}.xl\:py-32{padding-top:8rem;padding-bottom:8rem}} \ No newline at end of file -- 2.45.2 From 83feaaab4072b78bec16a25366573feb5cd7e62f Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Tue, 27 Feb 2024 18:38:49 -0600 Subject: [PATCH 09/14] add script/stylesheet versioning --- src/NSeguin.Dev.Web/Components/App.razor | 25 +++++++++++++------ .../Components/Layout/SimpleLayout.razor | 15 ++++------- .../Components/Shared/BlazorErrorUI.razor | 11 ++++++++ 3 files changed, 34 insertions(+), 17 deletions(-) create mode 100644 src/NSeguin.Dev.Web/Components/Shared/BlazorErrorUI.razor diff --git a/src/NSeguin.Dev.Web/Components/App.razor b/src/NSeguin.Dev.Web/Components/App.razor index 0862ebc..4b1ee31 100644 --- a/src/NSeguin.Dev.Web/Components/App.razor +++ b/src/NSeguin.Dev.Web/Components/App.razor @@ -1,19 +1,30 @@ - +@using Microsoft.AspNetCore.Mvc.ViewFeatures +@using JetBrains.Annotations +@inject IFileVersionProvider FileVersionProvider + + + - - - - + + + + @* ReSharper disable once Html.PathError *@ - + - \ No newline at end of file + + +@code { + private const string PathBase = "/"; + + private string AddVersionToPath([PathReference] string path) => FileVersionProvider.AddFileVersionToPath(PathBase, path); +} \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor index 8f9ef10..0a5f311 100644 --- a/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor +++ b/src/NSeguin.Dev.Web/Components/Layout/SimpleLayout.razor @@ -14,18 +14,13 @@
-
- @Body +
+ + @Body +
- \ No newline at end of file + \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/Components/Shared/BlazorErrorUI.razor b/src/NSeguin.Dev.Web/Components/Shared/BlazorErrorUI.razor new file mode 100644 index 0000000..ab8cc00 --- /dev/null +++ b/src/NSeguin.Dev.Web/Components/Shared/BlazorErrorUI.razor @@ -0,0 +1,11 @@ +@inject IHostEnvironment HostEnvironment + + \ No newline at end of file -- 2.45.2 From 79f6d80b894c08f5241023aa68577147380efd34 Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Tue, 27 Feb 2024 19:01:25 -0600 Subject: [PATCH 10/14] housekeeping --- .../Components/Pages/Authentication.razor | 43 -------------- .../Components/Pages/Home.razor | 5 -- .../Components/Pages/NotFound.razor | 30 +++------- src/NSeguin.Dev.Web/Components/Routes.razor | 57 +++++++++++-------- src/NSeguin.Dev.Web/Program.cs | 27 ++++++++- 5 files changed, 64 insertions(+), 98 deletions(-) delete mode 100644 src/NSeguin.Dev.Web/Components/Pages/Authentication.razor diff --git a/src/NSeguin.Dev.Web/Components/Pages/Authentication.razor b/src/NSeguin.Dev.Web/Components/Pages/Authentication.razor deleted file mode 100644 index 2693a54..0000000 --- a/src/NSeguin.Dev.Web/Components/Pages/Authentication.razor +++ /dev/null @@ -1,43 +0,0 @@ -@page "/authentication/{action}" -@using System.Security.Claims -@layout SimpleLayout - -@code{ - private const string Login = "login"; - private const string Logout = "logout"; - public ClaimsPrincipal? User { get; private set; } - - [CascadingParameter] - public required Task AuthenticationState { get; set; } - - [Parameter] - public string? Action { get; set; } - - [Inject] - public required NavigationManager NavigationManager { get; set; } - - private void SignOut() - { - NavigationManager.NavigateTo("MicrosoftIdentity/Account/SignOut", true); - } - - private void SignIn() - { - NavigationManager.NavigateTo("MicrosoftIdentity/Account/SignIn", true); - } - - protected override async Task OnInitializedAsync() - { - var authenticationState = await AuthenticationState; - User = authenticationState.User; - if (Action == Logout) - { - SignOut(); - } - else if (Action == Login) - { - SignIn(); - } - } - -} \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/Components/Pages/Home.razor b/src/NSeguin.Dev.Web/Components/Pages/Home.razor index baf493d..45f0887 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/Home.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/Home.razor @@ -21,11 +21,6 @@ Thanks for visiting!

-

- Click this button to throw an error: - -

-
diff --git a/src/NSeguin.Dev.Web/Components/Pages/NotFound.razor b/src/NSeguin.Dev.Web/Components/Pages/NotFound.razor index 8dc695f..2e81b97 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/NotFound.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/NotFound.razor @@ -5,30 +5,14 @@ Not Found - +

Not Found

+

+ No page was found at @Path. +

-
-
-

Not Found

-

- No page was found at @Path.
-

- -

- Go to home page -

- -
-
+

+ Go to home page +

@code { private string Path { get; set; } diff --git a/src/NSeguin.Dev.Web/Components/Routes.razor b/src/NSeguin.Dev.Web/Components/Routes.razor index af1b907..12d74d0 100644 --- a/src/NSeguin.Dev.Web/Components/Routes.razor +++ b/src/NSeguin.Dev.Web/Components/Routes.razor @@ -1,24 +1,33 @@ - - - - - - @if (context.User.Identity?.IsAuthenticated != true) - { - - } - else - { -

You are not authorized to access this resource.

- } -
-
-
- - Not found - -

Sorry, there's nothing at this address.

-
-
-
-
\ No newline at end of file + + + + + + Not found + + + +
+
+

Not Found

+

+ No page was found at this address. Please check the web address and try again. +

+

+ Go to home page +

+ +
+
+
+
+
\ No newline at end of file diff --git a/src/NSeguin.Dev.Web/Program.cs b/src/NSeguin.Dev.Web/Program.cs index e7d802d..88d7f4a 100644 --- a/src/NSeguin.Dev.Web/Program.cs +++ b/src/NSeguin.Dev.Web/Program.cs @@ -1,6 +1,7 @@ using Azure.Identity; using Microsoft.AspNetCore.Authentication.OpenIdConnect; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.FileProviders; using Microsoft.Identity.Web; using Microsoft.Identity.Web.UI; @@ -31,6 +32,20 @@ builder.Services.AddRazorComponents() .AddInteractiveServerComponents() .AddInteractiveWebAssemblyComponents(); +builder.Services.AddProblemDetails( + options => + { + options.CustomizeProblemDetails = ctx => + { + ctx.ProblemDetails.Extensions.TryAdd("traceId", ctx.HttpContext.TraceIdentifier); + if (ctx.HttpContext.RequestServices.GetRequiredService() + .IsDevelopment()) + { + ctx.ProblemDetails.Extensions.TryAdd("exception", ctx.Exception?.ToString()); + } + }; + }); + if (builder.Environment.IsStaging() || builder.Environment.IsProduction()) { builder.Configuration.AddAzureAppConfiguration( @@ -92,21 +107,27 @@ app.UseHttpLogging(); app.UseHttpsRedirection(); app.UseBlazorFrameworkFiles(); app.UseStaticFiles(new StaticFileOptions {ServeUnknownFileTypes = true}); - app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseAntiforgery(); app.MapRazorComponents() .AddAdditionalAssemblies(typeof(Counter).Assembly) + .AddAdditionalAssemblies(typeof(AsyncEventHandler).Assembly) .AddInteractiveServerRenderMode() .AddInteractiveWebAssemblyRenderMode(); -app.MapControllers(); +app.UseExceptionHandler(); app.MapFallback( ctx => { - ctx.Response.Redirect($"/NotFound?path={ctx.Request.Path}"); + ctx.Response.StatusCode = StatusCodes.Status404NotFound; + var headers = ctx.Request.GetTypedHeaders(); + if (headers.Accept.Any(h => h.MatchesMediaType("text/html"))) + { + ctx.Response.Redirect($"/NotFound?path={ctx.Request.Path}"); + } + return Task.CompletedTask; }); -- 2.45.2 From 3ddbfd2a9bd6b7fafb1f5ee2ec9b6bacc1f45f58 Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Tue, 27 Feb 2024 19:06:16 -0600 Subject: [PATCH 11/14] housekeeping --- src/NSeguin.Dev.Web/Components/Pages/Home.razor | 4 ++-- src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj | 1 - src/NSeguin.Dev.Web/wwwroot/css/styles.css | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/NSeguin.Dev.Web/Components/Pages/Home.razor b/src/NSeguin.Dev.Web/Components/Pages/Home.razor index 45f0887..45f9242 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/Home.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/Home.razor @@ -5,11 +5,11 @@ Home -

+

nseguin/website -

+

Nick Seguin diff --git a/src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj b/src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj index 0072c50..43138df 100644 --- a/src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj +++ b/src/NSeguin.Dev.Web/NSeguin.Dev.Web.csproj @@ -51,7 +51,6 @@ - diff --git a/src/NSeguin.Dev.Web/wwwroot/css/styles.css b/src/NSeguin.Dev.Web/wwwroot/css/styles.css index 82e4bcd..e23a62f 100644 --- a/src/NSeguin.Dev.Web/wwwroot/css/styles.css +++ b/src/NSeguin.Dev.Web/wwwroot/css/styles.css @@ -1 +1 @@ -/*! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,Helvetica Neue,Helvetica,Open Sans,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:Iosevka,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#5b85ae80;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-\[40rem\]{left:40rem}.right-0{right:0}.z-0{z-index:0}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-10{margin-bottom:2.5rem}.mb-4{margin-bottom:1rem}.ml-3{margin-left:.75rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.items-center{align-items:center}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-4{row-gap:1rem}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-blue-700{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(91 133 174/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(69 105 141/var(--tw-bg-opacity))}.bg-brand{--tw-bg-opacity:1;background-color:rgb(76 86 106/var(--tw-bg-opacity))}.bg-brand\/5{background-color:#4c566a0d}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(244 244 244/var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(235 203 139/var(--tw-bg-opacity))}.fill-blue-600{fill:#45698d}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[0\.8125rem\]{font-size:.8125rem}.text-\[2rem\]{font-size:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-10{line-height:2.5rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.tracking-tighter{letter-spacing:-.05em}.text-blue-500{--tw-text-opacity:1;color:rgb(91 133 174/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(69 105 141/var(--tw-text-opacity))}.text-brand{--tw-text-opacity:1;color:rgb(76 86 106/var(--tw-text-opacity))}.text-green{--tw-text-opacity:1;color:rgb(106 139 79/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(134 170 104/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(191 97 106/var(--tw-text-opacity))}.text-slate{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-50{--tw-text-opacity:1;color:rgb(244 244 244/var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(46 52 64/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(227 182 91/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-blue-100{--tw-shadow-color:#d8dee9;--tw-shadow:var(--tw-shadow-colored)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}:root{scrollbar-gutter:stable}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(51 77 103/var(--tw-bg-opacity))}.focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.group:hover .group-hover\:bg-slate-100{--tw-bg-opacity:1;background-color:rgb(236 239 244/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:w-auto{width:auto}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-col{flex-direction:column}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-28{padding-top:7rem;padding-bottom:7rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.group:hover .sm\:group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-5xl{font-size:3rem;line-height:1}}@media (min-width:1024px){.lg\:mx-0{margin-left:0;margin-right:0}.lg\:ms-auto{margin-inline-start:auto}.lg\:block{display:block}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width:1280px){.xl\:left-\[50rem\]{left:50rem}.xl\:px-28{padding-left:7rem;padding-right:7rem}.xl\:py-32{padding-top:8rem;padding-bottom:8rem}} \ No newline at end of file +/*! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,Helvetica Neue,Helvetica,Open Sans,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:Iosevka,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#5b85ae80;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-\[40rem\]{left:40rem}.right-0{right:0}.z-0{z-index:0}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-10{margin-bottom:2.5rem}.mb-4{margin-bottom:1rem}.ml-3{margin-left:.75rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-full{width:100%}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.items-center{align-items:center}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-4{row-gap:1rem}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-blue-700{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(91 133 174/var(--tw-bg-opacity))}.bg-blue-600{--tw-bg-opacity:1;background-color:rgb(69 105 141/var(--tw-bg-opacity))}.bg-brand\/5{background-color:#4c566a0d}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(244 244 244/var(--tw-bg-opacity))}.bg-yellow-400{--tw-bg-opacity:1;background-color:rgb(235 203 139/var(--tw-bg-opacity))}.fill-blue-600{fill:#45698d}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[0\.8125rem\]{font-size:.8125rem}.text-\[2rem\]{font-size:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-10{line-height:2.5rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.tracking-tighter{letter-spacing:-.05em}.text-blue-500{--tw-text-opacity:1;color:rgb(91 133 174/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(69 105 141/var(--tw-text-opacity))}.text-brand{--tw-text-opacity:1;color:rgb(76 86 106/var(--tw-text-opacity))}.text-green{--tw-text-opacity:1;color:rgb(106 139 79/var(--tw-text-opacity))}.text-green-500{--tw-text-opacity:1;color:rgb(134 170 104/var(--tw-text-opacity))}.text-red-500{--tw-text-opacity:1;color:rgb(191 97 106/var(--tw-text-opacity))}.text-slate{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-50{--tw-text-opacity:1;color:rgb(244 244 244/var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity:1;color:rgb(59 66 82/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(46 52 64/var(--tw-text-opacity))}.text-yellow-500{--tw-text-opacity:1;color:rgb(227 182 91/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-blue-100{--tw-shadow-color:#d8dee9;--tw-shadow:var(--tw-shadow-colored)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}:root{scrollbar-gutter:stable}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(51 77 103/var(--tw-bg-opacity))}.focus\:border-blue-700:focus{--tw-border-opacity:1;border-color:rgb(51 77 103/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.group:hover .group-hover\:bg-slate-100{--tw-bg-opacity:1;background-color:rgb(236 239 244/var(--tw-bg-opacity))}@media (min-width:640px){.sm\:w-auto{width:auto}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-col{flex-direction:column}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-28{padding-top:7rem;padding-bottom:7rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.group:hover .sm\:group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-5xl{font-size:3rem;line-height:1}}@media (min-width:1024px){.lg\:mx-0{margin-left:0;margin-right:0}.lg\:ms-auto{margin-inline-start:auto}.lg\:block{display:block}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width:1280px){.xl\:left-\[50rem\]{left:50rem}.xl\:px-28{padding-left:7rem;padding-right:7rem}.xl\:py-32{padding-top:8rem;padding-bottom:8rem}} \ No newline at end of file -- 2.45.2 From 1aad60fb8c150bec88f77bcf2dd6767307780481 Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Tue, 27 Feb 2024 19:16:57 -0600 Subject: [PATCH 12/14] cleanup --- .../Components/Pages/Attributions.razor | 1 - src/NSeguin.Dev.Web/Components/Pages/Error.razor | 11 ----------- src/NSeguin.Dev.Web/Components/Pages/Home.razor | 10 +--------- src/NSeguin.Dev.Web/Components/Pages/NotFound.razor | 1 - 4 files changed, 1 insertion(+), 22 deletions(-) diff --git a/src/NSeguin.Dev.Web/Components/Pages/Attributions.razor b/src/NSeguin.Dev.Web/Components/Pages/Attributions.razor index 5b215c6..42f8e01 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/Attributions.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/Attributions.razor @@ -1,6 +1,5 @@ @page "/attributions" @using System.Text.Json -@layout SimpleLayout Attributions diff --git a/src/NSeguin.Dev.Web/Components/Pages/Error.razor b/src/NSeguin.Dev.Web/Components/Pages/Error.razor index abd2871..db64da8 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/Error.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/Error.razor @@ -13,17 +13,6 @@

} -

Development Mode

-

- Swapping to Development environment will display more detailed information about the error that occurred. -

-

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

- @code{ [CascadingParameter] diff --git a/src/NSeguin.Dev.Web/Components/Pages/Home.razor b/src/NSeguin.Dev.Web/Components/Pages/Home.razor index 45f9242..085e2f9 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/Home.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/Home.razor @@ -1,6 +1,5 @@ @page "/" @using NSeguin.Dev.Web.Components.Shared.HeroIcons -@layout SimpleLayout @rendermode InteractiveServer Home @@ -66,11 +65,4 @@

-
- -@code { - private void ThrowError() - { - throw new Exception("This is a test exception"); - } -} \ No newline at end of file +
\ No newline at end of file diff --git a/src/NSeguin.Dev.Web/Components/Pages/NotFound.razor b/src/NSeguin.Dev.Web/Components/Pages/NotFound.razor index 2e81b97..c78f01b 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/NotFound.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/NotFound.razor @@ -1,6 +1,5 @@ @page "/NotFound" @using Microsoft.AspNetCore.WebUtilities -@layout SimpleLayout @inject NavigationManager NavigationManager Not Found -- 2.45.2 From ef898769ea93abe7a8307e121709bc579231fb7d Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Tue, 27 Feb 2024 19:18:56 -0600 Subject: [PATCH 13/14] update exception page --- src/NSeguin.Dev.Web/Components/Pages/Error.razor | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/NSeguin.Dev.Web/Components/Pages/Error.razor b/src/NSeguin.Dev.Web/Components/Pages/Error.razor index db64da8..49721a0 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/Error.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/Error.razor @@ -3,12 +3,15 @@ Error -

Error.

-

An error occurred while processing your request.

+

Error

+ +

+ An error occurred while processing your request. +

@if (ShowRequestId) { -

+

Request ID: @RequestId

} -- 2.45.2 From b03f320af30cf6604bfe0de85f9b5804aa54c83f Mon Sep 17 00:00:00 2001 From: Nick Seguin Date: Tue, 27 Feb 2024 19:26:37 -0600 Subject: [PATCH 14/14] add exception details if available --- .../Components/Pages/Error.razor | 17 +++++++++++ src/NSeguin.Dev.Web/Components/Routes.razor | 28 ------------------- 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/src/NSeguin.Dev.Web/Components/Pages/Error.razor b/src/NSeguin.Dev.Web/Components/Pages/Error.razor index 49721a0..3968c5c 100644 --- a/src/NSeguin.Dev.Web/Components/Pages/Error.razor +++ b/src/NSeguin.Dev.Web/Components/Pages/Error.razor @@ -1,5 +1,6 @@ @page "/Error" @using System.Diagnostics +@using Microsoft.AspNetCore.Diagnostics Error @@ -16,17 +17,33 @@

} +@if (ShowException) +{ +

+

Exception

+
+        @(Exception?.ToString())
+        
+

+} + @code{ [CascadingParameter] private HttpContext? HttpContext { get; set; } + [Inject] + private IHostEnvironment HostEnvironment { get; set; } = default!; + + private Exception? Exception { get; set; } private string? RequestId { get; set; } private bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + private bool ShowException => Exception is not null && HostEnvironment.IsDevelopment(); protected override void OnInitialized() { RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier; + Exception = HttpContext?.Features.Get()?.Error ?? new Exception("An error occurred while processing your request."); } } \ No newline at end of file diff --git a/src/NSeguin.Dev.Web/Components/Routes.razor b/src/NSeguin.Dev.Web/Components/Routes.razor index 12d74d0..b54b864 100644 --- a/src/NSeguin.Dev.Web/Components/Routes.razor +++ b/src/NSeguin.Dev.Web/Components/Routes.razor @@ -2,32 +2,4 @@ - - Not found - - - -
-
-

Not Found

-

- No page was found at this address. Please check the web address and try again. -

-

- Go to home page -

- -
-
-
-
\ No newline at end of file -- 2.45.2