From 699fcdcb66ee1f1ee4a1eabef5062f84d81655e4 Mon Sep 17 00:00:00 2001 From: MarcEricMartel Date: Wed, 15 Nov 2023 09:38:06 -0500 Subject: [PATCH] =?UTF-8?q?=C3=87a=20a=20l'air=20que=20DotNet=20Aspire=20c?= =?UTF-8?q?'est=20ben=20sweet.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BlazorCanvas.sln | 37 ++ .../BlazorCanvas.AppHost.csproj | 19 + BlazorCanvas/BlazorCanvas.AppHost/Program.cs | 8 + .../Properties/launchSettings.json | 16 + .../appsettings.Development.json | 1 - .../BlazorCanvas.AppHost/appsettings.json | 9 + .../BlazorCanvas.Server.csproj} | 8 +- .../BlazorCanvas.Server/Components/App.razor | 20 + .../Components/Data/CanvasCommand.cs | 29 + .../Components}/Data/CanvasService.cs | 39 +- .../Components/Layout/MainLayout.razor | 23 + .../Components/Layout}/MainLayout.razor.css | 42 +- .../Components/Layout/NavMenu.razor | 30 + .../Components/Layout/NavMenu.razor.css | 105 ++++ .../Components}/Pages/Counter.razor | 0 .../Components/Pages/Error.razor | 36 ++ .../Components/Pages/Home.razor} | 16 +- .../Components/Pages/Weather.razor | 63 ++ .../Components/Routes.razor | 6 + .../Components}/_Imports.razor | 8 +- .../Program.cs | 25 +- .../Properties/launchSettings.json | 38 ++ .../appsettings.Development.json | 8 + .../appsettings.json | 0 .../wwwroot/app.css} | 39 +- .../wwwroot}/bootstrap/bootstrap.min.css | 0 .../wwwroot}/bootstrap/bootstrap.min.css.map | 0 .../wwwroot/favicon.png | Bin .../BlazorCanvas.ServiceDefaults.csproj | 24 + .../Extensions.cs | 119 ++++ BlazorCanvas/BlazorCanvas.sln | 25 - BlazorCanvas/BlazorCanvas/App.razor | 12 - .../BlazorCanvas/Data/CanvasCommand.cs | 26 - .../BlazorCanvas/Data/WeatherForecast.cs | 13 - .../Data/WeatherForecastService.cs | 20 - BlazorCanvas/BlazorCanvas/Pages/Error.cshtml | 42 -- .../BlazorCanvas/Pages/Error.cshtml.cs | 27 - .../BlazorCanvas/Pages/FetchData.razor | 47 -- BlazorCanvas/BlazorCanvas/Pages/_Host.cshtml | 43 -- .../Properties/launchSettings.json | 37 -- .../BlazorCanvas/Shared/MainLayout.razor | 19 - .../BlazorCanvas/Shared/NavMenu.razor | 39 -- .../BlazorCanvas/Shared/NavMenu.razor.css | 68 --- .../BlazorCanvas/Shared/SurveyPrompt.razor | 16 - .../wwwroot/css/open-iconic/FONT-LICENSE | 86 --- .../wwwroot/css/open-iconic/ICON-LICENSE | 21 - .../wwwroot/css/open-iconic/README.md | 114 ---- .../font/css/open-iconic-bootstrap.min.css | 1 - .../open-iconic/font/fonts/open-iconic.eot | Bin 28196 -> 0 bytes .../open-iconic/font/fonts/open-iconic.otf | Bin 20996 -> 0 bytes .../open-iconic/font/fonts/open-iconic.svg | 543 ------------------ .../open-iconic/font/fonts/open-iconic.ttf | Bin 28028 -> 0 bytes .../open-iconic/font/fonts/open-iconic.woff | Bin 14984 -> 0 bytes 53 files changed, 697 insertions(+), 1270 deletions(-) create mode 100644 BlazorCanvas.sln create mode 100644 BlazorCanvas/BlazorCanvas.AppHost/BlazorCanvas.AppHost.csproj create mode 100644 BlazorCanvas/BlazorCanvas.AppHost/Program.cs create mode 100644 BlazorCanvas/BlazorCanvas.AppHost/Properties/launchSettings.json rename BlazorCanvas/{BlazorCanvas => BlazorCanvas.AppHost}/appsettings.Development.json (82%) create mode 100644 BlazorCanvas/BlazorCanvas.AppHost/appsettings.json rename BlazorCanvas/{BlazorCanvas/BlazorCanvas.csproj => BlazorCanvas.Server/BlazorCanvas.Server.csproj} (65%) create mode 100644 BlazorCanvas/BlazorCanvas.Server/Components/App.razor create mode 100644 BlazorCanvas/BlazorCanvas.Server/Components/Data/CanvasCommand.cs rename BlazorCanvas/{BlazorCanvas => BlazorCanvas.Server/Components}/Data/CanvasService.cs (82%) create mode 100644 BlazorCanvas/BlazorCanvas.Server/Components/Layout/MainLayout.razor rename BlazorCanvas/{BlazorCanvas/Shared => BlazorCanvas.Server/Components/Layout}/MainLayout.razor.css (56%) create mode 100644 BlazorCanvas/BlazorCanvas.Server/Components/Layout/NavMenu.razor create mode 100644 BlazorCanvas/BlazorCanvas.Server/Components/Layout/NavMenu.razor.css rename BlazorCanvas/{BlazorCanvas => BlazorCanvas.Server/Components}/Pages/Counter.razor (100%) create mode 100644 BlazorCanvas/BlazorCanvas.Server/Components/Pages/Error.razor rename BlazorCanvas/{BlazorCanvas/Pages/Index.razor => BlazorCanvas.Server/Components/Pages/Home.razor} (80%) create mode 100644 BlazorCanvas/BlazorCanvas.Server/Components/Pages/Weather.razor create mode 100644 BlazorCanvas/BlazorCanvas.Server/Components/Routes.razor rename BlazorCanvas/{BlazorCanvas => BlazorCanvas.Server/Components}/_Imports.razor (61%) rename BlazorCanvas/{BlazorCanvas => BlazorCanvas.Server}/Program.cs (52%) create mode 100644 BlazorCanvas/BlazorCanvas.Server/Properties/launchSettings.json create mode 100644 BlazorCanvas/BlazorCanvas.Server/appsettings.Development.json rename BlazorCanvas/{BlazorCanvas => BlazorCanvas.Server}/appsettings.json (100%) rename BlazorCanvas/{BlazorCanvas/wwwroot/css/site.css => BlazorCanvas.Server/wwwroot/app.css} (82%) rename BlazorCanvas/{BlazorCanvas/wwwroot/css => BlazorCanvas.Server/wwwroot}/bootstrap/bootstrap.min.css (100%) rename BlazorCanvas/{BlazorCanvas/wwwroot/css => BlazorCanvas.Server/wwwroot}/bootstrap/bootstrap.min.css.map (100%) rename BlazorCanvas/{BlazorCanvas => BlazorCanvas.Server}/wwwroot/favicon.png (100%) create mode 100644 BlazorCanvas/BlazorCanvas.ServiceDefaults/BlazorCanvas.ServiceDefaults.csproj create mode 100644 BlazorCanvas/BlazorCanvas.ServiceDefaults/Extensions.cs delete mode 100644 BlazorCanvas/BlazorCanvas.sln delete mode 100644 BlazorCanvas/BlazorCanvas/App.razor delete mode 100644 BlazorCanvas/BlazorCanvas/Data/CanvasCommand.cs delete mode 100644 BlazorCanvas/BlazorCanvas/Data/WeatherForecast.cs delete mode 100644 BlazorCanvas/BlazorCanvas/Data/WeatherForecastService.cs delete mode 100644 BlazorCanvas/BlazorCanvas/Pages/Error.cshtml delete mode 100644 BlazorCanvas/BlazorCanvas/Pages/Error.cshtml.cs delete mode 100644 BlazorCanvas/BlazorCanvas/Pages/FetchData.razor delete mode 100644 BlazorCanvas/BlazorCanvas/Pages/_Host.cshtml delete mode 100644 BlazorCanvas/BlazorCanvas/Properties/launchSettings.json delete mode 100644 BlazorCanvas/BlazorCanvas/Shared/MainLayout.razor delete mode 100644 BlazorCanvas/BlazorCanvas/Shared/NavMenu.razor delete mode 100644 BlazorCanvas/BlazorCanvas/Shared/NavMenu.razor.css delete mode 100644 BlazorCanvas/BlazorCanvas/Shared/SurveyPrompt.razor delete mode 100644 BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/FONT-LICENSE delete mode 100644 BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/ICON-LICENSE delete mode 100644 BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/README.md delete mode 100644 BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css delete mode 100644 BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.eot delete mode 100644 BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.otf delete mode 100644 BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.svg delete mode 100644 BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf delete mode 100644 BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.woff diff --git a/BlazorCanvas.sln b/BlazorCanvas.sln new file mode 100644 index 0000000..570d3d6 --- /dev/null +++ b/BlazorCanvas.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34221.43 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorCanvas.AppHost", "BlazorCanvas\BlazorCanvas.AppHost\BlazorCanvas.AppHost.csproj", "{599AD69B-CEF0-434A-8665-7A03AC7399AB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorCanvas.ServiceDefaults", "BlazorCanvas\BlazorCanvas.ServiceDefaults\BlazorCanvas.ServiceDefaults.csproj", "{4D1014ED-0AC7-460C-B479-9DC47AD996D3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorCanvas.Server", "BlazorCanvas\BlazorCanvas.Server\BlazorCanvas.Server.csproj", "{F86B4EEB-BC95-457F-8B77-9BD4D69A057C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {599AD69B-CEF0-434A-8665-7A03AC7399AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {599AD69B-CEF0-434A-8665-7A03AC7399AB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {599AD69B-CEF0-434A-8665-7A03AC7399AB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {599AD69B-CEF0-434A-8665-7A03AC7399AB}.Release|Any CPU.Build.0 = Release|Any CPU + {4D1014ED-0AC7-460C-B479-9DC47AD996D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D1014ED-0AC7-460C-B479-9DC47AD996D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D1014ED-0AC7-460C-B479-9DC47AD996D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D1014ED-0AC7-460C-B479-9DC47AD996D3}.Release|Any CPU.Build.0 = Release|Any CPU + {F86B4EEB-BC95-457F-8B77-9BD4D69A057C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F86B4EEB-BC95-457F-8B77-9BD4D69A057C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F86B4EEB-BC95-457F-8B77-9BD4D69A057C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F86B4EEB-BC95-457F-8B77-9BD4D69A057C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0026AFBE-0ED7-482C-B657-2B2610E82BD5} + EndGlobalSection +EndGlobal diff --git a/BlazorCanvas/BlazorCanvas.AppHost/BlazorCanvas.AppHost.csproj b/BlazorCanvas/BlazorCanvas.AppHost/BlazorCanvas.AppHost.csproj new file mode 100644 index 0000000..142ba26 --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.AppHost/BlazorCanvas.AppHost.csproj @@ -0,0 +1,19 @@ + + + + Exe + net8.0 + enable + enable + true + + + + + + + + + + + diff --git a/BlazorCanvas/BlazorCanvas.AppHost/Program.cs b/BlazorCanvas/BlazorCanvas.AppHost/Program.cs new file mode 100644 index 0000000..238c73c --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.AppHost/Program.cs @@ -0,0 +1,8 @@ +var builder = DistributedApplication.CreateBuilder(args); + +var cache = builder.AddRedisContainer("cache"); + +builder.AddProject("canvasServer") + .WithReference(cache); + +builder.Build().Run(); diff --git a/BlazorCanvas/BlazorCanvas.AppHost/Properties/launchSettings.json b/BlazorCanvas/BlazorCanvas.AppHost/Properties/launchSettings.json new file mode 100644 index 0000000..32cc58f --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.AppHost/Properties/launchSettings.json @@ -0,0 +1,16 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:15071", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:16047" + } + } + } +} diff --git a/BlazorCanvas/BlazorCanvas/appsettings.Development.json b/BlazorCanvas/BlazorCanvas.AppHost/appsettings.Development.json similarity index 82% rename from BlazorCanvas/BlazorCanvas/appsettings.Development.json rename to BlazorCanvas/BlazorCanvas.AppHost/appsettings.Development.json index 770d3e9..0c208ae 100644 --- a/BlazorCanvas/BlazorCanvas/appsettings.Development.json +++ b/BlazorCanvas/BlazorCanvas.AppHost/appsettings.Development.json @@ -1,5 +1,4 @@ { - "DetailedErrors": true, "Logging": { "LogLevel": { "Default": "Information", diff --git a/BlazorCanvas/BlazorCanvas.AppHost/appsettings.json b/BlazorCanvas/BlazorCanvas.AppHost/appsettings.json new file mode 100644 index 0000000..31c092a --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.AppHost/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "Aspire.Hosting.Dcp": "Warning" + } + } +} diff --git a/BlazorCanvas/BlazorCanvas/BlazorCanvas.csproj b/BlazorCanvas/BlazorCanvas.Server/BlazorCanvas.Server.csproj similarity index 65% rename from BlazorCanvas/BlazorCanvas/BlazorCanvas.csproj rename to BlazorCanvas/BlazorCanvas.Server/BlazorCanvas.Server.csproj index c4bac90..5a72f6b 100644 --- a/BlazorCanvas/BlazorCanvas/BlazorCanvas.csproj +++ b/BlazorCanvas/BlazorCanvas.Server/BlazorCanvas.Server.csproj @@ -1,15 +1,19 @@ - net7.0 + net8.0 enable enable - + + + + + diff --git a/BlazorCanvas/BlazorCanvas.Server/Components/App.razor b/BlazorCanvas/BlazorCanvas.Server/Components/App.razor new file mode 100644 index 0000000..6afe4ba --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.Server/Components/App.razor @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/BlazorCanvas/BlazorCanvas.Server/Components/Data/CanvasCommand.cs b/BlazorCanvas/BlazorCanvas.Server/Components/Data/CanvasCommand.cs new file mode 100644 index 0000000..9428969 --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.Server/Components/Data/CanvasCommand.cs @@ -0,0 +1,29 @@ +namespace BlazorCanvas.Server.Components.Data; + +public class CanvasCommand +{ + public double X { get; set; } + public double Y { get; set; } + public string Color { get; set; } = "Black"; + public int PointSize { get; set; } + public CanvasCommand() { } + public CanvasCommand(CanvasCommand command) + { + X = command.X; + Y = command.Y; + Color = command.Color; + PointSize = command.PointSize; + } + + public bool Equals(CanvasCommand obj) + { + if (obj == null) + return false; + if (X == obj.X & + Y == obj.Y & + Color == obj.Color & + PointSize == obj.PointSize) + return true; + return false; + } +} diff --git a/BlazorCanvas/BlazorCanvas/Data/CanvasService.cs b/BlazorCanvas/BlazorCanvas.Server/Components/Data/CanvasService.cs similarity index 82% rename from BlazorCanvas/BlazorCanvas/Data/CanvasService.cs rename to BlazorCanvas/BlazorCanvas.Server/Components/Data/CanvasService.cs index 10e1ce3..939629c 100644 --- a/BlazorCanvas/BlazorCanvas/Data/CanvasService.cs +++ b/BlazorCanvas/BlazorCanvas.Server/Components/Data/CanvasService.cs @@ -9,16 +9,18 @@ using System.Drawing; using System.Threading; using Microsoft.AspNetCore.Mvc.ApplicationModels; -namespace BlazorCanvas.Data; +namespace BlazorCanvas.Server.Components.Data; // https://www.codeproject.com/Articles/5269947/Drawing-with-the-HTML-Canvas-Element-in-Blazor-Ser -public class CanvasService { +public class CanvasService +{ private Canvas2DContext? _currentCanvasContext; private IJSRuntime _jsRuntime; private CanvasCommand _lastCommand = new(); - public CanvasService(IJSRuntime jsRuntime) { + public CanvasService(IJSRuntime jsRuntime) + { _jsRuntime = jsRuntime; } @@ -30,21 +32,26 @@ public class CanvasService { // TODO: Dessiner à partir des commandes de Franz. - public async void Draw(IEnumerable lscommand) { - if (_currentCanvasContext is null) { + public async void Draw(IEnumerable lscommand) + { + if (_currentCanvasContext is null) + { _currentCanvasContext = await myCanvas.CreateCanvas2DAsync(); await _currentCanvasContext.ClearRectAsync(0, 0, 1920, 1080); } await _currentCanvasContext.BeginBatchAsync(); - foreach (CanvasCommand command in lscommand) { + foreach (CanvasCommand command in lscommand) + { await _currentCanvasContext.SetFillStyleAsync(command.Color); await _currentCanvasContext.FillRectAsync(command.X, command.Y, command.PointSize, command.PointSize); } await _currentCanvasContext.EndBatchAsync(); } - public async void Draw(CanvasCommand command) { - if (_currentCanvasContext is null) { + public async void Draw(CanvasCommand command) + { + if (_currentCanvasContext is null) + { _currentCanvasContext = await myCanvas.CreateCanvas2DAsync(); await _currentCanvasContext.ClearRectAsync(0, 0, 1920, 1080); } @@ -52,28 +59,32 @@ public class CanvasService { await _currentCanvasContext.FillRectAsync(command.X, command.Y, command.PointSize, command.PointSize); } - public async void HandleMouse(MouseEventArgs eventArgs) { + public async void HandleMouse(MouseEventArgs eventArgs) + { double mouseX = 0, mouseY = 0; - + if (eventArgs.Buttons == 0 || eventArgs.Buttons > 2) return; // Rien faire si aucun bouton est appuyé ou si les deux boutons/ d'autres boutons sont appuyés. - if (divCanvas.Id?.Length > 0) { + if (divCanvas.Id?.Length > 0) + { string data = await _jsRuntime.InvokeAsync("getDivCanvasOffsets", new object[] { divCanvas }); string color = "White"; CanvasCommand command = new(); JObject? offsets = (JObject?)JsonConvert.DeserializeObject(data); - if (offsets is not null && offsets.HasValues) { // Translation entre le canvas et la souris. + if (offsets is not null && offsets.HasValues) + { // Translation entre le canvas et la souris. mouseX = eventArgs.PageX - offsets.Value("offsetLeft"); mouseY = eventArgs.PageY - offsets.Value("offsetTop"); } if (eventArgs.Buttons == 1) // Couleur si bouton gauche, blanc si bouton droit color = currentColor; - - if (snap) { // Magnétisme boboche. + + if (snap) + { // Magnétisme boboche. mouseX -= mouseX % pointSize; mouseY -= mouseY % pointSize; } diff --git a/BlazorCanvas/BlazorCanvas.Server/Components/Layout/MainLayout.razor b/BlazorCanvas/BlazorCanvas.Server/Components/Layout/MainLayout.razor new file mode 100644 index 0000000..7ce1c14 --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.Server/Components/Layout/MainLayout.razor @@ -0,0 +1,23 @@ +@inherits LayoutComponentBase + +
+@* *@ + +
+@*
+ About +
*@ + +
+ @Body +
+
+
+ +@*
+ An unhandled error has occurred. + Reload + 🗙 +
*@ diff --git a/BlazorCanvas/BlazorCanvas/Shared/MainLayout.razor.css b/BlazorCanvas/BlazorCanvas.Server/Components/Layout/MainLayout.razor.css similarity index 56% rename from BlazorCanvas/BlazorCanvas/Shared/MainLayout.razor.css rename to BlazorCanvas/BlazorCanvas.Server/Components/Layout/MainLayout.razor.css index 551e4b2..038baf1 100644 --- a/BlazorCanvas/BlazorCanvas/Shared/MainLayout.razor.css +++ b/BlazorCanvas/BlazorCanvas.Server/Components/Layout/MainLayout.razor.css @@ -21,26 +21,27 @@ main { align-items: center; } - .top-row ::deep a, .top-row .btn-link { + .top-row ::deep a, .top-row ::deep .btn-link { white-space: nowrap; margin-left: 1.5rem; + text-decoration: none; } - .top-row a:first-child { + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { overflow: hidden; text-overflow: ellipsis; } @media (max-width: 640.98px) { - .top-row:not(.auth) { - display: none; - } - - .top-row.auth { + .top-row { justify-content: space-between; } - .top-row a, .top-row .btn-link { + .top-row ::deep a, .top-row ::deep .btn-link { margin-left: 0; } } @@ -63,8 +64,33 @@ main { z-index: 1; } + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + .top-row, article { padding-left: 2rem !important; padding-right: 1.5rem !important; } } + +#blazor-error-ui { + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } diff --git a/BlazorCanvas/BlazorCanvas.Server/Components/Layout/NavMenu.razor b/BlazorCanvas/BlazorCanvas.Server/Components/Layout/NavMenu.razor new file mode 100644 index 0000000..8c63c29 --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.Server/Components/Layout/NavMenu.razor @@ -0,0 +1,30 @@ + + + + + + diff --git a/BlazorCanvas/BlazorCanvas.Server/Components/Layout/NavMenu.razor.css b/BlazorCanvas/BlazorCanvas.Server/Components/Layout/NavMenu.razor.css new file mode 100644 index 0000000..4e15395 --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.Server/Components/Layout/NavMenu.razor.css @@ -0,0 +1,105 @@ +.navbar-toggler { + appearance: none; + cursor: pointer; + width: 3.5rem; + height: 2.5rem; + color: white; + position: absolute; + top: 0.5rem; + right: 1rem; + border: 1px solid rgba(255, 255, 255, 0.1); + background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1); +} + +.navbar-toggler:checked { + background-color: rgba(255, 255, 255, 0.5); +} + +.top-row { + height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep .nav-link { + color: #d7d7d7; + background: none; + border: none; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + width: 100%; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep .nav-link:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +.nav-scrollable { + display: none; +} + +.navbar-toggler:checked ~ .nav-scrollable { + display: block; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .nav-scrollable { + /* Never collapse the sidebar for wide screens */ + display: block; + + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/BlazorCanvas/BlazorCanvas/Pages/Counter.razor b/BlazorCanvas/BlazorCanvas.Server/Components/Pages/Counter.razor similarity index 100% rename from BlazorCanvas/BlazorCanvas/Pages/Counter.razor rename to BlazorCanvas/BlazorCanvas.Server/Components/Pages/Counter.razor diff --git a/BlazorCanvas/BlazorCanvas.Server/Components/Pages/Error.razor b/BlazorCanvas/BlazorCanvas.Server/Components/Pages/Error.razor new file mode 100644 index 0000000..576cc2d --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.Server/Components/Pages/Error.razor @@ -0,0 +1,36 @@ +@page "/Error" +@using System.Diagnostics + +Error + +

Error.

+

An error occurred while processing your request.

+ +@if (ShowRequestId) +{ +

+ Request ID: @RequestId +

+} + +

Development Mode

+

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

+

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

+ +@code{ + [CascadingParameter] + private HttpContext? HttpContext { get; set; } + + private string? RequestId { get; set; } + private bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + protected override void OnInitialized() => + RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier; +} diff --git a/BlazorCanvas/BlazorCanvas/Pages/Index.razor b/BlazorCanvas/BlazorCanvas.Server/Components/Pages/Home.razor similarity index 80% rename from BlazorCanvas/BlazorCanvas/Pages/Index.razor rename to BlazorCanvas/BlazorCanvas.Server/Components/Pages/Home.razor index 74b820b..3662534 100644 --- a/BlazorCanvas/BlazorCanvas/Pages/Index.razor +++ b/BlazorCanvas/BlazorCanvas.Server/Components/Pages/Home.razor @@ -3,7 +3,7 @@ @using Blazor.Extensions.Canvas @using Blazor.Extensions.Canvas.Canvas2D @using Blazor.Extensions.Canvas.WebGL -@using BlazorCanvas.Data +@using BlazorCanvas.Server.Components.Data @using Newtonsoft.Json @using Newtonsoft.Json.Linq @inject CanvasService canvasService @@ -36,11 +36,21 @@ - +
© Cowboy Kim 2023 -
\ No newline at end of file + + + + \ No newline at end of file diff --git a/BlazorCanvas/BlazorCanvas.Server/Components/Pages/Weather.razor b/BlazorCanvas/BlazorCanvas.Server/Components/Pages/Weather.razor new file mode 100644 index 0000000..8eca4cc --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.Server/Components/Pages/Weather.razor @@ -0,0 +1,63 @@ +@page "/weather" + +Weather + +

Weather

+ +

This component demonstrates showing data.

+ +@if (forecasts == null) +{ +

Loading...

+} +else +{ + + + + + + + + + + + @foreach (var forecast in forecasts) + { + + + + + + + } + +
DateTemp. (C)Temp. (F)Summary
@forecast.Date.ToShortDateString()@forecast.TemperatureC@forecast.TemperatureF@forecast.Summary
+} + +@code { + private WeatherForecast[]? forecasts; + + protected override async Task OnInitializedAsync() + { + // Simulate asynchronous loading to demonstrate a loading indicator + await Task.Delay(500); + + var startDate = DateOnly.FromDateTime(DateTime.Now); + var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; + forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = startDate.AddDays(index), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = summaries[Random.Shared.Next(summaries.Length)] + }).ToArray(); + } + + private class WeatherForecast + { + public DateOnly Date { get; set; } + public int TemperatureC { get; set; } + public string? Summary { get; set; } + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + } +} diff --git a/BlazorCanvas/BlazorCanvas.Server/Components/Routes.razor b/BlazorCanvas/BlazorCanvas.Server/Components/Routes.razor new file mode 100644 index 0000000..d0df781 --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.Server/Components/Routes.razor @@ -0,0 +1,6 @@ + + + + + + diff --git a/BlazorCanvas/BlazorCanvas/_Imports.razor b/BlazorCanvas/BlazorCanvas.Server/Components/_Imports.razor similarity index 61% rename from BlazorCanvas/BlazorCanvas/_Imports.razor rename to BlazorCanvas/BlazorCanvas.Server/Components/_Imports.razor index 579b18a..c1bb972 100644 --- a/BlazorCanvas/BlazorCanvas/_Imports.razor +++ b/BlazorCanvas/BlazorCanvas.Server/Components/_Imports.razor @@ -1,10 +1,10 @@ @using System.Net.Http -@using Microsoft.AspNetCore.Authorization -@using Microsoft.AspNetCore.Components.Authorization +@using System.Net.Http.Json @using Microsoft.AspNetCore.Components.Forms @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web +@using static Microsoft.AspNetCore.Components.Web.RenderMode @using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.JSInterop -@using BlazorCanvas -@using BlazorCanvas.Shared +@using BlazorCanvas.Server +@using BlazorCanvas.Server.Components diff --git a/BlazorCanvas/BlazorCanvas/Program.cs b/BlazorCanvas/BlazorCanvas.Server/Program.cs similarity index 52% rename from BlazorCanvas/BlazorCanvas/Program.cs rename to BlazorCanvas/BlazorCanvas.Server/Program.cs index 4d2f05c..103fd8c 100644 --- a/BlazorCanvas/BlazorCanvas/Program.cs +++ b/BlazorCanvas/BlazorCanvas.Server/Program.cs @@ -1,21 +1,25 @@ -using BlazorCanvas.Data; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Web; +using BlazorCanvas.Server.Components; +using BlazorCanvas.Server.Components.Data; +using Microsoft.Extensions.Hosting; var builder = WebApplication.CreateBuilder(args); +builder.AddServiceDefaults(); + // Add services to the container. -builder.Services.AddRazorPages(); -builder.Services.AddServerSideBlazor(); +builder.Services.AddRazorComponents() + .AddInteractiveServerComponents(); + builder.Services.AddScoped(); -builder.Services.AddSingleton(); var app = builder.Build(); +app.MapDefaultEndpoints(); + // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { - app.UseExceptionHandler("/Error"); + app.UseExceptionHandler("/Error", createScopeForErrors: true); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } @@ -23,10 +27,9 @@ if (!app.Environment.IsDevelopment()) app.UseHttpsRedirection(); app.UseStaticFiles(); +app.UseAntiforgery(); -app.UseRouting(); - -app.MapBlazorHub(); -app.MapFallbackToPage("/_Host"); +app.MapRazorComponents() + .AddInteractiveServerRenderMode(); app.Run(); diff --git a/BlazorCanvas/BlazorCanvas.Server/Properties/launchSettings.json b/BlazorCanvas/BlazorCanvas.Server/Properties/launchSettings.json new file mode 100644 index 0000000..e907cb7 --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.Server/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:47589", + "sslPort": 44363 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5276", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7257;http://localhost:5276", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } + } diff --git a/BlazorCanvas/BlazorCanvas.Server/appsettings.Development.json b/BlazorCanvas/BlazorCanvas.Server/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.Server/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/BlazorCanvas/BlazorCanvas/appsettings.json b/BlazorCanvas/BlazorCanvas.Server/appsettings.json similarity index 100% rename from BlazorCanvas/BlazorCanvas/appsettings.json rename to BlazorCanvas/BlazorCanvas.Server/appsettings.json diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/site.css b/BlazorCanvas/BlazorCanvas.Server/wwwroot/app.css similarity index 82% rename from BlazorCanvas/BlazorCanvas/wwwroot/css/site.css rename to BlazorCanvas/BlazorCanvas.Server/wwwroot/app.css index 96b0583..2bd9b78 100644 --- a/BlazorCanvas/BlazorCanvas/wwwroot/css/site.css +++ b/BlazorCanvas/BlazorCanvas.Server/wwwroot/app.css @@ -1,15 +1,9 @@ -@import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); - html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; } -h1:focus { - outline: none; -} - a, .btn-link { - color: #0071c1; + color: #006bb7; } .btn-primary { @@ -26,37 +20,22 @@ a, .btn-link { padding-top: 1.1rem; } +h1:focus { + outline: none; +} + .valid.modified:not([type=checkbox]) { outline: 1px solid #26b050; } .invalid { - outline: 1px solid red; + outline: 1px solid #e50000; } .validation-message { - color: red; + color: #e50000; } -#blazor-error-ui { - background: lightyellow; - bottom: 0; - box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); - display: none; - left: 0; - padding: 0.6rem 1.25rem 0.7rem 1.25rem; - position: fixed; - width: 100%; - z-index: 1000; -} - - #blazor-error-ui .dismiss { - cursor: pointer; - position: absolute; - right: 0.75rem; - top: 0.5rem; - } - .blazor-error-boundary { background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; padding: 1rem 1rem 1rem 3.7rem; @@ -66,3 +45,7 @@ a, .btn-link { .blazor-error-boundary::after { content: "An error has occurred." } + +.darker-border-checkbox.form-check-input { + border-color: #929292; +} diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/bootstrap/bootstrap.min.css b/BlazorCanvas/BlazorCanvas.Server/wwwroot/bootstrap/bootstrap.min.css similarity index 100% rename from BlazorCanvas/BlazorCanvas/wwwroot/css/bootstrap/bootstrap.min.css rename to BlazorCanvas/BlazorCanvas.Server/wwwroot/bootstrap/bootstrap.min.css diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/bootstrap/bootstrap.min.css.map b/BlazorCanvas/BlazorCanvas.Server/wwwroot/bootstrap/bootstrap.min.css.map similarity index 100% rename from BlazorCanvas/BlazorCanvas/wwwroot/css/bootstrap/bootstrap.min.css.map rename to BlazorCanvas/BlazorCanvas.Server/wwwroot/bootstrap/bootstrap.min.css.map diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/favicon.png b/BlazorCanvas/BlazorCanvas.Server/wwwroot/favicon.png similarity index 100% rename from BlazorCanvas/BlazorCanvas/wwwroot/favicon.png rename to BlazorCanvas/BlazorCanvas.Server/wwwroot/favicon.png diff --git a/BlazorCanvas/BlazorCanvas.ServiceDefaults/BlazorCanvas.ServiceDefaults.csproj b/BlazorCanvas/BlazorCanvas.ServiceDefaults/BlazorCanvas.ServiceDefaults.csproj new file mode 100644 index 0000000..00e0d1f --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.ServiceDefaults/BlazorCanvas.ServiceDefaults.csproj @@ -0,0 +1,24 @@ + + + + Library + net8.0 + enable + enable + true + + + + + + + + + + + + + + + + diff --git a/BlazorCanvas/BlazorCanvas.ServiceDefaults/Extensions.cs b/BlazorCanvas/BlazorCanvas.ServiceDefaults/Extensions.cs new file mode 100644 index 0000000..c59308d --- /dev/null +++ b/BlazorCanvas/BlazorCanvas.ServiceDefaults/Extensions.cs @@ -0,0 +1,119 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Logging; +using OpenTelemetry.Logs; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; + +namespace Microsoft.Extensions.Hosting; + +public static class Extensions +{ + public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBuilder builder) + { + builder.ConfigureOpenTelemetry(); + + builder.AddDefaultHealthChecks(); + + builder.Services.AddServiceDiscovery(); + + builder.Services.ConfigureHttpClientDefaults(http => + { + // Turn on resilience by default + http.AddStandardResilienceHandler(); + + // Turn on service discovery by default + http.UseServiceDiscovery(); + }); + + return builder; + } + + public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicationBuilder builder) + { + builder.Logging.AddOpenTelemetry(logging => + { + logging.IncludeFormattedMessage = true; + logging.IncludeScopes = true; + }); + + builder.Services.AddOpenTelemetry() + .WithMetrics(metrics => + { + metrics.AddRuntimeInstrumentation() + .AddBuiltInMeters(); + }) + .WithTracing(tracing => + { + if (builder.Environment.IsDevelopment()) + { + // We want to view all traces in development + tracing.SetSampler(new AlwaysOnSampler()); + } + + tracing.AddAspNetCoreInstrumentation() + .AddGrpcClientInstrumentation() + .AddHttpClientInstrumentation(); + }); + + builder.AddOpenTelemetryExporters(); + + return builder; + } + + private static IHostApplicationBuilder AddOpenTelemetryExporters(this IHostApplicationBuilder builder) + { + var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); + + if (useOtlpExporter) + { + builder.Services.Configure(logging => logging.AddOtlpExporter()); + builder.Services.ConfigureOpenTelemetryMeterProvider(metrics => metrics.AddOtlpExporter()); + builder.Services.ConfigureOpenTelemetryTracerProvider(tracing => tracing.AddOtlpExporter()); + } + + // Uncomment the following lines to enable the Prometheus exporter (requires the OpenTelemetry.Exporter.Prometheus.AspNetCore package) + // builder.Services.AddOpenTelemetry() + // .WithMetrics(metrics => metrics.AddPrometheusExporter()); + + // Uncomment the following lines to enable the Azure Monitor exporter (requires the Azure.Monitor.OpenTelemetry.Exporter package) + // builder.Services.AddOpenTelemetry() + // .UseAzureMonitor(); + + return builder; + } + + public static IHostApplicationBuilder AddDefaultHealthChecks(this IHostApplicationBuilder builder) + { + builder.Services.AddHealthChecks() + // Add a default liveness check to ensure app is responsive + .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]); + + return builder; + } + + public static WebApplication MapDefaultEndpoints(this WebApplication app) + { + // Uncomment the following line to enable the Prometheus endpoint (requires the OpenTelemetry.Exporter.Prometheus.AspNetCore package) + // app.MapPrometheusScrapingEndpoint(); + + // All health checks must pass for app to be considered ready to accept traffic after starting + app.MapHealthChecks("/health"); + + // Only health checks tagged with the "live" tag must pass for app to be considered alive + app.MapHealthChecks("/alive", new HealthCheckOptions + { + Predicate = r => r.Tags.Contains("live") + }); + + return app; + } + + private static MeterProviderBuilder AddBuiltInMeters(this MeterProviderBuilder meterProviderBuilder) => + meterProviderBuilder.AddMeter( + "Microsoft.AspNetCore.Hosting", + "Microsoft.AspNetCore.Server.Kestrel", + "System.Net.Http"); +} diff --git a/BlazorCanvas/BlazorCanvas.sln b/BlazorCanvas/BlazorCanvas.sln deleted file mode 100644 index 76df03c..0000000 --- a/BlazorCanvas/BlazorCanvas.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.7.34221.43 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorCanvas", "BlazorCanvas\BlazorCanvas.csproj", "{34F516BD-DF07-4783-9C8C-87194F4CF167}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {34F516BD-DF07-4783-9C8C-87194F4CF167}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {34F516BD-DF07-4783-9C8C-87194F4CF167}.Debug|Any CPU.Build.0 = Debug|Any CPU - {34F516BD-DF07-4783-9C8C-87194F4CF167}.Release|Any CPU.ActiveCfg = Release|Any CPU - {34F516BD-DF07-4783-9C8C-87194F4CF167}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {0026AFBE-0ED7-482C-B657-2B2610E82BD5} - EndGlobalSection -EndGlobal diff --git a/BlazorCanvas/BlazorCanvas/App.razor b/BlazorCanvas/BlazorCanvas/App.razor deleted file mode 100644 index 6fd3ed1..0000000 --- a/BlazorCanvas/BlazorCanvas/App.razor +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - Not found - -

Sorry, there's nothing at this address.

-
-
-
diff --git a/BlazorCanvas/BlazorCanvas/Data/CanvasCommand.cs b/BlazorCanvas/BlazorCanvas/Data/CanvasCommand.cs deleted file mode 100644 index 0dcf53c..0000000 --- a/BlazorCanvas/BlazorCanvas/Data/CanvasCommand.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace BlazorCanvas.Data; - -public class CanvasCommand { - public double X { get; set; } - public double Y { get; set; } - public string Color { get; set; } = "Black"; - public int PointSize { get; set; } - public CanvasCommand() { } - public CanvasCommand(CanvasCommand command) { - this.X = command.X; - this.Y = command.Y; - this.Color = command.Color; - this.PointSize = command.PointSize; - } - - public bool Equals(CanvasCommand obj) { - if (obj == null) - return false; - if (this.X == obj.X & - this.Y == obj.Y & - this.Color == obj.Color & - this.PointSize == obj.PointSize) - return true; - return false; - } -} diff --git a/BlazorCanvas/BlazorCanvas/Data/WeatherForecast.cs b/BlazorCanvas/BlazorCanvas/Data/WeatherForecast.cs deleted file mode 100644 index d8938df..0000000 --- a/BlazorCanvas/BlazorCanvas/Data/WeatherForecast.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace BlazorCanvas.Data -{ - public class WeatherForecast - { - public DateOnly Date { get; set; } - - public int TemperatureC { get; set; } - - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); - - public string? Summary { get; set; } - } -} \ No newline at end of file diff --git a/BlazorCanvas/BlazorCanvas/Data/WeatherForecastService.cs b/BlazorCanvas/BlazorCanvas/Data/WeatherForecastService.cs deleted file mode 100644 index 47a3f37..0000000 --- a/BlazorCanvas/BlazorCanvas/Data/WeatherForecastService.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace BlazorCanvas.Data -{ - public class WeatherForecastService - { - private static readonly string[] Summaries = new[] - { - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" - }; - - public Task GetForecastAsync(DateOnly startDate) - { - return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast - { - Date = startDate.AddDays(index), - TemperatureC = Random.Shared.Next(-20, 55), - Summary = Summaries[Random.Shared.Next(Summaries.Length)] - }).ToArray()); - } - } -} \ No newline at end of file diff --git a/BlazorCanvas/BlazorCanvas/Pages/Error.cshtml b/BlazorCanvas/BlazorCanvas/Pages/Error.cshtml deleted file mode 100644 index 74de9f4..0000000 --- a/BlazorCanvas/BlazorCanvas/Pages/Error.cshtml +++ /dev/null @@ -1,42 +0,0 @@ -@page -@model BlazorCanvas.Pages.ErrorModel - - - - - - - - Error - - - - - -
-
-

Error.

-

An error occurred while processing your request.

- - @if (Model.ShowRequestId) - { -

- Request ID: @Model.RequestId -

- } - -

Development Mode

-

- Swapping to the Development environment displays detailed information about the error that occurred. -

-

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

-
-
- - - diff --git a/BlazorCanvas/BlazorCanvas/Pages/Error.cshtml.cs b/BlazorCanvas/BlazorCanvas/Pages/Error.cshtml.cs deleted file mode 100644 index 7d95297..0000000 --- a/BlazorCanvas/BlazorCanvas/Pages/Error.cshtml.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; -using System.Diagnostics; - -namespace BlazorCanvas.Pages -{ - [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] - [IgnoreAntiforgeryToken] - public class ErrorModel : PageModel - { - public string? RequestId { get; set; } - - public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); - - private readonly ILogger _logger; - - public ErrorModel(ILogger logger) - { - _logger = logger; - } - - public void OnGet() - { - RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; - } - } -} \ No newline at end of file diff --git a/BlazorCanvas/BlazorCanvas/Pages/FetchData.razor b/BlazorCanvas/BlazorCanvas/Pages/FetchData.razor deleted file mode 100644 index 60c65f4..0000000 --- a/BlazorCanvas/BlazorCanvas/Pages/FetchData.razor +++ /dev/null @@ -1,47 +0,0 @@ -@page "/fetchdata" -@using BlazorCanvas.Data -@inject WeatherForecastService ForecastService - -Weather forecast - -

Weather forecast

- -

This component demonstrates fetching data from a service.

- -@if (forecasts == null) -{ -

Loading...

-} -else -{ - - - - - - - - - - - @foreach (var forecast in forecasts) - { - - - - - - - } - -
DateTemp. (C)Temp. (F)Summary
@forecast.Date.ToShortDateString()@forecast.TemperatureC@forecast.TemperatureF@forecast.Summary
-} - -@code { - private WeatherForecast[]? forecasts; - - protected override async Task OnInitializedAsync() - { - forecasts = await ForecastService.GetForecastAsync(DateOnly.FromDateTime(DateTime.Now)); - } -} diff --git a/BlazorCanvas/BlazorCanvas/Pages/_Host.cshtml b/BlazorCanvas/BlazorCanvas/Pages/_Host.cshtml deleted file mode 100644 index f741056..0000000 --- a/BlazorCanvas/BlazorCanvas/Pages/_Host.cshtml +++ /dev/null @@ -1,43 +0,0 @@ -@page "/" -@using Microsoft.AspNetCore.Components.Web -@namespace BlazorCanvas.Pages -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers - - - - - - - - - - - - - - - - -
- - An error has occurred. This application may no longer respond until reloaded. - - - An unhandled exception has occurred. See browser dev tools for details. - - Reload - 🗙 -
- - - - - - diff --git a/BlazorCanvas/BlazorCanvas/Properties/launchSettings.json b/BlazorCanvas/BlazorCanvas/Properties/launchSettings.json deleted file mode 100644 index 42973e9..0000000 --- a/BlazorCanvas/BlazorCanvas/Properties/launchSettings.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:15056", - "sslPort": 44305 - } - }, - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "http://localhost:5144", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "https://localhost:7185;http://localhost:5144", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/BlazorCanvas/BlazorCanvas/Shared/MainLayout.razor b/BlazorCanvas/BlazorCanvas/Shared/MainLayout.razor deleted file mode 100644 index 39cadd3..0000000 --- a/BlazorCanvas/BlazorCanvas/Shared/MainLayout.razor +++ /dev/null @@ -1,19 +0,0 @@ -@inherits LayoutComponentBase - -BlazorCanvas - -
- - -
-
- About -
- -
- @Body -
-
-
diff --git a/BlazorCanvas/BlazorCanvas/Shared/NavMenu.razor b/BlazorCanvas/BlazorCanvas/Shared/NavMenu.razor deleted file mode 100644 index c98cf33..0000000 --- a/BlazorCanvas/BlazorCanvas/Shared/NavMenu.razor +++ /dev/null @@ -1,39 +0,0 @@ - - - - -@code { - private bool collapseNavMenu = true; - - private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; - - private void ToggleNavMenu() - { - collapseNavMenu = !collapseNavMenu; - } -} diff --git a/BlazorCanvas/BlazorCanvas/Shared/NavMenu.razor.css b/BlazorCanvas/BlazorCanvas/Shared/NavMenu.razor.css deleted file mode 100644 index 604b7a1..0000000 --- a/BlazorCanvas/BlazorCanvas/Shared/NavMenu.razor.css +++ /dev/null @@ -1,68 +0,0 @@ -.navbar-toggler { - background-color: rgba(255, 255, 255, 0.1); -} - -.top-row { - height: 3.5rem; - background-color: rgba(0,0,0,0.4); -} - -.navbar-brand { - font-size: 1.1rem; -} - -.oi { - width: 2rem; - font-size: 1.1rem; - vertical-align: text-top; - top: -2px; -} - -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item ::deep a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } - -.nav-item ::deep a.active { - background-color: rgba(255,255,255,0.25); - color: white; -} - -.nav-item ::deep a:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} - -@media (min-width: 641px) { - .navbar-toggler { - display: none; - } - - .collapse { - /* Never collapse the sidebar for wide screens */ - display: block; - } - - .nav-scrollable { - /* Allow sidebar to scroll for tall menus */ - height: calc(100vh - 3.5rem); - overflow-y: auto; - } -} diff --git a/BlazorCanvas/BlazorCanvas/Shared/SurveyPrompt.razor b/BlazorCanvas/BlazorCanvas/Shared/SurveyPrompt.razor deleted file mode 100644 index ec64baa..0000000 --- a/BlazorCanvas/BlazorCanvas/Shared/SurveyPrompt.razor +++ /dev/null @@ -1,16 +0,0 @@ -
- - @Title - - - Please take our - brief survey - - and tell us what you think. -
- -@code { - // Demonstrates how a parent component can supply parameters - [Parameter] - public string? Title { get; set; } -} diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/FONT-LICENSE b/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/FONT-LICENSE deleted file mode 100644 index a1dc03f..0000000 --- a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/FONT-LICENSE +++ /dev/null @@ -1,86 +0,0 @@ -SIL OPEN FONT LICENSE Version 1.1 - -Copyright (c) 2014 Waybury - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/ICON-LICENSE b/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/ICON-LICENSE deleted file mode 100644 index 2199f4a..0000000 --- a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/ICON-LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Waybury - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/README.md b/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/README.md deleted file mode 100644 index e34bd86..0000000 --- a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/README.md +++ /dev/null @@ -1,114 +0,0 @@ -[Open Iconic v1.1.1](https://github.com/iconic/open-iconic) -=========== - -### Open Iconic is the open source sibling of [Iconic](https://github.com/iconic/open-iconic). It is a hyper-legible collection of 223 icons with a tiny footprint—ready to use with Bootstrap and Foundation. [View the collection](https://github.com/iconic/open-iconic) - - - -## What's in Open Iconic? - -* 223 icons designed to be legible down to 8 pixels -* Super-light SVG files - 61.8 for the entire set -* SVG sprite—the modern replacement for icon fonts -* Webfont (EOT, OTF, SVG, TTF, WOFF), PNG and WebP formats -* Webfont stylesheets (including versions for Bootstrap and Foundation) in CSS, LESS, SCSS and Stylus formats -* PNG and WebP raster images in 8px, 16px, 24px, 32px, 48px and 64px. - - -## Getting Started - -#### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](https://github.com/iconic/open-iconic) and [Reference](https://github.com/iconic/open-iconic) sections. - -### General Usage - -#### Using Open Iconic's SVGs - -We like SVGs and we think they're the way to display icons on the web. Since Open Iconic are just basic SVGs, we suggest you display them like you would any other image (don't forget the `alt` attribute). - -``` -icon name -``` - -#### Using Open Iconic's SVG Sprite - -Open Iconic also comes in a SVG sprite which allows you to display all the icons in the set with a single request. It's like an icon font, without being a hack. - -Adding an icon from an SVG sprite is a little different than what you're used to, but it's still a piece of cake. *Tip: To make your icons easily style able, we suggest adding a general class to the* `` *tag and a unique class name for each different icon in the* `` *tag.* - -``` - - - -``` - -Sizing icons only needs basic CSS. All the icons are in a square format, so just set the `` tag with equal width and height dimensions. - -``` -.icon { - width: 16px; - height: 16px; -} -``` - -Coloring icons is even easier. All you need to do is set the `fill` rule on the `` tag. - -``` -.icon-account-login { - fill: #f00; -} -``` - -To learn more about SVG Sprites, read [Chris Coyier's guide](http://css-tricks.com/svg-sprites-use-better-icon-fonts/). - -#### Using Open Iconic's Icon Font... - - -##### …with Bootstrap - -You can find our Bootstrap stylesheets in `font/css/open-iconic-bootstrap.{css, less, scss, styl}` - - -``` - -``` - - -``` - -``` - -##### …with Foundation - -You can find our Foundation stylesheets in `font/css/open-iconic-foundation.{css, less, scss, styl}` - -``` - -``` - - -``` - -``` - -##### …on its own - -You can find our default stylesheets in `font/css/open-iconic.{css, less, scss, styl}` - -``` - -``` - -``` - -``` - - -## License - -### Icons - -All code (including SVG markup) is under the [MIT License](http://opensource.org/licenses/MIT). - -### Fonts - -All fonts are under the [SIL Licensed](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web). diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css b/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css deleted file mode 100644 index 4664f2e..0000000 --- a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Icons;src:url(../fonts/open-iconic.eot);src:url(../fonts/open-iconic.eot?#iconic-sm) format('embedded-opentype'),url(../fonts/open-iconic.woff) format('woff'),url(../fonts/open-iconic.ttf) format('truetype'),url(../fonts/open-iconic.otf) format('opentype'),url(../fonts/open-iconic.svg#iconic-sm) format('svg');font-weight:400;font-style:normal}.oi{position:relative;top:1px;display:inline-block;speak:none;font-family:Icons;font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.oi:empty:before{width:1em;text-align:center;box-sizing:content-box}.oi.oi-align-center:before{text-align:center}.oi.oi-align-left:before{text-align:left}.oi.oi-align-right:before{text-align:right}.oi.oi-flip-horizontal:before{-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.oi.oi-flip-vertical:before{-webkit-transform:scale(1,-1);-ms-transform:scale(-1,1);transform:scale(1,-1)}.oi.oi-flip-horizontal-vertical:before{-webkit-transform:scale(-1,-1);-ms-transform:scale(-1,1);transform:scale(-1,-1)}.oi-account-login:before{content:'\e000'}.oi-account-logout:before{content:'\e001'}.oi-action-redo:before{content:'\e002'}.oi-action-undo:before{content:'\e003'}.oi-align-center:before{content:'\e004'}.oi-align-left:before{content:'\e005'}.oi-align-right:before{content:'\e006'}.oi-aperture:before{content:'\e007'}.oi-arrow-bottom:before{content:'\e008'}.oi-arrow-circle-bottom:before{content:'\e009'}.oi-arrow-circle-left:before{content:'\e00a'}.oi-arrow-circle-right:before{content:'\e00b'}.oi-arrow-circle-top:before{content:'\e00c'}.oi-arrow-left:before{content:'\e00d'}.oi-arrow-right:before{content:'\e00e'}.oi-arrow-thick-bottom:before{content:'\e00f'}.oi-arrow-thick-left:before{content:'\e010'}.oi-arrow-thick-right:before{content:'\e011'}.oi-arrow-thick-top:before{content:'\e012'}.oi-arrow-top:before{content:'\e013'}.oi-audio-spectrum:before{content:'\e014'}.oi-audio:before{content:'\e015'}.oi-badge:before{content:'\e016'}.oi-ban:before{content:'\e017'}.oi-bar-chart:before{content:'\e018'}.oi-basket:before{content:'\e019'}.oi-battery-empty:before{content:'\e01a'}.oi-battery-full:before{content:'\e01b'}.oi-beaker:before{content:'\e01c'}.oi-bell:before{content:'\e01d'}.oi-bluetooth:before{content:'\e01e'}.oi-bold:before{content:'\e01f'}.oi-bolt:before{content:'\e020'}.oi-book:before{content:'\e021'}.oi-bookmark:before{content:'\e022'}.oi-box:before{content:'\e023'}.oi-briefcase:before{content:'\e024'}.oi-british-pound:before{content:'\e025'}.oi-browser:before{content:'\e026'}.oi-brush:before{content:'\e027'}.oi-bug:before{content:'\e028'}.oi-bullhorn:before{content:'\e029'}.oi-calculator:before{content:'\e02a'}.oi-calendar:before{content:'\e02b'}.oi-camera-slr:before{content:'\e02c'}.oi-caret-bottom:before{content:'\e02d'}.oi-caret-left:before{content:'\e02e'}.oi-caret-right:before{content:'\e02f'}.oi-caret-top:before{content:'\e030'}.oi-cart:before{content:'\e031'}.oi-chat:before{content:'\e032'}.oi-check:before{content:'\e033'}.oi-chevron-bottom:before{content:'\e034'}.oi-chevron-left:before{content:'\e035'}.oi-chevron-right:before{content:'\e036'}.oi-chevron-top:before{content:'\e037'}.oi-circle-check:before{content:'\e038'}.oi-circle-x:before{content:'\e039'}.oi-clipboard:before{content:'\e03a'}.oi-clock:before{content:'\e03b'}.oi-cloud-download:before{content:'\e03c'}.oi-cloud-upload:before{content:'\e03d'}.oi-cloud:before{content:'\e03e'}.oi-cloudy:before{content:'\e03f'}.oi-code:before{content:'\e040'}.oi-cog:before{content:'\e041'}.oi-collapse-down:before{content:'\e042'}.oi-collapse-left:before{content:'\e043'}.oi-collapse-right:before{content:'\e044'}.oi-collapse-up:before{content:'\e045'}.oi-command:before{content:'\e046'}.oi-comment-square:before{content:'\e047'}.oi-compass:before{content:'\e048'}.oi-contrast:before{content:'\e049'}.oi-copywriting:before{content:'\e04a'}.oi-credit-card:before{content:'\e04b'}.oi-crop:before{content:'\e04c'}.oi-dashboard:before{content:'\e04d'}.oi-data-transfer-download:before{content:'\e04e'}.oi-data-transfer-upload:before{content:'\e04f'}.oi-delete:before{content:'\e050'}.oi-dial:before{content:'\e051'}.oi-document:before{content:'\e052'}.oi-dollar:before{content:'\e053'}.oi-double-quote-sans-left:before{content:'\e054'}.oi-double-quote-sans-right:before{content:'\e055'}.oi-double-quote-serif-left:before{content:'\e056'}.oi-double-quote-serif-right:before{content:'\e057'}.oi-droplet:before{content:'\e058'}.oi-eject:before{content:'\e059'}.oi-elevator:before{content:'\e05a'}.oi-ellipses:before{content:'\e05b'}.oi-envelope-closed:before{content:'\e05c'}.oi-envelope-open:before{content:'\e05d'}.oi-euro:before{content:'\e05e'}.oi-excerpt:before{content:'\e05f'}.oi-expand-down:before{content:'\e060'}.oi-expand-left:before{content:'\e061'}.oi-expand-right:before{content:'\e062'}.oi-expand-up:before{content:'\e063'}.oi-external-link:before{content:'\e064'}.oi-eye:before{content:'\e065'}.oi-eyedropper:before{content:'\e066'}.oi-file:before{content:'\e067'}.oi-fire:before{content:'\e068'}.oi-flag:before{content:'\e069'}.oi-flash:before{content:'\e06a'}.oi-folder:before{content:'\e06b'}.oi-fork:before{content:'\e06c'}.oi-fullscreen-enter:before{content:'\e06d'}.oi-fullscreen-exit:before{content:'\e06e'}.oi-globe:before{content:'\e06f'}.oi-graph:before{content:'\e070'}.oi-grid-four-up:before{content:'\e071'}.oi-grid-three-up:before{content:'\e072'}.oi-grid-two-up:before{content:'\e073'}.oi-hard-drive:before{content:'\e074'}.oi-header:before{content:'\e075'}.oi-headphones:before{content:'\e076'}.oi-heart:before{content:'\e077'}.oi-home:before{content:'\e078'}.oi-image:before{content:'\e079'}.oi-inbox:before{content:'\e07a'}.oi-infinity:before{content:'\e07b'}.oi-info:before{content:'\e07c'}.oi-italic:before{content:'\e07d'}.oi-justify-center:before{content:'\e07e'}.oi-justify-left:before{content:'\e07f'}.oi-justify-right:before{content:'\e080'}.oi-key:before{content:'\e081'}.oi-laptop:before{content:'\e082'}.oi-layers:before{content:'\e083'}.oi-lightbulb:before{content:'\e084'}.oi-link-broken:before{content:'\e085'}.oi-link-intact:before{content:'\e086'}.oi-list-rich:before{content:'\e087'}.oi-list:before{content:'\e088'}.oi-location:before{content:'\e089'}.oi-lock-locked:before{content:'\e08a'}.oi-lock-unlocked:before{content:'\e08b'}.oi-loop-circular:before{content:'\e08c'}.oi-loop-square:before{content:'\e08d'}.oi-loop:before{content:'\e08e'}.oi-magnifying-glass:before{content:'\e08f'}.oi-map-marker:before{content:'\e090'}.oi-map:before{content:'\e091'}.oi-media-pause:before{content:'\e092'}.oi-media-play:before{content:'\e093'}.oi-media-record:before{content:'\e094'}.oi-media-skip-backward:before{content:'\e095'}.oi-media-skip-forward:before{content:'\e096'}.oi-media-step-backward:before{content:'\e097'}.oi-media-step-forward:before{content:'\e098'}.oi-media-stop:before{content:'\e099'}.oi-medical-cross:before{content:'\e09a'}.oi-menu:before{content:'\e09b'}.oi-microphone:before{content:'\e09c'}.oi-minus:before{content:'\e09d'}.oi-monitor:before{content:'\e09e'}.oi-moon:before{content:'\e09f'}.oi-move:before{content:'\e0a0'}.oi-musical-note:before{content:'\e0a1'}.oi-paperclip:before{content:'\e0a2'}.oi-pencil:before{content:'\e0a3'}.oi-people:before{content:'\e0a4'}.oi-person:before{content:'\e0a5'}.oi-phone:before{content:'\e0a6'}.oi-pie-chart:before{content:'\e0a7'}.oi-pin:before{content:'\e0a8'}.oi-play-circle:before{content:'\e0a9'}.oi-plus:before{content:'\e0aa'}.oi-power-standby:before{content:'\e0ab'}.oi-print:before{content:'\e0ac'}.oi-project:before{content:'\e0ad'}.oi-pulse:before{content:'\e0ae'}.oi-puzzle-piece:before{content:'\e0af'}.oi-question-mark:before{content:'\e0b0'}.oi-rain:before{content:'\e0b1'}.oi-random:before{content:'\e0b2'}.oi-reload:before{content:'\e0b3'}.oi-resize-both:before{content:'\e0b4'}.oi-resize-height:before{content:'\e0b5'}.oi-resize-width:before{content:'\e0b6'}.oi-rss-alt:before{content:'\e0b7'}.oi-rss:before{content:'\e0b8'}.oi-script:before{content:'\e0b9'}.oi-share-boxed:before{content:'\e0ba'}.oi-share:before{content:'\e0bb'}.oi-shield:before{content:'\e0bc'}.oi-signal:before{content:'\e0bd'}.oi-signpost:before{content:'\e0be'}.oi-sort-ascending:before{content:'\e0bf'}.oi-sort-descending:before{content:'\e0c0'}.oi-spreadsheet:before{content:'\e0c1'}.oi-star:before{content:'\e0c2'}.oi-sun:before{content:'\e0c3'}.oi-tablet:before{content:'\e0c4'}.oi-tag:before{content:'\e0c5'}.oi-tags:before{content:'\e0c6'}.oi-target:before{content:'\e0c7'}.oi-task:before{content:'\e0c8'}.oi-terminal:before{content:'\e0c9'}.oi-text:before{content:'\e0ca'}.oi-thumb-down:before{content:'\e0cb'}.oi-thumb-up:before{content:'\e0cc'}.oi-timer:before{content:'\e0cd'}.oi-transfer:before{content:'\e0ce'}.oi-trash:before{content:'\e0cf'}.oi-underline:before{content:'\e0d0'}.oi-vertical-align-bottom:before{content:'\e0d1'}.oi-vertical-align-center:before{content:'\e0d2'}.oi-vertical-align-top:before{content:'\e0d3'}.oi-video:before{content:'\e0d4'}.oi-volume-high:before{content:'\e0d5'}.oi-volume-low:before{content:'\e0d6'}.oi-volume-off:before{content:'\e0d7'}.oi-warning:before{content:'\e0d8'}.oi-wifi:before{content:'\e0d9'}.oi-wrench:before{content:'\e0da'}.oi-x:before{content:'\e0db'}.oi-yen:before{content:'\e0dc'}.oi-zoom-in:before{content:'\e0dd'}.oi-zoom-out:before{content:'\e0de'} \ No newline at end of file diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.eot b/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.eot deleted file mode 100644 index f98177dbf711863eff7c90f84d5d419d02d99ba8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28196 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 JBNKxQ0|22?pL75K diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.otf b/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.otf deleted file mode 100644 index f6bd6846a252b4474223c3f62698f53c0746d635..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20996 zcmeYd3Grv(VrXDsW>9c;b5n>t>(s@-z#727;3?+j7UG-zfpG}~L*NSr1_l}bV0|MK zw!kI^21Wq}28M*>+{6L~-p4Hr49ssB7#N*0QWH}cKks&BU|?9oz`$UZk&&9n*2Dat zfq~%(0|SFfMs7*PEEWa^1_r+j1_tK3+{B6kh6e!*3=E7M3=9lxd5O8HecuF*GB7X} zFfcIH6yz6|{BL70Vqjo3U|?WSU|<9(m7M8lkZcyuZ}XLbn^^&5+WDLMSqS?7Y-S~} zI0pk0NED=pfq_}!|7->i<`$3$vl7@O5EF*)GcW`&Fg##jU|?bT$2ft3m4ShYg9&77 z0fc63U{Gf`&%nUMz{(8M#J~Uw1{g0O%{7JLzypQ{_rSJ$Fe@;mLhOdBP=NY?k6|6$ zekX=DD4UUimEkIs&BVaQ@Dj>qW>8_Yg0fi{I2ntfY*q$7#@SFd8v{4vAqHj!Mix#6 z1_qEHA#6qlE{2m(aV7>HhTBj!GlK`i2Pm6`L5MLP%4TJdVXTF+*%-taS1~v<6fvYS zBr=pRq%x#1C@>^3R5BWWHOX6WH2Z&xH052 zfs$isNprDaa zQc_^0ub-BmSCR%2)hkZZ%S$cMWMJ@QNCsO}%)sE8oS#?Bz>o!``L#bKB3YtTHUT{4xv-0y3;;1Z5cXWL(39 z818`dGcqtSFf*_)urjbQurqKla58W)@G$T(2rvjSh%ksTNH9n-$S}w;C@?57s4%E8 zXfS9o=zuew5rYYX8G{9b6@v|f9fJdd6N3wb8-oXf7lRLjA432`5JLz<7()a@6hjO{ z976&_58AAm_6+;a}9YX^{6GIC_8$$;}7efz2AHxKO zNeojMrZLQ5n8h%MVIIQ*hD8iZ7?v@tU|7YlhG8AU28K-xTNt)6>|of%u!mtE!vTgv z3`ZD_F`QsH#c+n<9K!{MOAJ>St})zTxW#aX;U2>ShDQuf7@je_V0gvwhT$E<2Zm1! zUl_hI{9yRS@Q2|aBLgE7BMT!NBL^cFBM&1VqX452qX?rIqXeTAqYR@QqXMH6qY9%M zqXwfEqYk4UqXDB4qY0xKqXnZCqYa}SqXVN8qYI-OqX(lGqYtAWV*q0iV+dmyV+3Oq zV+>;)V*+CmV+vy$V+LauV-8~;V*z6kV+ms!V+CUsV+~^+V*_IoV+&&&V+UgwV-I5= z;{?V@j8hn=G0tF|#W;s?9^(SWMT|=rmoctpe9QQa@wcIov5BdfxrL>nfuW(Hk)g4n ziJ_^XnW4F%g`uTkqG6I@vSEs0s$rUufsvt+k&&^HiIJ(1nUT4Xg^{IEqEV7jvQdgr zs!^J;fw7^nk+HF{iLt4%nX$RCg|Ve^qH&UOvT=%Ws&Sf$fr+7sk%_U1iHWI+nTffH zg^8s}qDhiTvPp_bs!5uufvKUXk*Tq%iK(fnnW?#{g{h@!qG^(8vT2HGs%e^;ftjJ1 zk(sfXiJ7UHnVGqng_)&UqFItzvRR5*s#%)3fw`f%k-4$CiMgq{nYp>Sg}J49qIr^e zvU!Sms(G4)frX)kk%h5^iG`_!nT5H9g@vU>qD7KLvPFtTszsWmfu*6Pk)^SviKVHf znWedXZ4TCzd1VX{%Oak5FWX|h?ed9p>aWpZM2 zQgU)~N^)v)T8cr6VTw_Taf(TbX^L5jd5T4fWlCa7Qc7}4N=hoY5T(4DftTITDu#iv zow0+lld+4jo3V$nm$8qrpK$_%6N58@3xg|z8-qLJM8-*slNqNlPGy|NIGu3@<4nd` zjI$Z%FwSM1$2gyH0pmi(MU0CXmoP46T*kPZaRuW_##M}~8P_nbWn9O&o^b=?M#fEy zn;Ew-Ze`rYxSeqa<4(q1jJp~4Fz#jC$GD&I0OLW%LyU(Rk1!r(JjQsO@dV>Z##4-^ z8P71DWjx1tp78?XMaD~vml>}xUS+(-c%AVE<4wj}jJFx@Fy3Xn$9SLd0pml)M~sgd zpD;dUe8%{k@de{c##fB58Q(CzWqil@p78_YN5)T#pBcX}er5c|_?__w<4?w4jK3NG zF#cuy$M~O#fr*iciHVtsg^87kjftI!gNc)gi;0_whl!VokBOg2fJu-^h)I}9gh`Z1 zj7gkHf=QA|ibt(h=wyo?8>;>#S>{r;|bBJ^FbBc4ea^B(k$nC?unMaUk3(rBGD?CqlKJjMr&f`7B z`;?D`Pnpk-FOIL2?+QO3|1|#J0_*~|0>uLF1qB671j7W&gfxXBgj$5w2;CLd6wVW2 z644e36)6xoD=HwmLUgz2B{2~(Pq9T}yTopZ{S=oLj}?C*p()`lkt;DlVuQpBNiWI0 zlDDPwq=KaCq_#@CONU9P%ZSO?%IuQ)BdaXiDEn3}Np70lQMn)Tw(=VlOcb&e`V}@S zTvs$yY*SpTG*h`#rB-F9%2!oRRd>}U)$?kSY6)sj)uq)ZsV`ICto~U2uZF0GmWHcF zq(+m*e9b`37|orUf3yO%7HI2e2WWrS@zI%~^HtYZH%oW2?r%MRy&k={`knee41O5q z8J;)%Wu$HtXtdav-8k2HpYcnRV3T%}lP14RwM{!rH=4EoX3ZzW(!!&ACQ+6x&A_UXllTc zN)Sm!E+~($`{x$sA1XfsMBTc*DuQx2zF+%YckO#AtN(hJMGoB@znA}J5w&-UQtSTB z)?L(F(qGK+{nYm&)*l?-1x0`J{o($e*UdV4_2f0(>$<-symq_H@h9i^HPPSBzXe$j z{bv1a`dy@iWBd0o(UZR;S-(q8|IT{-^mj%MzHbZ47{AB7XZ{}ZbBpMoj^8ot-zWY) z@V)!{f!{IR-9I{5`4*J@40zAj{r$lAnC}NbPTV4@%%!d_`aS0Nf$uSFzYl;QNVc1m z52^~B5Pqoq1gm8E9Ro7#_krIr?7t6uKY&ox{T^-{%XhFbzYlbSjP33Q*#$BW(_)Cq znC@yvhsaD@SgGefgf)~e;@cg@%w?_AQOIcfD%$iH$?VF2S_&NPlx&surCjM zpU4XJJt&1Cynp!jf$w`kE{1p?4qtJ&-}d`q@o+9;yuW2u!03;jIb02 z2`m+^-v`u1|Gats;|=@w1L~rxTz>=9MSp`bASfrk2W7>RJr{hO)# zH`8{N%g!8^FSCXo%)H)xulwHG%Lfl~{Ajr>>g>#VFm$bRw?(%_rhRBA$7N^M%a^x* z>i*8u{hcZPo%3amKeoRWMAOqtBD+JnLl%XtPv^LBnYD6mbMWacDEp!ELxr*XhYBRIsd1_Q zDHZMhefjFSBMhWHo1WXLM&y&Y8x+*Zm%p{lO%}r8}=V6VxSoL(ZLRiJyB2$d_MpRNl=n{4+&0Y5sM#+Keve1 zb=9>rHE{f{`@QzJNO!mT`|j>POsti&tLMu7Siv@T_UyUxKbYRX|1H8^u;zEh_X(Z7 z4O1E?)OB(6{T31ZuJYUA_m*zf*55Ir8eHEGh-q-~y?_5h<-Jh%dr&F&JLbLcizzx z*Htf#z4@E@dsfpNj_-n?3Yw4bpSrpwJ z&hc{#TlfB=-AQXL&xgP4{><^6$?)lKCOP%L0iq#0;tn0!vEz^&BwuU2Xa27BbBk#A z?>>iX4i4Y7euLpPhilimfA{U}{{HEE-|y1zy5CE`tN;G=y^nS8Z!OX9TI#>G)LGS8 zpbSu*bpVv7gx-TH7*H_A2!Hvxg+-nH(2lqe`9CV`A#rgba_T>Jv4d(PP|YOY{XXD< z*=7#mAIsLx+1|Yi=EmPK>Z0%2K-xfB|)C= zUAP<+1@b?3{n*6@iU_&L-v`*#->a*4e?Pzq%8TH9_;U+O_unlLfBlZ>{<(#f4^-Cw z+ybiYKy}xj$Iw)`2$BkaJpR2`<#+ricD`;{t}xuqjib80`#0Z@H=s(PzMJ**m38N49_RS(_Wrj6oA8(B^W}%T_jPZY zwsy{fISb}bUDv&-dtt-O+L^V}O1o1y-m`Tdt=^xufg^20`0T)L4nB2I&VBzLRH%Sh z%xixJh*q@Lly;YMba!_D4PZs_`p*D%a4h@{=x*z72W5xvEb5|~T;F5Fz8_#)zOXbu zzqB-8{`Uby)cx-J9V7bV%^#INZ`k-im9*6NdCWg+er^?EpEcwAydT`Gef>TC?fo3_+gblq{E-uN4D@%D@74%4v5wtTx~qP7H^+DN@7&+H zzpG#MKkg{c*Y@t~d&VES-w!ZP`4KMKT{*pcb_>UMj$qcN>c*sS}ZZcN!yv~J$wCEd$8 zy1%P*Pw4LNzRTLv*FB-Tue+~%LRa5}MGNLE?&bjbTE5!^Tt2jdgXOn0Yj?qt!gUo} z7H{0Vcqhl14A#l5GuozhFYjKsuzPv;g6c(O6F6))v-U6OUD&;dV=p*efdW?Eovn3F zSl!` za4$%Leb)Wy_Y&4=MQa+COj|N-+M0$X91h>zSo>y9ojj|Xqr2~W-)}*1Qwma(e~*DA z8&KPldCJc%kOKejB8XwI0{`bCsHNaS{&&ou4mNd`_v-3w-(%j3!s*`!)Y<;1APK0e zv%#91-($e36Ku`TEiAudeg=GxVgDQO`+(@5dQ{7P)U*G2qmD2Z$(lbZsNx{g!Fm7p z0Z`2ats#Zq|Ih{bq`SSnvyDUdw->AM{m!=b_SSBW-->MD!tIYQ)J|Ag0u5D5w$|?U z{>}*;y5GH6h2M8hXzy?B<`BOB$M^REQBWcQWere?CJ!n_aU|0MRE>8aswCP?-0 zo5}F$cP9DoOi!PFXOdHA(c`>#J?qS~O=fHoK3f-+E10&4Qcy#LVwYNmAm>3IMCJ*buY{Xlp3d)D7Ezhgu} z9%Fy64o*=&ML`Wu*5BN}xqh?#=J?GSz9(XDvyRcqyyykq#p5sU3k49F$ z?^>W1u-0!aSlIm5`mXi6?{^=h8Hy4{-@#Jf`#=yP4X#RmYyH;x-Urh2yAM>Kq6HsF z2&4m~1Y`m$s8_=XHdvYKd(3Y)(aX-iul>IE+u^&z<;(BYA@b0k52&;7TkE%*s16rj z_m2*6*$PT%G4Gj0EWUsGxkVI|5ac5r*lQaaYULfiAGpRovte4ToWov775Dq5x+qxc zuN-^rw1$~-KjqkFPMbDU{-+#NAt)Dpj{#*6NZayz-}~=(dCL%7w!IC zG`pU4Mc(qfWx1e6bJ4=$MJ0d{a!Wh&G0(WSCYjt;j*Xr(J1r=s;9o-#W9o-!5;0ob~%6t6Q7lC?FG2df; z$9z}pX2oUspD-3se1iHUk>E-ToXhrpk6{P5DZyQ5Jy49iVf@|)YL>|TW&wA*yHloQ z&dyr7aP6%1QxAO?_%8h5yK;Bzap%pJ-5elGMfJG&ApN2Pf8Mmg-S%0XAz5fkr1iS~;?CRfRK>fqM?+3p3F?N3k)1dDE7SYJx-1+stx%WCd z@BPhPpZ}XXvRnN-cjWZ^$lu(ToxgMMU0%QUH#h71?!Di+mrwuB9eMe3nz2CW=FaPF_%%9F0`JJ0J@^_yoC~823lZ6K;n$F#m2X#9-zQ-{B+`^&{ z>Y5(_b#uWn!TRUT9~DtWP%dSJG}xJcZeda3`q3d~zy<1yf`%}_p$+OXGlDyb??Flo zKuT1&{&f6~5$*n?0%~o6ycqMN<2}e4MXo<8zYl;l|4`{>1r@{kT%bZ0RBj_x6yLRe z28e>)dd}mX{9g4)aH$Gv^nuct{NDGG>@dzfk8>7sk?*0Y&*L1VaT%$;mmMsl&H^e` z9qOQ{RR0mi{{DUBUUl_9VUVJn<@=}Z-=BVeVg>n2 z6vP5`JKukg>3$DtC{oeQQ-wUsC02flf3x0e2_V``!yWqRWZ;$T<-wVEb zeE0ZXApgDKx5syn-vx4@LQHtBgF1^L*YB9$8lv6xld7jQb38R*6~5=tTEq(LC4rmZ zMXd%;S(~R+Ppa?cXzuO+wM?O{Sm8AXzJJ;+Y6uE_M$jM#Gq{}%O6lyN!J6*}AY&xo z53v5}_!|Jp8KB++SS>j0!6Sg+(IN0~4XB6#NrDDsVnEdvcmV150Z^0t#~ao^VYZ;6 z9~{%*FnrG}QUD$igZWwhJsT*_LA`wt4T^iY_iS*F2mDSIwJP$r?>6N4&GgjpI}@}? z(EZf^y44bn0Ap5AwgMGR@83h3F2ZwuZejVmpn8?2)3r~?A(JcD8glx8fxgS?{d!0sLtN3Tq{z$0KLTzv0Ak?>v!G<0_0Jt*z{KJZ=`GHPqe zC4Av`44d$S@61o0d}o#uKJlaDy{IXd@DY&c38*L^D3^Ud05U-x)GI!q{$BXO&j6O+ z2iS!#fQBd@m~jc8_#Pt$5;y`9IAO-c_pKC^&p^!sNJ`4gWNm2pJ^Aq4GQC zhYBc5vVsS5|ET=j@k<{M^#r4NA=_k43*9_^s9bJK*<$ z-&(&9eAnv!9>DrORTNb5f$F~Q_pE&2k^xi%fd*qBy^i00-M@8zi^TnQ;P@TfU8D{g z1?%JSsPY2ukK#Y@%<5qf4`e`%Xg0NjQ78bcS8r#W`AW3TIDs*ts68z1}de% ztu7FQSp*aS>OTYCLy9_B5gG$4Le<~DXMZn-AVJZ9sM0{=-=LfZuI<1zr#|+Y6C5Y- zY7sQr2^w8Rt~kMMUJwB?50r&LgJqzaQ=bdeWJjqv6+xvHqyz!gE0Em1<$H{}`kyyH z-n@U$4(f1&MuGZ%_q|sKrA1Jawflz(D<8n#Ezsz)e22QI1(!MtXut!MEJ34A^4(KArgThcuCA^x@6PWo1@&0xPoF(|a#LSZ zUt>21-w*BY_raqC)ur9#&{Fx7&mZnTg5AHDd|%l8L-2>-NiWvP4fC32bVIwmGn(f# zPUg^idFCwZ(WBk31CItB(d-Ti;_&p+eZks1rD}40cL!)dp^Kw~?K|u5e9`aXzr}xF z_-PhoW(cI11C?>?@5R6+9N&U6q3$1``5EB@;Nk!GzhizMQ1AX7 z(+!$UQSa{7{2ujv-^cFnG2jN>`))Z<<`ETM09VNI{Q%qM<9ok@rfy>1cY_)MjNRbK zQ{j3q25Ri6|4?E79rHc%d(8Lv-{3wBc=QR@n>g@2rrYy(%x|gg_aHZY2jv)0K>v;b z)qWrkbi4<}`+Fhb1K>U^yYPaaTi*ZaU=u#@o*h)Ti2eyf9cKCw25P2%2lY-tH59mj z0*$Rc0NV*_LCFhW==R(aa;%)=cOJX&lYsK1kZw;7SnEly`*`Nw$i-8pOq&Gi*Tt~i zJ%9eL{4sXn6UXLnIn;fY1JsBD86zir1!_zHJE(Ca_dABIs=Knirj6q}7rXESB;|6T z5uBe}SS-2T|4|XO0%rx#7@idus0Su$iAc7PvP79non>wJ%BGc#W#z?{{gwTdXC`!~ zbr&Qyt;}7Qq2b#Z+hP8w?m{=m*6wNL9mSz``q66Lsoj}VGG{E@9{DI{dC8)vru=D5 z%bJ#Tt>oyNFk!;vZjNJ_taJMfz6)(#I)D1+@VZ0w`*xMAoUwG;{FPaAIZEfT?pU^e z&f#v3@72E$oc4=>&b9-U|W84T(T9R7Vk z{XJ-A|7 zZb2&K|8DtxKonBmgUWq0F029tb@#r5Ccl1eVX+3)t=3$BxBTf4g|b1d3Q&WE5me;N z`?*E5p}Dz1{`Y-Ivi$J|JW3`1{XYA&=E)6me{KKNi~iom-Y~g&n%qw5sE{~lB}iGXTabTrLmJ zK3b3zi7fs@g&kC1%I$ss`+z#6@h%T4;l69Z#6jK4A8$Y{gBZ~8COF>-Uw|~hEPqS? zmi}!iuO7)R`~YO9{O=fu2j4^dCw%4mCw52!;XCsaqu-#$!|zWhO1{THMnQ$IM80SH zZuwjKyYz2MIldnqEZrfCBG;#Le1G}-#rK!rU$CxUzi4mwA&&2i2G4#o{$?~V_|1sS z24^Qw#*P6^?t&&wL47FDYz(NX26ubA!DU!?_Yd{=9pFj>-r0aw3O~27gC@>?ynzmk zgM8bquHFqQA=N=66W_rVKd7(w<~=h!TL1PzW3CSpb3glF(Fz`}1&zn4tN)JaR)4P! zZs&qhAk+*{_ek`&xSN`W#s#(S;_|n;PaQsb_NeEH;5*$M-^DL{c=yij!*6kUt8TyG zK+nLlzK5;5In-IUcJGYY85SEB8+qyaU^t#`F|MY(E_ZXq~@43xDX&SN|>3ZOUPK&ikI6@C$HfQ}~HGxH~8(`~lqe6MoXY z{{452?z0?sJT6$sfjZG|Kr;hBw}`5LH)n6DXSMwuVe>oO?sp`|Z$3~{;b=1xAfWvA&Q_=@}Nlygc=Z!fEsXn zLkUy>gId9m3Ln%+dC&Y~7pOdgk8V_VSNGL${675qFeoJ*08J=^Ixz41`dDXm%kS4fsNzH?^PGI0kyhgAXA5+0h;epKi(jZ?R--2?*6R>9%n(!i)g8T{{+by;OVmV z?)GlhQ|h8WRKOkKnD?+DT~KBILj~l2P=yXks6SNL-~WygwdI14eBadH3w>w)e*E|R z?Oee&D+nEAmJ=2Xv_X{ckN%P+Jz8CQwrtMH5ud?-&+PE0ltAi&AKvRjJkyCho`+GDfk1>Cb2BkK2P%RY0{(WTbR`yp}i}mKs?(c%O zH}jWg%}t+N*m+0>=87B1x2ww-mxoC^=QAcxMfWwPmp5--H(`0#@~(MJ-JoLTpHD?dKNJzgzyOdM}`SIq5iu!wY*laY*;qCFk@}Qwk_QTt^AC`mY zK7gcqizsCJLjFA)NCil}-0v7rj|Obi_ZXO2kVOK}VI{Q6xcj@-?-)?)TfLhVQuoSz z?-Tp21sY#v{mpCys)p6sVV!Dua2X5g9)X%GkXhv4F(CHu7AUYeXa*WIMDrcAx=Q_z3aBJ}-wo>hf*T~z$_+eYrv9e`JR2^r{{H=s4$!i! z?^>*X-hfO(Ebr>*W(C(g@6|!d`F?1F)PjZvKoi^GaemlJuiv5H4SySc50yXGeRS5I zrG4!aTKhXV-mA0Du3l5SsQYmD&Yj(dyBF22sh-WD{+_kHzhy#O-?BY(j&vXA_zqhH z_U8@DZ~5QM-w%w{!#g@1)FS@|E>D{6Sz872lq}vJx{Iopk9Z(I*TS~ z1PWAPeUAaPrR_k?Q9CZaZ=lf%P#+gGz5flgfTH`y8<0-|MBzTM`Y!cb>bn(a=nOK1 z2K5UcI8lLGP@o!z_4@%95Dgl{01W|j|9Jx%BVzpx68?Swlpnyu*AUx5q8+~vfE9!K zf?jDjF1r*kT|Ft z%FfpZD&N0HBANwzA!87r(OgiC_x0ub9~wg4ph2nMTJOJWy%+xVebvtZ(S*i~`0jYn zbo}oa_^78`_xG6YepYa^r>VQOv!#>ccgOD-q&hm1Rrp)?Z;kJazxlo^7IP@F3;&8_ z1Gk)hsIYwYsEfyU3e_o7YRbg=P( z(h=j24iOb#CrAj-}@kK?jIdso8=J83QnrS z*9_P~W>A>FgGRM~8-@L5`>omi+ok(=;dl4n?%xZ$zq@pQ*Zj_Q;JZF~WP2roucc<=e-#ESteiwAR@SEc|Yg0X|o7-=eZnq2W=X<|1oxQ;Eebx8n zteZEV>DrXCDW%glEt%tY-|ueL#>UF-#;J`{yXQ`w$}y?$=}Wf@+FGp9(cLz?qjyK& z>fXJZ<9pxt4p_?|WmClbh;C4LG5&Z1Ziaw*6Yt-%{!tMFmFS=rWK1`>XAJI@g7Vi7 z6(LZ64zi$V2e|PW(H);&5WXXHnPazkcV0(fYvH_xxy=i^Iqsc%`W-aG?eWw?PWS?7 z{hx&gc>epG;XP!zANjv8h$ck%=XiE<2wz#2Iw!U}lEd?R%y%pH?)^F2;}>%Ll~Wgu zFU^VX4(Ir7#V$PKN5^+7Hi%qYm|u=tw_CU0s<;Cj5NCEkawm9r^EZ{nH_;*k)$Z{hNV9{pXhV?A_lP%pNID2=#MJvFf(!cH9(t z00?l@QTInG3xJyUtx5vek7rGuKozBi+(@wr{nhlw(nYzqQYM^K@E6D zaAl#@ZIa^S&GCKj@4ekW6j`f#t9q)sIlgNtigy2g`FqLlC9EeRujf4I{vO)>-SE31 zn0EOs{$2UE?GlbZy1ykvgF`bw0j|B%;$jHL_l)luprK(4Dqq_TIjl!xH@S3MbAakba9s$kBjvhpufKG3C&%Vhpi=$- zc$OQqj0Dv0U>1=9j}t-)X!bvke;;8$wDxyEcena?j&9cFCd*Bh8*lwCx#hdm*6)&=e~WDSEwb^q=*DLo zo^N>0F(dzbb$9ps-?rVXc}Me)ccWr*}{7nAo_ua(?%6jw9Q)9XYZs zAxN$}zp}isxC5g0d-eBfw&~qdyC-&V2zxAUoL{-T8=^E}TabKycX?%TV{1oacRhIA zt(qNVWZy&%;R#b0&jp*Buq{X~C?O$8o^O&mXs&_rd*pl2^4{*B0itHzK84B2$;q{m zZK)jZ>skAkPF_53-n@CM=AP|7+r7See&zhi$tB%I-4+=ok@1o7Uf$imIXQ~nFJbS# zw`$Se?R&RhINkl7vwL^-!Gui-o4n_ncXLGk4G;y5!hs6_(D*5+oB~Igh>Y-_A7MYY zhzj3PU*;W7NGr6vUvjo86t=_>_WISb!SF@1X^HBzs18Swm?7Xkm@pZ{6>1tffm!r)PF^ zsH?wc>+AS#{yX@$)$b&A@S>kyja|Q)pj8xTVg7fk-&UZi>9^H) zEAW_CH;4tQqChg>84>u_0PwPpKG4c&(5Tw)nC|Z&P9G?BfI0)987h9&QDVg~@@|4acxUhS++3bg&8gfO|W_bHHuqKJZv8 zXlPANSO>Hci(Odedknj<4!B_n8aV3!cZF2mGhh1|Aexk!nI!*b7kkp$%q?<1!q~Q~ zUAsm8yP!I#!`T5U8^0eAQ)mC32wLy1SMoc0!Q)$JUV@h2fKyrwyiS3v!---4qoV#h z@%L`|{okX$Ykd43)6MbzcMRM21K%%z#z+}|2>x6x`dc{cw@}D$k#LS2_U_+S=YFf* zR@fZ2Eq-gx)|}0yJG*ywZ(g`{)z($pwr@Ug`|G*y>fPV1I99R$7TNz>=+JNB0~{4o zSpNpFw0GxC%37SYICXQzPVWbi-#MGV3vqnk^_>soC{T?8jwsNa=N3`Oo(4$y52_1A z|8%_n(E*y?i4pyM;QjXlpn3z;`&R!RBlP{id*Kb>uvh;b!!CS5U7b~U18DXEw6)@W zH!Enw8Wf}(-oIxRzM%ddw2uX}s%SykcTjZ(S+Wf2aX5g66F|ZE8?>%Y{X1kzDMl1L z!~kjif?NrnoCVi>U=66_4`BC#D=g#@2XNVe8HGRPAW`^Z7yFjXwMlY+SrLmXjkrMT zp+O67Kr1}ad7vQ)a63#LH0cG(fia*pGJW4;zW4o(Q3qu*@Xi@fJa&URL7>JqD5WAe z!kP?V6AZb8jTwITsf!wdRwfA>HfVE!c*4aEYFxiR{nio{R%OuU`WYZ5tmvT4C7jFv z?!iM8CpKtv2`_}|28ECos6EFBS`hV~dF{_FqLtOvmGXZJ*uk43e)2#zMf@yapIbe< zQtl6ERI}qx$Daqc<-1nG!_MmW2FANbMnrvtRo z1hkBXRUJIO3YugF6_9UOK+Wm{pkfK+^X~^(zblA+KlmF|;PKtG1r`$FVjY}OoY7-nE9~>ON{V-@$2DGFIVjpO50^C^n8Swo#ySjS! zZ{t55;9WYuyWhWO{jMkmiWkrddr;FKRE~lsFIC=uKLB2fgt^QYx(XJy%=fRTt>|}$ z-(cu``TcwK_pINqf%YRDQ2%{^4OB3ICNTDX2S@l`W)TbUZ0KHgP~jr?T?@SEzcgPi z5|nhI6G1@~l7&l_%YD~k6FvZ{g_o;*-`*|XJhyU2892T` zJ#UD?ps6A~(b__t-=P&19KsJODvFx&yE*=-eE-D0pnL9&$#XfnKYia0*%|U%i!Hx& z$r8|9?2=92B_}VPytHmb;be}AKGurP%DTo1jz22D=ZUIWs#SZXBHBbws zgZ;N%@o%x;>fOIxu(WlzH*Blj$YGGiIxT-fUUv>gGZ!`#B)77AW!v%wjJN{S6uYf{uH=QUCD< z$9NZb!@(Qyx?<1>$?q7@)`j=)-@g};5xxU1$AtHQYY}L-;%5M~o6jbE2V5(F5|-$n zQpmg$tZVe6R2?+CRtj2yw{W@K_fKeCP%q*Adq(gi8KgG+qr(21={t+zcR9JeY>=f< z@;_A6p&M92;&vR81I^VR05t$X%RWFk=0^v(N(E0qGK*M%HW)c_{V)@Aree3@S@0WP)`orSpfMDR3U@)h_DNrPX%phYVT;3{~i222DAzmvdyQ02(LAw~i?852q#SGY6`#UDeefNZj zK4TYN{$32E7FqOrFgt8rG1zV3H9r=Rot>+H$A~&|ediK$0uhc}eD8mBFz)^F2D0S% zj|yZO^G63{*rofs)_c(2ukQ!cK{JNmwIHi=;WHB5pw1Ggk^boC7Ex#L+{~QrIi0iH zAC{iB?bhwq^|m!Ft!}UCtm@`aXJ692xNp%!jy|^UVryP~=j#5h(EVLO=R4JW#=KbFF(~cFo;NIZ(0nzurV?djdKy?tP{SOHy#_!8Pv#i|U*|F~5A}PNa zT{#X|vc5R>ooV%V?(XkA-QQVqUifnyxXb#R@#1gsO~2*3Ies5tvFUa$^-bnDXvVs0 z<^DOxyN`7rt=gH(ao_=~?-UF^jz~clzx3GLK{e9qf zDX1-fpu1ZgwAw`-)C30&#)DeJpw%xR!S}4+54`_f%J#h!lz@I$|2~k~{ks}8a0?m> zhXy*LgZ~FS%;CzV&f*4IoDN!4s{S6dXYxHec<>yq0aQhaJU~(nng@VPlJNc9BJ!hA zbRG}ad#=6PC%)gi_kI8C_upf9c;0jG-TQv>*4b+(y#NiM^6<(q=m|5ZgZAz7Gl()s zGuSe?FnBYhGPEYxj`fDpv9`7z8Z{1>9cXeJJiUYlm8J0 z-ajCZ*+=I79rJU`_ZW6=(C$4@*dRMj9^^VXZgAPo#@+qr4X6PH+V{r|s!2e5j1P3P za{q>{=m0g6z8_%ch74TGAx#&7MPon>DRyqm9XHS_gd4PY4?OJqTkHLMkoQ3zXXRE0 zPhNn60<@w3hYE_6$L581TwZe}wNZkREg$+)@WMRWn+`pwj&HiqX`(wJlOZ|>H z+YQ+{Ohz-J^bJjqZkl8S`FdA7sOblcWE(}r+!r0_N`au|*94*DL z*$ESa(L~!1I>Ao?5%#$JO0;=Uvj~}k%bg%`5Js`Dg@FMq2Bkr45Jpj>096CEADcW# zJ<}e9U%`Al=?)|h!;D{0^?}53*#VNH7Y4ZjC9IL-6LcCN0~ml#Ph>b_yXZWKhkRxt E0EkIZ=>Px# diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.svg b/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.svg deleted file mode 100644 index 32b2c4e..0000000 --- a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.svg +++ /dev/null @@ -1,543 +0,0 @@ - - - - - -Created by FontForge 20120731 at Tue Jul 1 20:39:22 2014 - By P.J. Onori -Created by P.J. Onori with FontForge 2.0 (http://fontforge.sf.net) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf b/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf deleted file mode 100644 index fab604866cd5e55ef4525ea22e420c411f510b01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28028 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 z%0D|$4FD=bz+;HuwuS)%+h$de-9n%#FE(~j(156!EhA`p+YBls!luor1epy3)h%Y` zrXbmfnh0}UY4H=HvbyGAc7)vtAptc#Fk9E0Ss}vC(3iiAQ&!ZP-`5Z{cwy+vZ*3PL zAmpI~<=p~FfZT(~du-r-1Q$Cr9k7eDtFtSLn+qzMt20iRHZ5h^G{!H}ru{1b&FX=< z5DrRQK+ND~2iFb4P|b>9qf#KsK@|j8H?smn;NKN67vvU1znGoDjUkkQYkQ!(ItL3V z|H8UZs-SUtHg+~8HgPdFJw|pmIYxGMC3Z1!IYx0gMs`p=Y;L9o%H`&E%<5`(jHV`P z>S}h(=4#@6jN)Qu;&ROPjHYU^VKl}G0iI%FykcD1f~;&@eBx}vk_znBTx^U&oPNBj zW&&0Q-p!g!;<9oEhSH3T@^XT_ysRQFjEv0OY{JZzhm?r_9ueYk%6WkVPgy_{|Zu0 zr!eY+XzNQqq-3DTVFd;sy-aC;3D!f6bK=C`71-I#3g8A3sP+X7)qpq* z$m0R9b^`huI6+XArpT%Yp+PN9P&*Vd_5AM&gbgZhK{6*m4P8+44bqkZmmRzek_?Ir zT-)WOMETf2`2#YY1Rkt26*Lh9&)`BPc3>S*VWw%qvZ8-ih{{SxF-1s82>;CzX0itN zG?^8I|7`^oP>kNfp!wT>_k@MFLOYPq@``B>gE0f!W+_m4C8#K>4C<{YnwqF-Gn#^V zqJkn~){Nj$WHVdv$PJ7Kn!wj)WYjSdl?6?M8-ZD}qDKF&fQM{gELl+_radXLqSK~{ z%BG~qivBBr&@evZ1X0j%D`YGm+y+x+VA~8?p9mU30MBQGi%T_-jY@2wX1+BZ9z&HVva6s#Ct}y@0J#hjwS%D~znZe~TyuU4|C@g5sXl$x(E-naZK!UV` z78`-u+yAbBvO8#Tl@4;b!3|yq!q3ABuA@OCSl|@{p!G4v;>PC2g2GI{goXdI2}Am- z%nBejNbCe;iU-oBg3M=$GAJ-;GjMHJQyOa@Zg@ZlA1anBWO&|OdK?P zXKZ9G4;-2rgQnEgOijR* z0C=~6$Fn+0e#kS}lPnD8if)x8=Q2TTXPfAL} zk@t?E#pbX%QlzpNy%NU}}0+|Oh2SkI%>yQ@Ng2w0| zbAGtWE075gjP5S*_zjY~5b0NtL6U)EtC$csDD8pcM_EaoT~rw~*{x;@pYLVdcVW_` z3P&ud1%oqxeB4&k27bYs(OeudWehI+K>8U2xwt{=FaBMDtgv9509lXmuK<;wB_t^)%E-oeLRglcn@?Jp znS~Xy+z!0*jAI_~G zzxsQ->I!gx*MAEeiz=HMs~Ve$i-9{jAQzjO*fW}`sjIQ^Gs3xy;MOpxaN%cU6B8FR zvj=sM#6(5-8QIv`)YR2X%t6(*sPgfY6Df?%j7nnWT2@xm_+><8C8o(S$|{6P>+nm9 z%1US({ky`;$qe=sAF7PJj!BWGl@;U86QE-BL`otPE031d66) zz#JWue-{N9WwrQFMdbyAB{i*=SoMGhCO~PEm06BimO+~#gn?sgh%YB2sBZ`NtGXU5 zWG>JM+`fYIq3sD+xx%&? zx;}(i6;x!TfQCu`JYduT6&j$l!~j}i#sI0q1$e;YqmZdJK}A8(^ctuUW^8J5Ye^ZX zE&VCP>IBoCvLH|qG$AEO$Vw|EMGMjf0gn+1g66V7^%mR=Py-HJFG5UUoM07Vl>%Bn zc>=UT_Jo#|l~xcactLJ~jQzpJRl#n7jMcKM8=IK1iYtq-DMN->Cj^&*wz6zsESr`B z8d(Jmag_$2I8n191%yk3A!85Vel)~9A;>tbu%aMnY97>}lxGB06UL&7p!LcTAmjcO zq!>*DEgc8%6!~}M*RK;PM!!ygdiXH&nD#JmGl+xg93Jpo1EV-Q$ShM6Gh;n3JlcXMp&)cV9Mm`l4LpME`MUy|k09!i z*J43hHlQIJP`U-R*&u4zVS8kRpjmzcXfeqKrafR9q!y9Jp=0T=ISfWcMnP~5KLNZ` zYXxX;%-46koho>|AZL@Pnyk%1IJb+MIlf=L@XtStZ#t26*L0`X?LP5A^w%3Y5jMFwI*nNf=B=;mCK6$;}Mlj z0l6kcR+RAzxba!QI059I|C^Y(n2`1)FoKp#8ylH}J6NVBW{d)2ua-I5Yg}kr_G$*x z9(%`Suf!^5yjs?D0h%uu!0ASufo(GnsJv$sR~9uk6=ye976q5D%A)G#qQ<7mjB%hr zJ@DuoXs!OV6mS^`=7R~)Rzi?_pmS2P3~ZYPz~%{pqR+(4*ht)zg&n~Wv}0jb0I$;! zm;U#)70O}}iKuwOtN>aNA5jy*d5%NtU$Gr%r41+JOcp*RDKYSRi~n<(b}{W?&|zTP ztPZk+0Wu5@+G1nRD9+EwCL(5J&uGV}uE)sE2pY*VvS$)!2T7YVGA>+VZDsXKCEY_M z!8MAVolk=OmkgtcS#YN|%+EE;}x0ueQv|!;V=vBm~4)0BXOP8OcsYTaYQGoRJ?Q z1M>eo$Y)lVd~WjObN}Y2q_7kRrlbTGL(2xp9x-kPeg@Er8*hw%$|hlH#aa^DLy&MpSpcOt;e#ta&BU^EgJ zWHe)i_JPzHRUzBK7~`ZQ{#{RH)M!|9c4BohqrkuPw^z*Um=&1+6*Fq4X9*u_o_IEp zQQ+dMD_T`<&~csrbHMooJckGx*Fo941L~0}3bLyULJA?s^4l12F9|dhB`azKZYx;m z{JUbUnF86Z1Kp!@!des5h+x#wv_8Qo2QAAXWiMz}jbkguS{+sRc(e|vFoN#8RQgu{ z-M0sBE5XZcM(}ICujF zxUHhkXb$OfD1hde%t3AH20M+oNf#!W=&IVO*?FA(ckir+9jJNA$lxdMU6nCuQigT9 zvb>+X;e?=xXU|RynqUY@^N6u~W(H6zoNK$72q$D+nJ{QR20Zoz9W4ay&r%drJOQdE z_cQZxaz_7M5zPtaf-(~4zh|5$PH-|xae`;98DQ&_kj6TM!Rs^NbFQFuO3;P^XcHJ{ zYY7NLW>^35fQM#Nz|992&>SoiWN{&=Z2SKZT))Bh_%MnI+cBDhH>aqxv8yq&F|n(u zE1Me2Gnxr8x=Lm8Tk(rHuYAtyr6!gr8Z0VfQL=}VnLmtaPx!wrs#8?e+EQe8M0+w? zIRE?R9I-A%iOrBv8f*__ub3qR+h%!aS_8GH_!!yQM2$s_%L?Fu>h7`k5O5PU5`{FUx|$1Em{i{R1kaz+>H@K8-TFJR_t& zSJG!>XVYdhH8$60R5pdoA6qkm`Zq>1*RzS8I3cO0uxzHheoD%+#mp%wdI~dp<@Jp~ zGjA#T&oP6#Rcib8simCT&zz#RX_Fc#AA{P=kg`e?Uf&ymC-T&k!R5HQIJm20#yDY7 zdHKI9xseq$8#eri@F-ca^!00I1+ZB3h94UuJW4=ouu#q9WMJD2*;lP7sLm*^C@9Vd z>fA5;R{%nwVOpH1?gnF(;75TZq2M#es%wbZ~1n(0C z*EQgBRER+qv<6<73tVo1b_#>mZ$P#fnu6AJfm)$TZ0vT7#@-K4FiuF(k^g5WucO1H zbK=Aaw;Tb%2Qxt%N_bLg<#lxAnbhQUPMk;ybDnk@mKT`zFz~>}-#M8;`)S!t?3j!p zGiE6>E~)9}o|we6=iifmM^4O|RJNwu9a64A^ATuYAjeiQQEu?KoVmCdi@2x=XlP9d zG~#B}8$SMXJoMWsN7FK2C^O|hy;8Eb=U_051kAlB zt;*qJ5CWw^L4ICtPIhox6m)0=ySg!`1Q&(&=}x48GZtvZ^WPOv9nGu&n*Rj360!gb z(Z0oRCe%DpV^L+OnIO|ZBYdEB>8NIc_s)US5c2G;I%w~lstRKF96M;=8feWhXnGH{ zISQ1jK$})U(=edbCT67Y$kqF3up& zpw6JrV9sFA;LafKAmZX+V_{;TqoJZ8BLP`6%&Dslo*Yq9Gl6A#*t%d?*8rC|OdU*~ zu^Qa0z6&Oq1i{q5XW%7Ekii(}BJICN!BS8a5arCE-Q}`c?vN2oFzF5+F@lJLmetE@ z-35z7*btRSbJC!AlVsr9E-oS{zz!-uF`^057Z5WtQ(~$BZS?=!!6zaT!1(2^m8^`7 z46}j=-(MAwIMW?I5onLV$jAt}@4^CE>%$6OUm~c;$z%qulgvy&Yi|Bs`Nsp>69_*1 zU=Kx#x-2{%RPa#%TAy(*% zyuooHWCfA~k0n9o>o~#dka(c$uO^&ezS0d$KhWXZOuB6#})Xh-HWkCYUTHGZJ< z58{G$Mfib*jKBpCxXc2VJCY1+n|VR?4`|&0XvF~1QUOyzWzYaLvx1Se<}}b!fC3{? z*=d^AM$8H)G_66K=|O7&nAEH_L3K5#o?!;}*_grgj3}f}10F+DG!hpQh0KA04m$vC z<<(%G)tbDnN3w>ro6DctSHX{FHd>K2{IfR)&G8ic8)^E z%RqaS_ix=w@=z;UkJjY*r*TXu%fe zHcrlMoJ@&e>fc=mbp=xCbN-X#0})_Xo#5QY z$*6OJb1N5wWZJ{Ie?KP(r*K9`bDl^^0r5b4<@bY*oM3>q4ZwYMe(4XniqRAtNKgv2)BqMfu;795L1hG}+<}z!p#BTE+yT`?vW(`& zg39XP86eQXH6~_8pkr4+wLWAhR+cG3R&*L@_Z7Hl3mW4A*BcDrGK`%;hCzjaYrBf9 z5GQ2qI>!uhf+VjiGv>E`g2fLGvwS90zo0 z0k}SAG&T}v6c+`pAhKmNXEb9LH8urdM$;e;7DhE@&`|}Pt7KD;=uj`SHPBvAZcub|Q0~7gcA@(Eq3>Y*A5dMvzzmw_0QY>8MFr;H2w}rf1u6p=Hj5~ zeRe%2buJbIf!ECAp63KNm5hzdL5ng>O;n9R zEqu^^B~xSYye9{1I(*)f#XoA|S;k|aH9j%!e1goTpmYGrcAz=Xh(H!r*c@m&D~HZm zMy1S27be+=b1*wcX6S*GfeK$#H-grnX_4wi&}LjB+*SYz9>Oj&gPe81C^=J`>$+(? zzs*+$ZtzK*3@GP&GW?$no;_w@;DF?125|adR`@@g!GpO49Q;a8(L7q9hYB;HctU!9wBpZxf3J~!YKB&Fff3{pfrdL!YFDKplYD@W0MD| z2c4!1qG1@9I+#3+X8Z#27mN?0iPZ~IODha=14>vU$0s;vf^(x70|;6$L@`t_%wRac z@Qjg<(T6dKv4e3P<0Zy#Ogv0VOcqRjOesuNOnpq-m>HOrm_wM$m`^ajW8q;5W2s|V z#qxsX533HV9cvux9M)@W3TzQmcen0*+{ucfP{HFxi1S|x?1j+=a2y7C#Ca58pBiJE$M(~vo zn~;W3fzTwOZNhfK3Bs2|q(t0A8bnTrGKk8FT8Ku8Hi(`OV-Zsm^ARf&n;~{W?2ovT z_zVd#i5U_XBsC;$Boic?Bv(mZlKdxSBb6bwMe2;yJ*h9!Jkl!CHqs%|DbjV)bEH4W zFvwWQM94JAY?ApWDbjN&B4BZ`ldq?DYL5|p}>wkZ8kmQbFcd`S6`3ZIIXN`cB8m18QuR83T?ROhJP zQe#nbQ=6f7L+zisoqCdbh58EhI~o!iZW;v|hcrP8Z$b6uBZdsnDbcXeKnBnprWtn* zIF=b0_!!o~%V8&mHYl5sftBGZlnq*i@e;~rW>8_Yg0fi{I2ntfY*q$7#@SFd8v{4v zA<${dETG*9pcKW-z{mnR7mbVIBvhPLwjEAyW8Dto1p=>q= zF~(I4&J0BisSJq>B@C$yDGUk>NeqJ_Ky<)xNrGB9{DB!ev~W?=A4&d)1mV911ufM|xy z@Sc%bHE{D$e_Rg5;tVfWiV&ZWiVneU@&AbVPHUYn3Y0k zUP)$2PHKvwf|Y`yuDPy}fuRWl7ULM;3KXG(!7f)|Fl5k!Vg&|6n}Lau ziIJI+g^`t!jgg&^gOQVwi;DxDicy+ThEbMLj!~Xbfl-lBiBXwRg;AAJjZvLZgHe-Fi&2|Vhf$Xibk39k zqamXaqcNiiqbZ{qqdB7mqa~viqcx)qqb;KyqdlVoqa&jeqcfumqbs8uqdTJqqbH*m zqc@`uqc5W$qd#K+V<2M?V=!X~V<=-7V>n|3VDw7V=QAFV?1L5V)97VV+BV=iMJV?JX6Vx35VM$9V=ZGH zV?AR7V4q5V=H4DV>@F9V<%%5V>e?DV=rSLV?W~r#)*uR7$-AMVVuf1jd42T z491y^vlwSH&S9L(IFE5Y;{wKojEfi-GcI9V%D9YiIpYe(l?)3QS23<;T*J7QaUJ7& z#tn=c88xR-Gs<9@~ij0YJHF&<_-!g!SN7~^rq z6O1PrPcfcmJi~aF@f_oM#tV!W880zjX1v09mGK(mb;cWvHyJPkmC4Y6$$;gn&$cV|vn90b5 z$;gz+$c)LzoXN<7$;gt)D3Qr1iODFL$tZ=%D3!@5jmg-6$=Hy|*oev4n910L$=H<1 z*o?{8oXOaN$=H&~IFZRXiOD#b$vB0{IF-pbjmgA-$;6P!#E8knn90P1$;6b&#Ei+r zoXNz3$;6V$B$3G^iOD3H$s~ozB$de|jmgx2$<&a^)QHK{n90FWGoXOmR$=s63Jdw#f ziOD>f$vlP0JeA2jjmg4*$-qnoXNt1$- zGL^|PjVaN9DbbKA(TFM0m?_bODbbWE(Tpk4oGH z#h59@gek?8DaDK_#hfX{f+@w4DJ799C5b5|nJFcODJ2!u=V1K*pMf8#RAJb_prf#X zAvD4@QbECc2LoTA_Xf7$sE7?F(i=1)6VepALL)XXsV45^VBla#PF7BmR#e=;5V?WD zS=nV110#cTf|KqBMx6}`32C|;m~<3U6gC_P*ubI|wMm1K%h@&AH7GhlQCU&CD?(vI zKtP1z28T##g$))UmPKTw!bXUq#FPyh0TGH&p27wLkh}p%<$-_*g*1h(u0(|mTmcaY z(h3_CKyq9lmKlg;mLQ!F85t?Pfl)g$Qh5VIKtyU}r0xc09R*i~4J@jODGD1{odY5^ zuqr!kU{iLIR#c4Kz?h)Bfkj7IQCU$TWg}~nlLANvV)+Ix=M4-At{a%O6cskGIV*H2 zbZubN-e|z8+7%d)5Fnix6d9o$si?5QAvj_Kqqa22Lr`0FH?Zn#V0YHu#J~gz7B-y? z?8;8c3L6-dof0=NC8cd(Oy0nluz^)ecLTeQ0?2{f&dEDi7?Kn~?%v>#5D8L}-~x6a zht4K;ZU$#pCoM&IKy&J#20RzU6h>|34Ghj3SX2`fT)UJLL6HCsB?f6wNN!M&-rxWa zn+?pW%84!zE4XoJ-=Go@v4H`k3+gpwO+29VqU^MZn~T{sLQz^-F;YuWcLT4^MkXfL z4JnB(x*Pa(HZUeAC~V+y_5%4!VFQn{Q{)C-5HBb~VFRzSQ>5+&ejSAk0^lG~*ulb( z+@+kjfzLTXp({aQ1D~>!vhD@}9q*8cjVviHkt!Q_QZR7zFyiBT28yLlu6*e%d21INGrP>WF zs!m;93Seus6qPqHCc@a#5P6UmCe_3Zd|HZ;8+e@EH}E>UCv0FsjVgr=SR-&F1B0-# z%LYd04Geah7#SJCnM7EJVIu>RYe>Wfeq|>G*A3jtP8+zCH!vhPDI{!QOx!9Uz{tSI z;N;Ymuu+Ijdqa`7v{Iz*1`(Z&48q#F8$@+BGJXgM8*4ZPZ9I7D7&BZHi_?gj;&jf@~#QD-9) zh*r|s$PA*DbvCkqXce7}tRPxdXCoVkR@2$Y4x-g{HgbSy4V{ggAX-yL!3LbpwR98` zHV7mrI4f^pOmGI3HK07A2})GjIvcdKH)v_;ZqU(DP;ghk5!}j&7RsP<3a<)j#Yo)^ zy6`w)6x*PqwSiI8036DC$f1HNrLUu43U;S~4#NgUSIq3Xfl(W4DgcQyh;3m20T(-E zi;en>qFTBe40RN26x?z6WCMe9qJ{1TBON_)8{G}Ygp_VzbWXO=-C&}#k%>V}RY6a| z9aPk8U{dw$>T*|hS58!jNRkGXcgjwij2Rh4MYMD`nCfg`5Zl0_x`9O%tYibHvvz8i zp0a|1O_zo41~Y`Tf*x3b!Uh&)Cy*+I4G94e3L6{(BQ`TBFe^xJW>RC8igW@Ma2(DG zUCLn9%5Di8Se()GNrJ)#Mr}wb&g7hsqP&6GIWZ+5Vgr+NqVxu4=Y+@&%&O>m5|tGc zHn6BEyCqskD{tU%cH6+Dx`D$PY)gUyHcOO2wkU64aZUh*J*#Ts238DHH?XKBg6ajZ zBUBSo0w6^g!mdc&4d$RQP*70Vz^Vof17#Zv-3=CC;SC(hP6`SNZp!W(7`2r_v1JJo z2YUb-q6{GsdI~nmiqaq#GeHCuKyHBrIh*PRR#i_>QioNmkch%eTnWn1m{A5LUn`JJ z3L7|_q0UlB0M)zb0SAjpYaL|;Jy58*1w|;>MCxtSW)#uZ-CzS34nP*Rg$sjK!?dEP zvD4XLstuC?D}xzoud~5SyGudA29#L3EU>8Az~Zd8L0emQg9FGD-~4MbMw}DC34OFh!C|gJ?BE`32B-D*g zpum9n-x=h8MNr6toCx&?+{-RH8yG|(nR62ZC?5*zZ7|f*-QbEt+)ZaA1EYxW1|u!q z4emM{Otf@2cz{C9Rarq#!L3U<5f)CKI-umZ!9!bjgO|=G1_noM-3{J4n-~~D3?H3M zj9?L8olT5j5kHU`CvDvg{vb6VMgT|+h!F@<17ZY$)Yxh3ZU_dc0Wm^AYCw!okQxvp z45Y?ETX#b^NDYV)0a62EM1s_S7*QZK&f2;gqCsjvj2Ms_5F-|(2E>R1sj=7A-4G8_ z17akA)PNX?AT=OHlFkNmZ9Qn1CxbW}thIGFq<~pA+PWK3K_RojTziA9w(f>BoedUn z)#)G(Sak-N1yY>}W`UGu>1?osE6oORz)Ew#ERfP%FbkwKPiKP_TxmXt16Eo9W`UFz zf>|J?MLL@~S(sogBPZ<*9H|?aRRStNRgEr#_YQ^=K@l4n8T%qPFhcTv!A1sFr;Q8@ zS`eB8h2F`)z`zL>fwGtxTsEpOb_7OjaOjBG$eiM`Q4Pe~#nHgP$l}nE91^jSnZYG8 YGBR=_1CQ1Y#{aDwSb8@yF}N@Q05*b;^Z)<= diff --git a/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.woff b/BlazorCanvas/BlazorCanvas/wwwroot/css/open-iconic/font/fonts/open-iconic.woff deleted file mode 100644 index f9309988aeab3868040d3b322658902098eba27f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14984 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 E0PziV#{d8T