From 36135b12a8606487bee23add9ff33d2c1572f211 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 23 Apr 2024 17:12:04 +0100 Subject: [PATCH 01/39] Remove old code --- .../.idea/.idea.BeauFindlay/.idea/.gitignore | 13 - .../.idea.BeauFindlay/.idea/encodings.xml | 4 - .../.idea.BeauFindlay/.idea/indexLayout.xml | 8 - .../.idea/.idea.BeauFindlay/.idea/vcs.xml | 6 - BeauFindlay/BeauFindlay.sln | 44 - BeauFindlay/src/BeauFindlay.Api/.gitignore | 264 ---- .../Abstractions/Messaging/ICommand.cs | 16 - .../Abstractions/Messaging/ICommandHandler.cs | 14 - .../Abstractions/Messaging/IDomainEvent.cs | 7 - .../Abstractions/Messaging/IQuery.cs | 8 - .../Abstractions/Messaging/IQueryHandler.cs | 9 - .../BeauFindlay.Api/BeauFindlay.Api.csproj | 35 - .../Extensions/ServiceCollectionExtensions.cs | 45 - .../Features/Contact/IRecaptchaService.cs | 9 - .../Features/Contact/ISendGridService.cs | 9 - .../Features/Contact/RecaptchaService.cs | 93 -- .../Features/Contact/RecaptchaSettings.cs | 3 - .../Features/Contact/SendContactEmail.cs | 71 - .../Contact/SendContactEmailFunction.cs | 76 - .../Features/Contact/SendGridService.cs | 38 - BeauFindlay/src/BeauFindlay.Api/Program.cs | 16 - .../Properties/launchSettings.json | 9 - .../Properties/serviceDependencies.json | 11 - .../Properties/serviceDependencies.local.json | 11 - BeauFindlay/src/BeauFindlay.Api/host.json | 12 - .../.idea.BeauFindlay.dir/.idea/.gitignore | 13 - .../.idea/.idea.BeauFindlay.dir/.idea/.name | 1 - .../.idea.BeauFindlay.dir/.idea/encodings.xml | 4 - .../.idea/indexLayout.xml | 8 - .../.idea/.idea.BeauFindlay.dir/.idea/vcs.xml | 6 - BeauFindlay/src/BeauFindlay.Client/App.razor | 11 - .../BeauFindlay.Client.csproj | 18 - .../Components/Alert/Alert.razor | 46 - .../Components/Alert/AlertType.cs | 7 - .../Components/Anchor/Anchor.razor | 18 - .../Components/Button/Button.razor | 24 - .../LoadingSpinner/LoadingSpinner.razor | 39 - .../LoadingSpinner/LoadingSpinnerSize.cs | 8 - .../ITypewriterNotificationService.cs | 7 - .../Components/Typewriter/Typewriter.razor | 122 -- .../Typewriter/TypewriterConstants.cs | 9 - .../TypewriterNotificationService.cs | 13 - .../BeauFindlay.Client/Layout/Footer.razor | 23 - .../Layout/MainLayout.razor | 11 - .../BeauFindlay.Client/Layout/NavBar.razor | 85 -- .../src/BeauFindlay.Client/Pages/About.razor | 77 - .../BeauFindlay.Client/Pages/Contact.razor | 124 -- .../src/BeauFindlay.Client/Pages/Home.razor | 68 - BeauFindlay/src/BeauFindlay.Client/Program.cs | 25 - .../Properties/launchSettings.json | 41 - .../src/BeauFindlay.Client/_Imports.razor | 17 - .../src/BeauFindlay.Client/postcss.config.js | 6 - .../staticwebapp.config.json | 5 - .../src/BeauFindlay.Client/tailwind.config.js | 12 - .../wwwroot/appsettings.json | 10 - .../BeauFindlay.Client/wwwroot/css/app.css | 45 - .../wwwroot/css/app.min.css | 1265 ----------------- .../wwwroot/fonts/CascadiaCode.woff2 | Bin 201364 -> 0 bytes .../wwwroot/images/apple-touch-icon.png | Bin 5562 -> 0 bytes .../wwwroot/images/azure-function-logo.png | Bin 8734 -> 0 bytes .../images/azure-static-web-app-logo.png | Bin 7867 -> 0 bytes .../wwwroot/images/beaufindlay-logo.png | Bin 12665 -> 0 bytes .../wwwroot/images/blazor-logo.png | Bin 19650 -> 0 bytes .../wwwroot/images/logo.png | Bin 12665 -> 0 bytes .../src/BeauFindlay.Client/wwwroot/index.html | 58 - .../wwwroot/js/recaptcha.js | 18 - .../wwwroot/js/smoothScroll.js | 10 - .../src/BeauFindlay.Client/wwwroot/robots.txt | 2 - .../wwwroot/site.webmanifest | 19 - .../BeauFindlay.Client/wwwroot/sitemap.txt | 3 - .../BeauFindlay.Shared/Abstractions/Error.cs | 7 - .../BeauFindlay.Shared/Abstractions/Result.cs | 66 - .../BeauFindlay.Shared.csproj | 13 - .../Contracts/ErrorResponse.cs | 19 - .../Contracts/SendContactEmailRequest.cs | 3 - 75 files changed, 3217 deletions(-) delete mode 100644 BeauFindlay/.idea/.idea.BeauFindlay/.idea/.gitignore delete mode 100644 BeauFindlay/.idea/.idea.BeauFindlay/.idea/encodings.xml delete mode 100644 BeauFindlay/.idea/.idea.BeauFindlay/.idea/indexLayout.xml delete mode 100644 BeauFindlay/.idea/.idea.BeauFindlay/.idea/vcs.xml delete mode 100644 BeauFindlay/BeauFindlay.sln delete mode 100644 BeauFindlay/src/BeauFindlay.Api/.gitignore delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/ICommand.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/ICommandHandler.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IDomainEvent.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IQuery.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IQueryHandler.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/BeauFindlay.Api.csproj delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Extensions/ServiceCollectionExtensions.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Features/Contact/IRecaptchaService.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Features/Contact/ISendGridService.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Features/Contact/RecaptchaService.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Features/Contact/RecaptchaSettings.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendContactEmail.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendContactEmailFunction.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendGridService.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Program.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Properties/launchSettings.json delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Properties/serviceDependencies.json delete mode 100644 BeauFindlay/src/BeauFindlay.Api/Properties/serviceDependencies.local.json delete mode 100644 BeauFindlay/src/BeauFindlay.Api/host.json delete mode 100644 BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/.gitignore delete mode 100644 BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/.name delete mode 100644 BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/encodings.xml delete mode 100644 BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/indexLayout.xml delete mode 100644 BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/vcs.xml delete mode 100644 BeauFindlay/src/BeauFindlay.Client/App.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/BeauFindlay.Client.csproj delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Components/Alert/Alert.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Components/Alert/AlertType.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Components/Anchor/Anchor.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Components/Button/Button.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Components/LoadingSpinner/LoadingSpinner.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Components/LoadingSpinner/LoadingSpinnerSize.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/ITypewriterNotificationService.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/Typewriter.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/TypewriterConstants.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/TypewriterNotificationService.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Layout/Footer.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Layout/MainLayout.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Layout/NavBar.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Pages/About.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Pages/Contact.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Pages/Home.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Program.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Client/Properties/launchSettings.json delete mode 100644 BeauFindlay/src/BeauFindlay.Client/_Imports.razor delete mode 100644 BeauFindlay/src/BeauFindlay.Client/postcss.config.js delete mode 100644 BeauFindlay/src/BeauFindlay.Client/staticwebapp.config.json delete mode 100644 BeauFindlay/src/BeauFindlay.Client/tailwind.config.js delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/appsettings.json delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/css/app.css delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/css/app.min.css delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/fonts/CascadiaCode.woff2 delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/images/apple-touch-icon.png delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/images/azure-function-logo.png delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/images/azure-static-web-app-logo.png delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/images/beaufindlay-logo.png delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/images/blazor-logo.png delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/images/logo.png delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/index.html delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/js/recaptcha.js delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/js/smoothScroll.js delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/robots.txt delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/site.webmanifest delete mode 100644 BeauFindlay/src/BeauFindlay.Client/wwwroot/sitemap.txt delete mode 100644 BeauFindlay/src/BeauFindlay.Shared/Abstractions/Error.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Shared/Abstractions/Result.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Shared/BeauFindlay.Shared.csproj delete mode 100644 BeauFindlay/src/BeauFindlay.Shared/Contracts/ErrorResponse.cs delete mode 100644 BeauFindlay/src/BeauFindlay.Shared/Contracts/SendContactEmailRequest.cs diff --git a/BeauFindlay/.idea/.idea.BeauFindlay/.idea/.gitignore b/BeauFindlay/.idea/.idea.BeauFindlay/.idea/.gitignore deleted file mode 100644 index a16a007..0000000 --- a/BeauFindlay/.idea/.idea.BeauFindlay/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/modules.xml -/projectSettingsUpdater.xml -/.idea.BeauFindlay.iml -/contentModel.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/BeauFindlay/.idea/.idea.BeauFindlay/.idea/encodings.xml b/BeauFindlay/.idea/.idea.BeauFindlay/.idea/encodings.xml deleted file mode 100644 index df87cf9..0000000 --- a/BeauFindlay/.idea/.idea.BeauFindlay/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/BeauFindlay/.idea/.idea.BeauFindlay/.idea/indexLayout.xml b/BeauFindlay/.idea/.idea.BeauFindlay/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/BeauFindlay/.idea/.idea.BeauFindlay/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/BeauFindlay/.idea/.idea.BeauFindlay/.idea/vcs.xml b/BeauFindlay/.idea/.idea.BeauFindlay/.idea/vcs.xml deleted file mode 100644 index 6c0b863..0000000 --- a/BeauFindlay/.idea/.idea.BeauFindlay/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/BeauFindlay/BeauFindlay.sln b/BeauFindlay/BeauFindlay.sln deleted file mode 100644 index ce28891..0000000 --- a/BeauFindlay/BeauFindlay.sln +++ /dev/null @@ -1,44 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.9.34622.214 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{3407557D-A21B-4F48-930C-6FDCE961ED2A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BeauFindlay.Client", "src\BeauFindlay.Client\BeauFindlay.Client.csproj", "{979CCAA2-5F1B-457B-9536-02F94BC98F9F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BeauFindlay.Api", "src\BeauFindlay.Api\BeauFindlay.Api.csproj", "{D2F248BF-8487-4CE7-B6AA-D558587A52DA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BeauFindlay.Shared", "src\BeauFindlay.Shared\BeauFindlay.Shared.csproj", "{0A17E6ED-1B40-4FAE-94D5-1255C3569F6E}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {979CCAA2-5F1B-457B-9536-02F94BC98F9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {979CCAA2-5F1B-457B-9536-02F94BC98F9F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {979CCAA2-5F1B-457B-9536-02F94BC98F9F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {979CCAA2-5F1B-457B-9536-02F94BC98F9F}.Release|Any CPU.Build.0 = Release|Any CPU - {D2F248BF-8487-4CE7-B6AA-D558587A52DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D2F248BF-8487-4CE7-B6AA-D558587A52DA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D2F248BF-8487-4CE7-B6AA-D558587A52DA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D2F248BF-8487-4CE7-B6AA-D558587A52DA}.Release|Any CPU.Build.0 = Release|Any CPU - {0A17E6ED-1B40-4FAE-94D5-1255C3569F6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0A17E6ED-1B40-4FAE-94D5-1255C3569F6E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0A17E6ED-1B40-4FAE-94D5-1255C3569F6E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0A17E6ED-1B40-4FAE-94D5-1255C3569F6E}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {979CCAA2-5F1B-457B-9536-02F94BC98F9F} = {3407557D-A21B-4F48-930C-6FDCE961ED2A} - {D2F248BF-8487-4CE7-B6AA-D558587A52DA} = {3407557D-A21B-4F48-930C-6FDCE961ED2A} - {0A17E6ED-1B40-4FAE-94D5-1255C3569F6E} = {3407557D-A21B-4F48-930C-6FDCE961ED2A} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {6D05FF39-4D7B-4F0D-8136-E48F71106C3A} - EndGlobalSection -EndGlobal diff --git a/BeauFindlay/src/BeauFindlay.Api/.gitignore b/BeauFindlay/src/BeauFindlay.Api/.gitignore deleted file mode 100644 index ff5b00c..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/.gitignore +++ /dev/null @@ -1,264 +0,0 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# Azure Functions localsettings file -local.settings.json - -# User-specific files -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# DNX -project.lock.json -project.fragment.lock.json -artifacts/ - -*_i.c -*_p.c -*_i.h -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# TODO: Comment the next line if you want to checkin your web deploy settings -# but database connection strings (with potential passwords) will be unencrypted -#*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/packages/* -# except build/, which is used as an MSBuild target. -!**/packages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config -# NuGet v3's project.json files produces more ignoreable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -node_modules/ -orleans.codegen.cs - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -*.mdf -*.ldf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# JetBrains Rider -.idea/ -*.sln.iml - -# CodeRush -.cr/ - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/ICommand.cs b/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/ICommand.cs deleted file mode 100644 index 044f012..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/ICommand.cs +++ /dev/null @@ -1,16 +0,0 @@ -using BeauFindlay.Shared.Abstractions; -using MediatR; - -namespace BeauFindlay.Api.Abstractions.Messaging; - -public interface ICommand : IRequest, IBaseCommand -{ -} - -public interface ICommand : IRequest>, IBaseCommand -{ -} - -public interface IBaseCommand -{ -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/ICommandHandler.cs b/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/ICommandHandler.cs deleted file mode 100644 index ac60f74..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/ICommandHandler.cs +++ /dev/null @@ -1,14 +0,0 @@ -using BeauFindlay.Shared.Abstractions; -using MediatR; - -namespace BeauFindlay.Api.Abstractions.Messaging; - -public interface ICommandHandler : IRequestHandler - where TCommand : ICommand -{ -} - -public interface ICommandHandler : IRequestHandler> - where TCommand : ICommand -{ -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IDomainEvent.cs b/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IDomainEvent.cs deleted file mode 100644 index e2dc074..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IDomainEvent.cs +++ /dev/null @@ -1,7 +0,0 @@ -using MediatR; - -namespace BeauFindlay.Api.Abstractions.Messaging; - -public interface IDomainEvent : INotification -{ -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IQuery.cs b/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IQuery.cs deleted file mode 100644 index 5c15bbc..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IQuery.cs +++ /dev/null @@ -1,8 +0,0 @@ -using BeauFindlay.Shared.Abstractions; -using MediatR; - -namespace BeauFindlay.Api.Abstractions.Messaging; - -public interface IQuery : IRequest> -{ -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IQueryHandler.cs b/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IQueryHandler.cs deleted file mode 100644 index 384b1bf..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Abstractions/Messaging/IQueryHandler.cs +++ /dev/null @@ -1,9 +0,0 @@ -using BeauFindlay.Shared.Abstractions; -using MediatR; - -namespace BeauFindlay.Api.Abstractions.Messaging; - -public interface IQueryHandler : IRequestHandler> - where TQuery : IQuery -{ -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/BeauFindlay.Api.csproj b/BeauFindlay/src/BeauFindlay.Api/BeauFindlay.Api.csproj deleted file mode 100644 index c2f7ea6..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/BeauFindlay.Api.csproj +++ /dev/null @@ -1,35 +0,0 @@ - - - net8.0 - v4 - Exe - enable - enable - - - - - - - - - - - - - - - PreserveNewest - - - Always - Never - - - - - - - - - \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Extensions/ServiceCollectionExtensions.cs b/BeauFindlay/src/BeauFindlay.Api/Extensions/ServiceCollectionExtensions.cs deleted file mode 100644 index 0768bbc..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Extensions/ServiceCollectionExtensions.cs +++ /dev/null @@ -1,45 +0,0 @@ -using BeauFindlay.Api.Features.Contact; -using FluentValidation; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using SendGrid.Extensions.DependencyInjection; - -namespace BeauFindlay.Api.Extensions; - -public static class ServiceCollectionExtensions -{ - public static void AddApplicationServices(this IServiceCollection services) - { - var assembly = typeof(ServiceCollectionExtensions).Assembly; - - services.AddMediatR(config => { config.RegisterServicesFromAssembly(assembly); }); - - services.AddValidatorsFromAssembly(assembly, includeInternalTypes: true); - - services.AddEmailService(); - - services.AddRecaptchaService(); - } - - private static void AddEmailService(this IServiceCollection services) - { - var apiKey = Environment.GetEnvironmentVariable("SendGridApiKey") - ?? throw new ArgumentException("SendGrid API key cannot be null"); - - services.AddSendGrid(config => config.ApiKey = apiKey); - - services.AddScoped(); - } - - private static void AddRecaptchaService(this IServiceCollection services) - { - var apiKey = Environment.GetEnvironmentVariable("RecaptchaApiKey") - ?? throw new ArgumentException("Google Recaptcha API key cannot be null"); - - var settings = new RecaptchaSettings(apiKey); - - services.AddSingleton(settings); - - services.AddHttpClient(); - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/IRecaptchaService.cs b/BeauFindlay/src/BeauFindlay.Api/Features/Contact/IRecaptchaService.cs deleted file mode 100644 index 8f9cd12..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/IRecaptchaService.cs +++ /dev/null @@ -1,9 +0,0 @@ -using BeauFindlay.Shared.Abstractions; - -namespace BeauFindlay.Api.Features.Contact; - -internal interface IRecaptchaService -{ - Task ValidateResponseAsync(string recaptchaResponse, - CancellationToken cancellationToken = default); -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/ISendGridService.cs b/BeauFindlay/src/BeauFindlay.Api/Features/Contact/ISendGridService.cs deleted file mode 100644 index b0f5b04..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/ISendGridService.cs +++ /dev/null @@ -1,9 +0,0 @@ -using BeauFindlay.Shared.Abstractions; - -namespace BeauFindlay.Api.Features.Contact; - -internal interface ISendGridService -{ - Task SendEmailAsync(string from, string to, string subject, string plainTextContent, - string htmlContent); -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/RecaptchaService.cs b/BeauFindlay/src/BeauFindlay.Api/Features/Contact/RecaptchaService.cs deleted file mode 100644 index 990d748..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/RecaptchaService.cs +++ /dev/null @@ -1,93 +0,0 @@ -using BeauFindlay.Shared.Abstractions; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; - -namespace BeauFindlay.Api.Features.Contact; - -internal sealed class RecaptchaService( - HttpClient httpClient, - ILogger logger, - RecaptchaSettings settings) - : IRecaptchaService -{ - public async Task ValidateResponseAsync(string recaptchaResponse, - CancellationToken cancellationToken = default) - { - if (string.IsNullOrWhiteSpace(recaptchaResponse)) - { - logger.LogWarning("Recaptcha response is null."); - - return Result.Failure(RecaptchaErrors.ResponseNull); - } - - var response = await httpClient.PostAsync( - $"https://www.google.com/recaptcha/api/siteverify?secret={settings.ApiKey}&response={recaptchaResponse}", - null, cancellationToken); - - if (!response.IsSuccessStatusCode) - { - logger.LogError( - "Google Recaptcha API validation request failed. Code: {StatusCode}", - response.StatusCode); - - return Result.Failure(RecaptchaErrors.ApiRequestFailed); - } - - var responseString = await response.Content.ReadAsStringAsync(cancellationToken); - var recaptchaResult = JsonConvert.DeserializeObject(responseString); - - if (recaptchaResult is null) - { - logger.LogError("Unable to deserialize Recaptcha result."); - - return Result.Failure(RecaptchaErrors.ResponseSerializationFailed); - } - - if (!recaptchaResult.Success) - { - logger.LogWarning( - "Google Recaptcha validation failed. Errors: {Errors}", - recaptchaResult.ErrorCodes); - - return Result.Failure(RecaptchaErrors.ValidationFailed); - } - - logger.LogInformation("Recaptcha validation passed."); - - return Result.Success(); - } - - private class RecaptchaVerificationResult - { - [JsonProperty("success")] - public bool Success { get; set; } - - [JsonProperty("challenge_ts")] - public DateTime ChallengeTs { get; set; } - - [JsonProperty("hostname")] - public string Hostname { get; set; } = string.Empty; - - [JsonProperty("error-codes")] - public List ErrorCodes { get; set; } = []; - } -} - -public static class RecaptchaErrors -{ - public static readonly Error ResponseNull = new( - "Recaptcha.ResponseNull", - "Recaptcha response is null."); - - public static readonly Error ValidationFailed = new( - "Recaptcha.ValidationFailed", - "Recaptcha validation failed."); - - public static readonly Error ResponseSerializationFailed = new( - "Recaptcha.ResponseSerializationFailed", - "Unable to deserialize Recaptcha result."); - - public static readonly Error ApiRequestFailed = new( - "Recaptcha.ApiRequestFailed", - "Recaptcha API validation request failed."); -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/RecaptchaSettings.cs b/BeauFindlay/src/BeauFindlay.Api/Features/Contact/RecaptchaSettings.cs deleted file mode 100644 index 5f9be6b..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/RecaptchaSettings.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace BeauFindlay.Api.Features.Contact; - -internal sealed record RecaptchaSettings(string ApiKey); \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendContactEmail.cs b/BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendContactEmail.cs deleted file mode 100644 index aca6732..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendContactEmail.cs +++ /dev/null @@ -1,71 +0,0 @@ -using BeauFindlay.Api.Abstractions.Messaging; -using BeauFindlay.Shared.Abstractions; -using FluentValidation; -using Microsoft.Extensions.Logging; - -namespace BeauFindlay.Api.Features.Contact; - -public sealed record SendContactEmailCommand(string Name, string FromEmail, string Message, string RecaptchaResponse) - : ICommand; - -internal sealed class SendContactEmailCommandValidator : AbstractValidator -{ - public SendContactEmailCommandValidator(IRecaptchaService recaptchaService) - { - RuleFor(c => c.Name) - .NotEmpty() - .MaximumLength(50); - - RuleFor(c => c.FromEmail) - .NotEmpty() - .EmailAddress(); - - RuleFor(c => c.Message) - .NotEmpty() - .MaximumLength(500); - - RuleFor(c => c.RecaptchaResponse) - .NotEmpty() - .MustAsync(async (response, cancellation) => - { - var validationResult = await recaptchaService.ValidateResponseAsync(response, cancellation); - - return validationResult.IsSuccess; - }); - } -} - -internal sealed class SendContactEmailCommandHandler( - ISendGridService sendGridService, - IValidator validator, - ILogger logger) - : ICommandHandler -{ - private const string EmailSubjectBase = "New website enquiry"; - private const string MyEmail = "me@beaufindlay.com"; - - public async Task Handle(SendContactEmailCommand request, CancellationToken cancellationToken) - { - var validationResult = await validator.ValidateAsync(request, cancellationToken); - - if (!validationResult.IsValid) - { - logger.LogError("Command validation failed. Errors: {ValidationErrors}", validationResult.ToString()); - - return Result.Failure(new Error("ValidationFailed", "Command validation failed")); - } - - var subject = $"{EmailSubjectBase} - {request.FromEmail}"; - var message = $"From: {request.FromEmail}. Message: {request.Message}"; - var htmlMessage = $"

From: {request.FromEmail}

Message:
{request.Message}

"; - - var emailResult = await sendGridService.SendEmailAsync( - MyEmail, - MyEmail, - subject, - message, - htmlMessage); - - return emailResult.IsFailure ? Result.Failure(emailResult.Error) : Result.Success(); - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendContactEmailFunction.cs b/BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendContactEmailFunction.cs deleted file mode 100644 index bf2a881..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendContactEmailFunction.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System.Collections.Generic; -using System.Net; -using System.Security.Cryptography; -using BeauFindlay.Shared.Contracts; -using MediatR; -using Microsoft.Azure.Functions.Worker; -using Microsoft.Azure.Functions.Worker.Http; -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; - -namespace BeauFindlay.Api.Features.Contact; - -public class SendContactEmailFunction(ILoggerFactory loggerFactory, ISender sender) -{ - private readonly ILogger logger = loggerFactory.CreateLogger(); - - [Function(nameof(SendContactEmailFunction))] - public async Task Run( - [HttpTrigger(AuthorizationLevel.Function, "post", Route = "send-contact-email")] HttpRequestData req, - FunctionContext executionContext, CancellationToken cancellationToken) - { - logger.LogInformation($"{nameof(SendContactEmailFunction)} function received a request."); - - var requestBody = await new StreamReader(req.Body).ReadToEndAsync(cancellationToken); - var request = JsonConvert.DeserializeObject(requestBody); - - HttpResponseData response; - - try - { - if (request == null) - { - throw new ApplicationException("Unable to deserialize response."); - } - - var emailCommand = new SendContactEmailCommand( - request.Name, - request.FromEmail, - request.Message, - request.RecaptchaResponse); - - var sendEmailResult = await sender.Send(emailCommand, cancellationToken); - - if (sendEmailResult.IsFailure) - { - logger.LogError("Send email command failed. Error: {Error}", sendEmailResult.Error.Message); - - response = req.CreateResponse(HttpStatusCode.BadRequest); - - var error = new ErrorResponse - { - Code = (int)HttpStatusCode.BadRequest, - Message = sendEmailResult.Error.Message - }; - - await response.WriteAsJsonAsync(error, cancellationToken); - } - else - { - response = req.CreateResponse(HttpStatusCode.OK); - - await response.WriteAsJsonAsync("", cancellationToken: cancellationToken); - } - } - catch (Exception e) - { - logger.LogError(e, "Exception occured. Error: '{Message}'", e.Message); - - response = req.CreateResponse(HttpStatusCode.InternalServerError); - - await response.WriteAsJsonAsync(ErrorResponse.Generic, cancellationToken); - } - - return response; - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendGridService.cs b/BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendGridService.cs deleted file mode 100644 index ca493fc..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Features/Contact/SendGridService.cs +++ /dev/null @@ -1,38 +0,0 @@ -using BeauFindlay.Shared.Abstractions; -using Microsoft.Extensions.Logging; -using SendGrid; -using SendGrid.Helpers.Mail; - -namespace BeauFindlay.Api.Features.Contact; - -internal sealed class SendGridService(ISendGridClient sendGridClient, ILogger logger) - : ISendGridService -{ - public async Task SendEmailAsync(string from, string to, string subject, string plainTextContent, - string htmlContent) - { - ArgumentException.ThrowIfNullOrWhiteSpace(from, nameof(from)); - ArgumentException.ThrowIfNullOrWhiteSpace(to, nameof(to)); - ArgumentException.ThrowIfNullOrWhiteSpace(subject, nameof(subject)); - ArgumentException.ThrowIfNullOrWhiteSpace(plainTextContent, nameof(plainTextContent)); - ArgumentException.ThrowIfNullOrWhiteSpace(htmlContent, nameof(htmlContent)); - - var fromEmail = new EmailAddress(from); - var toEmail = new EmailAddress(to); - - var message = MailHelper.CreateSingleEmail(fromEmail, toEmail, subject, plainTextContent, htmlContent); - - var response = await sendGridClient.SendEmailAsync(message); - - if (response is not { IsSuccessStatusCode: true }) - { - logger.LogError("Failed to send email. Status code: '{StatusCode}'", response?.StatusCode); - - return Result.Failure(new Error("Email.SendFailed", "Failed to send email.")); - } - - logger.LogInformation("Email sent successfully."); - - return Result.Success(); - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Program.cs b/BeauFindlay/src/BeauFindlay.Api/Program.cs deleted file mode 100644 index 3103e93..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -using BeauFindlay.Api.Extensions; -using Microsoft.Azure.Functions.Worker; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -var host = new HostBuilder() - .ConfigureFunctionsWorkerDefaults() - .ConfigureServices(services => - { - services.AddApplicationInsightsTelemetryWorkerService(); - services.ConfigureFunctionsApplicationInsights(); - services.AddApplicationServices(); - }) - .Build(); - -host.Run(); diff --git a/BeauFindlay/src/BeauFindlay.Api/Properties/launchSettings.json b/BeauFindlay/src/BeauFindlay.Api/Properties/launchSettings.json deleted file mode 100644 index c00a1af..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Properties/launchSettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "profiles": { - "BeauFindlay.Api": { - "commandName": "Project", - "commandLineArgs": "--port 7071", - "launchBrowser": false - } - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Properties/serviceDependencies.json b/BeauFindlay/src/BeauFindlay.Api/Properties/serviceDependencies.json deleted file mode 100644 index df4dcc9..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Properties/serviceDependencies.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "dependencies": { - "appInsights1": { - "type": "appInsights" - }, - "storage1": { - "type": "storage", - "connectionId": "AzureWebJobsStorage" - } - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/Properties/serviceDependencies.local.json b/BeauFindlay/src/BeauFindlay.Api/Properties/serviceDependencies.local.json deleted file mode 100644 index b804a28..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/Properties/serviceDependencies.local.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "dependencies": { - "appInsights1": { - "type": "appInsights.sdk" - }, - "storage1": { - "type": "storage.emulator", - "connectionId": "AzureWebJobsStorage" - } - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Api/host.json b/BeauFindlay/src/BeauFindlay.Api/host.json deleted file mode 100644 index ee5cf5f..0000000 --- a/BeauFindlay/src/BeauFindlay.Api/host.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "version": "2.0", - "logging": { - "applicationInsights": { - "samplingSettings": { - "isEnabled": true, - "excludedTypes": "Request" - }, - "enableLiveMetricsFilters": true - } - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/.gitignore b/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/.gitignore deleted file mode 100644 index ffddbd8..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Rider ignored files -/contentModel.xml -/modules.xml -/.idea.BeauFindlay.iml -/projectSettingsUpdater.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/.name b/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/.name deleted file mode 100644 index 0b27e6e..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -BeauFindlay \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/encodings.xml b/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/encodings.xml deleted file mode 100644 index df87cf9..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/encodings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/indexLayout.xml b/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/indexLayout.xml deleted file mode 100644 index 7b08163..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/indexLayout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/vcs.xml b/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/vcs.xml deleted file mode 100644 index c2365ab..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/.idea/.idea.BeauFindlay.dir/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/App.razor b/BeauFindlay/src/BeauFindlay.Client/App.razor deleted file mode 100644 index d414dad..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/App.razor +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Not found - -

Sorry, there's nothing at this address.

-
-
-
diff --git a/BeauFindlay/src/BeauFindlay.Client/BeauFindlay.Client.csproj b/BeauFindlay/src/BeauFindlay.Client/BeauFindlay.Client.csproj deleted file mode 100644 index 4d4cdc2..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/BeauFindlay.Client.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - net8.0 - enable - enable - - - - - - - - - - - - diff --git a/BeauFindlay/src/BeauFindlay.Client/Components/Alert/Alert.razor b/BeauFindlay/src/BeauFindlay.Client/Components/Alert/Alert.razor deleted file mode 100644 index d00463a..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Components/Alert/Alert.razor +++ /dev/null @@ -1,46 +0,0 @@ -
-
-
- @if (Type == AlertType.Success) - { - - } - else - { - - } - -
-
-

- @Title -

-
-

@ChildContent

-
-
-
-
- -@code { - - [Parameter] - public string Title { get; set; } = string.Empty; - - [Parameter] - public RenderFragment? ChildContent { get; set; } - - [Parameter] - public AlertType Type { get; set; } - -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Components/Alert/AlertType.cs b/BeauFindlay/src/BeauFindlay.Client/Components/Alert/AlertType.cs deleted file mode 100644 index 133534f..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Components/Alert/AlertType.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace BeauFindlay.Client.Components.Alert; - -public enum AlertType -{ - Success, - Error -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Components/Anchor/Anchor.razor b/BeauFindlay/src/BeauFindlay.Client/Components/Anchor/Anchor.razor deleted file mode 100644 index af28abc..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Components/Anchor/Anchor.razor +++ /dev/null @@ -1,18 +0,0 @@ - - @ChildContent - - -@code { - - [Parameter] - public string Href { get; set; } = string.Empty; - - [Parameter] - public string Target { get; set; } = "_blank"; - - [Parameter] - public RenderFragment? ChildContent { get; set; } - -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Components/Button/Button.razor b/BeauFindlay/src/BeauFindlay.Client/Components/Button/Button.razor deleted file mode 100644 index 46e1dab..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Components/Button/Button.razor +++ /dev/null @@ -1,24 +0,0 @@ - - -@code { - - [Parameter] - public RenderFragment? ChildContent { get; set; } - - [Parameter] - public string Type { get; set; } = "button"; - - [Parameter] - public bool IsLoading { get; set; } - -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Components/LoadingSpinner/LoadingSpinner.razor b/BeauFindlay/src/BeauFindlay.Client/Components/LoadingSpinner/LoadingSpinner.razor deleted file mode 100644 index deeae40..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Components/LoadingSpinner/LoadingSpinner.razor +++ /dev/null @@ -1,39 +0,0 @@ -
- - - Loading... -
- -@code { - - [Parameter] - public LoadingSpinnerSize Size { get; set; } - - private string sizeCss = "w-8 h-8"; - - protected override void OnParametersSet() - { - SetSpinnerSize(); - } - - private void SetSpinnerSize() - { - sizeCss = Size switch - { - LoadingSpinnerSize.Small => "w-6 h-6", - LoadingSpinnerSize.Medium => "w-8 h-8", - LoadingSpinnerSize.Large => "w-12 h-12", - _ => sizeCss - }; - } - -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Components/LoadingSpinner/LoadingSpinnerSize.cs b/BeauFindlay/src/BeauFindlay.Client/Components/LoadingSpinner/LoadingSpinnerSize.cs deleted file mode 100644 index 360a53f..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Components/LoadingSpinner/LoadingSpinnerSize.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace BeauFindlay.Client.Components.LoadingSpinner; - -public enum LoadingSpinnerSize -{ - Small, - Medium, - Large -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/ITypewriterNotificationService.cs b/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/ITypewriterNotificationService.cs deleted file mode 100644 index 1984c37..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/ITypewriterNotificationService.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace BeauFindlay.Client.Components.Typewriter; - -public interface ITypewriterNotificationService -{ - event EventHandler? TypingCompleted; - void NotifyTypingCompleted(TypingCompletedEventArgs args); -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/Typewriter.razor b/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/Typewriter.razor deleted file mode 100644 index a85104f..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/Typewriter.razor +++ /dev/null @@ -1,122 +0,0 @@ -@using System.Timers - -@inject ITypewriterNotificationService NotificationService - -@if (DisplayCursor) -{ - @currentText| -} -else -{ - @currentText -} - -@code { - private const int typingDelayMilliseconds = 50; - private const int lineEndDelayMilliseconds = 1000; - - private static List instances = []; - private static Typewriter? lastTypingInstance = null; - private string currentText = ""; - private bool isTyping = false; - - private bool DisplayCursor => lastTypingInstance == this; - - [Parameter] - public string Text { get; set; } = ""; - - [Parameter] - public string? Name { get; set; } - - public static event Action? OnAllTypingCompleted; - - protected override void OnInitialized() - { - Text = Text.Trim(); - instances.Add(this); - StartTypingIfFirst(); - } - - private void StartTypingIfFirst() - { - if (instances.FirstOrDefault() == this && !isTyping) - { - StartTyping(); - } - } - - private void StartTyping() - { - isTyping = true; - lastTypingInstance = this; - var timer = new Timer(typingDelayMilliseconds); - var index = 0; - - timer.Elapsed += (_, __) => - { - if (index < Text.Length) - { - currentText += Text[index++]; - InvokeAsync(StateHasChanged); - } - else - { - CompleteTyping(timer); - } - }; - timer.Start(); - } - - private void CompleteTyping(Timer typingTimer) - { - typingTimer.Stop(); - - isTyping = false; - - var delayTimer = new Timer(lineEndDelayMilliseconds); - delayTimer.Elapsed += (sender, e) => - { - delayTimer.Stop(); - delayTimer.Dispose(); - UpdateCursorVisibility(); - StartNextInstanceTyping(); - - if (!string.IsNullOrWhiteSpace(Name)) - { - NotificationService.NotifyTypingCompleted(new TypingCompletedEventArgs(Name)); - } - - if (!instances.Any()) - { - OnAllTypingCompleted?.Invoke(); - } - - InvokeAsync(StateHasChanged); - }; - - delayTimer.Start(); - } - - private void UpdateCursorVisibility() - { - lastTypingInstance = instances.LastOrDefault(i => !i.isTyping); - - InvokeAsync(StateHasChanged); - } - - private void StartNextInstanceTyping() - { - instances.Remove(this); - - var nextInstance = instances.FirstOrDefault(); - - nextInstance?.StartTyping(); - } - - public static void Reset() - { - instances.Clear(); - - lastTypingInstance = null; - } -} diff --git a/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/TypewriterConstants.cs b/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/TypewriterConstants.cs deleted file mode 100644 index a44bdef..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/TypewriterConstants.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace BeauFindlay.Client.Components.Typewriter; - -public static class TypewriterConstants -{ - public static class Name - { - public const string IntroComplete = nameof(IntroComplete); - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/TypewriterNotificationService.cs b/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/TypewriterNotificationService.cs deleted file mode 100644 index 9cc05db..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Components/Typewriter/TypewriterNotificationService.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace BeauFindlay.Client.Components.Typewriter; - -public class TypewriterNotificationService : ITypewriterNotificationService -{ - public event EventHandler? TypingCompleted; - - public void NotifyTypingCompleted(TypingCompletedEventArgs args) => TypingCompleted?.Invoke(this, args); -} - -public class TypingCompletedEventArgs(string typewriterInstanceId) : EventArgs -{ - public string TypewriterInstanceId { get; set; } = typewriterInstanceId; -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Layout/Footer.razor b/BeauFindlay/src/BeauFindlay.Client/Layout/Footer.razor deleted file mode 100644 index ab4cb04..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Layout/Footer.razor +++ /dev/null @@ -1,23 +0,0 @@ - \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Layout/MainLayout.razor b/BeauFindlay/src/BeauFindlay.Client/Layout/MainLayout.razor deleted file mode 100644 index cb4cff1..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Layout/MainLayout.razor +++ /dev/null @@ -1,11 +0,0 @@ -@inherits LayoutComponentBase - -
- - -
- @Body -
- -
-
diff --git a/BeauFindlay/src/BeauFindlay.Client/Layout/NavBar.razor b/BeauFindlay/src/BeauFindlay.Client/Layout/NavBar.razor deleted file mode 100644 index af427aa..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Layout/NavBar.razor +++ /dev/null @@ -1,85 +0,0 @@ - - -@code { - - private bool menuOpen; - - private void ToggleMenu() - { - menuOpen = !menuOpen; - } - -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Pages/About.razor b/BeauFindlay/src/BeauFindlay.Client/Pages/About.razor deleted file mode 100644 index d9bdd4e..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Pages/About.razor +++ /dev/null @@ -1,77 +0,0 @@ -@page "/About" - -@inject IJSRuntime JSRuntime - -About - Beau Findlay - -
-

This app

-
- - - -

Below is an overview of how this simple app is made and what technologies are used. If you'd like to dive straight in, the full project is available on my GitHub.

- -

I'm planning to integrate a simple blog as part of this app that will dive into more specific implementation details so check back soon for more!

- -
-

Front-end: blazor logo .NET Blazor WASM

- -

I wanted to create a decent, modern client-side experience for this app and given my (very...) limited front-end expertise I decided to choose .NET Blazor Webassembly. Blazor is Microsoft's take on component-based SPAs (single page applications) and offers us back-end focussed devs a way of producing decent client experiences without needing to dive into another front-end specific technology.

- -

Blazor traditionally came in two flavours, server and webassembly with an additional third option (Blazor Web App) recently released with .NET 8 which can offer the functionality of both, alongside traditional SSR (server-side rendering). Blazor Server initially generates content on the server and utilises web-sockets to communicate dynamic UI updates with the client without requiring a page load, whereas Blazor Webassembly downloads the entire app to the client browser on first load alongside a light-weight .NET run-time to execute code directly on the browsers UI thread.

- -

As Blazor server requires a dedicated server to host the application, I chose the webassembly model to enable free hosting using an Azure Static Web App. You can read more about this in the hosting section.

- -

This app is styled using a cool CSS framework called TailwindCSS. PostCSS is used alongside Tailwind to generate a lightweight stylesheet based only on the parts of the framework that are used, as oppose to including a everything the framework offers.

-
- -
-

Back-end: azure function app logo .NET Azure Functions API

- -

There is a very minimal API used as the back-end of this app to allow users to contact me directly via the contact page. This will be expanded to serve the technical blog I'm building as a new feature that will be available soon.

- -

The contact API endpoint currently:

-
    -
  • Validates a Google reCAPTCHA token to protect against fraudulent submissions.
  • -
  • Builds a HTML email from the information provided in the form.
  • -
  • Sends an email directly to my inbox using the SendGrid API.
  • -
- -

The API is written in .NET 8 using Azure Serverless Functions with HTTP triggers to act as API endpoints. For larger scale projects I would almost always opt for a fully-featured Web API, however Azure Functions provide automatic elastic scaling with consumption-based billing and a generous free-tier, making them perfect for smaller projects like this.

- -
- - -
-

Hosting: azure static web app logo Microsoft Azure Static Web App

- -

The goal of this project was to learn some new technologies and host the app as cheaply as possible. With this in mind I decided to go with a Static Web App hosted on Microsoft Azure. Static Web Apps offer global distribution of static assets (the Blazor Webassembly app in this case) and offer integrated hosting for Azure Function App APIs.

- -

Another cool feature of Static Web Apps is Azure's integration with GitHub actions to deploy both the client and server simultaneously and provide automatically deployed staging environments for pull-requests opened to the main branch. This made testing deployed changes much easier and cheaper than deploying an isolated testing/GA environment before releasing to the live version of the app.

- -

Using Static Web Apps on Azure has meant that I have been able to build, deploy and serve this site and API completely free (with the exception of the domain name). The next thing on the roadmap is building a simple blog using an Azure SQL database where I'll document the full process of writing and deploying this app so check back again soon.

-
- - - - - -@code { - private const string FrontEndSection = "front-end"; - private const string BackEndSection = "back-end"; - private const string HostingSection = "hosting"; - private const string TopSection = "top"; - - private async Task ScrollToElementAsync(string elementId) - { - await JSRuntime.InvokeVoidAsync("scrollToElement", elementId); - } - -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Pages/Contact.razor b/BeauFindlay/src/BeauFindlay.Client/Pages/Contact.razor deleted file mode 100644 index 5334ecf..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Pages/Contact.razor +++ /dev/null @@ -1,124 +0,0 @@ -@page "/contact" - -@inject HttpClient HttpClient -@inject IJSRuntime JSRuntime - -Contact - Beau Findlay - -
-

Contact

- -

- If you think I can help with your project or you'd just like to talk tech, send me a message! -

-
- -@if (!isSubmitted) -{ -
- - - -
-
- -
- - -
-
-
- -
- - -
-
-
- -
- - -
-
-
-
- This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply. -
-
- -
- -
-
-} -else -{ -
- @if (sendEmailSuccess) - { - - Thanks for getting in touch! I'll get back to you as soon as I can. - - } - else - { - - Looks like something went wrong trying to send that email. Please try again. - - } -
-} - -@code { - private readonly ContactInputModel contactInput = new(); - - private bool isSubmitting; - private bool isSubmitted; - private bool sendEmailSuccess; - - private class ContactInputModel - { - [Required(ErrorMessage = "Please enter your name.")] - [MaxLength(50, ErrorMessage = "Please use a shorter name. 50 characters max.")] - public string Name { get; set; } = string.Empty; - - [Required(ErrorMessage = "Please enter your email.")] - [EmailAddress(ErrorMessage = "Please enter a valid email address.")] - public string Email { get; set; } = string.Empty; - - [Required(ErrorMessage = "Please include a message.")] - [MaxLength(500, ErrorMessage = "Please enter a shorter message. 500 characters max.")] - public string Message { get; set; } = string.Empty; - } - - private async Task HandleValidSubmit() - { - isSubmitting = true; - - var recaptchaResponse = await JSRuntime.InvokeAsync("executeRecaptcha"); - - if (string.IsNullOrWhiteSpace(recaptchaResponse)) - { - sendEmailSuccess = false; - } - else - { - var sendEmailRequest = new SendContactEmailRequest( - contactInput.Name, - contactInput.Email, - contactInput.Message, - recaptchaResponse); - - var response = await HttpClient.PostAsJsonAsync("/api/send-contact-email", sendEmailRequest); - - sendEmailSuccess = response.IsSuccessStatusCode; - } - - isSubmitting = false; - isSubmitted = true; - } - -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Pages/Home.razor b/BeauFindlay/src/BeauFindlay.Client/Pages/Home.razor deleted file mode 100644 index 83111a0..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Pages/Home.razor +++ /dev/null @@ -1,68 +0,0 @@ -@page "/" - -@inject IJSRuntime JSRuntime - -Home - Beau Findlay - -@if (!hasPreviouslyRendered) -{ -

- -

- -

- -

- -

- -

- -

- -

- -

- -

-} -else -{ -

Hi, I'm Beau.

- -

I'm a UK-based software engineer and I love building cool stuff.

- -

A bit about me

- -

I mostly specialise in back-end C#/.NET development and I've built systems that scale for hundreds-of-thousands of global users.

- -

I've worked with businesses at all sizes and stages and I'm currently heading up the tech as CTO at a cool startup called un:hurd.

-} - - -@code { - private const string ComponentKey = "ComponentRendered_Home"; - private bool hasPreviouslyRendered; - - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if (firstRender) - { - var renderedBeforeAsString = await JSRuntime.InvokeAsync("localStorage.getItem", ComponentKey); - - var previousValue = hasPreviouslyRendered; - hasPreviouslyRendered = !string.IsNullOrEmpty(renderedBeforeAsString) && bool.Parse(renderedBeforeAsString); - - if (!hasPreviouslyRendered) - { - await JSRuntime.InvokeVoidAsync("localStorage.setItem", ComponentKey, "true"); - } - - if (previousValue != hasPreviouslyRendered) - { - StateHasChanged(); - } - } - } - -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Program.cs b/BeauFindlay/src/BeauFindlay.Client/Program.cs deleted file mode 100644 index 8dcd37c..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Program.cs +++ /dev/null @@ -1,25 +0,0 @@ -using BeauFindlay.Client; -using BeauFindlay.Client.Components.Typewriter; -using Microsoft.AspNetCore.Components.Web; -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; - -var builder = WebAssemblyHostBuilder.CreateDefault(args); -builder.RootComponents.Add("#app"); -builder.RootComponents.Add("head::after"); - -string apiBase; -if (builder.HostEnvironment.IsDevelopment()) -{ - apiBase = builder.Configuration["ApiBase"] - ?? throw new ArgumentException("API base address not found in config."); -} -else -{ - apiBase = builder.HostEnvironment.BaseAddress; -} - -builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(apiBase) }); - -builder.Services.AddSingleton(); - -await builder.Build().RunAsync(); \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/Properties/launchSettings.json b/BeauFindlay/src/BeauFindlay.Client/Properties/launchSettings.json deleted file mode 100644 index ae8c9d5..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/Properties/launchSettings.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:60918", - "sslPort": 44313 - } - }, - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "http://localhost:5218", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "https://localhost:7288;http://localhost:5218", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/BeauFindlay/src/BeauFindlay.Client/_Imports.razor b/BeauFindlay/src/BeauFindlay.Client/_Imports.razor deleted file mode 100644 index f279519..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/_Imports.razor +++ /dev/null @@ -1,17 +0,0 @@ -@using System.Net.Http -@using System.Net.Http.Json -@using System.ComponentModel.DataAnnotations -@using Microsoft.AspNetCore.Components.Forms -@using Microsoft.AspNetCore.Components.Routing -@using Microsoft.AspNetCore.Components.Web -@using Microsoft.AspNetCore.Components.Web.Virtualization -@using Microsoft.AspNetCore.Components.WebAssembly.Http -@using Microsoft.JSInterop -@using BeauFindlay.Client -@using BeauFindlay.Client.Layout -@using BeauFindlay.Client.Components.Alert -@using BeauFindlay.Client.Components.Anchor -@using BeauFindlay.Client.Components.Typewriter -@using BeauFindlay.Client.Components.Button -@using BeauFindlay.Client.Components.LoadingSpinner -@using BeauFindlay.Shared.Contracts \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/postcss.config.js b/BeauFindlay/src/BeauFindlay.Client/postcss.config.js deleted file mode 100644 index 3569595..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/staticwebapp.config.json b/BeauFindlay/src/BeauFindlay.Client/staticwebapp.config.json deleted file mode 100644 index 1d186ee..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/staticwebapp.config.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "navigationFallback": { - "rewrite": "/index.html" - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/tailwind.config.js b/BeauFindlay/src/BeauFindlay.Client/tailwind.config.js deleted file mode 100644 index bc2c35b..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/tailwind.config.js +++ /dev/null @@ -1,12 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: ["./**/*.{razor,html,cshtml}"], - theme: { - extend: { - fontFamily: { - cascadia: ["Cascadia Code", "mono-space"] - } - }, - }, - plugins: [], -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/appsettings.json b/BeauFindlay/src/BeauFindlay.Client/wwwroot/appsettings.json deleted file mode 100644 index 25e6abd..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/wwwroot/appsettings.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*", - "ApiBase": "http://localhost:7071" -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/css/app.css b/BeauFindlay/src/BeauFindlay.Client/wwwroot/css/app.css deleted file mode 100644 index c7afe85..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/wwwroot/css/app.css +++ /dev/null @@ -1,45 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@font-face { - font-family: "Cascadia Code"; - src: url("../fonts/CascadiaCode.woff2"); -} - -@keyframes blink { - from, to { opacity: 1 } - 50% { opacity: 0 } -} - -.blinking-cursor { - animation: blink 1s step-end infinite; -} - -.fade-in { - animation: fadeInAnimation ease 3s; - animation-iteration-count: 1; - animation-fill-mode: forwards; -} - -@keyframes fadeInAnimation { - from { opacity: 0; } - to { opacity: 1; } -} - -.grecaptcha-badge { - visibility: hidden !important; -} - -body::-webkit-scrollbar { - width: 14px; -} - -body::-webkit-scrollbar-track { - background: white; -} - -body::-webkit-scrollbar-thumb { - background-color: black; - border: 1px solid white; -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/css/app.min.css b/BeauFindlay/src/BeauFindlay.Client/wwwroot/css/app.min.css deleted file mode 100644 index bfcba57..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/wwwroot/css/app.min.css +++ /dev/null @@ -1,1265 +0,0 @@ -/* -! tailwindcss v3.4.1 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ - -*, -::before, -::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: #e5e7eb; - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -5. Use the user's configured `sans` font-feature-settings by default. -6. Use the user's configured `sans` font-variation-settings by default. -7. Disable tap highlights on iOS -*/ - -html, -:host { - line-height: 1.5; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - -moz-tab-size: 4; - /* 3 */ - -o-tab-size: 4; - tab-size: 4; - /* 3 */ - font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 4 */ - font-feature-settings: normal; - /* 5 */ - font-variation-settings: normal; - /* 6 */ - -webkit-tap-highlight-color: transparent; - /* 7 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ - -body { - margin: 0; - /* 1 */ - line-height: inherit; - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ - border-top-width: 1px; - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured `mono` font-family by default. -2. Use the user's configured `mono` font-feature-settings by default. -3. Use the user's configured `mono` font-variation-settings by default. -4. Correct the odd `em` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - /* 1 */ - font-feature-settings: normal; - /* 2 */ - font-variation-settings: normal; - /* 3 */ - font-size: 1em; - /* 4 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ - border-collapse: collapse; - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - /* 1 */ - font-feature-settings: inherit; - /* 1 */ - font-variation-settings: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - font-weight: inherit; - /* 1 */ - line-height: inherit; - /* 1 */ - color: inherit; - /* 1 */ - margin: 0; - /* 2 */ - padding: 0; - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; - /* 1 */ - background-color: transparent; - /* 2 */ - background-image: none; - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -fieldset { - margin: 0; - padding: 0; -} - -legend { - padding: 0; -} - -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} - -/* -Reset default styling for dialogs. -*/ - -dialog { - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role="button"] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -/* Make elements with the HTML hidden attribute stay hidden by default */ - -[hidden] { - display: none; -} - -*, ::before, ::after { - --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: rgb(59 130 246 / 0.5); - --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: ; -} - -::backdrop { - --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: rgb(59 130 246 / 0.5); - --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; -} - -.static { - position: static; -} - -.absolute { - position: absolute; -} - -.relative { - position: relative; -} - -.inset-y-0 { - top: 0px; - bottom: 0px; -} - -.left-0 { - left: 0px; -} - -.m-auto { - margin: auto; -} - -.mx-auto { - margin-left: auto; - margin-right: auto; -} - -.ml-3 { - margin-left: 0.75rem; -} - -.mt-2 { - margin-top: 0.5rem; -} - -.mt-2\.5 { - margin-top: 0.625rem; -} - -.mt-4 { - margin-top: 1rem; -} - -.mt-8 { - margin-top: 2rem; -} - -.mt-auto { - margin-top: auto; -} - -.block { - display: block; -} - -.inline { - display: inline; -} - -.flex { - display: flex; -} - -.inline-flex { - display: inline-flex; -} - -.grid { - display: grid; -} - -.hidden { - display: none; -} - -.h-12 { - height: 3rem; -} - -.h-14 { - height: 3.5rem; -} - -.h-20 { - height: 5rem; -} - -.h-5 { - height: 1.25rem; -} - -.h-6 { - height: 1.5rem; -} - -.h-8 { - height: 2rem; -} - -.h-full { - height: 100%; -} - -.h-16 { - height: 4rem; -} - -.min-h-screen { - min-height: 100vh; -} - -.w-12 { - width: 3rem; -} - -.w-5 { - width: 1.25rem; -} - -.w-6 { - width: 1.5rem; -} - -.w-8 { - width: 2rem; -} - -.w-auto { - width: auto; -} - -.w-full { - width: 100%; -} - -.max-w-7xl { - max-width: 80rem; -} - -.max-w-xl { - max-width: 36rem; -} - -.max-w-screen-2xl { - max-width: 1536px; -} - -.flex-1 { - flex: 1 1 0%; -} - -.flex-shrink-0 { - flex-shrink: 0; -} - -@keyframes spin { - to { - transform: rotate(360deg); - } -} - -.animate-spin { - animation: spin 1s linear infinite; -} - -.cursor-pointer { - cursor: pointer; -} - -.list-disc { - list-style-type: disc; -} - -.grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); -} - -.flex-col { - flex-direction: column; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.justify-between { - justify-content: space-between; -} - -.gap-x-8 { - -moz-column-gap: 2rem; - column-gap: 2rem; -} - -.gap-y-6 { - row-gap: 1.5rem; -} - -.space-x-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(1rem * var(--tw-space-x-reverse)); - margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-6 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(1.5rem * var(--tw-space-x-reverse)); - margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-8 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(2rem * var(--tw-space-x-reverse)); - margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-y-1 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); -} - -.rounded-md { - border-radius: 0.375rem; -} - -.border-0 { - border-width: 0px; -} - -.bg-black { - --tw-bg-opacity: 1; - background-color: rgb(0 0 0 / var(--tw-bg-opacity)); -} - -.bg-gray-900 { - --tw-bg-opacity: 1; - background-color: rgb(17 24 39 / var(--tw-bg-opacity)); -} - -.fill-gray-600 { - fill: #4b5563; -} - -.p-2 { - padding: 0.5rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} - -.px-3\.5 { - padding-left: 0.875rem; - padding-right: 0.875rem; -} - -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} - -.px-8 { - padding-left: 2rem; - padding-right: 2rem; -} - -.py-10 { - padding-top: 2.5rem; - padding-bottom: 2.5rem; -} - -.py-12 { - padding-top: 3rem; - padding-bottom: 3rem; -} - -.py-14 { - padding-top: 3.5rem; - padding-bottom: 3.5rem; -} - -.py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.py-2\.5 { - padding-top: 0.625rem; - padding-bottom: 0.625rem; -} - -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} - -.py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} - -.py-8 { - padding-top: 2rem; - padding-bottom: 2rem; -} - -.pb-2 { - padding-bottom: 0.5rem; -} - -.pb-3 { - padding-bottom: 0.75rem; -} - -.pb-4 { - padding-bottom: 1rem; -} - -.pb-8 { - padding-bottom: 2rem; -} - -.pl-8 { - padding-left: 2rem; -} - -.pt-16 { - padding-top: 4rem; -} - -.pt-2 { - padding-top: 0.5rem; -} - -.pt-4 { - padding-top: 1rem; -} - -.pt-8 { - padding-top: 2rem; -} - -.text-center { - text-align: center; -} - -.font-cascadia { - font-family: Cascadia Code, mono-space; -} - -.text-2xl { - font-size: 1.5rem; - line-height: 2rem; -} - -.text-3xl { - font-size: 1.875rem; - line-height: 2.25rem; -} - -.text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; -} - -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - -.text-xl { - font-size: 1.25rem; - line-height: 1.75rem; -} - -.text-xs { - font-size: 0.75rem; - line-height: 1rem; -} - -.font-medium { - font-weight: 500; -} - -.font-semibold { - font-weight: 600; -} - -.leading-5 { - line-height: 1.25rem; -} - -.leading-6 { - line-height: 1.5rem; -} - -.text-gray-200 { - --tw-text-opacity: 1; - color: rgb(229 231 235 / var(--tw-text-opacity)); -} - -.text-gray-300 { - --tw-text-opacity: 1; - color: rgb(209 213 219 / var(--tw-text-opacity)); -} - -.text-gray-400 { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} - -.text-green-500 { - --tw-text-opacity: 1; - color: rgb(34 197 94 / var(--tw-text-opacity)); -} - -.text-red-500 { - --tw-text-opacity: 1; - color: rgb(239 68 68 / var(--tw-text-opacity)); -} - -.text-red-600 { - --tw-text-opacity: 1; - color: rgb(220 38 38 / var(--tw-text-opacity)); -} - -.text-slate-100 { - --tw-text-opacity: 1; - color: rgb(241 245 249 / var(--tw-text-opacity)); -} - -.text-slate-200 { - --tw-text-opacity: 1; - color: rgb(226 232 240 / var(--tw-text-opacity)); -} - -.text-slate-50 { - --tw-text-opacity: 1; - color: rgb(248 250 252 / var(--tw-text-opacity)); -} - -.text-white { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.underline { - text-decoration-line: underline; -} - -.underline-offset-2 { - text-underline-offset: 2px; -} - -.antialiased { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.ring-1 { - --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(1px + 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); -} - -.ring-inset { - --tw-ring-inset: inset; -} - -.ring-gray-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); -} - -@font-face { - font-family: "Cascadia Code"; - - src: url("../fonts/CascadiaCode.woff2"); -} - -@keyframes blink { - from, to { - opacity: 1 - } - - 50% { - opacity: 0 - } -} - -.blinking-cursor { - animation: blink 1s step-end infinite; -} - -.fade-in { - animation: fadeInAnimation ease 3s; - animation-iteration-count: 1; - animation-fill-mode: forwards; -} - -@keyframes fadeInAnimation { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -.grecaptcha-badge { - visibility: hidden !important; -} - -body::-webkit-scrollbar { - width: 14px; -} - -body::-webkit-scrollbar-track { - background: white; -} - -body::-webkit-scrollbar-thumb { - background-color: black; - border: 1px solid white; -} - -.placeholder\:text-gray-400::-moz-placeholder { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} - -.placeholder\:text-gray-400::placeholder { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} - -.hover\:bg-gray-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(55 65 81 / var(--tw-bg-opacity)); -} - -.hover\:bg-gray-800:hover { - --tw-bg-opacity: 1; - background-color: rgb(31 41 55 / var(--tw-bg-opacity)); -} - -.hover\:text-slate-500:hover { - --tw-text-opacity: 1; - color: rgb(100 116 139 / var(--tw-text-opacity)); -} - -.hover\:text-white:hover { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.focus\:ring-2: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(2px + 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); -} - -.focus\:ring-inset:focus { - --tw-ring-inset: inset; -} - -.focus\:ring-gray-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(75 85 99 / var(--tw-ring-opacity)); -} - -.focus-visible\:outline:focus-visible { - outline-style: solid; -} - -.focus-visible\:outline-2:focus-visible { - outline-width: 2px; -} - -.focus-visible\:outline-offset-2:focus-visible { - outline-offset: 2px; -} - -.focus-visible\:outline-gray-600:focus-visible { - outline-color: #4b5563; -} - -.disabled\:cursor-progress:disabled { - cursor: progress; -} - -.disabled\:bg-gray-800:disabled { - --tw-bg-opacity: 1; - background-color: rgb(31 41 55 / var(--tw-bg-opacity)); -} - -@media (min-width: 640px) { - .sm\:col-span-2 { - grid-column: span 2 / span 2; - } - - .sm\:flex { - display: flex; - } - - .sm\:hidden { - display: none; - } - - .sm\:flex-1 { - flex: 1 1 0%; - } - - .sm\:grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .sm\:items-stretch { - align-items: stretch; - } - - .sm\:justify-start { - justify-content: flex-start; - } -} - -@media (min-width: 768px) { - .md\:order-1 { - order: 1; - } - - .md\:order-2 { - order: 2; - } - - .md\:mt-0 { - margin-top: 0px; - } - - .md\:flex { - display: flex; - } - - .md\:items-center { - align-items: center; - } - - .md\:justify-between { - justify-content: space-between; - } - - .md\:px-12 { - padding-left: 3rem; - padding-right: 3rem; - } -} - -@media (min-width: 1024px) { - .lg\:px-24 { - padding-left: 6rem; - padding-right: 6rem; - } -} - -@media (min-width: 1280px) { - .xl\:px-32 { - padding-left: 8rem; - padding-right: 8rem; - } -} - -@media (prefers-color-scheme: dark) { - .dark\:fill-gray-300 { - fill: #d1d5db; - } - - .dark\:text-gray-600 { - --tw-text-opacity: 1; - color: rgb(75 85 99 / var(--tw-text-opacity)); - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/fonts/CascadiaCode.woff2 b/BeauFindlay/src/BeauFindlay.Client/wwwroot/fonts/CascadiaCode.woff2 deleted file mode 100644 index 8865499776122ef0de1bd05a33c23c0616f8d1ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201364 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 diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/images/apple-touch-icon.png b/BeauFindlay/src/BeauFindlay.Client/wwwroot/images/apple-touch-icon.png deleted file mode 100644 index c55fd27c901cd68baabb68911df5f89b18777800..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5562 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 diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/images/azure-static-web-app-logo.png b/BeauFindlay/src/BeauFindlay.Client/wwwroot/images/azure-static-web-app-logo.png deleted file mode 100644 index 0b963330b63cf4ac65c4be65ae39e7684cf3c210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7867 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 diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/images/beaufindlay-logo.png b/BeauFindlay/src/BeauFindlay.Client/wwwroot/images/beaufindlay-logo.png deleted file mode 100644 index d78b212959ba88386e315dfefafe956c9d568b0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12665 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 LB|K=!6s!LOTreB( diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/images/logo.png b/BeauFindlay/src/BeauFindlay.Client/wwwroot/images/logo.png deleted file mode 100644 index 1985d3283a5bbb82cb05098375025948fc74f9cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12665 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 N6s{{@%f;M%@L%)07w!N6 diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/index.html b/BeauFindlay/src/BeauFindlay.Client/wwwroot/index.html deleted file mode 100644 index ef35838..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/wwwroot/index.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - Beau Findlay - - - - - - - - - -
-
-

- Loading - beaufindlay.com| -

-
-
- - - - - - - diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/js/recaptcha.js b/BeauFindlay/src/BeauFindlay.Client/wwwroot/js/recaptcha.js deleted file mode 100644 index 1245bd3..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/wwwroot/js/recaptcha.js +++ /dev/null @@ -1,18 +0,0 @@ -window.executeRecaptcha = function () { - return new Promise((resolve, reject) => { - grecaptcha.ready(function () { - grecaptcha - .execute("6LcvxZIpAAAAAOIP5L6kGngwDZRpwkTdMezPn06x", { - action: "submit", - }) - .then( - function (token) { - resolve(token); - }, - function (error) { - reject(error); - } - ); - }); - }); -}; \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/js/smoothScroll.js b/BeauFindlay/src/BeauFindlay.Client/wwwroot/js/smoothScroll.js deleted file mode 100644 index 1535999..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/wwwroot/js/smoothScroll.js +++ /dev/null @@ -1,10 +0,0 @@ -function scrollToElement(id) { - const element = document.getElementById(id); - if (element instanceof HTMLElement) { - element.scrollIntoView({ - behavior: "smooth", - block: "start", - inline: "nearest" - }); - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/robots.txt b/BeauFindlay/src/BeauFindlay.Client/wwwroot/robots.txt deleted file mode 100644 index 7041854..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/wwwroot/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/site.webmanifest b/BeauFindlay/src/BeauFindlay.Client/wwwroot/site.webmanifest deleted file mode 100644 index 74d0a9c..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/wwwroot/site.webmanifest +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "", - "short_name": "", - "icons": [ - { - "src": "images/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "images/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/BeauFindlay/src/BeauFindlay.Client/wwwroot/sitemap.txt b/BeauFindlay/src/BeauFindlay.Client/wwwroot/sitemap.txt deleted file mode 100644 index ace913b..0000000 --- a/BeauFindlay/src/BeauFindlay.Client/wwwroot/sitemap.txt +++ /dev/null @@ -1,3 +0,0 @@ -https://www.beaufindlay.com -https://www.beaufindlay.com/contact -https://www.beaufindlay.com/about \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Shared/Abstractions/Error.cs b/BeauFindlay/src/BeauFindlay.Shared/Abstractions/Error.cs deleted file mode 100644 index f389963..0000000 --- a/BeauFindlay/src/BeauFindlay.Shared/Abstractions/Error.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace BeauFindlay.Shared.Abstractions; - -public record Error(string Code, string Message) -{ - public static readonly Error None = new(string.Empty, string.Empty); - public static readonly Error NullValue = new("Error.NullValue", "Null value was provided."); -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Shared/Abstractions/Result.cs b/BeauFindlay/src/BeauFindlay.Shared/Abstractions/Result.cs deleted file mode 100644 index 5d73103..0000000 --- a/BeauFindlay/src/BeauFindlay.Shared/Abstractions/Result.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System.Diagnostics.CodeAnalysis; - -namespace BeauFindlay.Shared.Abstractions; - -public class Result -{ - protected Result(bool isSuccess, Error error) - { - switch (isSuccess) - { - case true when error != Error.None: - throw new InvalidOperationException("Successful result cannot contain an error."); - case false when error == Error.None: - throw new InvalidOperationException("Failed result must contain an error."); - default: - IsSuccess = isSuccess; - Error = error; - break; - } - } - - public bool IsSuccess { get; } - - public bool IsFailure => !IsSuccess; - - public Error Error { get; } - - public static Result Success() - { - return new Result(true, Error.None); - } - - public static Result Failure(Error error) - { - return new Result(false, error); - } - - public static Result Success(TValue value) - { - return new Result(value, true, Error.None); - } - - public static Result Failure(Error error) - { - return new Result(default, false, error); - } - - protected static Result Create(TValue? value) - { - return value is not null ? Success(value) : Failure(Error.NullValue); - } -} - -public sealed class Result(TValue? value, bool isSuccess, Error error) - : Result(isSuccess, error) -{ - [NotNull] - public TValue Value => IsSuccess - ? value! - : throw new InvalidOperationException("The value of a failure result can not be accessed."); - - public static implicit operator Result(TValue? value) - { - return Create(value); - } -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Shared/BeauFindlay.Shared.csproj b/BeauFindlay/src/BeauFindlay.Shared/BeauFindlay.Shared.csproj deleted file mode 100644 index a9c778a..0000000 --- a/BeauFindlay/src/BeauFindlay.Shared/BeauFindlay.Shared.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net8.0 - enable - enable - - - - - - - diff --git a/BeauFindlay/src/BeauFindlay.Shared/Contracts/ErrorResponse.cs b/BeauFindlay/src/BeauFindlay.Shared/Contracts/ErrorResponse.cs deleted file mode 100644 index aaee4dc..0000000 --- a/BeauFindlay/src/BeauFindlay.Shared/Contracts/ErrorResponse.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Net; -using Newtonsoft.Json; - -namespace BeauFindlay.Shared.Contracts; - -public sealed class ErrorResponse -{ - [JsonProperty("code")] - public int Code { get; set; } - - [JsonProperty("message")] - public string Message { get; set; } = string.Empty; - - public static ErrorResponse Generic => new ErrorResponse - { - Code = (int)HttpStatusCode.BadRequest, - Message = "Opps... something went wrong." - }; -} \ No newline at end of file diff --git a/BeauFindlay/src/BeauFindlay.Shared/Contracts/SendContactEmailRequest.cs b/BeauFindlay/src/BeauFindlay.Shared/Contracts/SendContactEmailRequest.cs deleted file mode 100644 index 4093bbb..0000000 --- a/BeauFindlay/src/BeauFindlay.Shared/Contracts/SendContactEmailRequest.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace BeauFindlay.Shared.Contracts; - -public record SendContactEmailRequest(string Name, string FromEmail, string Message, string RecaptchaResponse); \ No newline at end of file From 1af48fdb21ca17ebb935cbf7f43f3a119f4a6aaf Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 23 Apr 2024 17:17:04 +0100 Subject: [PATCH 02/39] Initial client commit --- src/Client/.eslintrc.cjs | 18 + src/Client/.gitignore | 24 + src/Client/README.md | 30 + src/Client/index.html | 13 + src/Client/package-lock.json | 3284 +++++++++++++++++++++++++++++++++ src/Client/package.json | 28 + src/Client/public/vite.svg | 1 + src/Client/src/App.tsx | 5 + src/Client/src/index.css | 0 src/Client/src/main.tsx | 10 + src/Client/src/vite-env.d.ts | 1 + src/Client/tsconfig.json | 25 + src/Client/tsconfig.node.json | 11 + src/Client/vite.config.ts | 7 + 14 files changed, 3457 insertions(+) create mode 100644 src/Client/.eslintrc.cjs create mode 100644 src/Client/.gitignore create mode 100644 src/Client/README.md create mode 100644 src/Client/index.html create mode 100644 src/Client/package-lock.json create mode 100644 src/Client/package.json create mode 100644 src/Client/public/vite.svg create mode 100644 src/Client/src/App.tsx create mode 100644 src/Client/src/index.css create mode 100644 src/Client/src/main.tsx create mode 100644 src/Client/src/vite-env.d.ts create mode 100644 src/Client/tsconfig.json create mode 100644 src/Client/tsconfig.node.json create mode 100644 src/Client/vite.config.ts diff --git a/src/Client/.eslintrc.cjs b/src/Client/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/src/Client/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/src/Client/.gitignore b/src/Client/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/src/Client/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/Client/README.md b/src/Client/README.md new file mode 100644 index 0000000..0d6babe --- /dev/null +++ b/src/Client/README.md @@ -0,0 +1,30 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +} +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/src/Client/index.html b/src/Client/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/src/Client/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/src/Client/package-lock.json b/src/Client/package-lock.json new file mode 100644 index 0000000..15c30ec --- /dev/null +++ b/src/Client/package-lock.json @@ -0,0 +1,3284 @@ +{ + "name": "client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.0.0", + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", + "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", + "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", + "integrity": "sha512-GkhjAaQ8oUTOKE4g4gsZ0u8K/IHU1+2WQSgS1TwTcYvL+sjbaQjNHFXbOJ6kgqGHIO1DfUhI/Sphi9GkRT9K+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.16.4.tgz", + "integrity": "sha512-Bvm6D+NPbGMQOcxvS1zUl8H7DWlywSXsphAeOnVeiZLQ+0J6Is8T7SrjGTH29KtYkiY9vld8ZnpV3G2EPbom+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.16.4.tgz", + "integrity": "sha512-i5d64MlnYBO9EkCOGe5vPR/EeDwjnKOGGdd7zKFhU5y8haKhQZTN2DgVtpODDMxUr4t2K90wTUJg7ilgND6bXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.16.4.tgz", + "integrity": "sha512-WZupV1+CdUYehaZqjaFTClJI72fjJEgTXdf4NbW69I9XyvdmztUExBtcI2yIIU6hJtYvtwS6pkTkHJz+k08mAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.16.4.tgz", + "integrity": "sha512-ADm/xt86JUnmAfA9mBqFcRp//RVRt1ohGOYF6yL+IFCYqOBNwy5lbEK05xTsEoJq+/tJzg8ICUtS82WinJRuIw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.16.4.tgz", + "integrity": "sha512-tJfJaXPiFAG+Jn3cutp7mCs1ePltuAgRqdDZrzb1aeE3TktWWJ+g7xK9SNlaSUFw6IU4QgOxAY4rA+wZUT5Wfg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.16.4.tgz", + "integrity": "sha512-7dy1BzQkgYlUTapDTvK997cgi0Orh5Iu7JlZVBy1MBURk7/HSbHkzRnXZa19ozy+wwD8/SlpJnOOckuNZtJR9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.16.4.tgz", + "integrity": "sha512-zsFwdUw5XLD1gQe0aoU2HVceI6NEW7q7m05wA46eUAyrkeNYExObfRFQcvA6zw8lfRc5BHtan3tBpo+kqEOxmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.16.4.tgz", + "integrity": "sha512-p8C3NnxXooRdNrdv6dBmRTddEapfESEUflpICDNKXpHvTjRRq1J82CbU5G3XfebIZyI3B0s074JHMWD36qOW6w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.16.4.tgz", + "integrity": "sha512-Lh/8ckoar4s4Id2foY7jNgitTOUQczwMWNYi+Mjt0eQ9LKhr6sK477REqQkmy8YHY3Ca3A2JJVdXnfb3Rrwkng==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.16.4.tgz", + "integrity": "sha512-1xwwn9ZCQYuqGmulGsTZoKrrn0z2fAur2ujE60QgyDpHmBbXbxLaQiEvzJWDrscRq43c8DnuHx3QorhMTZgisQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.16.4.tgz", + "integrity": "sha512-LuOGGKAJ7dfRtxVnO1i3qWc6N9sh0Em/8aZ3CezixSTM+E9Oq3OvTsvC4sm6wWjzpsIlOCnZjdluINKESflJLA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.16.4.tgz", + "integrity": "sha512-ch86i7KkJKkLybDP2AtySFTRi5fM3KXp0PnHocHuJMdZwu7BuyIKi35BE9guMlmTpwwBTB3ljHj9IQXnTCD0vA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.16.4.tgz", + "integrity": "sha512-Ma4PwyLfOWZWayfEsNQzTDBVW8PZ6TUUN1uFTBQbF2Chv/+sjenE86lpiEwj2FiviSmSZ4Ap4MaAfl1ciF4aSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.16.4.tgz", + "integrity": "sha512-9m/ZDrQsdo/c06uOlP3W9G2ENRVzgzbSXmXHT4hwVaDQhYcRpi9bgBT0FTG9OhESxwK0WjQxYOSfv40cU+T69w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.16.4.tgz", + "integrity": "sha512-YunpoOAyGLDseanENHmbFvQSfVL5BxW3k7hhy0eN4rb3gS/ct75dVD0EXOWIqFT/nE8XYW6LP6vz6ctKRi0k9A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.79", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.79.tgz", + "integrity": "sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.25", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.25.tgz", + "integrity": "sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.1.tgz", + "integrity": "sha512-KwfdWXJBOviaBVhxO3p5TJiLpNuh2iyXyjmWN0f1nU87pwyvfS0EmjC6ukQVYVFJd/K1+0NWGPDXiyEyQorn0Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/type-utils": "7.7.1", + "@typescript-eslint/utils": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.1.tgz", + "integrity": "sha512-vmPzBOOtz48F6JAGVS/kZYk4EkXao6iGrD838sp1w3NQQC0W8ry/q641KU4PrG7AKNAf56NOcR8GOpH8l9FPCw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/typescript-estree": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.1.tgz", + "integrity": "sha512-PytBif2SF+9SpEUKynYn5g1RHFddJUcyynGpztX3l/ik7KmZEv19WCMhUBkHXPU9es/VWGD3/zg3wg90+Dh2rA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.1.tgz", + "integrity": "sha512-ZksJLW3WF7o75zaBPScdW1Gbkwhd/lyeXGf1kQCxJaOeITscoSl0MjynVvCzuV5boUz/3fOI06Lz8La55mu29Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.7.1", + "@typescript-eslint/utils": "7.7.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.1.tgz", + "integrity": "sha512-AmPmnGW1ZLTpWa+/2omPrPfR7BcbUU4oha5VIbSbS1a1Tv966bklvLNXxp3mrbc+P2j4MNOTfDffNsk4o0c6/w==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.1.tgz", + "integrity": "sha512-CXe0JHCXru8Fa36dteXqmH2YxngKJjkQLjxzoj6LYwzZ7qZvgsLSc+eqItCrqIop8Vl2UKoAi0StVWu97FQZIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/visitor-keys": "7.7.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.1.tgz", + "integrity": "sha512-QUvBxPEaBXf41ZBbaidKICgVL8Hin0p6prQDu6bbetWo39BKbWJxRsErOzMNT1rXvTll+J7ChrbmMCXM9rsvOQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.7.1", + "@typescript-eslint/types": "7.7.1", + "@typescript-eslint/typescript-estree": "7.7.1", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.1.tgz", + "integrity": "sha512-gBL3Eq25uADw1LQ9kVpf3hRM+DWzs0uZknHYK3hq4jcTPqVCClHGDnB6UUUV2SFeBeA4KWHWbbLqmbGcZ4FYbw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", + "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.5", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001612", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", + "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.746", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.746.tgz", + "integrity": "sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.6.tgz", + "integrity": "sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", + "integrity": "sha512-kuaTJSUbz+Wsb2ATGvEknkI12XV40vIiHmLuFlejoo7HtDok/O5eDDD0UpCVY5bBX5U5RYo8wWP83H7ZsqVEnA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.16.4", + "@rollup/rollup-android-arm64": "4.16.4", + "@rollup/rollup-darwin-arm64": "4.16.4", + "@rollup/rollup-darwin-x64": "4.16.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.16.4", + "@rollup/rollup-linux-arm-musleabihf": "4.16.4", + "@rollup/rollup-linux-arm64-gnu": "4.16.4", + "@rollup/rollup-linux-arm64-musl": "4.16.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.16.4", + "@rollup/rollup-linux-riscv64-gnu": "4.16.4", + "@rollup/rollup-linux-s390x-gnu": "4.16.4", + "@rollup/rollup-linux-x64-gnu": "4.16.4", + "@rollup/rollup-linux-x64-musl": "4.16.4", + "@rollup/rollup-win32-arm64-msvc": "4.16.4", + "@rollup/rollup-win32-ia32-msvc": "4.16.4", + "@rollup/rollup-win32-x64-msvc": "4.16.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "5.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", + "integrity": "sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/src/Client/package.json b/src/Client/package.json new file mode 100644 index 0000000..17fecdc --- /dev/null +++ b/src/Client/package.json @@ -0,0 +1,28 @@ +{ + "name": "client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } +} diff --git a/src/Client/public/vite.svg b/src/Client/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/Client/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/Client/src/App.tsx b/src/Client/src/App.tsx new file mode 100644 index 0000000..3ba974f --- /dev/null +++ b/src/Client/src/App.tsx @@ -0,0 +1,5 @@ +function App() { + return

Hello world

; +} + +export default App; diff --git a/src/Client/src/index.css b/src/Client/src/index.css new file mode 100644 index 0000000..e69de29 diff --git a/src/Client/src/main.tsx b/src/Client/src/main.tsx new file mode 100644 index 0000000..3d7150d --- /dev/null +++ b/src/Client/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/Client/src/vite-env.d.ts b/src/Client/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/Client/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/Client/tsconfig.json b/src/Client/tsconfig.json new file mode 100644 index 0000000..a7fc6fb --- /dev/null +++ b/src/Client/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/src/Client/tsconfig.node.json b/src/Client/tsconfig.node.json new file mode 100644 index 0000000..97ede7e --- /dev/null +++ b/src/Client/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/src/Client/vite.config.ts b/src/Client/vite.config.ts new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/src/Client/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From fe9cec5e017f48364832d4d79710bffb17d947f5 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 23 Apr 2024 17:21:10 +0100 Subject: [PATCH 03/39] Add tailwind css --- src/Client/package-lock.json | 977 ++++++++++++++++++++++++++++++++++ src/Client/package.json | 3 + src/Client/postcss.config.js | 6 + src/Client/src/App.tsx | 2 +- src/Client/src/index.css | 3 + src/Client/tailwind.config.js | 9 + 6 files changed, 999 insertions(+), 1 deletion(-) create mode 100644 src/Client/postcss.config.js create mode 100644 src/Client/tailwind.config.js diff --git a/src/Client/package-lock.json b/src/Client/package-lock.json index 15c30ec..93a6300 100644 --- a/src/Client/package-lock.json +++ b/src/Client/package-lock.json @@ -17,9 +17,12 @@ "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.19", "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.3", "typescript": "^5.2.2", "vite": "^5.2.0" } @@ -33,6 +36,18 @@ "node": ">=0.10.0" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -908,6 +923,50 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -991,6 +1050,16 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", @@ -1556,6 +1625,31 @@ "node": ">=4" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1571,12 +1665,61 @@ "node": ">=8" } }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -1639,6 +1782,15 @@ "node": ">=6" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001612", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", @@ -1673,6 +1825,42 @@ "node": ">=4" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1688,6 +1876,15 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1714,6 +1911,18 @@ "node": ">= 8" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -1743,6 +1952,12 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1755,6 +1970,12 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1767,12 +1988,24 @@ "node": ">=6.0.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/electron-to-chromium": { "version": "1.4.746", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.746.tgz", "integrity": "sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==", "dev": true }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "node_modules/esbuild": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", @@ -2226,6 +2459,35 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2246,6 +2508,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2353,6 +2624,18 @@ "node": ">=4" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -2403,6 +2686,30 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2412,6 +2719,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2448,6 +2764,33 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2529,6 +2872,21 @@ "node": ">= 0.8.0" } }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2607,12 +2965,32 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -2643,6 +3021,42 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2738,6 +3152,37 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -2765,6 +3210,24 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", @@ -2793,6 +3256,127 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2863,6 +3447,44 @@ "node": ">=0.10.0" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3017,6 +3639,18 @@ "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -3035,6 +3669,71 @@ "node": ">=0.10.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -3047,6 +3746,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3059,6 +3771,50 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -3071,12 +3827,82 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -3110,6 +3936,12 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3186,6 +4018,12 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, "node_modules/vite": { "version": "5.2.10", "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", @@ -3256,6 +4094,133 @@ "node": ">= 8" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -3268,6 +4233,18 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/src/Client/package.json b/src/Client/package.json index 17fecdc..a4fa32f 100644 --- a/src/Client/package.json +++ b/src/Client/package.json @@ -19,9 +19,12 @@ "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.19", "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.3", "typescript": "^5.2.2", "vite": "^5.2.0" } diff --git a/src/Client/postcss.config.js b/src/Client/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/src/Client/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/src/Client/src/App.tsx b/src/Client/src/App.tsx index 3ba974f..30eec1a 100644 --- a/src/Client/src/App.tsx +++ b/src/Client/src/App.tsx @@ -1,5 +1,5 @@ function App() { - return

Hello world

; + return

Hello world

; } export default App; diff --git a/src/Client/src/index.css b/src/Client/src/index.css index e69de29..bd6213e 100644 --- a/src/Client/src/index.css +++ b/src/Client/src/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/src/Client/tailwind.config.js b/src/Client/tailwind.config.js new file mode 100644 index 0000000..5e3b6b8 --- /dev/null +++ b/src/Client/tailwind.config.js @@ -0,0 +1,9 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: {}, + }, + plugins: [], +}; + From 62ac025105f5b35c1e2a4a19e91e080597281512 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 23 Apr 2024 17:35:34 +0100 Subject: [PATCH 04/39] Add react router with basic layout + home page --- src/Client/package-lock.json | 41 ++++++++++++++++++- src/Client/package.json | 3 +- src/Client/src/main.tsx | 5 ++- .../src/{App.tsx => pages/HomePage.tsx} | 4 +- src/Client/src/pages/Layout.tsx | 11 +++++ src/Client/src/routes.tsx | 13 ++++++ 6 files changed, 70 insertions(+), 7 deletions(-) rename src/Client/src/{App.tsx => pages/HomePage.tsx} (65%) create mode 100644 src/Client/src/pages/Layout.tsx create mode 100644 src/Client/src/routes.tsx diff --git a/src/Client/package-lock.json b/src/Client/package-lock.json index 93a6300..9aec40d 100644 --- a/src/Client/package-lock.json +++ b/src/Client/package-lock.json @@ -9,7 +9,8 @@ "version": "0.0.0", "dependencies": { "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-router-dom": "^6.23.0" }, "devDependencies": { "@types/react": "^18.2.66", @@ -1060,6 +1061,14 @@ "node": ">=14" } }, + "node_modules/@remix-run/router": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.0.tgz", + "integrity": "sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.16.4.tgz", @@ -3447,6 +3456,36 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.0.tgz", + "integrity": "sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==", + "dependencies": { + "@remix-run/router": "1.16.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.0.tgz", + "integrity": "sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==", + "dependencies": { + "@remix-run/router": "1.16.0", + "react-router": "6.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", diff --git a/src/Client/package.json b/src/Client/package.json index a4fa32f..6120504 100644 --- a/src/Client/package.json +++ b/src/Client/package.json @@ -11,7 +11,8 @@ }, "dependencies": { "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-router-dom": "^6.23.0" }, "devDependencies": { "@types/react": "^18.2.66", diff --git a/src/Client/src/main.tsx b/src/Client/src/main.tsx index 3d7150d..91efbdc 100644 --- a/src/Client/src/main.tsx +++ b/src/Client/src/main.tsx @@ -1,10 +1,11 @@ import React from 'react' import ReactDOM from 'react-dom/client' -import App from './App.tsx' +import { RouterProvider } from 'react-router-dom' import './index.css' +import router from './routes.tsx' ReactDOM.createRoot(document.getElementById('root')!).render( - + , ) diff --git a/src/Client/src/App.tsx b/src/Client/src/pages/HomePage.tsx similarity index 65% rename from src/Client/src/App.tsx rename to src/Client/src/pages/HomePage.tsx index 30eec1a..9a570db 100644 --- a/src/Client/src/App.tsx +++ b/src/Client/src/pages/HomePage.tsx @@ -1,5 +1,3 @@ -function App() { +export default function HomePage() { return

Hello world

; } - -export default App; diff --git a/src/Client/src/pages/Layout.tsx b/src/Client/src/pages/Layout.tsx new file mode 100644 index 0000000..0405162 --- /dev/null +++ b/src/Client/src/pages/Layout.tsx @@ -0,0 +1,11 @@ +import { Outlet } from "react-router-dom"; + +export default function Layout() { + return ( +
+
+ +
+
+ ); +} diff --git a/src/Client/src/routes.tsx b/src/Client/src/routes.tsx new file mode 100644 index 0000000..41581a2 --- /dev/null +++ b/src/Client/src/routes.tsx @@ -0,0 +1,13 @@ +import { createBrowserRouter } from "react-router-dom"; +import Layout from "./pages/Layout"; +import HomePage from "./pages/HomePage"; + +const router = createBrowserRouter([ + { + path: "/", + element: , + children: [{ index: true, element: }], + }, +]); + +export default router; From 3096855f345864b84bbb7679a2f7266f2551a423 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Wed, 24 Apr 2024 14:12:10 +0100 Subject: [PATCH 05/39] Add nav bar --- src/Client/package-lock.json | 72 +++++++++++++++++++++++++++ src/Client/package.json | 3 ++ src/Client/src/assets/logo.webp | Bin 0 -> 4096 bytes src/Client/src/pages/Layout.tsx | 4 +- src/Client/src/pages/NavBar.tsx | 85 ++++++++++++++++++++++++++++++++ 5 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 src/Client/src/assets/logo.webp create mode 100644 src/Client/src/pages/NavBar.tsx diff --git a/src/Client/package-lock.json b/src/Client/package-lock.json index 9aec40d..30898b3 100644 --- a/src/Client/package-lock.json +++ b/src/Client/package-lock.json @@ -8,11 +8,14 @@ "name": "client", "version": "0.0.0", "dependencies": { + "@headlessui/react": "^1.7.19", + "@heroicons/react": "^2.1.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.23.0" }, "devDependencies": { + "@types/node": "^20.12.7", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@typescript-eslint/eslint-plugin": "^7.2.0", @@ -869,6 +872,30 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@headlessui/react": { + "version": "1.7.19", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.19.tgz", + "integrity": "sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==", + "dependencies": { + "@tanstack/react-virtual": "^3.0.0-beta.60", + "client-only": "^0.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/@heroicons/react": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.3.tgz", + "integrity": "sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==", + "peerDependencies": { + "react": ">= 16" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -1277,6 +1304,31 @@ "win32" ] }, + "node_modules/@tanstack/react-virtual": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.4.0.tgz", + "integrity": "sha512-GZN4xn/Tg5w7gvYeVcMVCeL4pEyUhvg+Cp6KX2Z01C4FRNxIWMgIQ9ibgMarNQfo+gt0PVLcEER4A9sNv/jlow==", + "dependencies": { + "@tanstack/virtual-core": "3.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.4.0.tgz", + "integrity": "sha512-75jXqXxqq5M5Veb9KP1STi8kA5u408uOOAefk2ftHDGCpUk3RP6zX++QqfbmHJTBiU72NQ+ghgCZVts/Wocz8Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1330,6 +1382,15 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", @@ -1870,6 +1931,11 @@ "node": ">= 6" } }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -4018,6 +4084,12 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", diff --git a/src/Client/package.json b/src/Client/package.json index 6120504..801c66c 100644 --- a/src/Client/package.json +++ b/src/Client/package.json @@ -10,11 +10,14 @@ "preview": "vite preview" }, "dependencies": { + "@headlessui/react": "^1.7.19", + "@heroicons/react": "^2.1.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.23.0" }, "devDependencies": { + "@types/node": "^20.12.7", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@typescript-eslint/eslint-plugin": "^7.2.0", diff --git a/src/Client/src/assets/logo.webp b/src/Client/src/assets/logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..d31f1e5df765897dddd1f0f77bbedd4b829ac831 GIT binary patch literal 4096 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 literal 0 HcmV?d00001 diff --git a/src/Client/src/pages/Layout.tsx b/src/Client/src/pages/Layout.tsx index 0405162..91a1d95 100644 --- a/src/Client/src/pages/Layout.tsx +++ b/src/Client/src/pages/Layout.tsx @@ -1,9 +1,11 @@ import { Outlet } from "react-router-dom"; +import NavBar from "./NavBar"; export default function Layout() { return (
-
+ +
diff --git a/src/Client/src/pages/NavBar.tsx b/src/Client/src/pages/NavBar.tsx new file mode 100644 index 0000000..534ff97 --- /dev/null +++ b/src/Client/src/pages/NavBar.tsx @@ -0,0 +1,85 @@ +import { Dialog, Popover } from "@headlessui/react"; +import { Bars3Icon, XMarkIcon } from "@heroicons/react/24/outline"; +import { useState } from "react"; +import { NavLink } from "react-router-dom"; +import logo from "../assets/logo.webp"; + +export default function NavBar() { + const [mobileMenuOpen, setMobileMenuOpen] = useState(false); + + return ( +
+ + +
+ +
+ + Beau Findlay + Logo + + +
+
+
+
+ + Contact + + + This App + +
+
+
+
+
+
+ ); +} From d0464df0f64c237456adef7f4997ef9f05c5a53c Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Wed, 24 Apr 2024 14:15:00 +0100 Subject: [PATCH 06/39] Move nav bar to components folder --- src/Client/public/vite.svg | 1 - src/Client/src/{pages => components}/NavBar.tsx | 0 src/Client/src/pages/Layout.tsx | 2 +- 3 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 src/Client/public/vite.svg rename src/Client/src/{pages => components}/NavBar.tsx (100%) diff --git a/src/Client/public/vite.svg b/src/Client/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/src/Client/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Client/src/pages/NavBar.tsx b/src/Client/src/components/NavBar.tsx similarity index 100% rename from src/Client/src/pages/NavBar.tsx rename to src/Client/src/components/NavBar.tsx diff --git a/src/Client/src/pages/Layout.tsx b/src/Client/src/pages/Layout.tsx index 91a1d95..b33b95a 100644 --- a/src/Client/src/pages/Layout.tsx +++ b/src/Client/src/pages/Layout.tsx @@ -1,5 +1,5 @@ import { Outlet } from "react-router-dom"; -import NavBar from "./NavBar"; +import NavBar from "../components/NavBar"; export default function Layout() { return ( From 2d5676f5967905885f765a56ecdda72bf1ce9b73 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Wed, 24 Apr 2024 14:33:27 +0100 Subject: [PATCH 07/39] Add footer and replace heroicons with react-icons --- src/Client/package-lock.json | 18 ++++++------- src/Client/package.json | 2 +- src/Client/src/components/Footer.tsx | 40 ++++++++++++++++++++++++++++ src/Client/src/components/NavBar.tsx | 11 ++++---- src/Client/src/pages/Layout.tsx | 13 ++++++--- 5 files changed, 65 insertions(+), 19 deletions(-) create mode 100644 src/Client/src/components/Footer.tsx diff --git a/src/Client/package-lock.json b/src/Client/package-lock.json index 30898b3..0a4cf49 100644 --- a/src/Client/package-lock.json +++ b/src/Client/package-lock.json @@ -9,9 +9,9 @@ "version": "0.0.0", "dependencies": { "@headlessui/react": "^1.7.19", - "@heroicons/react": "^2.1.3", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-icons": "^5.1.0", "react-router-dom": "^6.23.0" }, "devDependencies": { @@ -888,14 +888,6 @@ "react-dom": "^16 || ^17 || ^18" } }, - "node_modules/@heroicons/react": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.3.tgz", - "integrity": "sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==", - "peerDependencies": { - "react": ">= 16" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -3513,6 +3505,14 @@ "react": "^18.2.0" } }, + "node_modules/react-icons": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.1.0.tgz", + "integrity": "sha512-D3zug1270S4hbSlIRJ0CUS97QE1yNNKDjzQe3HqY0aefp2CBn9VgzgES27sRR2gOvFK+0CNx/BW0ggOESp6fqQ==", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", diff --git a/src/Client/package.json b/src/Client/package.json index 801c66c..743e825 100644 --- a/src/Client/package.json +++ b/src/Client/package.json @@ -11,9 +11,9 @@ }, "dependencies": { "@headlessui/react": "^1.7.19", - "@heroicons/react": "^2.1.3", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-icons": "^5.1.0", "react-router-dom": "^6.23.0" }, "devDependencies": { diff --git a/src/Client/src/components/Footer.tsx b/src/Client/src/components/Footer.tsx new file mode 100644 index 0000000..03c2711 --- /dev/null +++ b/src/Client/src/components/Footer.tsx @@ -0,0 +1,40 @@ +import { FaEnvelope, FaGithub, FaLinkedin } from "react-icons/fa6"; + +export default function Footer() { + const currentYear = new Date().getFullYear(); + + return ( + + ); +} diff --git a/src/Client/src/components/NavBar.tsx b/src/Client/src/components/NavBar.tsx index 534ff97..380c1fd 100644 --- a/src/Client/src/components/NavBar.tsx +++ b/src/Client/src/components/NavBar.tsx @@ -1,16 +1,17 @@ import { Dialog, Popover } from "@headlessui/react"; -import { Bars3Icon, XMarkIcon } from "@heroicons/react/24/outline"; import { useState } from "react"; +import { FaBars, FaXmark } from "react-icons/fa6"; import { NavLink } from "react-router-dom"; import logo from "../assets/logo.webp"; + export default function NavBar() { const [mobileMenuOpen, setMobileMenuOpen] = useState(false); return ( -
+
diff --git a/src/Client/src/pages/Layout.tsx b/src/Client/src/pages/Layout.tsx index b33b95a..b40dbe0 100644 --- a/src/Client/src/pages/Layout.tsx +++ b/src/Client/src/pages/Layout.tsx @@ -1,12 +1,17 @@ import { Outlet } from "react-router-dom"; import NavBar from "../components/NavBar"; +import Footer from "../components/Footer"; export default function Layout() { return ( -
- -
- +
+
+ +
+ +
+ +
); From 460ae6580a3fd6053ad8f6327f8476d4f5c81afe Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Wed, 24 Apr 2024 14:42:52 +0100 Subject: [PATCH 08/39] Extract social icons to component and add to mobile nav bar --- src/Client/src/components/Footer.tsx | 26 ++---------------- src/Client/src/components/NavBar.tsx | 5 +++- src/Client/src/components/SocialIcons.tsx | 33 +++++++++++++++++++++++ 3 files changed, 39 insertions(+), 25 deletions(-) create mode 100644 src/Client/src/components/SocialIcons.tsx diff --git a/src/Client/src/components/Footer.tsx b/src/Client/src/components/Footer.tsx index 03c2711..706a944 100644 --- a/src/Client/src/components/Footer.tsx +++ b/src/Client/src/components/Footer.tsx @@ -1,4 +1,4 @@ -import { FaEnvelope, FaGithub, FaLinkedin } from "react-icons/fa6"; +import SocialIcons from "./SocialIcons"; export default function Footer() { const currentYear = new Date().getFullYear(); @@ -7,29 +7,7 @@ export default function Footer() {
- +

© {currentYear} Beau Findlay. All rights reserved.

diff --git a/src/Client/src/components/NavBar.tsx b/src/Client/src/components/NavBar.tsx index 380c1fd..e2d36c7 100644 --- a/src/Client/src/components/NavBar.tsx +++ b/src/Client/src/components/NavBar.tsx @@ -3,7 +3,7 @@ import { useState } from "react"; import { FaBars, FaXmark } from "react-icons/fa6"; import { NavLink } from "react-router-dom"; import logo from "../assets/logo.webp"; - +import SocialIcons from "./SocialIcons"; export default function NavBar() { const [mobileMenuOpen, setMobileMenuOpen] = useState(false); @@ -77,6 +77,9 @@ export default function NavBar() { This App
+
+ +
diff --git a/src/Client/src/components/SocialIcons.tsx b/src/Client/src/components/SocialIcons.tsx new file mode 100644 index 0000000..5f86245 --- /dev/null +++ b/src/Client/src/components/SocialIcons.tsx @@ -0,0 +1,33 @@ +import { FaEnvelope, FaGithub, FaLinkedin } from "react-icons/fa6"; + +interface Props { + size?: number; +} + +export default function SocialIcons({ size = 20 }: Props) { + return ( + + ); +} From a85b63b58a3c864f71b19dfea02b4ae09a3bf00c Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Wed, 24 Apr 2024 14:50:21 +0100 Subject: [PATCH 09/39] Render social icons from array --- src/Client/src/components/Footer.tsx | 2 +- src/Client/src/components/SocialIcons.tsx | 49 +++++++++++++---------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/Client/src/components/Footer.tsx b/src/Client/src/components/Footer.tsx index 706a944..a56079f 100644 --- a/src/Client/src/components/Footer.tsx +++ b/src/Client/src/components/Footer.tsx @@ -8,7 +8,7 @@ export default function Footer() {
-

+

© {currentYear} Beau Findlay. All rights reserved.

diff --git a/src/Client/src/components/SocialIcons.tsx b/src/Client/src/components/SocialIcons.tsx index 5f86245..c816a76 100644 --- a/src/Client/src/components/SocialIcons.tsx +++ b/src/Client/src/components/SocialIcons.tsx @@ -5,29 +5,36 @@ interface Props { } export default function SocialIcons({ size = 20 }: Props) { + const socialIcons = [ + { + name: "GitHub", + href: "https://github.com/bdfin", + icon: , + }, + { + name: "LinkedIn", + href: "https://www.linkedin.com/in/beau-findlay/", + icon: , + }, + { + name: "Email", + href: "mailto:me@beaufindlay.com", + icon: , + }, + ]; + return ( ); } From f46c7bd9daf79d191dc6b4b37535ec91d0ba01f0 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Wed, 24 Apr 2024 15:47:42 +0100 Subject: [PATCH 10/39] Add home page content --- src/Client/src/components/Link.tsx | 17 +++++++++++++++++ src/Client/src/components/NavBar.tsx | 2 +- src/Client/src/components/Subtitle.tsx | 11 +++++++++++ src/Client/src/components/Text.tsx | 9 +++++++++ src/Client/src/components/Title.tsx | 7 +++++++ src/Client/src/pages/HomePage.tsx | 25 ++++++++++++++++++++++++- src/Client/src/pages/Layout.tsx | 3 +-- 7 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 src/Client/src/components/Link.tsx create mode 100644 src/Client/src/components/Subtitle.tsx create mode 100644 src/Client/src/components/Text.tsx create mode 100644 src/Client/src/components/Title.tsx diff --git a/src/Client/src/components/Link.tsx b/src/Client/src/components/Link.tsx new file mode 100644 index 0000000..578f1d5 --- /dev/null +++ b/src/Client/src/components/Link.tsx @@ -0,0 +1,17 @@ +interface Props { + children: string; + href: string; + target?: "_blank" | ""; +} + +export default function Link({ children, href, target }: Props) { + return ( + + {children} + + ); +} diff --git a/src/Client/src/components/NavBar.tsx b/src/Client/src/components/NavBar.tsx index e2d36c7..e2a0434 100644 --- a/src/Client/src/components/NavBar.tsx +++ b/src/Client/src/components/NavBar.tsx @@ -46,7 +46,7 @@ export default function NavBar() { onClose={setMobileMenuOpen} >
- +
Beau Findlay diff --git a/src/Client/src/components/Subtitle.tsx b/src/Client/src/components/Subtitle.tsx new file mode 100644 index 0000000..a84f69d --- /dev/null +++ b/src/Client/src/components/Subtitle.tsx @@ -0,0 +1,11 @@ +interface Props { + children: string; + className?: string | null; +} + +export default function Subtitle({ children, className }: Props) { + const defaultStyles = "text-2xl py-4 font-semibold"; + const styles = className ? `${defaultStyles} ${className}` : defaultStyles; + + return

{children}

; +} diff --git a/src/Client/src/components/Text.tsx b/src/Client/src/components/Text.tsx new file mode 100644 index 0000000..e67b657 --- /dev/null +++ b/src/Client/src/components/Text.tsx @@ -0,0 +1,9 @@ +import { ReactNode } from "react"; + +interface Props { + children: ReactNode; +} + +export default function Text({ children }: Props) { + return

{children}

; +} diff --git a/src/Client/src/components/Title.tsx b/src/Client/src/components/Title.tsx new file mode 100644 index 0000000..086c2cc --- /dev/null +++ b/src/Client/src/components/Title.tsx @@ -0,0 +1,7 @@ +interface Props { + children: string; +} + +export default function Title({ children }: Props) { + return

{children}

; +} diff --git a/src/Client/src/pages/HomePage.tsx b/src/Client/src/pages/HomePage.tsx index 9a570db..9be6c7f 100644 --- a/src/Client/src/pages/HomePage.tsx +++ b/src/Client/src/pages/HomePage.tsx @@ -1,3 +1,26 @@ +import Link from "../components/Link"; +import Subtitle from "../components/Subtitle"; +import Text from "../components/Text"; +import Title from "../components/Title"; + export default function HomePage() { - return

Hello world

; + return ( + <> + Hi, I'm Beau. + + I'm a UK-based software engineer and I love building cool stuff. + + + A bit about me + + I mostly specialise in back-end C#/.NET development and I've built + systems that scale for hundreds-of-thousands of global users. + + + I've worked with businesses at all sizes and stages and I'm currently + heading up the tech as CTO at a cool startup called{" "} + un:hurd music. + + + ); } diff --git a/src/Client/src/pages/Layout.tsx b/src/Client/src/pages/Layout.tsx index b40dbe0..3de92b2 100644 --- a/src/Client/src/pages/Layout.tsx +++ b/src/Client/src/pages/Layout.tsx @@ -7,10 +7,9 @@ export default function Layout() {
-
+
-
From 839ba683a076703907d1bb97ae1152f0240ca1e0 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Wed, 24 Apr 2024 16:09:50 +0100 Subject: [PATCH 11/39] Fix navbar home icon link --- src/Client/src/components/NavBar.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Client/src/components/NavBar.tsx b/src/Client/src/components/NavBar.tsx index e2a0434..c79aed4 100644 --- a/src/Client/src/components/NavBar.tsx +++ b/src/Client/src/components/NavBar.tsx @@ -1,7 +1,7 @@ import { Dialog, Popover } from "@headlessui/react"; import { useState } from "react"; import { FaBars, FaXmark } from "react-icons/fa6"; -import { NavLink } from "react-router-dom"; +import { Link, NavLink } from "react-router-dom"; import logo from "../assets/logo.webp"; import SocialIcons from "./SocialIcons"; @@ -15,10 +15,10 @@ export default function NavBar() { aria-label="Global" >
- - Contact - - - This App - + Contact + This App
- + Beau Findlay Logo - + + ); +} diff --git a/src/Client/src/components/ContactForm.tsx b/src/Client/src/components/ContactForm.tsx new file mode 100644 index 0000000..6b3573c --- /dev/null +++ b/src/Client/src/components/ContactForm.tsx @@ -0,0 +1,58 @@ +import { FaRegPaperPlane } from "react-icons/fa6"; +import Link from "./Link"; +import TextInput from "./TextInput"; +import TextAreaInput from "./TextAreaInput"; +import Button from "./Button"; +import Label from "./Label"; + +export default function ContactForm() { + return ( +
+
{ + event.preventDefault(); + console.log("Submitted"); + }} + > +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ + This site is protected by reCAPTCHA and the Google{" "} + + Privacy Policy + {" "} + and{" "} + + Terms of Service + {" "} + apply. + +
+
+ +
+
+
+ ); +} diff --git a/src/Client/src/components/Label.tsx b/src/Client/src/components/Label.tsx new file mode 100644 index 0000000..c35395e --- /dev/null +++ b/src/Client/src/components/Label.tsx @@ -0,0 +1,12 @@ +interface Props { + htmlFor: string; + children: string; +} + +export default function Label({ htmlFor, children }: Props) { + return ( + + ); +} diff --git a/src/Client/src/components/TextAreaInput.tsx b/src/Client/src/components/TextAreaInput.tsx new file mode 100644 index 0000000..6c1790f --- /dev/null +++ b/src/Client/src/components/TextAreaInput.tsx @@ -0,0 +1,14 @@ +interface Props { + id: string; + rows?: number; +} + +export default function TextAreaInput({ id, rows = 4 }: Props) { + return ( + + ); +} diff --git a/src/Client/src/components/TextInput.tsx b/src/Client/src/components/TextInput.tsx new file mode 100644 index 0000000..74e2d09 --- /dev/null +++ b/src/Client/src/components/TextInput.tsx @@ -0,0 +1,14 @@ +interface Props { + id: string; + type: "text" | "email"; +} + +export default function TextInput({ id, type }: Props) { + return ( + + ); +} diff --git a/src/Client/src/components/Title.tsx b/src/Client/src/components/Title.tsx index f46b30d..ba25493 100644 --- a/src/Client/src/components/Title.tsx +++ b/src/Client/src/components/Title.tsx @@ -4,7 +4,7 @@ interface Props { } export default function Title({ children, className }: Props) { - const defaultStyles = "text-4xl"; + const defaultStyles = "text-4xl py-4"; const styles = className ? `${defaultStyles} ${className}` : defaultStyles; return

{children}

; diff --git a/src/Client/src/pages/ContactPage.tsx b/src/Client/src/pages/ContactPage.tsx index 1d17e85..57047d5 100644 --- a/src/Client/src/pages/ContactPage.tsx +++ b/src/Client/src/pages/ContactPage.tsx @@ -1,3 +1,4 @@ +import ContactForm from "../components/ContactForm"; import Text from "../components/Text"; import Title from "../components/Title"; @@ -5,10 +6,11 @@ export default function ContactPage() { return ( <> Contact - + If you think I can help with your project or you'd just like to talk tech, send me a message! + ); } From 3fa78ad2bbb87a5e40bcfdb64738ce7e7d6da6f4 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Wed, 24 Apr 2024 22:04:28 +0100 Subject: [PATCH 15/39] Update font styles --- src/Client/src/components/Footer.tsx | 2 +- src/Client/src/components/NavLink.tsx | 4 ++-- src/Client/src/components/SocialIcons.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Client/src/components/Footer.tsx b/src/Client/src/components/Footer.tsx index a56079f..821707d 100644 --- a/src/Client/src/components/Footer.tsx +++ b/src/Client/src/components/Footer.tsx @@ -8,7 +8,7 @@ export default function Footer() {
-

+

© {currentYear} Beau Findlay. All rights reserved.

diff --git a/src/Client/src/components/NavLink.tsx b/src/Client/src/components/NavLink.tsx index 16b4154..ae04782 100644 --- a/src/Client/src/components/NavLink.tsx +++ b/src/Client/src/components/NavLink.tsx @@ -7,14 +7,14 @@ interface Props { } export default function NavLink({ children, to, className }: Props) { - const defaultStyles = "text-sm font-semibold leading-6"; + const defaultStyles = "text-base font-semibold leading-6 hover:text-gray-300"; const styles = className ? className : defaultStyles; return ( - isActive ? `${styles} underline underline-offset-2` : styles + isActive ? `${styles} underline underline-offset-4` : styles } > {children} diff --git a/src/Client/src/components/SocialIcons.tsx b/src/Client/src/components/SocialIcons.tsx index c816a76..d916b09 100644 --- a/src/Client/src/components/SocialIcons.tsx +++ b/src/Client/src/components/SocialIcons.tsx @@ -29,7 +29,7 @@ export default function SocialIcons({ size = 20 }: Props) { {socialIcon.name} {socialIcon.icon} From 3bf38b74133e82a692599aafb09c346c55f21de4 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Thu, 25 Apr 2024 09:12:59 +0100 Subject: [PATCH 16/39] About tabs wip --- src/Client/src/components/AboutTabs.tsx | 68 +++++++++++++++++++++++++ src/Client/src/components/Link.tsx | 14 ++--- src/Client/src/pages/AboutPage.tsx | 24 +++++++++ src/Client/src/routes.tsx | 2 + 4 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 src/Client/src/components/AboutTabs.tsx create mode 100644 src/Client/src/pages/AboutPage.tsx diff --git a/src/Client/src/components/AboutTabs.tsx b/src/Client/src/components/AboutTabs.tsx new file mode 100644 index 0000000..f2c1f68 --- /dev/null +++ b/src/Client/src/components/AboutTabs.tsx @@ -0,0 +1,68 @@ +import { Tab } from "@headlessui/react"; +import { Fragment } from "react"; +import Subtitle from "./Subtitle"; + +function classNames(...classes: string[]) { + return classes.filter(Boolean).join(" "); +} + +export default function AboutTabs() { + return ( + +
+
+ + + classNames( + selected + ? "border-indigo-500 text-indigo-600" + : "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700", + "whitespace-nowrap border-b-2 py-6 text-sm font-medium" + ) + } + > + Front-end + + + classNames( + selected + ? "border-indigo-500 text-indigo-600" + : "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700", + "whitespace-nowrap border-b-2 py-6 text-sm font-medium" + ) + } + > + Back-end + + + classNames( + selected + ? "border-indigo-500 text-indigo-600" + : "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700", + "whitespace-nowrap border-b-2 py-6 text-sm font-medium" + ) + } + > + Hosting + + +
+
+ + + + Front-end + + + Back-end + + + Hosting + + +
+ ); +} diff --git a/src/Client/src/components/Link.tsx b/src/Client/src/components/Link.tsx index 578f1d5..a0982d0 100644 --- a/src/Client/src/components/Link.tsx +++ b/src/Client/src/components/Link.tsx @@ -1,16 +1,16 @@ interface Props { children: string; - href: string; + href?: string; target?: "_blank" | ""; + className?: string | null; } -export default function Link({ children, href, target }: Props) { +export default function Link({ children, href, target, className }: Props) { + const defaultStyles = "underline underline-offset-2 hover:underline-offset-4"; + const styles = className ? `${defaultStyles} ${className}` : defaultStyles; + return ( -
+ {children} ); diff --git a/src/Client/src/pages/AboutPage.tsx b/src/Client/src/pages/AboutPage.tsx new file mode 100644 index 0000000..e293c9b --- /dev/null +++ b/src/Client/src/pages/AboutPage.tsx @@ -0,0 +1,24 @@ +import AboutTabs from "../components/AboutTabs"; +import Link from "../components/Link"; +import Text from "../components/Text"; +import Title from "../components/Title"; + +export default function AboutPage() { + return ( + <> + This App + + Below is an overview of how this simple app is made and what + technologies are used. If you'd like to dive straight in, the full + project is available on my{" "} + GitHub. + + + I'm planning to integrate a simple blog as part of this app that will + dive into more specific implementation details so check back soon for + more! + + + + ); +} diff --git a/src/Client/src/routes.tsx b/src/Client/src/routes.tsx index 0bca920..44ddd1e 100644 --- a/src/Client/src/routes.tsx +++ b/src/Client/src/routes.tsx @@ -2,6 +2,7 @@ import { createBrowserRouter } from "react-router-dom"; import Layout from "./pages/Layout"; import HomePage from "./pages/HomePage"; import ContactPage from "./pages/ContactPage"; +import AboutPage from "./pages/AboutPage"; const router = createBrowserRouter([ { @@ -10,6 +11,7 @@ const router = createBrowserRouter([ children: [ { index: true, element: }, { path: "contact", element: }, + { path: "about", element: }, ], }, ]); From fb47d730bd950de926d8cd0bd1680527e2662eae Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Fri, 26 Apr 2024 13:46:59 +0100 Subject: [PATCH 17/39] About tabs WIP --- src/Client/src/components/AboutTabs.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Client/src/components/AboutTabs.tsx b/src/Client/src/components/AboutTabs.tsx index f2c1f68..56e0d73 100644 --- a/src/Client/src/components/AboutTabs.tsx +++ b/src/Client/src/components/AboutTabs.tsx @@ -11,13 +11,13 @@ export default function AboutTabs() {
- + classNames( selected - ? "border-indigo-500 text-indigo-600" - : "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700", + ? "border-gray-300 text-gray-200" + : "border-transparent hover:border-gray-300 hover:text-gray-200", "whitespace-nowrap border-b-2 py-6 text-sm font-medium" ) } @@ -28,8 +28,8 @@ export default function AboutTabs() { className={({ selected }) => classNames( selected - ? "border-indigo-500 text-indigo-600" - : "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700", + ? "border-gray-300 text-gray-200" + : "border-transparent hover:border-gray-300 hover:text-gray-200", "whitespace-nowrap border-b-2 py-6 text-sm font-medium" ) } @@ -40,8 +40,8 @@ export default function AboutTabs() { className={({ selected }) => classNames( selected - ? "border-indigo-500 text-indigo-600" - : "border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700", + ? "border-gray-300 text-gray-200" + : "border-transparent hover:border-gray-300 hover:text-gray-200", "whitespace-nowrap border-b-2 py-6 text-sm font-medium" ) } From 474d0ed5bf564a57be5f309943e530fca61b3e67 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Fri, 26 Apr 2024 13:57:19 +0100 Subject: [PATCH 18/39] Extract helper function to build css class names --- src/Client/src/components/AboutTabs.tsx | 11 ++++------- src/Client/src/components/Link.tsx | 4 +++- src/Client/src/components/Subtitle.tsx | 4 +++- src/Client/src/components/Text.tsx | 3 ++- src/Client/src/components/Title.tsx | 4 +++- src/Client/src/helpers/cssClassFormatter.ts | 3 +++ 6 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 src/Client/src/helpers/cssClassFormatter.ts diff --git a/src/Client/src/components/AboutTabs.tsx b/src/Client/src/components/AboutTabs.tsx index 56e0d73..0ae4fbd 100644 --- a/src/Client/src/components/AboutTabs.tsx +++ b/src/Client/src/components/AboutTabs.tsx @@ -1,10 +1,7 @@ import { Tab } from "@headlessui/react"; import { Fragment } from "react"; import Subtitle from "./Subtitle"; - -function classNames(...classes: string[]) { - return classes.filter(Boolean).join(" "); -} +import buildClassNames from "../helpers/cssClassFormatter"; export default function AboutTabs() { return ( @@ -14,7 +11,7 @@ export default function AboutTabs() { - classNames( + buildClassNames( selected ? "border-gray-300 text-gray-200" : "border-transparent hover:border-gray-300 hover:text-gray-200", @@ -26,7 +23,7 @@ export default function AboutTabs() { - classNames( + buildClassNames( selected ? "border-gray-300 text-gray-200" : "border-transparent hover:border-gray-300 hover:text-gray-200", @@ -38,7 +35,7 @@ export default function AboutTabs() { - classNames( + buildClassNames( selected ? "border-gray-300 text-gray-200" : "border-transparent hover:border-gray-300 hover:text-gray-200", diff --git a/src/Client/src/components/Link.tsx b/src/Client/src/components/Link.tsx index a0982d0..d6178ce 100644 --- a/src/Client/src/components/Link.tsx +++ b/src/Client/src/components/Link.tsx @@ -1,3 +1,5 @@ +import buildClassNames from "../helpers/cssClassFormatter"; + interface Props { children: string; href?: string; @@ -7,7 +9,7 @@ interface Props { export default function Link({ children, href, target, className }: Props) { const defaultStyles = "underline underline-offset-2 hover:underline-offset-4"; - const styles = className ? `${defaultStyles} ${className}` : defaultStyles; + const styles = buildClassNames(className ? className : "", defaultStyles); return ( diff --git a/src/Client/src/components/Subtitle.tsx b/src/Client/src/components/Subtitle.tsx index a84f69d..6593962 100644 --- a/src/Client/src/components/Subtitle.tsx +++ b/src/Client/src/components/Subtitle.tsx @@ -1,3 +1,5 @@ +import buildClassNames from "../helpers/cssClassFormatter"; + interface Props { children: string; className?: string | null; @@ -5,7 +7,7 @@ interface Props { export default function Subtitle({ children, className }: Props) { const defaultStyles = "text-2xl py-4 font-semibold"; - const styles = className ? `${defaultStyles} ${className}` : defaultStyles; + const styles = buildClassNames(className ? className : "", defaultStyles); return

{children}

; } diff --git a/src/Client/src/components/Text.tsx b/src/Client/src/components/Text.tsx index 5748f66..c5abf0c 100644 --- a/src/Client/src/components/Text.tsx +++ b/src/Client/src/components/Text.tsx @@ -1,4 +1,5 @@ import { ReactNode } from "react"; +import buildClassNames from "../helpers/cssClassFormatter"; interface Props { children: ReactNode; @@ -7,7 +8,7 @@ interface Props { export default function Text({ children, className }: Props) { const defaultStyles = "text-lg py-2"; - const styles = className ? `${defaultStyles} ${className}` : defaultStyles; + const styles = buildClassNames(className ? className : "", defaultStyles); return

{children}

; } diff --git a/src/Client/src/components/Title.tsx b/src/Client/src/components/Title.tsx index ba25493..cff535b 100644 --- a/src/Client/src/components/Title.tsx +++ b/src/Client/src/components/Title.tsx @@ -1,3 +1,5 @@ +import buildClassNames from "../helpers/cssClassFormatter"; + interface Props { children: string; className?: string | null; @@ -5,7 +7,7 @@ interface Props { export default function Title({ children, className }: Props) { const defaultStyles = "text-4xl py-4"; - const styles = className ? `${defaultStyles} ${className}` : defaultStyles; + const styles = buildClassNames(className ? className : "", defaultStyles); return

{children}

; } diff --git a/src/Client/src/helpers/cssClassFormatter.ts b/src/Client/src/helpers/cssClassFormatter.ts new file mode 100644 index 0000000..6f94766 --- /dev/null +++ b/src/Client/src/helpers/cssClassFormatter.ts @@ -0,0 +1,3 @@ +export default function buildClassNames(...classes: string[]) { + return classes.filter(Boolean).join(" "); +} From fcfff25ec77240f63277b159957b3f5f2b3365b2 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Fri, 26 Apr 2024 15:57:15 +0100 Subject: [PATCH 19/39] Add about page --- src/Client/src/components/AboutTabs.tsx | 224 ++++++++++++++---- .../components/{Link.tsx => AnchorLink.tsx} | 7 +- src/Client/src/components/ContactForm.tsx | 16 +- src/Client/src/components/List.tsx | 15 ++ src/Client/src/components/ListItem.tsx | 9 + src/Client/src/components/Subtitle.tsx | 5 +- src/Client/src/components/Text.tsx | 2 +- src/Client/src/pages/AboutPage.tsx | 7 +- src/Client/src/pages/HomePage.tsx | 4 +- 9 files changed, 229 insertions(+), 60 deletions(-) rename src/Client/src/components/{Link.tsx => AnchorLink.tsx} (82%) create mode 100644 src/Client/src/components/List.tsx create mode 100644 src/Client/src/components/ListItem.tsx diff --git a/src/Client/src/components/AboutTabs.tsx b/src/Client/src/components/AboutTabs.tsx index 0ae4fbd..8bf1a75 100644 --- a/src/Client/src/components/AboutTabs.tsx +++ b/src/Client/src/components/AboutTabs.tsx @@ -1,7 +1,158 @@ import { Tab } from "@headlessui/react"; -import { Fragment } from "react"; -import Subtitle from "./Subtitle"; +import { Fragment, ReactNode } from "react"; +import { SiAzurefunctions, SiMicrosoftazure, SiReact } from "react-icons/si"; +import { Link } from "react-router-dom"; import buildClassNames from "../helpers/cssClassFormatter"; +import AnchorLink from "./AnchorLink"; +import List from "./List"; +import ListItem from "./ListItem"; +import Subtitle from "./Subtitle"; +import Text from "./Text"; + +interface AboutTab { + tabName: string; + title: ReactNode; + subtitle: string; + content: ReactNode[]; +} + +const tabs: AboutTab[] = [ + { + tabName: "Front-end", + title: ( + + Front-end + + ), + subtitle: "React + TypeScript", + content: [ + + This app was originally made using{" "} + + .NET Blazor WASM + {" "} + however I recently decided to start learning{" "} + React and saw this as + a good oppurtunity to solidify some knowledge by re-writing this app + from the ground up using React with{" "} + + TypeScript + + . + , + + Overall I've found building front-end apps far more enjoyable using + React & TypeScript dispite the steep learning-curve coming from a purely + .NET & C# background. Both the developer experience and performance of + the app have improved dramatically after switching front-end + technologies. + , + + This app is styled using a cool CSS framework called{" "} + TailwindCSS.{" "} + PostCSS is used + alongside Tailwind to generate a lightweight stylesheet based only on + the parts of the framework that are used, as oppose to including a + everything the framework offers. + , + ], + }, + { + tabName: "Back-end", + title: ( + + Back-end + + ), + subtitle: ".NET Azure Functions API", + content: [ + + There is a very minimal API used as the back-end of this app to allow + users to contact me directly via the{" "} + + contact + {" "} + page. This will be expanded to serve the technical blog I'm building as + a new feature that will be available soon. + , + The contact API endpoint currently:, + + + Validates a{" "} + + Google reCAPTCHA + {" "} + token to protect against fraudulent submissions. + + + Builds a HTML email from the information provided in the form. + + + Sends an email directly to my inbox using the{" "} + SendGrid{" "} + API. + + , + + The API is written in .NET 8 using{" "} + + Azure Serverless Functions + {" "} + with a HTTP trigger to act as an API endpoint. For larger scale projects + I would almost always opt for a fully-featured{" "} + + Web API + + , however Azure Functions provide automatic elastic scaling with + consumption-based billing and a generous free-tier, making them perfect + for smaller projects like this. + , + ], + }, + { + tabName: "Hosting", + title: ( + + Hosting + + ), + subtitle: "Microsoft Azure Static Web App", + content: [ + + The goal of this project was to learn some new technologies and host the + app as cheaply as possible. With this in mind I decided to go with a{" "} + + Static Web App + {" "} + hosted on Microsoft Azure. Static Web Apps offer global distribution of + static assets (the Blazor Webassembly app in this case) and offer + integrated hosting for Azure Function App APIs. + , + + Another cool feature of Static Web Apps is Azure's integration with + GitHub actions to deploy both the client and server simultaneously and + provide automatically deployed staging environments for pull-requests + opened to the main branch. This made testing deployed changes much + easier and cheaper than deploying an isolated testing/GA environment + before releasing to the live version of the app. + , + + Using Static Web Apps on Azure has meant that I have been able to build, + deploy and serve this site and API completely free (with the exception + of the domain name). The next thing on the roadmap is building a simple + blog using an{" "} + + Azure SQL database + {" "} + where I'll document the full process of writing and deploying this app + so check back again soon. + , + ], + }, +]; export default function AboutTabs() { return ( @@ -9,56 +160,35 @@ export default function AboutTabs() {
- - buildClassNames( - selected - ? "border-gray-300 text-gray-200" - : "border-transparent hover:border-gray-300 hover:text-gray-200", - "whitespace-nowrap border-b-2 py-6 text-sm font-medium" - ) - } - > - Front-end - - - buildClassNames( - selected - ? "border-gray-300 text-gray-200" - : "border-transparent hover:border-gray-300 hover:text-gray-200", - "whitespace-nowrap border-b-2 py-6 text-sm font-medium" - ) - } - > - Back-end - - - buildClassNames( - selected - ? "border-gray-300 text-gray-200" - : "border-transparent hover:border-gray-300 hover:text-gray-200", - "whitespace-nowrap border-b-2 py-6 text-sm font-medium" - ) - } - > - Hosting - + {tabs.map((tab) => ( + + buildClassNames( + selected + ? "border-gray-300 text-gray-200" + : "border-transparent hover:border-gray-300 hover:text-gray-200", + "whitespace-nowrap border-b-4 py-6 text-sm font-medium" + ) + } + > + {tab.tabName} + + ))}
- - Front-end - - - Back-end - - - Hosting - + {tabs.map((tab) => ( + + {tab.title} +

Tech: {tab.subtitle}

+ {tab.content.map((content, index) => ( + {content} + ))} +
+ ))}
); diff --git a/src/Client/src/components/Link.tsx b/src/Client/src/components/AnchorLink.tsx similarity index 82% rename from src/Client/src/components/Link.tsx rename to src/Client/src/components/AnchorLink.tsx index d6178ce..91a799c 100644 --- a/src/Client/src/components/Link.tsx +++ b/src/Client/src/components/AnchorLink.tsx @@ -7,7 +7,12 @@ interface Props { className?: string | null; } -export default function Link({ children, href, target, className }: Props) { +export default function AnchorLink({ + children, + href, + target, + className, +}: Props) { const defaultStyles = "underline underline-offset-2 hover:underline-offset-4"; const styles = buildClassNames(className ? className : "", defaultStyles); diff --git a/src/Client/src/components/ContactForm.tsx b/src/Client/src/components/ContactForm.tsx index 6b3573c..ebedcb7 100644 --- a/src/Client/src/components/ContactForm.tsx +++ b/src/Client/src/components/ContactForm.tsx @@ -1,5 +1,5 @@ import { FaRegPaperPlane } from "react-icons/fa6"; -import Link from "./Link"; +import AnchorLink from "./AnchorLink"; import TextInput from "./TextInput"; import TextAreaInput from "./TextAreaInput"; import Button from "./Button"; @@ -37,13 +37,19 @@ export default function ContactForm() {
This site is protected by reCAPTCHA and the Google{" "} - + Privacy Policy - {" "} + {" "} and{" "} - + Terms of Service - {" "} + {" "} apply.
diff --git a/src/Client/src/components/List.tsx b/src/Client/src/components/List.tsx new file mode 100644 index 0000000..7ebacd5 --- /dev/null +++ b/src/Client/src/components/List.tsx @@ -0,0 +1,15 @@ +import { ReactElement } from "react"; +import buildClassNames from "../helpers/cssClassFormatter"; +import { ListItemProps } from "./ListItem"; + +interface Props { + className?: string | null; + children: ReactElement | Array>; +} + +export default function List({ className, children }: Props) { + const defaultStyles = "list-disc pl-8 space-y-2"; + const styles = buildClassNames(className ? className : "", defaultStyles); + + return
    {children}
; +} diff --git a/src/Client/src/components/ListItem.tsx b/src/Client/src/components/ListItem.tsx new file mode 100644 index 0000000..5fea678 --- /dev/null +++ b/src/Client/src/components/ListItem.tsx @@ -0,0 +1,9 @@ +import { ReactNode } from "react"; + +export interface ListItemProps { + children: ReactNode; +} + +export default function ListItem({ children }: ListItemProps) { + return
  • {children}
  • ; +} diff --git a/src/Client/src/components/Subtitle.tsx b/src/Client/src/components/Subtitle.tsx index 6593962..842f72d 100644 --- a/src/Client/src/components/Subtitle.tsx +++ b/src/Client/src/components/Subtitle.tsx @@ -1,12 +1,13 @@ +import { ReactNode } from "react"; import buildClassNames from "../helpers/cssClassFormatter"; interface Props { - children: string; + children: ReactNode; className?: string | null; } export default function Subtitle({ children, className }: Props) { - const defaultStyles = "text-2xl py-4 font-semibold"; + const defaultStyles = "flex items-center text-2xl py-4 font-semibold"; const styles = buildClassNames(className ? className : "", defaultStyles); return

    {children}

    ; diff --git a/src/Client/src/components/Text.tsx b/src/Client/src/components/Text.tsx index c5abf0c..3ff197d 100644 --- a/src/Client/src/components/Text.tsx +++ b/src/Client/src/components/Text.tsx @@ -7,7 +7,7 @@ interface Props { } export default function Text({ children, className }: Props) { - const defaultStyles = "text-lg py-2"; + const defaultStyles = "text-lg py-3"; const styles = buildClassNames(className ? className : "", defaultStyles); return

    {children}

    ; diff --git a/src/Client/src/pages/AboutPage.tsx b/src/Client/src/pages/AboutPage.tsx index e293c9b..2cd3277 100644 --- a/src/Client/src/pages/AboutPage.tsx +++ b/src/Client/src/pages/AboutPage.tsx @@ -1,5 +1,5 @@ import AboutTabs from "../components/AboutTabs"; -import Link from "../components/Link"; +import AnchorLink from "../components/AnchorLink"; import Text from "../components/Text"; import Title from "../components/Title"; @@ -11,7 +11,10 @@ export default function AboutPage() { Below is an overview of how this simple app is made and what technologies are used. If you'd like to dive straight in, the full project is available on my{" "} - GitHub. + + GitHub + + . I'm planning to integrate a simple blog as part of this app that will diff --git a/src/Client/src/pages/HomePage.tsx b/src/Client/src/pages/HomePage.tsx index 9be6c7f..dc9b4db 100644 --- a/src/Client/src/pages/HomePage.tsx +++ b/src/Client/src/pages/HomePage.tsx @@ -1,4 +1,4 @@ -import Link from "../components/Link"; +import AnchorLink from "../components/AnchorLink"; import Subtitle from "../components/Subtitle"; import Text from "../components/Text"; import Title from "../components/Title"; @@ -19,7 +19,7 @@ export default function HomePage() { I've worked with businesses at all sizes and stages and I'm currently heading up the tech as CTO at a cool startup called{" "} - un:hurd music. + un:hurd music. ); From 58baa78e7a72c7ec269731a81bc5f6aba155cd65 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Fri, 26 Apr 2024 16:09:51 +0100 Subject: [PATCH 20/39] Add fade in animation --- src/Client/src/index.css | 17 ++++++++++++++++- src/Client/src/pages/Layout.tsx | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Client/src/index.css b/src/Client/src/index.css index bd6213e..7c8243d 100644 --- a/src/Client/src/index.css +++ b/src/Client/src/index.css @@ -1,3 +1,18 @@ @tailwind base; @tailwind components; -@tailwind utilities; \ No newline at end of file +@tailwind utilities; + +.fade-in { + animation: fadeInAnimation ease 1s; + animation-iteration-count: 1; + animation-fill-mode: forwards; +} + +@keyframes fadeInAnimation { + from { + opacity: 0; + } + to { + opacity: 1; + } +} diff --git a/src/Client/src/pages/Layout.tsx b/src/Client/src/pages/Layout.tsx index 3de92b2..d7b33e5 100644 --- a/src/Client/src/pages/Layout.tsx +++ b/src/Client/src/pages/Layout.tsx @@ -5,7 +5,7 @@ import Footer from "../components/Footer"; export default function Layout() { return (
    -
    +
    From f16c6ff8390dd0e39687f5a1635721e292b05c9b Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Fri, 26 Apr 2024 16:11:44 +0100 Subject: [PATCH 21/39] Style scroll bar --- src/Client/src/index.css | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Client/src/index.css b/src/Client/src/index.css index 7c8243d..7877d5a 100644 --- a/src/Client/src/index.css +++ b/src/Client/src/index.css @@ -16,3 +16,16 @@ opacity: 1; } } + +body::-webkit-scrollbar { + width: 10px; +} + +body::-webkit-scrollbar-track { + background: white; +} + +body::-webkit-scrollbar-thumb { + background-color: black; + border: 1px solid white; +} From 547041b40e19a92491f2d428924271e86024ccfb Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Fri, 26 Apr 2024 17:49:17 +0100 Subject: [PATCH 22/39] Add loading spinner and page --- src/Client/src/components/Loading.tsx | 13 +++++++++++ src/Client/src/components/LoadingSpinner.tsx | 23 ++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/Client/src/components/Loading.tsx create mode 100644 src/Client/src/components/LoadingSpinner.tsx diff --git a/src/Client/src/components/Loading.tsx b/src/Client/src/components/Loading.tsx new file mode 100644 index 0000000..138578e --- /dev/null +++ b/src/Client/src/components/Loading.tsx @@ -0,0 +1,13 @@ +import LoadingSpinner from "./LoadingSpinner"; +import logo from "../assets/logo.webp"; + +export default function Loading() { + return ( +
    +
    + Logo + +
    +
    + ); +} diff --git a/src/Client/src/components/LoadingSpinner.tsx b/src/Client/src/components/LoadingSpinner.tsx new file mode 100644 index 0000000..a65b737 --- /dev/null +++ b/src/Client/src/components/LoadingSpinner.tsx @@ -0,0 +1,23 @@ +export default function LoadingSpinner() { + return ( +
    + + Loading... +
    + ); +} From 3ec8cbcd49e11016acd385884245b4719afb4d04 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Fri, 26 Apr 2024 17:49:46 +0100 Subject: [PATCH 23/39] Add lazy loading to pages --- src/Client/src/main.tsx | 21 ++++++++++++--------- src/Client/src/pages/AboutPage.tsx | 5 ----- src/Client/src/routes.tsx | 8 +++++--- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Client/src/main.tsx b/src/Client/src/main.tsx index 91efbdc..28f3be7 100644 --- a/src/Client/src/main.tsx +++ b/src/Client/src/main.tsx @@ -1,11 +1,14 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import { RouterProvider } from 'react-router-dom' -import './index.css' -import router from './routes.tsx' +import React, { Suspense } from "react"; +import ReactDOM from "react-dom/client"; +import { RouterProvider } from "react-router-dom"; +import Loading from "./components/Loading.tsx"; +import "./index.css"; +import router from "./routes.tsx"; -ReactDOM.createRoot(document.getElementById('root')!).render( +ReactDOM.createRoot(document.getElementById("root")!).render( - - , -) + }> + + + +); diff --git a/src/Client/src/pages/AboutPage.tsx b/src/Client/src/pages/AboutPage.tsx index 2cd3277..734d435 100644 --- a/src/Client/src/pages/AboutPage.tsx +++ b/src/Client/src/pages/AboutPage.tsx @@ -16,11 +16,6 @@ export default function AboutPage() { . - - I'm planning to integrate a simple blog as part of this app that will - dive into more specific implementation details so check back soon for - more! - ); diff --git a/src/Client/src/routes.tsx b/src/Client/src/routes.tsx index 44ddd1e..640da93 100644 --- a/src/Client/src/routes.tsx +++ b/src/Client/src/routes.tsx @@ -1,8 +1,10 @@ +import React from "react"; import { createBrowserRouter } from "react-router-dom"; import Layout from "./pages/Layout"; -import HomePage from "./pages/HomePage"; -import ContactPage from "./pages/ContactPage"; -import AboutPage from "./pages/AboutPage"; + +const HomePage = React.lazy(() => import("./pages/HomePage")); +const ContactPage = React.lazy(() => import("./pages/ContactPage")); +const AboutPage = React.lazy(() => import("./pages/AboutPage")); const router = createBrowserRouter([ { From 9991cd1bf7cc82dc956320f7f64a71ab8be4de68 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Fri, 26 Apr 2024 18:06:21 +0100 Subject: [PATCH 24/39] Add error page --- src/Client/src/pages/ErrorPage.tsx | 35 ++++++++++++++++++++++++++++++ src/Client/src/routes.tsx | 2 ++ 2 files changed, 37 insertions(+) create mode 100644 src/Client/src/pages/ErrorPage.tsx diff --git a/src/Client/src/pages/ErrorPage.tsx b/src/Client/src/pages/ErrorPage.tsx new file mode 100644 index 0000000..c4c5686 --- /dev/null +++ b/src/Client/src/pages/ErrorPage.tsx @@ -0,0 +1,35 @@ +import { isRouteErrorResponse, useRouteError } from "react-router-dom"; +import Footer from "../components/Footer"; +import NavBar from "../components/NavBar"; + +export default function ErrorPage() { + const error = useRouteError(); + + let errorCode = "Oops"; + let errorTitle = "Something went wrong."; + let errorMessage = "This error has been automatically logged."; + + if (isRouteErrorResponse(error)) { + errorCode = "404"; + errorTitle = "Page not found"; + errorMessage = "Sorry, this page dosen't exist."; + } + + return ( +
    +
    + +
    +
    +

    {errorCode}

    +

    + {errorTitle} +

    +

    {errorMessage}

    +
    +
    +
    +
    +
    + ); +} diff --git a/src/Client/src/routes.tsx b/src/Client/src/routes.tsx index 640da93..10c1fd1 100644 --- a/src/Client/src/routes.tsx +++ b/src/Client/src/routes.tsx @@ -1,6 +1,7 @@ import React from "react"; import { createBrowserRouter } from "react-router-dom"; import Layout from "./pages/Layout"; +import ErrorPage from "./pages/ErrorPage"; const HomePage = React.lazy(() => import("./pages/HomePage")); const ContactPage = React.lazy(() => import("./pages/ContactPage")); @@ -10,6 +11,7 @@ const router = createBrowserRouter([ { path: "/", element: , + errorElement: , children: [ { index: true, element: }, { path: "contact", element: }, From 7b0ad4dcc6e7687329874d0a3589f01f82479767 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Sat, 27 Apr 2024 11:24:21 +0100 Subject: [PATCH 25/39] Add tech icons --- src/Client/src/components/NavBar.tsx | 2 +- src/Client/src/components/TechIcons.tsx | 56 +++++++++++++++++++++++++ src/Client/src/pages/HomePage.tsx | 3 ++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/Client/src/components/TechIcons.tsx diff --git a/src/Client/src/components/NavBar.tsx b/src/Client/src/components/NavBar.tsx index 790b891..f520402 100644 --- a/src/Client/src/components/NavBar.tsx +++ b/src/Client/src/components/NavBar.tsx @@ -59,7 +59,7 @@ export default function NavBar() {
    -
    +
    , + }, + { + name: "Microsoft Azure", + icon: , + }, + { + name: "Blazor", + icon: , + }, + { + name: "React", + icon: , + }, + { + name: "Databases", + icon: , + }, + { + name: "Docker", + icon: , + }, +]; + +interface Props { + className?: string | null; +} + +export default function TechIcons({ className }: Props) { + const defaultStyles = "mx-auto max-w-4xl"; + const styles = buildClassNames(className ? className : "", defaultStyles); + + return ( +
    +

    Tech

    +
    + {techIcons.map((techIcon, index) => ( +
    + {techIcon.icon} +

    {techIcon.name}

    +
    + ))} +
    +
    + ); +} diff --git a/src/Client/src/pages/HomePage.tsx b/src/Client/src/pages/HomePage.tsx index dc9b4db..d21aaee 100644 --- a/src/Client/src/pages/HomePage.tsx +++ b/src/Client/src/pages/HomePage.tsx @@ -1,5 +1,6 @@ import AnchorLink from "../components/AnchorLink"; import Subtitle from "../components/Subtitle"; +import TechIcons from "../components/TechIcons"; import Text from "../components/Text"; import Title from "../components/Title"; @@ -21,6 +22,8 @@ export default function HomePage() { heading up the tech as CTO at a cool startup called{" "} un:hurd music. + + ); } From ca8cc3e387bff0d7906b10e92006b7d35008b79f Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Sun, 28 Apr 2024 16:55:54 +0100 Subject: [PATCH 26/39] Remove contact page --- src/Client/src/components/AboutTabs.tsx | 66 ++--------------------- src/Client/src/components/ContactForm.tsx | 64 ---------------------- src/Client/src/components/NavBar.tsx | 7 --- src/Client/src/pages/ContactPage.tsx | 16 ------ src/Client/src/routes.tsx | 2 - 5 files changed, 4 insertions(+), 151 deletions(-) delete mode 100644 src/Client/src/components/ContactForm.tsx delete mode 100644 src/Client/src/pages/ContactPage.tsx diff --git a/src/Client/src/components/AboutTabs.tsx b/src/Client/src/components/AboutTabs.tsx index 8bf1a75..42f937f 100644 --- a/src/Client/src/components/AboutTabs.tsx +++ b/src/Client/src/components/AboutTabs.tsx @@ -1,11 +1,8 @@ import { Tab } from "@headlessui/react"; import { Fragment, ReactNode } from "react"; -import { SiAzurefunctions, SiMicrosoftazure, SiReact } from "react-icons/si"; -import { Link } from "react-router-dom"; +import { SiMicrosoftazure, SiReact } from "react-icons/si"; import buildClassNames from "../helpers/cssClassFormatter"; import AnchorLink from "./AnchorLink"; -import List from "./List"; -import ListItem from "./ListItem"; import Subtitle from "./Subtitle"; import Text from "./Text"; @@ -57,61 +54,6 @@ const tabs: AboutTab[] = [ , ], }, - { - tabName: "Back-end", - title: ( - - Back-end - - ), - subtitle: ".NET Azure Functions API", - content: [ - - There is a very minimal API used as the back-end of this app to allow - users to contact me directly via the{" "} - - contact - {" "} - page. This will be expanded to serve the technical blog I'm building as - a new feature that will be available soon. - , - The contact API endpoint currently:, - - - Validates a{" "} - - Google reCAPTCHA - {" "} - token to protect against fraudulent submissions. - - - Builds a HTML email from the information provided in the form. - - - Sends an email directly to my inbox using the{" "} - SendGrid{" "} - API. - - , - - The API is written in .NET 8 using{" "} - - Azure Serverless Functions - {" "} - with a HTTP trigger to act as an API endpoint. For larger scale projects - I would almost always opt for a fully-featured{" "} - - Web API - - , however Azure Functions provide automatic elastic scaling with - consumption-based billing and a generous free-tier, making them perfect - for smaller projects like this. - , - ], - }, { tabName: "Hosting", title: ( @@ -141,9 +83,9 @@ const tabs: AboutTab[] = [ , Using Static Web Apps on Azure has meant that I have been able to build, - deploy and serve this site and API completely free (with the exception - of the domain name). The next thing on the roadmap is building a simple - blog using an{" "} + deploy and serve this site completely free (with the exception of the + domain name). The next thing on the roadmap is building a simple blog + using an{" "} Azure SQL database {" "} diff --git a/src/Client/src/components/ContactForm.tsx b/src/Client/src/components/ContactForm.tsx deleted file mode 100644 index ebedcb7..0000000 --- a/src/Client/src/components/ContactForm.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { FaRegPaperPlane } from "react-icons/fa6"; -import AnchorLink from "./AnchorLink"; -import TextInput from "./TextInput"; -import TextAreaInput from "./TextAreaInput"; -import Button from "./Button"; -import Label from "./Label"; - -export default function ContactForm() { - return ( -
    -
    { - event.preventDefault(); - console.log("Submitted"); - }} - > -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    -
    - - This site is protected by reCAPTCHA and the Google{" "} - - Privacy Policy - {" "} - and{" "} - - Terms of Service - {" "} - apply. - -
    -
    - -
    -
    -
    - ); -} diff --git a/src/Client/src/components/NavBar.tsx b/src/Client/src/components/NavBar.tsx index f520402..7f566f2 100644 --- a/src/Client/src/components/NavBar.tsx +++ b/src/Client/src/components/NavBar.tsx @@ -32,7 +32,6 @@ export default function NavBar() {
    - Contact This App @@ -61,12 +60,6 @@ export default function NavBar() {
    - - Contact - - Contact - - If you think I can help with your project or you'd just like to talk - tech, send me a message! - - - - ); -} diff --git a/src/Client/src/routes.tsx b/src/Client/src/routes.tsx index 10c1fd1..3407a0e 100644 --- a/src/Client/src/routes.tsx +++ b/src/Client/src/routes.tsx @@ -4,7 +4,6 @@ import Layout from "./pages/Layout"; import ErrorPage from "./pages/ErrorPage"; const HomePage = React.lazy(() => import("./pages/HomePage")); -const ContactPage = React.lazy(() => import("./pages/ContactPage")); const AboutPage = React.lazy(() => import("./pages/AboutPage")); const router = createBrowserRouter([ @@ -14,7 +13,6 @@ const router = createBrowserRouter([ errorElement: , children: [ { index: true, element: }, - { path: "contact", element: }, { path: "about", element: }, ], }, From 6a7ec77e4a1087b274bf3b2ccfd5db05dc9cb528 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Sun, 28 Apr 2024 16:58:07 +0100 Subject: [PATCH 27/39] Remove duplicate gitignore --- .gitignore | 406 ----------------------------------------------------- 1 file changed, 406 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index f84895a..0000000 --- a/.gitignore +++ /dev/null @@ -1,406 +0,0 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.tlog -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio 6 auto-generated project file (contains which files were open etc.) -*.vbp - -# Visual Studio 6 workspace and project file (working project files containing files to include in project) -*.dsw -*.dsp - -# Visual Studio 6 technical files -*.ncb -*.aps - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# Visual Studio History (VSHistory) files -.vshistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp - -# JetBrains Rider -*.sln.iml -/BeauFindlay/BeauFindlay/package-lock.json -/BeauFindlay/BeauFindlay/package.json -/BeauFindlay/src/BeauFindlay.Client/package-lock.json -/BeauFindlay/src/BeauFindlay.Client/package.json -/BeauFindlay/src/BeauFindlay.Client/package-lock.json -/BeauFindlay/src/BeauFindlay.Client/package.json -/BeauFindlay/src/BeauFindlay.Client/package-lock.json -/BeauFindlay/src/BeauFindlay.Client/package.json From e58db914df5da0e9d87cfa2457b2168f6b40b874 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Mon, 29 Apr 2024 21:21:40 +0100 Subject: [PATCH 28/39] Remove lazy loading --- src/Client/src/main.tsx | 7 ++----- src/Client/src/routes.tsx | 8 +++----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/Client/src/main.tsx b/src/Client/src/main.tsx index 28f3be7..01052b7 100644 --- a/src/Client/src/main.tsx +++ b/src/Client/src/main.tsx @@ -1,14 +1,11 @@ -import React, { Suspense } from "react"; +import React from "react"; import ReactDOM from "react-dom/client"; import { RouterProvider } from "react-router-dom"; -import Loading from "./components/Loading.tsx"; import "./index.css"; import router from "./routes.tsx"; ReactDOM.createRoot(document.getElementById("root")!).render( - }> - - + ); diff --git a/src/Client/src/routes.tsx b/src/Client/src/routes.tsx index 3407a0e..55f8999 100644 --- a/src/Client/src/routes.tsx +++ b/src/Client/src/routes.tsx @@ -1,10 +1,8 @@ -import React from "react"; import { createBrowserRouter } from "react-router-dom"; -import Layout from "./pages/Layout"; +import AboutPage from "./pages/AboutPage"; import ErrorPage from "./pages/ErrorPage"; - -const HomePage = React.lazy(() => import("./pages/HomePage")); -const AboutPage = React.lazy(() => import("./pages/AboutPage")); +import HomePage from "./pages/HomePage"; +import Layout from "./pages/Layout"; const router = createBrowserRouter([ { From 99c813855014a48981e39b1662835071bd7828ff Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Mon, 29 Apr 2024 21:58:33 +0100 Subject: [PATCH 29/39] Update homepage styling --- src/Client/src/components/TechIcons.tsx | 4 +++- src/Client/src/pages/HomePage.tsx | 15 ++++++++++++--- src/Client/src/pages/Layout.tsx | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/Client/src/components/TechIcons.tsx b/src/Client/src/components/TechIcons.tsx index 5a89adf..9bc9f23 100644 --- a/src/Client/src/components/TechIcons.tsx +++ b/src/Client/src/components/TechIcons.tsx @@ -42,7 +42,9 @@ export default function TechIcons({ className }: Props) { return (
    -

    Tech

    +

    + Tech i'm working with at the moment: +

    {techIcons.map((techIcon, index) => (
    diff --git a/src/Client/src/pages/HomePage.tsx b/src/Client/src/pages/HomePage.tsx index d21aaee..c4b7a2e 100644 --- a/src/Client/src/pages/HomePage.tsx +++ b/src/Client/src/pages/HomePage.tsx @@ -1,3 +1,4 @@ +import { FaRegPaperPlane } from "react-icons/fa6"; import AnchorLink from "../components/AnchorLink"; import Subtitle from "../components/Subtitle"; import TechIcons from "../components/TechIcons"; @@ -11,8 +12,6 @@ export default function HomePage() { I'm a UK-based software engineer and I love building cool stuff. - - A bit about me I mostly specialise in back-end C#/.NET development and I've built systems that scale for hundreds-of-thousands of global users. @@ -23,7 +22,17 @@ export default function HomePage() { un:hurd music. - + + +
    + If you think I can help with your project... + + Get in touch + +
    ); } diff --git a/src/Client/src/pages/Layout.tsx b/src/Client/src/pages/Layout.tsx index d7b33e5..6b87bc4 100644 --- a/src/Client/src/pages/Layout.tsx +++ b/src/Client/src/pages/Layout.tsx @@ -4,7 +4,7 @@ import Footer from "../components/Footer"; export default function Layout() { return ( -
    +
    From 8e0ae68e695fd3922fd0a05d2d4ed5ae85090d97 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 30 Apr 2024 20:50:48 +0100 Subject: [PATCH 30/39] Add work page --- src/Client/src/components/NavBar.tsx | 7 ++ src/Client/src/components/WorkTimeline.tsx | 76 ++++++++++++++++++++++ src/Client/src/pages/HomePage.tsx | 16 +---- src/Client/src/pages/WorkPage.tsx | 25 +++++++ src/Client/src/routes.tsx | 2 + 5 files changed, 112 insertions(+), 14 deletions(-) create mode 100644 src/Client/src/components/WorkTimeline.tsx create mode 100644 src/Client/src/pages/WorkPage.tsx diff --git a/src/Client/src/components/NavBar.tsx b/src/Client/src/components/NavBar.tsx index 7f566f2..b31b964 100644 --- a/src/Client/src/components/NavBar.tsx +++ b/src/Client/src/components/NavBar.tsx @@ -32,6 +32,7 @@ export default function NavBar() {
    + Work This App @@ -60,6 +61,12 @@ export default function NavBar() {
    + + Work + + {workTimelineItems.map((item, index) => ( +
  • +
    + +

    + {item.title} @{" "} + {item.companyName} +

    + {item.content.map((content, index) => ( + {content} + ))} +
  • + ))} + + ); +} diff --git a/src/Client/src/pages/HomePage.tsx b/src/Client/src/pages/HomePage.tsx index c4b7a2e..30fb2bc 100644 --- a/src/Client/src/pages/HomePage.tsx +++ b/src/Client/src/pages/HomePage.tsx @@ -1,6 +1,4 @@ -import { FaRegPaperPlane } from "react-icons/fa6"; import AnchorLink from "../components/AnchorLink"; -import Subtitle from "../components/Subtitle"; import TechIcons from "../components/TechIcons"; import Text from "../components/Text"; import Title from "../components/Title"; @@ -8,7 +6,7 @@ import Title from "../components/Title"; export default function HomePage() { return ( <> - Hi, I'm Beau. + Hi, I'm Beau. I'm a UK-based software engineer and I love building cool stuff. @@ -22,17 +20,7 @@ export default function HomePage() { un:hurd music. - - -
    - If you think I can help with your project... - - Get in touch - -
    + ); } diff --git a/src/Client/src/pages/WorkPage.tsx b/src/Client/src/pages/WorkPage.tsx new file mode 100644 index 0000000..59cd6d6 --- /dev/null +++ b/src/Client/src/pages/WorkPage.tsx @@ -0,0 +1,25 @@ +import { FaRegPaperPlane } from "react-icons/fa6"; +import Text from "../components/Text"; +import Title from "../components/Title"; +import WorkTimeline from "../components/WorkTimeline"; + +export default function WorkPage() { + return ( + <> + Work +

    + Freelance Software Engineer since 2018 +

    + +
    + + ); +} diff --git a/src/Client/src/routes.tsx b/src/Client/src/routes.tsx index 55f8999..5977394 100644 --- a/src/Client/src/routes.tsx +++ b/src/Client/src/routes.tsx @@ -3,6 +3,7 @@ import AboutPage from "./pages/AboutPage"; import ErrorPage from "./pages/ErrorPage"; import HomePage from "./pages/HomePage"; import Layout from "./pages/Layout"; +import WorkPage from "./pages/WorkPage"; const router = createBrowserRouter([ { @@ -11,6 +12,7 @@ const router = createBrowserRouter([ errorElement: , children: [ { index: true, element: }, + { path: "work", element: }, { path: "about", element: }, ], }, From eb05b1f7b5ccd844634d71369a87a9ebd071bbc6 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 30 Apr 2024 20:53:07 +0100 Subject: [PATCH 31/39] Extract contact me section to component --- src/Client/src/components/ContactMe.tsx | 16 ++++++++++++++++ src/Client/src/pages/WorkPage.tsx | 13 ++----------- 2 files changed, 18 insertions(+), 11 deletions(-) create mode 100644 src/Client/src/components/ContactMe.tsx diff --git a/src/Client/src/components/ContactMe.tsx b/src/Client/src/components/ContactMe.tsx new file mode 100644 index 0000000..6aed821 --- /dev/null +++ b/src/Client/src/components/ContactMe.tsx @@ -0,0 +1,16 @@ +import { FaRegPaperPlane } from "react-icons/fa6"; +import Text from "../components/Text"; + +export default function ContactMe() { + return ( +
    + If you think I can help with your project... + + Get in touch + +
    + ); +} diff --git a/src/Client/src/pages/WorkPage.tsx b/src/Client/src/pages/WorkPage.tsx index 59cd6d6..ab65dbc 100644 --- a/src/Client/src/pages/WorkPage.tsx +++ b/src/Client/src/pages/WorkPage.tsx @@ -1,5 +1,4 @@ -import { FaRegPaperPlane } from "react-icons/fa6"; -import Text from "../components/Text"; +import ContactMe from "../components/ContactMe"; import Title from "../components/Title"; import WorkTimeline from "../components/WorkTimeline"; @@ -11,15 +10,7 @@ export default function WorkPage() { Freelance Software Engineer since 2018

    -
    - If you think I can help with your project... - - Get in touch - -
    + ); } From 5cd551d259077268ec4dab39007d1fb9620c2449 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 30 Apr 2024 20:58:02 +0100 Subject: [PATCH 32/39] Close mobile navbar when links are clicked --- src/Client/src/components/NavBar.tsx | 8 +++++++- src/Client/src/components/NavLink.tsx | 4 +++- src/Client/src/pages/WorkPage.tsx | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Client/src/components/NavBar.tsx b/src/Client/src/components/NavBar.tsx index b31b964..749b737 100644 --- a/src/Client/src/components/NavBar.tsx +++ b/src/Client/src/components/NavBar.tsx @@ -45,7 +45,11 @@ export default function NavBar() {
    - + setMobileMenuOpen(false)} + > Beau Findlay Logo @@ -64,12 +68,14 @@ export default function NavBar() { setMobileMenuOpen(false)} > Work setMobileMenuOpen(false)} > This App diff --git a/src/Client/src/components/NavLink.tsx b/src/Client/src/components/NavLink.tsx index ae04782..5a7acdd 100644 --- a/src/Client/src/components/NavLink.tsx +++ b/src/Client/src/components/NavLink.tsx @@ -4,15 +4,17 @@ interface Props { children: string; to: string; className?: string | null; + onClick?: () => void; } -export default function NavLink({ children, to, className }: Props) { +export default function NavLink({ children, to, className, onClick }: Props) { const defaultStyles = "text-base font-semibold leading-6 hover:text-gray-300"; const styles = className ? className : defaultStyles; return ( isActive ? `${styles} underline underline-offset-4` : styles } diff --git a/src/Client/src/pages/WorkPage.tsx b/src/Client/src/pages/WorkPage.tsx index ab65dbc..b5e3362 100644 --- a/src/Client/src/pages/WorkPage.tsx +++ b/src/Client/src/pages/WorkPage.tsx @@ -6,7 +6,7 @@ export default function WorkPage() { return ( <> Work -

    +

    Freelance Software Engineer since 2018

    From e213adcddb552b09fdb4825603e0472be91ef510 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 30 Apr 2024 20:59:50 +0100 Subject: [PATCH 33/39] Update github action --- ...b68b6103.yml => azure-static-web-apps.yml} | 91 +++++++++---------- 1 file changed, 45 insertions(+), 46 deletions(-) rename .github/workflows/{azure-static-web-apps-victorious-tree-0b68b6103.yml => azure-static-web-apps.yml} (88%) diff --git a/.github/workflows/azure-static-web-apps-victorious-tree-0b68b6103.yml b/.github/workflows/azure-static-web-apps.yml similarity index 88% rename from .github/workflows/azure-static-web-apps-victorious-tree-0b68b6103.yml rename to .github/workflows/azure-static-web-apps.yml index d547411..1cc6336 100644 --- a/.github/workflows/azure-static-web-apps-victorious-tree-0b68b6103.yml +++ b/.github/workflows/azure-static-web-apps.yml @@ -1,46 +1,45 @@ -name: Azure Static Web Apps CI/CD - -on: - push: - branches: - - main - pull_request: - types: [opened, synchronize, reopened, closed] - branches: - - main - -jobs: - build_and_deploy_job: - if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed') - runs-on: ubuntu-latest - name: Build and Deploy Job - steps: - - uses: actions/checkout@v3 - with: - submodules: true - lfs: false - - name: Build And Deploy - id: builddeploy - uses: Azure/static-web-apps-deploy@v1 - with: - azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_VICTORIOUS_TREE_0B68B6103 }} - repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments) - action: "upload" - ###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### - # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig - app_location: "/BeauFindlay/src/BeauFindlay.Client" # App source code path - api_location: "/BeauFindlay/src/BeauFindlay.Api" # Api source code path - optional - output_location: "wwwroot" # Built app content directory - optional - ###### End of Repository/Build Configurations ###### - - close_pull_request_job: - if: github.event_name == 'pull_request' && github.event.action == 'closed' - runs-on: ubuntu-latest - name: Close Pull Request Job - steps: - - name: Close Pull Request - id: closepullrequest - uses: Azure/static-web-apps-deploy@v1 - with: - azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_VICTORIOUS_TREE_0B68B6103 }} - action: "close" +name: Azure Static Web Apps CI/CD + +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened, closed] + branches: + - main + +jobs: + build_and_deploy_job: + if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed') + runs-on: ubuntu-latest + name: Build and Deploy Job + steps: + - uses: actions/checkout@v3 + with: + submodules: true + lfs: false + - name: Build And Deploy + id: builddeploy + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_VICTORIOUS_TREE_0B68B6103 }} + repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments) + action: "upload" + ###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### + # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig + app_location: "/BeauFindlay/src/Client" # App source code path + output_location: "wwwroot" # Built app content directory - optional + ###### End of Repository/Build Configurations ###### + + close_pull_request_job: + if: github.event_name == 'pull_request' && github.event.action == 'closed' + runs-on: ubuntu-latest + name: Close Pull Request Job + steps: + - name: Close Pull Request + id: closepullrequest + uses: Azure/static-web-apps-deploy@v1 + with: + azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_VICTORIOUS_TREE_0B68B6103 }} + action: "close" From a78b8d969ed7beca7fe1d49c6e2cecb6e49cbcea Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 30 Apr 2024 21:06:16 +0100 Subject: [PATCH 34/39] Add meta tags --- src/Client/index.html | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/Client/index.html b/src/Client/index.html index a11c409..281875f 100644 --- a/src/Client/index.html +++ b/src/Client/index.html @@ -1,10 +1,37 @@ + + + - + + + + + + + Beau Findlay +
    From 05b1b886f92bfdfd6638e696d5bf5772c8bc3201 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 30 Apr 2024 21:10:03 +0100 Subject: [PATCH 35/39] Update github action --- .github/workflows/azure-static-web-apps.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/azure-static-web-apps.yml b/.github/workflows/azure-static-web-apps.yml index 1cc6336..a94bf7b 100644 --- a/.github/workflows/azure-static-web-apps.yml +++ b/.github/workflows/azure-static-web-apps.yml @@ -28,7 +28,7 @@ jobs: action: "upload" ###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig - app_location: "/BeauFindlay/src/Client" # App source code path + app_location: "/src/Client" # App source code path output_location: "wwwroot" # Built app content directory - optional ###### End of Repository/Build Configurations ###### From 97124638e6a6529614a5402f0c5308b17d9ad432 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 30 Apr 2024 21:10:26 +0100 Subject: [PATCH 36/39] Update github action --- .github/workflows/azure-static-web-apps.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/azure-static-web-apps.yml b/.github/workflows/azure-static-web-apps.yml index a94bf7b..3d17724 100644 --- a/.github/workflows/azure-static-web-apps.yml +++ b/.github/workflows/azure-static-web-apps.yml @@ -29,7 +29,7 @@ jobs: ###### Repository/Build Configurations - These values can be configured to match your app requirements. ###### # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig app_location: "/src/Client" # App source code path - output_location: "wwwroot" # Built app content directory - optional + output_location: "dist" # Built app content directory - optional ###### End of Repository/Build Configurations ###### close_pull_request_job: From 425ba4d2034d6ec465b1025cbe6bf5570f3cf306 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 30 Apr 2024 21:16:07 +0100 Subject: [PATCH 37/39] Add static web app config --- src/Client/staticwebapp.config.json | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/Client/staticwebapp.config.json diff --git a/src/Client/staticwebapp.config.json b/src/Client/staticwebapp.config.json new file mode 100644 index 0000000..cf75712 --- /dev/null +++ b/src/Client/staticwebapp.config.json @@ -0,0 +1,9 @@ +{ + "navigationFallback": { + "rewrite": "index.html", + "exclude": ["/static/media/*.{png,jpg,jpeg,gif,bmp}", "/static/css/*"] + }, + "mimeTypes": { + ".json": "text/json" + } +} From 20a9a1023084e5c5f8ebf7314e76d8102b5ceb9c Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 30 Apr 2024 21:19:59 +0100 Subject: [PATCH 38/39] Add robots.txt --- src/Client/robots.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/Client/robots.txt diff --git a/src/Client/robots.txt b/src/Client/robots.txt new file mode 100644 index 0000000..6f27bb6 --- /dev/null +++ b/src/Client/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: \ No newline at end of file From ce8a855c5cf5810606596278e67923c302655853 Mon Sep 17 00:00:00 2001 From: Beau Findlay Date: Tue, 30 Apr 2024 21:30:06 +0100 Subject: [PATCH 39/39] Move robots.txt to public --- src/Client/{ => public}/robots.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/Client/{ => public}/robots.txt (100%) diff --git a/src/Client/robots.txt b/src/Client/public/robots.txt similarity index 100% rename from src/Client/robots.txt rename to src/Client/public/robots.txt