├── .gitignore ├── BlazoredRepairs.sln ├── LICENSE └── src ├── BlazoredRepairs.Client ├── BlazoredRepairs.Client.csproj ├── Extensions │ └── StringExtensions.cs ├── Features │ ├── App.razor │ ├── Dashboard │ │ ├── Chart.razor │ │ ├── ChartData.cs │ │ └── DashboardPage.razor │ ├── Login │ │ ├── Login.razor │ │ └── _Login.scss │ ├── NewRepair │ │ └── NewRepairPage.razor │ ├── Shared │ │ ├── Card │ │ │ ├── Card.razor │ │ │ └── _Card.scss │ │ └── Layout │ │ │ ├── HeaderBar │ │ │ ├── HeaderBar.razor │ │ │ ├── UserStatus.razor │ │ │ └── _HeaderBar.scss │ │ │ ├── MainLayout.razor │ │ │ ├── NavMenu │ │ │ ├── NavMenu.razor │ │ │ └── _NavMenu.scss │ │ │ └── _MainLayout.scss │ └── ViewRepairs │ │ └── ViewRepairPage.razor ├── Program.cs ├── Properties │ └── launchSettings.json ├── Providers │ └── TokenAuthenticationStateProvider.cs ├── Styles │ ├── LineAwesome │ │ ├── _bordered_pulled.scss │ │ ├── _core.scss │ │ ├── _fixed-width.scss │ │ ├── _icons.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _path.scss │ │ ├── _rotated-flipped.scss │ │ ├── _screen-reader.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ └── line-awesome.scss │ ├── Milligram │ │ ├── _Base.sass │ │ ├── _Blockquote.sass │ │ ├── _Button.sass │ │ ├── _Code.sass │ │ ├── _Color.sass │ │ ├── _Divider.sass │ │ ├── _Form.sass │ │ ├── _Grid.sass │ │ ├── _Image.sass │ │ ├── _Link.sass │ │ ├── _List.sass │ │ ├── _Spacing.sass │ │ ├── _Table.sass │ │ ├── _Typography.sass │ │ ├── _Utility.sass │ │ └── milligram.sass │ ├── Normalize │ │ ├── Normalize.scss │ │ ├── _NormalizeMixin.scss │ │ ├── _Variables.scss │ │ └── _VerticalRhythm.scss │ ├── _Base.scss │ ├── _Variables.scss │ └── blazored-repairs.scss ├── _Imports.razor ├── compilerconfig.json ├── compilerconfig.json.defaults └── wwwroot │ ├── blazored-repairs.css │ ├── blazored-repairs.min.css │ ├── favicon.ico │ ├── fonts │ ├── la-brands-400.eot │ ├── la-brands-400.svg │ ├── la-brands-400.ttf │ ├── la-brands-400.woff │ ├── la-brands-400.woff2 │ ├── la-regular-400.eot │ ├── la-regular-400.svg │ ├── la-regular-400.ttf │ ├── la-regular-400.woff │ ├── la-regular-400.woff2 │ ├── la-solid-900.eot │ ├── la-solid-900.svg │ ├── la-solid-900.ttf │ ├── la-solid-900.woff │ └── la-solid-900.woff2 │ ├── index.html │ └── js │ ├── chart-wrapper.js │ └── chart.min.js ├── BlazoredRepairs.Server ├── BlazoredRepairs.Server.csproj ├── Controllers │ ├── LoginController.cs │ └── RepairsController.cs ├── Program.cs ├── Properties │ └── launchSettings.json ├── Startup.cs ├── appsettings.Development.json └── appsettings.json └── BlazoredRepairs.Shared ├── BlazoredRepairs.Shared.csproj ├── LoginModel.cs ├── LoginResult.cs └── RepairModel.cs /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Aa][Rr][Mm]/ 27 | [Aa][Rr][Mm]64/ 28 | bld/ 29 | [Bb]in/ 30 | [Oo]bj/ 31 | [Ll]og/ 32 | [Ll]ogs/ 33 | 34 | # Visual Studio 2015/2017 cache/options directory 35 | .vs/ 36 | # Uncomment if you have tasks that create the project's static files in wwwroot 37 | #wwwroot/ 38 | 39 | # Visual Studio 2017 auto generated files 40 | Generated\ Files/ 41 | 42 | # MSTest test Results 43 | [Tt]est[Rr]esult*/ 44 | [Bb]uild[Ll]og.* 45 | 46 | # NUnit 47 | *.VisualState.xml 48 | TestResult.xml 49 | nunit-*.xml 50 | 51 | # Build Results of an ATL Project 52 | [Dd]ebugPS/ 53 | [Rr]eleasePS/ 54 | dlldata.c 55 | 56 | # Benchmark Results 57 | BenchmarkDotNet.Artifacts/ 58 | 59 | # .NET Core 60 | project.lock.json 61 | project.fragment.lock.json 62 | artifacts/ 63 | 64 | # StyleCop 65 | StyleCopReport.xml 66 | 67 | # Files built by Visual Studio 68 | *_i.c 69 | *_p.c 70 | *_h.h 71 | *.ilk 72 | *.meta 73 | *.obj 74 | *.iobj 75 | *.pch 76 | *.pdb 77 | *.ipdb 78 | *.pgc 79 | *.pgd 80 | *.rsp 81 | *.sbr 82 | *.tlb 83 | *.tli 84 | *.tlh 85 | *.tmp 86 | *.tmp_proj 87 | *_wpftmp.csproj 88 | *.log 89 | *.vspscc 90 | *.vssscc 91 | .builds 92 | *.pidb 93 | *.svclog 94 | *.scc 95 | 96 | # Chutzpah Test files 97 | _Chutzpah* 98 | 99 | # Visual C++ cache files 100 | ipch/ 101 | *.aps 102 | *.ncb 103 | *.opendb 104 | *.opensdf 105 | *.sdf 106 | *.cachefile 107 | *.VC.db 108 | *.VC.VC.opendb 109 | 110 | # Visual Studio profiler 111 | *.psess 112 | *.vsp 113 | *.vspx 114 | *.sap 115 | 116 | # Visual Studio Trace Files 117 | *.e2e 118 | 119 | # TFS 2012 Local Workspace 120 | $tf/ 121 | 122 | # Guidance Automation Toolkit 123 | *.gpState 124 | 125 | # ReSharper is a .NET coding add-in 126 | _ReSharper*/ 127 | *.[Rr]e[Ss]harper 128 | *.DotSettings.user 129 | 130 | # TeamCity is a build add-in 131 | _TeamCity* 132 | 133 | # DotCover is a Code Coverage Tool 134 | *.dotCover 135 | 136 | # AxoCover is a Code Coverage Tool 137 | .axoCover/* 138 | !.axoCover/settings.json 139 | 140 | # Visual Studio code coverage results 141 | *.coverage 142 | *.coveragexml 143 | 144 | # NCrunch 145 | _NCrunch_* 146 | .*crunch*.local.xml 147 | nCrunchTemp_* 148 | 149 | # MightyMoose 150 | *.mm.* 151 | AutoTest.Net/ 152 | 153 | # Web workbench (sass) 154 | .sass-cache/ 155 | 156 | # Installshield output folder 157 | [Ee]xpress/ 158 | 159 | # DocProject is a documentation generator add-in 160 | DocProject/buildhelp/ 161 | DocProject/Help/*.HxT 162 | DocProject/Help/*.HxC 163 | DocProject/Help/*.hhc 164 | DocProject/Help/*.hhk 165 | DocProject/Help/*.hhp 166 | DocProject/Help/Html2 167 | DocProject/Help/html 168 | 169 | # Click-Once directory 170 | publish/ 171 | 172 | # Publish Web Output 173 | *.[Pp]ublish.xml 174 | *.azurePubxml 175 | # Note: Comment the next line if you want to checkin your web deploy settings, 176 | # but database connection strings (with potential passwords) will be unencrypted 177 | *.pubxml 178 | *.publishproj 179 | 180 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 181 | # checkin your Azure Web App publish settings, but sensitive information contained 182 | # in these scripts will be unencrypted 183 | PublishScripts/ 184 | 185 | # NuGet Packages 186 | *.nupkg 187 | # NuGet Symbol Packages 188 | *.snupkg 189 | # The packages folder can be ignored because of Package Restore 190 | **/[Pp]ackages/* 191 | # except build/, which is used as an MSBuild target. 192 | !**/[Pp]ackages/build/ 193 | # Uncomment if necessary however generally it will be regenerated when needed 194 | #!**/[Pp]ackages/repositories.config 195 | # NuGet v3's project.json files produces more ignorable files 196 | *.nuget.props 197 | *.nuget.targets 198 | 199 | # Microsoft Azure Build Output 200 | csx/ 201 | *.build.csdef 202 | 203 | # Microsoft Azure Emulator 204 | ecf/ 205 | rcf/ 206 | 207 | # Windows Store app package directories and files 208 | AppPackages/ 209 | BundleArtifacts/ 210 | Package.StoreAssociation.xml 211 | _pkginfo.txt 212 | *.appx 213 | *.appxbundle 214 | *.appxupload 215 | 216 | # Visual Studio cache files 217 | # files ending in .cache can be ignored 218 | *.[Cc]ache 219 | # but keep track of directories ending in .cache 220 | !?*.[Cc]ache/ 221 | 222 | # Others 223 | ClientBin/ 224 | ~$* 225 | *~ 226 | *.dbmdl 227 | *.dbproj.schemaview 228 | *.jfm 229 | *.pfx 230 | *.publishsettings 231 | orleans.codegen.cs 232 | 233 | # Including strong name files can present a security risk 234 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 235 | #*.snk 236 | 237 | # Since there are multiple workflows, uncomment next line to ignore bower_components 238 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 239 | #bower_components/ 240 | 241 | # RIA/Silverlight projects 242 | Generated_Code/ 243 | 244 | # Backup & report files from converting an old project file 245 | # to a newer Visual Studio version. Backup files are not needed, 246 | # because we have git ;-) 247 | _UpgradeReport_Files/ 248 | Backup*/ 249 | UpgradeLog*.XML 250 | UpgradeLog*.htm 251 | ServiceFabricBackup/ 252 | *.rptproj.bak 253 | 254 | # SQL Server files 255 | *.mdf 256 | *.ldf 257 | *.ndf 258 | 259 | # Business Intelligence projects 260 | *.rdl.data 261 | *.bim.layout 262 | *.bim_*.settings 263 | *.rptproj.rsuser 264 | *- [Bb]ackup.rdl 265 | *- [Bb]ackup ([0-9]).rdl 266 | *- [Bb]ackup ([0-9][0-9]).rdl 267 | 268 | # Microsoft Fakes 269 | FakesAssemblies/ 270 | 271 | # GhostDoc plugin setting file 272 | *.GhostDoc.xml 273 | 274 | # Node.js Tools for Visual Studio 275 | .ntvs_analysis.dat 276 | node_modules/ 277 | 278 | # Visual Studio 6 build log 279 | *.plg 280 | 281 | # Visual Studio 6 workspace options file 282 | *.opt 283 | 284 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 285 | *.vbw 286 | 287 | # Visual Studio LightSwitch build output 288 | **/*.HTMLClient/GeneratedArtifacts 289 | **/*.DesktopClient/GeneratedArtifacts 290 | **/*.DesktopClient/ModelManifest.xml 291 | **/*.Server/GeneratedArtifacts 292 | **/*.Server/ModelManifest.xml 293 | _Pvt_Extensions 294 | 295 | # Paket dependency manager 296 | .paket/paket.exe 297 | paket-files/ 298 | 299 | # FAKE - F# Make 300 | .fake/ 301 | 302 | # CodeRush personal settings 303 | .cr/personal 304 | 305 | # Python Tools for Visual Studio (PTVS) 306 | __pycache__/ 307 | *.pyc 308 | 309 | # Cake - Uncomment if you are using it 310 | # tools/** 311 | # !tools/packages.config 312 | 313 | # Tabs Studio 314 | *.tss 315 | 316 | # Telerik's JustMock configuration file 317 | *.jmconfig 318 | 319 | # BizTalk build output 320 | *.btp.cs 321 | *.btm.cs 322 | *.odx.cs 323 | *.xsd.cs 324 | 325 | # OpenCover UI analysis results 326 | OpenCover/ 327 | 328 | # Azure Stream Analytics local run output 329 | ASALocalRun/ 330 | 331 | # MSBuild Binary and Structured Log 332 | *.binlog 333 | 334 | # NVidia Nsight GPU debugger configuration file 335 | *.nvuser 336 | 337 | # MFractors (Xamarin productivity tool) working folder 338 | .mfractor/ 339 | 340 | # Local History for Visual Studio 341 | .localhistory/ 342 | 343 | # BeatPulse healthcheck temp database 344 | healthchecksdb 345 | 346 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 347 | MigrationBackup/ 348 | 349 | # Ionide (cross platform F# VS Code tools) working folder 350 | .ionide/ 351 | -------------------------------------------------------------------------------- /BlazoredRepairs.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.29521.150 5 | MinimumVisualStudioVersion = 15.0.26124.0 6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazoredRepairs.Server", "src\BlazoredRepairs.Server\BlazoredRepairs.Server.csproj", "{97D011A9-852E-43A4-9213-9D9E977CF709}" 7 | EndProject 8 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazoredRepairs.Client", "src\BlazoredRepairs.Client\BlazoredRepairs.Client.csproj", "{AA25B685-67B7-4F4B-8860-F8ABEB60611D}" 9 | EndProject 10 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazoredRepairs.Shared", "src\BlazoredRepairs.Shared\BlazoredRepairs.Shared.csproj", "{54A7FABC-9427-4C3A-8974-1FFF95591749}" 11 | EndProject 12 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1D79B310-802A-4AFA-A6FF-FC4BA064B80D}" 13 | ProjectSection(SolutionItems) = preProject 14 | demos.demosnippets = demos.demosnippets 15 | EndProjectSection 16 | EndProject 17 | Global 18 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 19 | Debug|Any CPU = Debug|Any CPU 20 | Debug|x64 = Debug|x64 21 | Debug|x86 = Debug|x86 22 | Release|Any CPU = Release|Any CPU 23 | Release|x64 = Release|x64 24 | Release|x86 = Release|x86 25 | EndGlobalSection 26 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 27 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 28 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Debug|Any CPU.Build.0 = Debug|Any CPU 29 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Debug|x64.ActiveCfg = Debug|Any CPU 30 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Debug|x64.Build.0 = Debug|Any CPU 31 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Debug|x86.ActiveCfg = Debug|Any CPU 32 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Debug|x86.Build.0 = Debug|Any CPU 33 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Release|Any CPU.ActiveCfg = Release|Any CPU 34 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Release|Any CPU.Build.0 = Release|Any CPU 35 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Release|x64.ActiveCfg = Release|Any CPU 36 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Release|x64.Build.0 = Release|Any CPU 37 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Release|x86.ActiveCfg = Release|Any CPU 38 | {97D011A9-852E-43A4-9213-9D9E977CF709}.Release|x86.Build.0 = Release|Any CPU 39 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 40 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Debug|Any CPU.Build.0 = Debug|Any CPU 41 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Debug|x64.ActiveCfg = Debug|Any CPU 42 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Debug|x64.Build.0 = Debug|Any CPU 43 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Debug|x86.ActiveCfg = Debug|Any CPU 44 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Debug|x86.Build.0 = Debug|Any CPU 45 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Release|Any CPU.ActiveCfg = Release|Any CPU 46 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Release|Any CPU.Build.0 = Release|Any CPU 47 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Release|x64.ActiveCfg = Release|Any CPU 48 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Release|x64.Build.0 = Release|Any CPU 49 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Release|x86.ActiveCfg = Release|Any CPU 50 | {AA25B685-67B7-4F4B-8860-F8ABEB60611D}.Release|x86.Build.0 = Release|Any CPU 51 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 52 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Debug|Any CPU.Build.0 = Debug|Any CPU 53 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Debug|x64.ActiveCfg = Debug|Any CPU 54 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Debug|x64.Build.0 = Debug|Any CPU 55 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Debug|x86.ActiveCfg = Debug|Any CPU 56 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Debug|x86.Build.0 = Debug|Any CPU 57 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Release|Any CPU.ActiveCfg = Release|Any CPU 58 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Release|Any CPU.Build.0 = Release|Any CPU 59 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Release|x64.ActiveCfg = Release|Any CPU 60 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Release|x64.Build.0 = Release|Any CPU 61 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Release|x86.ActiveCfg = Release|Any CPU 62 | {54A7FABC-9427-4C3A-8974-1FFF95591749}.Release|x86.Build.0 = Release|Any CPU 63 | EndGlobalSection 64 | GlobalSection(SolutionProperties) = preSolution 65 | HideSolutionNode = FALSE 66 | EndGlobalSection 67 | GlobalSection(ExtensibilityGlobals) = postSolution 68 | SolutionGuid = {DBAD6C16-C636-4AA9-A92F-B7FB6E8E91E1} 69 | EndGlobalSection 70 | EndGlobal 71 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Chris Sainty 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/BlazoredRepairs.Client.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net5.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Extensions/StringExtensions.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Security.Claims; 5 | using System.Text.Json; 6 | 7 | namespace BlazoredRepairs.Client.Extensions 8 | { 9 | public static class StringExtensions 10 | { 11 | public static IEnumerable ParseClaimsFromJwt(this string jwt) 12 | { 13 | var claims = new List(); 14 | var payload = jwt.Split('.')[1]; 15 | var jsonBytes = ParseBase64WithoutPadding(payload); 16 | var keyValuePairs = JsonSerializer.Deserialize>(jsonBytes); 17 | 18 | keyValuePairs.TryGetValue(ClaimTypes.Role, out object roles); 19 | 20 | if (roles != null) 21 | { 22 | if (roles.ToString().Trim().StartsWith("[")) 23 | { 24 | var parsedRoles = JsonSerializer.Deserialize(roles.ToString()); 25 | 26 | foreach (var parsedRole in parsedRoles) 27 | { 28 | claims.Add(new Claim(ClaimTypes.Role, parsedRole)); 29 | } 30 | } 31 | else 32 | { 33 | claims.Add(new Claim(ClaimTypes.Role, roles.ToString())); 34 | } 35 | 36 | keyValuePairs.Remove(ClaimTypes.Role); 37 | } 38 | 39 | claims.AddRange(keyValuePairs.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString()))); 40 | 41 | return claims; 42 | } 43 | 44 | private static byte[] ParseBase64WithoutPadding(string base64) 45 | { 46 | switch (base64.Length % 4) 47 | { 48 | case 2: base64 += "=="; break; 49 | case 3: base64 += "="; break; 50 | } 51 | return Convert.FromBase64String(base64); 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/App.razor: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |

Sorry, there's nothing at this address.

12 |
13 |
14 |
15 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Dashboard/Chart.razor: -------------------------------------------------------------------------------- 1 | @implements IAsyncDisposable 2 | @inject IJSRuntime _jsRuntime 3 | 4 | 5 | 6 | @code { 7 | private ElementReference _chartContainer; 8 | private IJSObjectReference _module; 9 | 10 | [Parameter] public ChartData Data { get; set; } 11 | [Parameter] public string Type { get; set; } 12 | 13 | protected override async Task OnAfterRenderAsync(bool firstRender) 14 | { 15 | if (firstRender) 16 | { 17 | _module = await _jsRuntime.InvokeAsync("import", "./js/chart-wrapper.js"); 18 | } 19 | 20 | await _module.InvokeVoidAsync("buildChart", _chartContainer, Type, Data); 21 | } 22 | 23 | async ValueTask IAsyncDisposable.DisposeAsync() 24 | => await _module.DisposeAsync(); 25 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Dashboard/ChartData.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | 6 | namespace BlazoredRepairs.Client.Features.Dashboard 7 | { 8 | public class ChartData 9 | { 10 | public List Labels { get; set; } = new List(); 11 | public List Datasets { get; set; } = new List(); 12 | } 13 | 14 | public class DataSet 15 | { 16 | public string Label { get; set; } 17 | public List Data { get; set; } = new List(); 18 | public List BackgroundColor { get; set; } = new List(); 19 | public List BorderColor { get; set; } = new List(); 20 | public int BorderWidth { get; set; } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Dashboard/DashboardPage.razor: -------------------------------------------------------------------------------- 1 | @page "/" 2 | @inject HttpClient _httpClient 3 | @attribute [Authorize] 4 | 5 |

Dashboard

6 | 7 | 8 | 9 | 10 | 11 | @code { 12 | 13 | ChartData _chartData; 14 | 15 | protected override async Task OnInitializedAsync() 16 | { 17 | var repairs = await _httpClient.GetFromJsonAsync>("/api/repairs"); 18 | CreateChartData(repairs); 19 | } 20 | 21 | private void CreateChartData(List repairs) 22 | { 23 | _chartData = new ChartData 24 | { 25 | Labels = new List { "Completed Repairs", "Outstanding Repairs" }, 26 | Datasets = new List 27 | { 28 | new DataSet 29 | { 30 | Label = "Completed Repairs", 31 | Data = new List { repairs.Count(x => x.Complete), repairs.Count(x => !x.Complete) }, 32 | BackgroundColor = new List { "rgba(63, 191, 63, 0.5)", "rgba(54, 162, 235, 0.2)" }, 33 | BorderColor = new List { "rgba(51, 153, 51, 0.70)", "rgba(54, 162, 235, 1)" } 34 | } 35 | } 36 | }; 37 | } 38 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Login/Login.razor: -------------------------------------------------------------------------------- 1 | @inject HttpClient _httpClient 2 | @inject Providers.TokenAuthenticationStateProvider _tokenAuthStateProvider 3 | 4 | 27 | 28 | @code { 29 | 30 | LoginModel _loginModel = new LoginModel(); 31 | bool _showError = false; 32 | 33 | private async Task HandleSubmit() 34 | { 35 | var response = await _httpClient.PostAsJsonAsync("/api/login", _loginModel); 36 | var loginResult = await response.Content.ReadFromJsonAsync(); 37 | 38 | if (loginResult.Successful) 39 | { 40 | await _tokenAuthStateProvider.Login(loginResult.Token); 41 | } 42 | else 43 | { 44 | _showError = true; 45 | } 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Login/_Login.scss: -------------------------------------------------------------------------------- 1 | @import "../../Styles/_Variables.scss"; 2 | 3 | .login-panel { 4 | background: $white; 5 | padding: $size-32; 6 | box-shadow: $box-shadow-medium; 7 | border-radius: $size-8; 8 | margin-bottom: $size-48; 9 | position: relative; 10 | max-width: 500px; 11 | margin: $size-64 auto; 12 | 13 | &.accent { 14 | border-top: $size-4 solid $orange-500; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/NewRepair/NewRepairPage.razor: -------------------------------------------------------------------------------- 1 | @page "/repairs/new" 2 | @inject HttpClient _httpClient 3 | @attribute [Authorize] 4 | 5 |

New Repair

6 | 7 | @if (_showSuccess) 8 | { 9 |
10 | New Repair Saved Successfully! 11 |
12 | } 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | @code { 47 | bool _showSuccess = false; 48 | RepairModel _repairModel = new RepairModel(); 49 | 50 | private async Task HandleFormSubmit() 51 | { 52 | var response = await _httpClient.PostAsJsonAsync("/api/repairs", _repairModel); 53 | 54 | if (response.IsSuccessStatusCode) 55 | { 56 | _showSuccess = true; 57 | _repairModel = new RepairModel(); 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Shared/Card/Card.razor: -------------------------------------------------------------------------------- 1 | 
2 | @ChildContent 3 |
4 | 5 | @code { 6 | [Parameter] public RenderFragment ChildContent { get; set; } 7 | } 8 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Shared/Card/_Card.scss: -------------------------------------------------------------------------------- 1 | @import "../../Styles/_Variables.scss"; 2 | 3 | .card { 4 | background: $white; 5 | padding: $size-32; 6 | box-shadow: $box-shadow-medium; 7 | border-radius: $size-8; 8 | margin-bottom: $size-48; 9 | position: relative; 10 | 11 | &.accent { 12 | border-top: $size-4 solid $orange-500; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Shared/Layout/HeaderBar/HeaderBar.razor: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Shared/Layout/HeaderBar/UserStatus.razor: -------------------------------------------------------------------------------- 1 | @inject Providers.TokenAuthenticationStateProvider _tokenAuthStateProvider 2 | 3 | 4 | 8 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Shared/Layout/HeaderBar/_HeaderBar.scss: -------------------------------------------------------------------------------- 1 | @import "../../../Styles/_Variables.scss"; 2 | 3 | .header-bar { 4 | display: flex; 5 | justify-content: space-between; 6 | align-items: center; 7 | padding: $size-12 $size-32; 8 | margin-bottom: $size-32; 9 | background-color: #fff; 10 | height: $size-64; 11 | box-shadow: $box-shadow-medium; 12 | 13 | .logo { 14 | display: flex; 15 | align-items: center; 16 | justify-content: center; 17 | text-decoration: none; 18 | font-size: $font-size-30; 19 | font-weight: $font-medium; 20 | color: $grey-600; 21 | background: $white; 22 | 23 | .logo-text { 24 | opacity: 1; 25 | transition: all .2s; 26 | margin: 0; 27 | 28 | span { 29 | font-weight: $font-black; 30 | color: $orange-500; 31 | } 32 | } 33 | } 34 | 35 | .menu { 36 | display: flex; 37 | flex-direction: row; 38 | align-items: center; 39 | justify-content: space-between; 40 | font-size: $font-size-20; 41 | 42 | button { 43 | display: flex; 44 | align-items: center; 45 | margin: 0 $size-16; 46 | background: white; 47 | color: $orange-600; 48 | 49 | i { 50 | font-size: $font-size-24; 51 | 52 | &:hover { 53 | color: #606c76; 54 | } 55 | } 56 | 57 | &:hover { 58 | color: #606c76; 59 | } 60 | } 61 | 62 | a { 63 | display: flex; 64 | padding-left: $size-16; 65 | color: $grey-500; 66 | text-decoration: none; 67 | 68 | &:hover { 69 | color: $orange-500; 70 | } 71 | } 72 | 73 | a.active { 74 | color: $orange-500; 75 | } 76 | 77 | a:last-child { 78 | padding-right: 0; 79 | } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Shared/Layout/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 | 4 | 5 |
6 | 9 | 10 |
11 | @Body 12 |
13 |
14 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Shared/Layout/NavMenu/NavMenu.razor: -------------------------------------------------------------------------------- 1 |  18 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Shared/Layout/NavMenu/_NavMenu.scss: -------------------------------------------------------------------------------- 1 | @import "../../../Styles/_Variables.scss"; 2 | 3 | .navmenu { 4 | display: flex; 5 | flex-direction: column; 6 | width: 22rem; 7 | margin: 0 $size-64 0 0; 8 | 9 | .menu-container { 10 | display: flex; 11 | flex: 1; 12 | flex-direction: column; 13 | justify-content: space-between; 14 | 15 | .menu { 16 | display: flex; 17 | 18 | ul { 19 | list-style: none; 20 | display: flex; 21 | flex-direction: column; 22 | flex: 1; 23 | margin: 0; 24 | padding: 0; 25 | 26 | a { 27 | display: flex; 28 | align-items: baseline; 29 | padding: $size-12 $size-16; 30 | color: $grey-600; 31 | text-decoration: none; 32 | font-size: $font-size-16; 33 | font-weight: $font-medium; 34 | 35 | &:hover { 36 | color: $orange-500; 37 | 38 | i { 39 | color: $orange-500; 40 | } 41 | } 42 | 43 | i { 44 | color: $grey-500; 45 | margin-right: 1rem; 46 | font-size: $font-size-18; 47 | } 48 | 49 | span { 50 | transition: display .2s; 51 | } 52 | } 53 | 54 | a.active { 55 | background-color: $white; 56 | color: $orange-500; 57 | box-shadow: $box-shadow; 58 | border-radius: $size-8; 59 | 60 | i { 61 | color: $orange-500; 62 | } 63 | } 64 | } 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/Shared/Layout/_MainLayout.scss: -------------------------------------------------------------------------------- 1 | @import "../../Styles/_Variables.scss"; 2 | 3 | app { 4 | position: relative; 5 | display: flex; 6 | flex-direction: column; 7 | } 8 | 9 | .main { 10 | display: flex; 11 | flex-direction: row; 12 | padding: 0 $size-32 $size-32 $size-32; 13 | 14 | .sidebar { 15 | width: 250px; 16 | margin-right: $size-64; 17 | } 18 | 19 | .content { 20 | flex: 1; 21 | } 22 | } 23 | 24 | #blazor-error-ui { 25 | background: lightyellow; 26 | bottom: 0; 27 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); 28 | display: none; 29 | left: 0; 30 | padding: 0.6rem 1.25rem 0.7rem 1.25rem; 31 | position: fixed; 32 | width: 100%; 33 | z-index: 1000; 34 | 35 | .dismiss { 36 | cursor: pointer; 37 | position: absolute; 38 | right: 0.75rem; 39 | top: 0.5rem; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Features/ViewRepairs/ViewRepairPage.razor: -------------------------------------------------------------------------------- 1 | @page "/repairs" 2 | @inject HttpClient _httpClient 3 | @attribute [Authorize] 4 | 5 |

View Repairs

6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | @foreach (var item in _repairs) 22 | { 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | } 31 | 32 |
NameIssueTradeContact NumberComplete
@item.Name@item.Issue@item.Trade@item.ContactNumber@(item.Complete ? "Yes" : "No")
33 |
34 |
35 | 36 | 37 |

Not Authorized

38 |

You do not have permissions to view this area.

39 |
40 |
41 |
42 | 43 | @code { 44 | 45 | List _repairs = new List(); 46 | 47 | protected override async Task OnInitializedAsync() 48 | { 49 | _repairs = await _httpClient.GetFromJsonAsync>("/api/repairs"); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Net.Http; 3 | using System.Threading.Tasks; 4 | using Blazored.LocalStorage; 5 | using BlazoredRepairs.Client.Features; 6 | using BlazoredRepairs.Client.Providers; 7 | using Microsoft.AspNetCore.Components.Authorization; 8 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 9 | using Microsoft.Extensions.DependencyInjection; 10 | 11 | namespace BlazoredRepairs.Client 12 | { 13 | public class Program 14 | { 15 | public static async Task Main(string[] args) 16 | { 17 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 18 | builder.RootComponents.Add("app"); 19 | 20 | builder.Services.AddHttpClient("BlazoredRepairs.ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress)); 21 | 22 | // Supply HttpClient instances that include access tokens when making requests to the server project 23 | builder.Services.AddScoped(sp => sp.GetRequiredService().CreateClient("BlazoredRepairs.ServerAPI")); 24 | builder.Services.AddOptions(); 25 | builder.Services.AddAuthorizationCore(); 26 | builder.Services.AddBlazoredLocalStorage(); 27 | builder.Services.AddScoped(); 28 | builder.Services.AddScoped(provider => provider.GetRequiredService()); 29 | 30 | await builder.Build().RunAsync(); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:54861/", 7 | "sslPort": 44360 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "BlazoredRepairs.Client": { 20 | "commandName": "Project", 21 | "launchBrowser": true, 22 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 23 | "environmentVariables": { 24 | "ASPNETCORE_ENVIRONMENT": "Development" 25 | }, 26 | "applicationUrl": "https://localhost:5001;http://localhost:5000" 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Providers/TokenAuthenticationStateProvider.cs: -------------------------------------------------------------------------------- 1 | using Blazored.LocalStorage; 2 | using Microsoft.AspNetCore.Components.Authorization; 3 | using System.Net.Http; 4 | using System.Net.Http.Headers; 5 | using System.Security.Claims; 6 | using System.Threading.Tasks; 7 | using BlazoredRepairs.Client.Extensions; 8 | 9 | namespace BlazoredRepairs.Client.Providers 10 | { 11 | public class TokenAuthenticationStateProvider : AuthenticationStateProvider 12 | { 13 | private readonly HttpClient _httpClient; 14 | private readonly ILocalStorageService _localStorage; 15 | 16 | public TokenAuthenticationStateProvider(HttpClient httpClient, ILocalStorageService localStorage) 17 | { 18 | _httpClient = httpClient; 19 | _localStorage = localStorage; 20 | } 21 | 22 | public override async Task GetAuthenticationStateAsync() 23 | { 24 | var token = await _localStorage.GetItemAsync("token"); 25 | var identity = string.IsNullOrWhiteSpace(token) 26 | ? new ClaimsIdentity() 27 | : new ClaimsIdentity(token.ParseClaimsFromJwt(), "jwt"); 28 | 29 | _httpClient.DefaultRequestHeaders.Authorization = string.IsNullOrWhiteSpace(token) 30 | ? null 31 | : new AuthenticationHeaderValue("bearer", token); 32 | 33 | return new AuthenticationState(new ClaimsPrincipal(identity)); 34 | } 35 | 36 | public async Task Login(string token) 37 | { 38 | await _localStorage.SetItemAsync("token", token); 39 | 40 | NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); 41 | } 42 | 43 | public async Task Logout() 44 | { 45 | await _localStorage.RemoveItemAsync("token"); 46 | 47 | NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/_bordered_pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$la-css-prefix}-border { 5 | border: solid 0.08em #eee; 6 | border-radius: .1em; 7 | padding: .2em .25em .15em; 8 | } 9 | 10 | .#{$la-css-prefix}-pull-left { float: left; } 11 | .#{$la-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$la-css-prefix} { 14 | &.#{$la-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$la-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | .#{$la-css-prefix} { 19 | &.pull-left { margin-right: .3em; } 20 | &.pull-right { margin-left: .3em; } 21 | } 22 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/_core.scss: -------------------------------------------------------------------------------- 1 | .lar, 2 | .las, 3 | .lab { 4 | -moz-osx-font-smoothing: grayscale; 5 | -webkit-font-smoothing: antialiased; 6 | display: inline-block; 7 | font-style: normal; 8 | font-variant: normal; 9 | text-rendering: auto; 10 | line-height: 1; 11 | } 12 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | .#{$la-css-prefix}-fw { 2 | width: 1.25em; 3 | text-align: center; 4 | } 5 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/_larger.scss: -------------------------------------------------------------------------------- 1 | .#{$la-css-prefix}-lg { 2 | font-size: 1.33333em; 3 | line-height: 0.75em; 4 | vertical-align: -.0667em; 5 | } 6 | 7 | .#{$la-css-prefix}-xs { font-size: 0.75em; } 8 | .#{$la-css-prefix}-2x { font-size: 1em; } 9 | .#{$la-css-prefix}-2x { font-size: 2em; } 10 | .#{$la-css-prefix}-3x { font-size: 3em; } 11 | .#{$la-css-prefix}-4x { font-size: 4em; } 12 | .#{$la-css-prefix}-5x { font-size: 5em; } 13 | .#{$la-css-prefix}-6x { font-size: 6em; } 14 | .#{$la-css-prefix}-7x { font-size: 7em; } 15 | .#{$la-css-prefix}-8x { font-size: 8em; } 16 | .#{$la-css-prefix}-9x { font-size: 9em; } 17 | .#{$la-css-prefix}-10x { font-size: 10em; } 18 | 19 | .#{$la-css-prefix}-fw { 20 | text-align: center; 21 | width: 1.25em; 22 | } 23 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/_list.scss: -------------------------------------------------------------------------------- 1 | .#{$la-css-prefix}-ul { 2 | padding-left: 0; 3 | margin-left: $la-li-width; 4 | list-style-type: none; 5 | > li { 6 | position: relative; 7 | } 8 | } 9 | 10 | .#{$la-css-prefix}-li { 11 | position: absolute; 12 | left: -2em; 13 | text-align: center; 14 | width: $la-li-width; 15 | line-height: inherit; 16 | &.#{$la-css-prefix}-lg { 17 | left: -$la-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Only display content to screen readers. A la Bootstrap 4. 2 | // 3 | // See: http://a11yproject.com/posts/how-to-hide-content/ 4 | 5 | @mixin sr-only { 6 | border: 0; 7 | clip: rect(0, 0, 0, 0); 8 | height: 1px; 9 | margin: -1px; 10 | overflow: hidden; 11 | padding: 0; 12 | position: absolute; 13 | width: 1px; 14 | } 15 | 16 | // Use in conjunction with .sr-only to only display content when it's focused. 17 | // 18 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 19 | // 20 | // Credit: HTML5 Boilerplate 21 | 22 | @mixin sr-only-focusable { 23 | &:active, 24 | &:focus { 25 | clip: auto; 26 | height: auto; 27 | margin: 0; 28 | overflow: visible; 29 | position: static; 30 | width: auto; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/_path.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: $la-font-name-lab; 3 | font-style: normal; 4 | font-weight: normal; 5 | font-display: auto; 6 | src: url('#{$la-font-path}/la-brands-400.eot'); 7 | src: url("#{$la-font-path}/la-brands-400.eot?#iefix") format("embedded-opentype"), 8 | url("#{$la-font-path}/la-brands-400.woff2") format("woff2"), 9 | url("#{$la-font-path}/la-brands-400.woff") format("woff"), 10 | url("#{$la-font-path}/la-brands-400.ttf") format("truetype"), 11 | url("#{$la-font-path}/la-brands-400.svg#lineawesome") format("svg"); 12 | } 13 | 14 | .#{$la-css-prefix-lab} { 15 | font-family: $la-font-name-lab; 16 | font-weight: 400; 17 | } 18 | 19 | @font-face { 20 | font-family: $la-font-name-lar; 21 | font-style: normal; 22 | font-weight: 400; 23 | font-display: auto; 24 | src: url('#{$la-font-path}/la-regular-400.eot'); 25 | src: url("#{$la-font-path}/la-regular-400.eot?#iefix") format("embedded-opentype"), 26 | url("#{$la-font-path}/la-regular-400.woff2") format("woff2"), 27 | url("#{$la-font-path}/la-regular-400.woff") format("woff"), 28 | url("#{$la-font-path}/la-regular-400.ttf") format("truetype"), 29 | url("#{$la-font-path}/la-regular-400.svg#lineawesome") format("svg"); 30 | } 31 | 32 | .#{$la-css-prefix-lar} { 33 | font-family: $la-font-name-lar; 34 | font-weight: 400; 35 | } 36 | 37 | @font-face { 38 | font-family: $la-font-name-las; 39 | font-style: normal; 40 | font-weight: 900; 41 | font-display: auto; 42 | src: url('#{$la-font-path}/la-solid-900.eot'); 43 | src: url("#{$la-font-path}/la-solid-900.eot?#iefix") format("embedded-opentype"), 44 | url("#{$la-font-path}/la-solid-900.woff2") format("woff2"), 45 | url("#{$la-font-path}/la-solid-900.woff") format("woff"), 46 | url("#{$la-font-path}/la-solid-900.ttf") format("truetype"), 47 | url("#{$la-font-path}/la-solid-900.svg#lineawesome") format("svg"); 48 | } 49 | 50 | .#{$la-css-prefix-las} { 51 | font-family: $la-font-name-las; 52 | font-weight: 900; 53 | } 54 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | .la-pull-left { 2 | float: left; 3 | } 4 | 5 | .la-pull-right { 6 | float: right; 7 | } 8 | 9 | .la.la-pull-left, 10 | .las.la-pull-left, 11 | .lar.la-pull-left, 12 | .lal.la-pull-left, 13 | .lab.la-pull-left { 14 | margin-right: .3em; 15 | } 16 | 17 | .la.la-pull-right, 18 | .las.la-pull-right, 19 | .lar.la-pull-right, 20 | .lal.la-pull-right, 21 | .lab.la-pull-right { 22 | margin-left: .3em; 23 | } 24 | 25 | .la-spin { 26 | -webkit-animation: la-spin 2s infinite linear; 27 | animation: la-spin 2s infinite linear; 28 | } 29 | 30 | .la-pulse { 31 | -webkit-animation: la-spin 1s infinite steps(8); 32 | animation: la-spin 1s infinite steps(8); 33 | } 34 | 35 | @-webkit-keyframes la-spin { 36 | 0% { 37 | -webkit-transform: rotate(0deg); 38 | transform: rotate(0deg); 39 | } 40 | 100% { 41 | -webkit-transform: rotate(360deg); 42 | transform: rotate(360deg); 43 | } 44 | } 45 | 46 | @keyframes la-spin { 47 | 0% { 48 | -webkit-transform: rotate(0deg); 49 | transform: rotate(0deg); 50 | } 51 | 100% { 52 | -webkit-transform: rotate(360deg); 53 | transform: rotate(360deg); 54 | } 55 | } 56 | 57 | .la-rotate-90 { 58 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; 59 | -webkit-transform: rotate(90deg); 60 | transform: rotate(90deg); 61 | } 62 | 63 | .la-rotate-180 { 64 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; 65 | -webkit-transform: rotate(180deg); 66 | transform: rotate(180deg); 67 | } 68 | 69 | .la-rotate-270 { 70 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; 71 | -webkit-transform: rotate(270deg); 72 | transform: rotate(270deg); 73 | } 74 | 75 | .la-flip-horizontal { 76 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; 77 | -webkit-transform: scale(-1, 1); 78 | transform: scale(-1, 1); 79 | } 80 | 81 | .la-flip-vertical { 82 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; 83 | -webkit-transform: scale(1, -1); 84 | transform: scale(1, -1); 85 | } 86 | 87 | .la-flip-both, .la-flip-horizontal.la-flip-vertical { 88 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; 89 | -webkit-transform: scale(-1, -1); 90 | transform: scale(-1, -1); 91 | } 92 | 93 | :root .la-rotate-90, 94 | :root .la-rotate-180, 95 | :root .la-rotate-270, 96 | :root .la-flip-horizontal, 97 | :root .la-flip-vertical, 98 | :root .la-flip-both { 99 | -webkit-filter: none; 100 | filter: none; 101 | } 102 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | .sr-only { @include sr-only(); } 2 | .sr-only-focusable { @include sr-only-focusable(); } 3 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/_stacked.scss: -------------------------------------------------------------------------------- 1 | .#{$la-css-prefix}-stack { 2 | display: inline-block; 3 | height: 2em; 4 | line-height: 2em; 5 | position: relative; 6 | vertical-align: middle; 7 | width: 2.5em; 8 | } 9 | 10 | .#{$la-css-prefix}-stack-1x, 11 | .#{$la-css-prefix}-stack-2x { 12 | left: 0; 13 | position: absolute; 14 | text-align: center; 15 | width: 100%; 16 | } 17 | 18 | .#{$la-css-prefix}-stack-1x { 19 | line-height: inherit; 20 | } 21 | 22 | .#{$la-css-prefix}-stack-2x { 23 | font-size: 2em; 24 | } 25 | 26 | .#{$la-css-prefix}-inverse { 27 | color: $la-inverse; 28 | } 29 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/_variables.scss: -------------------------------------------------------------------------------- 1 | $la-font-path: "/fonts" !default; 2 | $la-font-size-base: 14px !default; 3 | $la-line-height-base: 1 !default; 4 | $la-border-color: #eee !default; 5 | $la-inverse: #fff !default; 6 | $la-version: 1.3.0 !default; 7 | $la-li-width: (20em / 14) !default; 8 | 9 | @function la-content($la-var) { 10 | @return unquote("\"#{ $la-var }\""); 11 | } 12 | 13 | $la-css-prefix: la; 14 | 15 | $la-font-name-lar: Line Awesome Free !default; 16 | $la-css-prefix-lar: lar !default; 17 | 18 | $la-font-name-las: Line Awesome Free !default; 19 | $la-css-prefix-las: las !default; 20 | 21 | $la-font-name-lab: Line Awesome Brands !default; 22 | $la-css-prefix-lab: lab !default; 23 | 24 | $la-500px: \f26e; 25 | $la-accessible-icon: \f368; 26 | $la-accusoft: \f369; 27 | $la-acquisitions-incorporated: \f6af; 28 | $la-ad: \f641; 29 | $la-address-book: \f2b9; 30 | $la-address-card: \f2bb; 31 | $la-adjust: \f042; 32 | $la-adn: \f170; 33 | $la-adobe: \f778; 34 | $la-adversal: \f36a; 35 | $la-affiliatetheme: \f36b; 36 | $la-air-freshener: \f5d0; 37 | $la-airbnb: \f834; 38 | $la-algolia: \f36c; 39 | $la-align-center: \f037; 40 | $la-align-justify: \f039; 41 | $la-align-left: \f036; 42 | $la-align-right: \f038; 43 | $la-alipay: \f642; 44 | $la-allergies: \f461; 45 | $la-amazon: \f270; 46 | $la-amazon-pay: \f42c; 47 | $la-ambulance: \f0f9; 48 | $la-american-sign-language-interpreting: \f2a3; 49 | $la-amilia: \f36d; 50 | $la-anchor: \f13d; 51 | $la-android: \f17b; 52 | $la-angellist: \f209; 53 | $la-angle-double-down: \f103; 54 | $la-angle-double-left: \f100; 55 | $la-angle-double-right: \f101; 56 | $la-angle-double-up: \f102; 57 | $la-angle-down: \f107; 58 | $la-angle-left: \f104; 59 | $la-angle-right: \f105; 60 | $la-angle-up: \f106; 61 | $la-angry: \f556; 62 | $la-angrycreative: \f36e; 63 | $la-angular: \f420; 64 | $la-ankh: \f644; 65 | $la-app-store: \f36f; 66 | $la-app-store-ios: \f370; 67 | $la-apper: \f371; 68 | $la-apple: \f179; 69 | $la-apple-alt: \f5d1; 70 | $la-apple-pay: \f415; 71 | $la-archive: \f187; 72 | $la-archway: \f557; 73 | $la-arrow-alt-circle-down: \f358; 74 | $la-arrow-alt-circle-left: \f359; 75 | $la-arrow-alt-circle-right: \f35a; 76 | $la-arrow-alt-circle-up: \f35b; 77 | $la-arrow-circle-down: \f0ab; 78 | $la-arrow-circle-left: \f0a8; 79 | $la-arrow-circle-right: \f0a9; 80 | $la-arrow-circle-up: \f0aa; 81 | $la-arrow-down: \f063; 82 | $la-arrow-left: \f060; 83 | $la-arrow-right: \f061; 84 | $la-arrow-up: \f062; 85 | $la-arrows-alt: \f0b2; 86 | $la-arrows-alt-h: \f337; 87 | $la-arrows-alt-v: \f338; 88 | $la-artstation: \f77a; 89 | $la-assistive-listening-systems: \f2a2; 90 | $la-asterisk: \f069; 91 | $la-asymmetrik: \f372; 92 | $la-at: \f1fa; 93 | $la-atlas: \f558; 94 | $la-atlassian: \f77b; 95 | $la-atom: \f5d2; 96 | $la-audible: \f373; 97 | $la-audio-description: \f29e; 98 | $la-autoprefixer: \f41c; 99 | $la-avianex: \f374; 100 | $la-aviato: \f421; 101 | $la-award: \f559; 102 | $la-aws: \f375; 103 | $la-baby: \f77c; 104 | $la-baby-carriage: \f77d; 105 | $la-backspace: \f55a; 106 | $la-backward: \f04a; 107 | $la-bacon: \f7e5; 108 | $la-balance-scale: \f24e; 109 | $la-balance-scale-left: \f515; 110 | $la-balance-scale-right: \f516; 111 | $la-ban: \f05e; 112 | $la-band-aid: \f462; 113 | $la-bandcamp: \f2d5; 114 | $la-barcode: \f02a; 115 | $la-bars: \f0c9; 116 | $la-baseball-ball: \f433; 117 | $la-basketball-ball: \f434; 118 | $la-bath: \f2cd; 119 | $la-battery-empty: \f244; 120 | $la-battery-full: \f240; 121 | $la-battery-half: \f242; 122 | $la-battery-quarter: \f243; 123 | $la-battery-three-quarters: \f241; 124 | $la-battle-net: \f835; 125 | $la-bed: \f236; 126 | $la-beer: \f0fc; 127 | $la-behance: \f1b4; 128 | $la-behance-square: \f1b5; 129 | $la-bell: \f0f3; 130 | $la-bell-slash: \f1f6; 131 | $la-bezier-curve: \f55b; 132 | $la-bible: \f647; 133 | $la-bicycle: \f206; 134 | $la-biking: \f84a; 135 | $la-bimobject: \f378; 136 | $la-binoculars: \f1e5; 137 | $la-biohazard: \f780; 138 | $la-birthday-cake: \f1fd; 139 | $la-bitbucket: \f171; 140 | $la-bitcoin: \f379; 141 | $la-bity: \f37a; 142 | $la-black-tie: \f27e; 143 | $la-blackberry: \f37b; 144 | $la-blender: \f517; 145 | $la-blender-phone: \f6b6; 146 | $la-blind: \f29d; 147 | $la-blog: \f781; 148 | $la-blogger: \f37c; 149 | $la-blogger-b: \f37d; 150 | $la-bluetooth: \f293; 151 | $la-bluetooth-b: \f294; 152 | $la-bold: \f032; 153 | $la-bolt: \f0e7; 154 | $la-bomb: \f1e2; 155 | $la-bone: \f5d7; 156 | $la-bong: \f55c; 157 | $la-book: \f02d; 158 | $la-book-dead: \f6b7; 159 | $la-book-medical: \f7e6; 160 | $la-book-open: \f518; 161 | $la-book-reader: \f5da; 162 | $la-bookmark: \f02e; 163 | $la-bootstrap: \f836; 164 | $la-border-all: \f84c; 165 | $la-border-none: \f850; 166 | $la-border-style: \f853; 167 | $la-bowling-ball: \f436; 168 | $la-box: \f466; 169 | $la-box-open: \f49e; 170 | $la-boxes: \f468; 171 | $la-braille: \f2a1; 172 | $la-brain: \f5dc; 173 | $la-bread-slice: \f7ec; 174 | $la-briefcase: \f0b1; 175 | $la-briefcase-medical: \f469; 176 | $la-broadcast-tower: \f519; 177 | $la-broom: \f51a; 178 | $la-brush: \f55d; 179 | $la-btc: \f15a; 180 | $la-buffer: \f837; 181 | $la-bug: \f188; 182 | $la-building: \f1ad; 183 | $la-bullhorn: \f0a1; 184 | $la-bullseye: \f140; 185 | $la-burn: \f46a; 186 | $la-buromobelexperte: \f37f; 187 | $la-bus: \f207; 188 | $la-bus-alt: \f55e; 189 | $la-business-time: \f64a; 190 | $la-buysellads: \f20d; 191 | $la-calculator: \f1ec; 192 | $la-calendar: \f133; 193 | $la-calendar-alt: \f073; 194 | $la-calendar-check: \f274; 195 | $la-calendar-day: \f783; 196 | $la-calendar-minus: \f272; 197 | $la-calendar-plus: \f271; 198 | $la-calendar-times: \f273; 199 | $la-calendar-week: \f784; 200 | $la-camera: \f030; 201 | $la-camera-retro: \f083; 202 | $la-campground: \f6bb; 203 | $la-canadian-maple-leaf: \f785; 204 | $la-candy-cane: \f786; 205 | $la-cannabis: \f55f; 206 | $la-capsules: \f46b; 207 | $la-car: \f1b9; 208 | $la-car-alt: \f5de; 209 | $la-car-battery: \f5df; 210 | $la-car-crash: \f5e1; 211 | $la-car-side: \f5e4; 212 | $la-caret-down: \f0d7; 213 | $la-caret-left: \f0d9; 214 | $la-caret-right: \f0da; 215 | $la-caret-square-down: \f150; 216 | $la-caret-square-left: \f191; 217 | $la-caret-square-right: \f152; 218 | $la-caret-square-up: \f151; 219 | $la-caret-up: \f0d8; 220 | $la-carrot: \f787; 221 | $la-cart-arrow-down: \f218; 222 | $la-cart-plus: \f217; 223 | $la-cash-register: \f788; 224 | $la-cat: \f6be; 225 | $la-cc-amazon-pay: \f42d; 226 | $la-cc-amex: \f1f3; 227 | $la-cc-apple-pay: \f416; 228 | $la-cc-diners-club: \f24c; 229 | $la-cc-discover: \f1f2; 230 | $la-cc-jcb: \f24b; 231 | $la-cc-mastercard: \f1f1; 232 | $la-cc-paypal: \f1f4; 233 | $la-cc-stripe: \f1f5; 234 | $la-cc-visa: \f1f0; 235 | $la-centercode: \f380; 236 | $la-centos: \f789; 237 | $la-certificate: \f0a3; 238 | $la-chair: \f6c0; 239 | $la-chalkboard: \f51b; 240 | $la-chalkboard-teacher: \f51c; 241 | $la-charging-station: \f5e7; 242 | $la-chart-area: \f1fe; 243 | $la-chart-bar: \f080; 244 | $la-chart-line: \f201; 245 | $la-chart-pie: \f200; 246 | $la-check: \f00c; 247 | $la-check-circle: \f058; 248 | $la-check-double: \f560; 249 | $la-check-square: \f14a; 250 | $la-cheese: \f7ef; 251 | $la-chess: \f439; 252 | $la-chess-bishop: \f43a; 253 | $la-chess-board: \f43c; 254 | $la-chess-king: \f43f; 255 | $la-chess-knight: \f441; 256 | $la-chess-pawn: \f443; 257 | $la-chess-queen: \f445; 258 | $la-chess-rook: \f447; 259 | $la-chevron-circle-down: \f13a; 260 | $la-chevron-circle-left: \f137; 261 | $la-chevron-circle-right: \f138; 262 | $la-chevron-circle-up: \f139; 263 | $la-chevron-down: \f078; 264 | $la-chevron-left: \f053; 265 | $la-chevron-right: \f054; 266 | $la-chevron-up: \f077; 267 | $la-child: \f1ae; 268 | $la-chrome: \f268; 269 | $la-chromecast: \f838; 270 | $la-church: \f51d; 271 | $la-circle: \f111; 272 | $la-circle-notch: \f1ce; 273 | $la-city: \f64f; 274 | $la-clinic-medical: \f7f2; 275 | $la-clipboard: \f328; 276 | $la-clipboard-check: \f46c; 277 | $la-clipboard-list: \f46d; 278 | $la-clock: \f017; 279 | $la-clone: \f24d; 280 | $la-closed-captioning: \f20a; 281 | $la-cloud: \f0c2; 282 | $la-cloud-download-alt: \f381; 283 | $la-cloud-meatball: \f73b; 284 | $la-cloud-moon: \f6c3; 285 | $la-cloud-moon-rain: \f73c; 286 | $la-cloud-rain: \f73d; 287 | $la-cloud-showers-heavy: \f740; 288 | $la-cloud-sun: \f6c4; 289 | $la-cloud-sun-rain: \f743; 290 | $la-cloud-upload-alt: \f382; 291 | $la-cloudscale: \f383; 292 | $la-cloudsmith: \f384; 293 | $la-cloudversify: \f385; 294 | $la-cocktail: \f561; 295 | $la-code: \f121; 296 | $la-code-branch: \f126; 297 | $la-codepen: \f1cb; 298 | $la-codiepie: \f284; 299 | $la-coffee: \f0f4; 300 | $la-cog: \f013; 301 | $la-cogs: \f085; 302 | $la-coins: \f51e; 303 | $la-columns: \f0db; 304 | $la-comment: \f075; 305 | $la-comment-alt: \f27a; 306 | $la-comment-dollar: \f651; 307 | $la-comment-dots: \f4ad; 308 | $la-comment-medical: \f7f5; 309 | $la-comment-slash: \f4b3; 310 | $la-comments: \f086; 311 | $la-comments-dollar: \f653; 312 | $la-compact-disc: \f51f; 313 | $la-compass: \f14e; 314 | $la-compress: \f066; 315 | $la-compress-arrows-alt: \f78c; 316 | $la-concierge-bell: \f562; 317 | $la-confluence: \f78d; 318 | $la-connectdevelop: \f20e; 319 | $la-contao: \f26d; 320 | $la-cookie: \f563; 321 | $la-cookie-bite: \f564; 322 | $la-copy: \f0c5; 323 | $la-copyright: \f1f9; 324 | $la-cotton-bureau: \f89e; 325 | $la-couch: \f4b8; 326 | $la-cpanel: \f388; 327 | $la-creative-commons: \f25e; 328 | $la-creative-commons-by: \f4e7; 329 | $la-creative-commons-nc: \f4e8; 330 | $la-creative-commons-nc-eu: \f4e9; 331 | $la-creative-commons-nc-jp: \f4ea; 332 | $la-creative-commons-nd: \f4eb; 333 | $la-creative-commons-pd: \f4ec; 334 | $la-creative-commons-pd-alt: \f4ed; 335 | $la-creative-commons-remix: \f4ee; 336 | $la-creative-commons-sa: \f4ef; 337 | $la-creative-commons-sampling: \f4f0; 338 | $la-creative-commons-sampling-plus: \f4f1; 339 | $la-creative-commons-share: \f4f2; 340 | $la-creative-commons-zero: \f4f3; 341 | $la-credit-card: \f09d; 342 | $la-critical-role: \f6c9; 343 | $la-crop: \f125; 344 | $la-crop-alt: \f565; 345 | $la-cross: \f654; 346 | $la-crosshairs: \f05b; 347 | $la-crow: \f520; 348 | $la-crown: \f521; 349 | $la-crutch: \f7f7; 350 | $la-css3: \f13c; 351 | $la-css3-alt: \f38b; 352 | $la-cube: \f1b2; 353 | $la-cubes: \f1b3; 354 | $la-cut: \f0c4; 355 | $la-cuttlefish: \f38c; 356 | $la-d-and-d: \f38d; 357 | $la-d-and-d-beyond: \f6ca; 358 | $la-dashcube: \f210; 359 | $la-database: \f1c0; 360 | $la-deaf: \f2a4; 361 | $la-delicious: \f1a5; 362 | $la-democrat: \f747; 363 | $la-deploydog: \f38e; 364 | $la-deskpro: \f38f; 365 | $la-desktop: \f108; 366 | $la-dev: \f6cc; 367 | $la-deviantart: \f1bd; 368 | $la-dharmachakra: \f655; 369 | $la-dhl: \f790; 370 | $la-diagnoses: \f470; 371 | $la-diaspora: \f791; 372 | $la-dice: \f522; 373 | $la-dice-d20: \f6cf; 374 | $la-dice-d6: \f6d1; 375 | $la-dice-five: \f523; 376 | $la-dice-four: \f524; 377 | $la-dice-one: \f525; 378 | $la-dice-six: \f526; 379 | $la-dice-three: \f527; 380 | $la-dice-two: \f528; 381 | $la-digg: \f1a6; 382 | $la-digital-ocean: \f391; 383 | $la-digital-tachograph: \f566; 384 | $la-directions: \f5eb; 385 | $la-discord: \f392; 386 | $la-discourse: \f393; 387 | $la-divide: \f529; 388 | $la-dizzy: \f567; 389 | $la-dna: \f471; 390 | $la-dochub: \f394; 391 | $la-docker: \f395; 392 | $la-dog: \f6d3; 393 | $la-dollar-sign: \f155; 394 | $la-dolly: \f472; 395 | $la-dolly-flatbed: \f474; 396 | $la-donate: \f4b9; 397 | $la-door-closed: \f52a; 398 | $la-door-open: \f52b; 399 | $la-dot-circle: \f192; 400 | $la-dove: \f4ba; 401 | $la-download: \f019; 402 | $la-draft2digital: \f396; 403 | $la-drafting-compass: \f568; 404 | $la-dragon: \f6d5; 405 | $la-draw-polygon: \f5ee; 406 | $la-dribbble: \f17d; 407 | $la-dribbble-square: \f397; 408 | $la-dropbox: \f16b; 409 | $la-drum: \f569; 410 | $la-drum-steelpan: \f56a; 411 | $la-drumstick-bite: \f6d7; 412 | $la-drupal: \f1a9; 413 | $la-dumbbell: \f44b; 414 | $la-dumpster: \f793; 415 | $la-dumpster-fire: \f794; 416 | $la-dungeon: \f6d9; 417 | $la-dyalog: \f399; 418 | $la-earlybirds: \f39a; 419 | $la-ebay: \f4f4; 420 | $la-edge: \f282; 421 | $la-edit: \f044; 422 | $la-egg: \f7fb; 423 | $la-eject: \f052; 424 | $la-elementor: \f430; 425 | $la-ellipsis-h: \f141; 426 | $la-ellipsis-v: \f142; 427 | $la-ello: \f5f1; 428 | $la-ember: \f423; 429 | $la-empire: \f1d1; 430 | $la-envelope: \f0e0; 431 | $la-envelope-open: \f2b6; 432 | $la-envelope-open-text: \f658; 433 | $la-envelope-square: \f199; 434 | $la-envira: \f299; 435 | $la-equals: \f52c; 436 | $la-eraser: \f12d; 437 | $la-erlang: \f39d; 438 | $la-ethereum: \f42e; 439 | $la-ethernet: \f796; 440 | $la-etsy: \f2d7; 441 | $la-euro-sign: \f153; 442 | $la-evernote: \f839; 443 | $la-exchange-alt: \f362; 444 | $la-exclamation: \f12a; 445 | $la-exclamation-circle: \f06a; 446 | $la-exclamation-triangle: \f071; 447 | $la-expand: \f065; 448 | $la-expand-arrows-alt: \f31e; 449 | $la-expeditedssl: \f23e; 450 | $la-external-link-alt: \f35d; 451 | $la-external-link-square-alt: \f360; 452 | $la-eye: \f06e; 453 | $la-eye-dropper: \f1fb; 454 | $la-eye-slash: \f070; 455 | $la-facebook: \f09a; 456 | $la-facebook-f: \f39e; 457 | $la-facebook-messenger: \f39f; 458 | $la-facebook-square: \f082; 459 | $la-fan: \f863; 460 | $la-fantasy-flight-games: \f6dc; 461 | $la-fast-backward: \f049; 462 | $la-fast-forward: \f050; 463 | $la-fax: \f1ac; 464 | $la-feather: \f52d; 465 | $la-feather-alt: \f56b; 466 | $la-fedex: \f797; 467 | $la-fedora: \f798; 468 | $la-female: \f182; 469 | $la-fighter-jet: \f0fb; 470 | $la-figma: \f799; 471 | $la-file: \f15b; 472 | $la-file-alt: \f15c; 473 | $la-file-archive: \f1c6; 474 | $la-file-audio: \f1c7; 475 | $la-file-code: \f1c9; 476 | $la-file-contract: \f56c; 477 | $la-file-csv: \f6dd; 478 | $la-file-download: \f56d; 479 | $la-file-excel: \f1c3; 480 | $la-file-export: \f56e; 481 | $la-file-image: \f1c5; 482 | $la-file-import: \f56f; 483 | $la-file-invoice: \f570; 484 | $la-file-invoice-dollar: \f571; 485 | $la-file-medical: \f477; 486 | $la-file-medical-alt: \f478; 487 | $la-file-pdf: \f1c1; 488 | $la-file-powerpoint: \f1c4; 489 | $la-file-prescription: \f572; 490 | $la-file-signature: \f573; 491 | $la-file-upload: \f574; 492 | $la-file-video: \f1c8; 493 | $la-file-word: \f1c2; 494 | $la-fill: \f575; 495 | $la-fill-drip: \f576; 496 | $la-film: \f008; 497 | $la-filter: \f0b0; 498 | $la-fingerprint: \f577; 499 | $la-fire: \f06d; 500 | $la-fire-alt: \f7e4; 501 | $la-fire-extinguisher: \f134; 502 | $la-firefox: \f269; 503 | $la-first-aid: \f479; 504 | $la-first-order: \f2b0; 505 | $la-first-order-alt: \f50a; 506 | $la-firstdraft: \f3a1; 507 | $la-fish: \f578; 508 | $la-fist-raised: \f6de; 509 | $la-flag: \f024; 510 | $la-flag-checkered: \f11e; 511 | $la-flag-usa: \f74d; 512 | $la-flask: \f0c3; 513 | $la-flickr: \f16e; 514 | $la-flipboard: \f44d; 515 | $la-flushed: \f579; 516 | $la-fly: \f417; 517 | $la-folder: \f07b; 518 | $la-folder-minus: \f65d; 519 | $la-folder-open: \f07c; 520 | $la-folder-plus: \f65e; 521 | $la-font: \f031; 522 | $la-font-awesome: \f2b4; 523 | $la-font-awesome-alt: \f35c; 524 | $la-font-awesome-flag: \f425; 525 | $la-fonticons: \f280; 526 | $la-fonticons-fi: \f3a2; 527 | $la-football-ball: \f44e; 528 | $la-fort-awesome: \f286; 529 | $la-fort-awesome-alt: \f3a3; 530 | $la-forumbee: \f211; 531 | $la-forward: \f04e; 532 | $la-foursquare: \f180; 533 | $la-free-code-camp: \f2c5; 534 | $la-freebsd: \f3a4; 535 | $la-frog: \f52e; 536 | $la-frown: \f119; 537 | $la-frown-open: \f57a; 538 | $la-fulcrum: \f50b; 539 | $la-funnel-dollar: \f662; 540 | $la-futbol: \f1e3; 541 | $la-galactic-republic: \f50c; 542 | $la-galactic-senate: \f50d; 543 | $la-gamepad: \f11b; 544 | $la-gas-pump: \f52f; 545 | $la-gavel: \f0e3; 546 | $la-gem: \f3a5; 547 | $la-genderless: \f22d; 548 | $la-get-pocket: \f265; 549 | $la-gg: \f260; 550 | $la-gg-circle: \f261; 551 | $la-ghost: \f6e2; 552 | $la-gift: \f06b; 553 | $la-gifts: \f79c; 554 | $la-git: \f1d3; 555 | $la-git-alt: \f841; 556 | $la-git-square: \f1d2; 557 | $la-github: \f09b; 558 | $la-github-alt: \f113; 559 | $la-github-square: \f092; 560 | $la-gitkraken: \f3a6; 561 | $la-gitlab: \f296; 562 | $la-gitter: \f426; 563 | $la-glass-cheers: \f79f; 564 | $la-glass-martini: \f000; 565 | $la-glass-martini-alt: \f57b; 566 | $la-glass-whiskey: \f7a0; 567 | $la-glasses: \f530; 568 | $la-glide: \f2a5; 569 | $la-glide-g: \f2a6; 570 | $la-globe: \f0ac; 571 | $la-globe-africa: \f57c; 572 | $la-globe-americas: \f57d; 573 | $la-globe-asia: \f57e; 574 | $la-globe-europe: \f7a2; 575 | $la-gofore: \f3a7; 576 | $la-golf-ball: \f450; 577 | $la-goodreads: \f3a8; 578 | $la-goodreads-g: \f3a9; 579 | $la-google: \f1a0; 580 | $la-google-drive: \f3aa; 581 | $la-google-play: \f3ab; 582 | $la-google-plus: \f2b3; 583 | $la-google-plus-g: \f0d5; 584 | $la-google-plus-square: \f0d4; 585 | $la-google-wallet: \f1ee; 586 | $la-gopuram: \f664; 587 | $la-graduation-cap: \f19d; 588 | $la-gratipay: \f184; 589 | $la-grav: \f2d6; 590 | $la-greater-than: \f531; 591 | $la-greater-than-equal: \f532; 592 | $la-grimace: \f57f; 593 | $la-grin: \f580; 594 | $la-grin-alt: \f581; 595 | $la-grin-beam: \f582; 596 | $la-grin-beam-sweat: \f583; 597 | $la-grin-hearts: \f584; 598 | $la-grin-squint: \f585; 599 | $la-grin-squint-tears: \f586; 600 | $la-grin-stars: \f587; 601 | $la-grin-tears: \f588; 602 | $la-grin-tongue: \f589; 603 | $la-grin-tongue-squint: \f58a; 604 | $la-grin-tongue-wink: \f58b; 605 | $la-grin-wink: \f58c; 606 | $la-grip-horizontal: \f58d; 607 | $la-grip-lines: \f7a4; 608 | $la-grip-lines-vertical: \f7a5; 609 | $la-grip-vertical: \f58e; 610 | $la-gripfire: \f3ac; 611 | $la-grunt: \f3ad; 612 | $la-guitar: \f7a6; 613 | $la-gulp: \f3ae; 614 | $la-h-square: \f0fd; 615 | $la-hacker-news: \f1d4; 616 | $la-hacker-news-square: \f3af; 617 | $la-hackerrank: \f5f7; 618 | $la-hamburger: \f805; 619 | $la-hammer: \f6e3; 620 | $la-hamsa: \f665; 621 | $la-hand-holding: \f4bd; 622 | $la-hand-holding-heart: \f4be; 623 | $la-hand-holding-usd: \f4c0; 624 | $la-hand-lizard: \f258; 625 | $la-hand-middle-finger: \f806; 626 | $la-hand-paper: \f256; 627 | $la-hand-peace: \f25b; 628 | $la-hand-point-down: \f0a7; 629 | $la-hand-point-left: \f0a5; 630 | $la-hand-point-right: \f0a4; 631 | $la-hand-point-up: \f0a6; 632 | $la-hand-pointer: \f25a; 633 | $la-hand-rock: \f255; 634 | $la-hand-scissors: \f257; 635 | $la-hand-spock: \f259; 636 | $la-hands: \f4c2; 637 | $la-hands-helping: \f4c4; 638 | $la-handshake: \f2b5; 639 | $la-hanukiah: \f6e6; 640 | $la-hard-hat: \f807; 641 | $la-hashtag: \f292; 642 | $la-hat-wizard: \f6e8; 643 | $la-haykal: \f666; 644 | $la-hdd: \f0a0; 645 | $la-heading: \f1dc; 646 | $la-headphones: \f025; 647 | $la-headphones-alt: \f58f; 648 | $la-headset: \f590; 649 | $la-heart: \f004; 650 | $la-heart-broken: \f7a9; 651 | $la-heartbeat: \f21e; 652 | $la-helicopter: \f533; 653 | $la-highlighter: \f591; 654 | $la-hiking: \f6ec; 655 | $la-hippo: \f6ed; 656 | $la-hips: \f452; 657 | $la-hire-a-helper: \f3b0; 658 | $la-history: \f1da; 659 | $la-hockey-puck: \f453; 660 | $la-holly-berry: \f7aa; 661 | $la-home: \f015; 662 | $la-hooli: \f427; 663 | $la-hornbill: \f592; 664 | $la-horse: \f6f0; 665 | $la-horse-head: \f7ab; 666 | $la-hospital: \f0f8; 667 | $la-hospital-alt: \f47d; 668 | $la-hospital-symbol: \f47e; 669 | $la-hot-tub: \f593; 670 | $la-hotdog: \f80f; 671 | $la-hotel: \f594; 672 | $la-hotjar: \f3b1; 673 | $la-hourglass: \f254; 674 | $la-hourglass-end: \f253; 675 | $la-hourglass-half: \f252; 676 | $la-hourglass-start: \f251; 677 | $la-house-damage: \f6f1; 678 | $la-houzz: \f27c; 679 | $la-hryvnia: \f6f2; 680 | $la-html5: \f13b; 681 | $la-hubspot: \f3b2; 682 | $la-i-cursor: \f246; 683 | $la-ice-cream: \f810; 684 | $la-icicles: \f7ad; 685 | $la-icons: \f86d; 686 | $la-id-badge: \f2c1; 687 | $la-id-card: \f2c2; 688 | $la-id-card-alt: \f47f; 689 | $la-igloo: \f7ae; 690 | $la-image: \f03e; 691 | $la-images: \f302; 692 | $la-imdb: \f2d8; 693 | $la-inbox: \f01c; 694 | $la-indent: \f03c; 695 | $la-industry: \f275; 696 | $la-infinity: \f534; 697 | $la-info: \f129; 698 | $la-info-circle: \f05a; 699 | $la-instagram: \f16d; 700 | $la-intercom: \f7af; 701 | $la-internet-explorer: \f26b; 702 | $la-invision: \f7b0; 703 | $la-ioxhost: \f208; 704 | $la-italic: \f033; 705 | $la-itch-io: \f83a; 706 | $la-itunes: \f3b4; 707 | $la-itunes-note: \f3b5; 708 | $la-java: \f4e4; 709 | $la-jedi: \f669; 710 | $la-jedi-order: \f50e; 711 | $la-jenkins: \f3b6; 712 | $la-jira: \f7b1; 713 | $la-joget: \f3b7; 714 | $la-joint: \f595; 715 | $la-joomla: \f1aa; 716 | $la-journal-whills: \f66a; 717 | $la-js: \f3b8; 718 | $la-js-square: \f3b9; 719 | $la-jsfiddle: \f1cc; 720 | $la-kaaba: \f66b; 721 | $la-kaggle: \f5fa; 722 | $la-key: \f084; 723 | $la-keybase: \f4f5; 724 | $la-keyboard: \f11c; 725 | $la-keycdn: \f3ba; 726 | $la-khanda: \f66d; 727 | $la-kickstarter: \f3bb; 728 | $la-kickstarter-k: \f3bc; 729 | $la-kiss: \f596; 730 | $la-kiss-beam: \f597; 731 | $la-kiss-wink-heart: \f598; 732 | $la-kiwi-bird: \f535; 733 | $la-korvue: \f42f; 734 | $la-landmark: \f66f; 735 | $la-language: \f1ab; 736 | $la-laptop: \f109; 737 | $la-laptop-code: \f5fc; 738 | $la-laptop-medical: \f812; 739 | $la-laravel: \f3bd; 740 | $la-lastfm: \f202; 741 | $la-lastfm-square: \f203; 742 | $la-laugh: \f599; 743 | $la-laugh-beam: \f59a; 744 | $la-laugh-squint: \f59b; 745 | $la-laugh-wink: \f59c; 746 | $la-layer-group: \f5fd; 747 | $la-leaf: \f06c; 748 | $la-leanpub: \f212; 749 | $la-lemon: \f094; 750 | $la-less: \f41d; 751 | $la-less-than: \f536; 752 | $la-less-than-equal: \f537; 753 | $la-level-down-alt: \f3be; 754 | $la-level-up-alt: \f3bf; 755 | $la-life-ring: \f1cd; 756 | $la-lightbulb: \f0eb; 757 | $la-line: \f3c0; 758 | $la-link: \f0c1; 759 | $la-linkedin: \f08c; 760 | $la-linkedin-in: \f0e1; 761 | $la-linode: \f2b8; 762 | $la-linux: \f17c; 763 | $la-lira-sign: \f195; 764 | $la-list: \f03a; 765 | $la-list-alt: \f022; 766 | $la-list-ol: \f0cb; 767 | $la-list-ul: \f0ca; 768 | $la-location-arrow: \f124; 769 | $la-lock: \f023; 770 | $la-lock-open: \f3c1; 771 | $la-long-arrow-alt-down: \f309; 772 | $la-long-arrow-alt-left: \f30a; 773 | $la-long-arrow-alt-right: \f30b; 774 | $la-long-arrow-alt-up: \f30c; 775 | $la-low-vision: \f2a8; 776 | $la-luggage-cart: \f59d; 777 | $la-lyft: \f3c3; 778 | $la-magento: \f3c4; 779 | $la-magic: \f0d0; 780 | $la-magnet: \f076; 781 | $la-mail-bulk: \f674; 782 | $la-mailchimp: \f59e; 783 | $la-male: \f183; 784 | $la-mandalorian: \f50f; 785 | $la-map: \f279; 786 | $la-map-marked: \f59f; 787 | $la-map-marked-alt: \f5a0; 788 | $la-map-marker: \f041; 789 | $la-map-marker-alt: \f3c5; 790 | $la-map-pin: \f276; 791 | $la-map-signs: \f277; 792 | $la-markdown: \f60f; 793 | $la-marker: \f5a1; 794 | $la-mars: \f222; 795 | $la-mars-double: \f227; 796 | $la-mars-stroke: \f229; 797 | $la-mars-stroke-h: \f22b; 798 | $la-mars-stroke-v: \f22a; 799 | $la-mask: \f6fa; 800 | $la-mastodon: \f4f6; 801 | $la-maxcdn: \f136; 802 | $la-medal: \f5a2; 803 | $la-medapps: \f3c6; 804 | $la-medium: \f23a; 805 | $la-medium-m: \f3c7; 806 | $la-medkit: \f0fa; 807 | $la-medrt: \f3c8; 808 | $la-meetup: \f2e0; 809 | $la-megaport: \f5a3; 810 | $la-meh: \f11a; 811 | $la-meh-blank: \f5a4; 812 | $la-meh-rolling-eyes: \f5a5; 813 | $la-memory: \f538; 814 | $la-mendeley: \f7b3; 815 | $la-menorah: \f676; 816 | $la-mercury: \f223; 817 | $la-meteor: \f753; 818 | $la-microchip: \f2db; 819 | $la-microphone: \f130; 820 | $la-microphone-alt: \f3c9; 821 | $la-microphone-alt-slash: \f539; 822 | $la-microphone-slash: \f131; 823 | $la-microscope: \f610; 824 | $la-microsoft: \f3ca; 825 | $la-minus: \f068; 826 | $la-minus-circle: \f056; 827 | $la-minus-square: \f146; 828 | $la-mitten: \f7b5; 829 | $la-mix: \f3cb; 830 | $la-mixcloud: \f289; 831 | $la-mizuni: \f3cc; 832 | $la-mobile: \f10b; 833 | $la-mobile-alt: \f3cd; 834 | $la-modx: \f285; 835 | $la-monero: \f3d0; 836 | $la-money-bill: \f0d6; 837 | $la-money-bill-alt: \f3d1; 838 | $la-money-bill-wave: \f53a; 839 | $la-money-bill-wave-alt: \f53b; 840 | $la-money-check: \f53c; 841 | $la-money-check-alt: \f53d; 842 | $la-monument: \f5a6; 843 | $la-moon: \f186; 844 | $la-mortar-pestle: \f5a7; 845 | $la-mosque: \f678; 846 | $la-motorcycle: \f21c; 847 | $la-mountain: \f6fc; 848 | $la-mouse-pointer: \f245; 849 | $la-mug-hot: \f7b6; 850 | $la-music: \f001; 851 | $la-napster: \f3d2; 852 | $la-neos: \f612; 853 | $la-network-wired: \f6ff; 854 | $la-neuter: \f22c; 855 | $la-newspaper: \f1ea; 856 | $la-nimblr: \f5a8; 857 | $la-node: \f419; 858 | $la-node-js: \f3d3; 859 | $la-not-equal: \f53e; 860 | $la-notes-medical: \f481; 861 | $la-npm: \f3d4; 862 | $la-ns8: \f3d5; 863 | $la-nutritionix: \f3d6; 864 | $la-object-group: \f247; 865 | $la-object-ungroup: \f248; 866 | $la-odnoklassniki: \f263; 867 | $la-odnoklassniki-square: \f264; 868 | $la-oil-can: \f613; 869 | $la-old-republic: \f510; 870 | $la-om: \f679; 871 | $la-opencart: \f23d; 872 | $la-openid: \f19b; 873 | $la-opera: \f26a; 874 | $la-optin-monster: \f23c; 875 | $la-osi: \f41a; 876 | $la-otter: \f700; 877 | $la-outdent: \f03b; 878 | $la-page4: \f3d7; 879 | $la-pagelines: \f18c; 880 | $la-pager: \f815; 881 | $la-paint-brush: \f1fc; 882 | $la-paint-roller: \f5aa; 883 | $la-palette: \f53f; 884 | $la-palfed: \f3d8; 885 | $la-pallet: \f482; 886 | $la-paper-plane: \f1d8; 887 | $la-paperclip: \f0c6; 888 | $la-parachute-box: \f4cd; 889 | $la-paragraph: \f1dd; 890 | $la-parking: \f540; 891 | $la-passport: \f5ab; 892 | $la-pastafarianism: \f67b; 893 | $la-paste: \f0ea; 894 | $la-patreon: \f3d9; 895 | $la-pause: \f04c; 896 | $la-pause-circle: \f28b; 897 | $la-paw: \f1b0; 898 | $la-paypal: \f1ed; 899 | $la-peace: \f67c; 900 | $la-pen: \f304; 901 | $la-pen-alt: \f305; 902 | $la-pen-fancy: \f5ac; 903 | $la-pen-nib: \f5ad; 904 | $la-pen-square: \f14b; 905 | $la-pencil-alt: \f303; 906 | $la-pencil-ruler: \f5ae; 907 | $la-penny-arcade: \f704; 908 | $la-people-carry: \f4ce; 909 | $la-pepper-hot: \f816; 910 | $la-percent: \f295; 911 | $la-percentage: \f541; 912 | $la-periscope: \f3da; 913 | $la-person-booth: \f756; 914 | $la-phabricator: \f3db; 915 | $la-phoenix-framework: \f3dc; 916 | $la-phoenix-squadron: \f511; 917 | $la-phone: \f095; 918 | $la-phone-alt: \f879; 919 | $la-phone-slash: \f3dd; 920 | $la-phone-square: \f098; 921 | $la-phone-square-alt: \f87b; 922 | $la-phone-volume: \f2a0; 923 | $la-photo-video: \f87c; 924 | $la-php: \f457; 925 | $la-pied-piper: \f2ae; 926 | $la-pied-piper-alt: \f1a8; 927 | $la-pied-piper-hat: \f4e5; 928 | $la-pied-piper-pp: \f1a7; 929 | $la-piggy-bank: \f4d3; 930 | $la-pills: \f484; 931 | $la-pinterest: \f0d2; 932 | $la-pinterest-p: \f231; 933 | $la-pinterest-square: \f0d3; 934 | $la-pizza-slice: \f818; 935 | $la-place-of-worship: \f67f; 936 | $la-plane: \f072; 937 | $la-plane-arrival: \f5af; 938 | $la-plane-departure: \f5b0; 939 | $la-play: \f04b; 940 | $la-play-circle: \f144; 941 | $la-playstation: \f3df; 942 | $la-plug: \f1e6; 943 | $la-plus: \f067; 944 | $la-plus-circle: \f055; 945 | $la-plus-square: \f0fe; 946 | $la-podcast: \f2ce; 947 | $la-poll: \f681; 948 | $la-poll-h: \f682; 949 | $la-poo: \f2fe; 950 | $la-poo-storm: \f75a; 951 | $la-poop: \f619; 952 | $la-portrait: \f3e0; 953 | $la-pound-sign: \f154; 954 | $la-power-off: \f011; 955 | $la-pray: \f683; 956 | $la-praying-hands: \f684; 957 | $la-prescription: \f5b1; 958 | $la-prescription-bottle: \f485; 959 | $la-prescription-bottle-alt: \f486; 960 | $la-print: \f02f; 961 | $la-procedures: \f487; 962 | $la-product-hunt: \f288; 963 | $la-project-diagram: \f542; 964 | $la-pushed: \f3e1; 965 | $la-puzzle-piece: \f12e; 966 | $la-python: \f3e2; 967 | $la-qq: \f1d6; 968 | $la-qrcode: \f029; 969 | $la-question: \f128; 970 | $la-question-circle: \f059; 971 | $la-quidditch: \f458; 972 | $la-quinscape: \f459; 973 | $la-quora: \f2c4; 974 | $la-quote-left: \f10d; 975 | $la-quote-right: \f10e; 976 | $la-quran: \f687; 977 | $la-r-project: \f4f7; 978 | $la-radiation: \f7b9; 979 | $la-radiation-alt: \f7ba; 980 | $la-rainbow: \f75b; 981 | $la-random: \f074; 982 | $la-raspberry-pi: \f7bb; 983 | $la-ravelry: \f2d9; 984 | $la-react: \f41b; 985 | $la-reacteurope: \f75d; 986 | $la-readme: \f4d5; 987 | $la-rebel: \f1d0; 988 | $la-receipt: \f543; 989 | $la-recycle: \f1b8; 990 | $la-red-river: \f3e3; 991 | $la-reddit: \f1a1; 992 | $la-reddit-alien: \f281; 993 | $la-reddit-square: \f1a2; 994 | $la-redhat: \f7bc; 995 | $la-redo: \f01e; 996 | $la-redo-alt: \f2f9; 997 | $la-registered: \f25d; 998 | $la-remove-format: \f87d; 999 | $la-renren: \f18b; 1000 | $la-reply: \f3e5; 1001 | $la-reply-all: \f122; 1002 | $la-replyd: \f3e6; 1003 | $la-republican: \f75e; 1004 | $la-researchgate: \f4f8; 1005 | $la-resolving: \f3e7; 1006 | $la-restroom: \f7bd; 1007 | $la-retweet: \f079; 1008 | $la-rev: \f5b2; 1009 | $la-ribbon: \f4d6; 1010 | $la-ring: \f70b; 1011 | $la-road: \f018; 1012 | $la-robot: \f544; 1013 | $la-rocket: \f135; 1014 | $la-rocketchat: \f3e8; 1015 | $la-rockrms: \f3e9; 1016 | $la-route: \f4d7; 1017 | $la-rss: \f09e; 1018 | $la-rss-square: \f143; 1019 | $la-ruble-sign: \f158; 1020 | $la-ruler: \f545; 1021 | $la-ruler-combined: \f546; 1022 | $la-ruler-horizontal: \f547; 1023 | $la-ruler-vertical: \f548; 1024 | $la-running: \f70c; 1025 | $la-rupee-sign: \f156; 1026 | $la-sad-cry: \f5b3; 1027 | $la-sad-tear: \f5b4; 1028 | $la-safari: \f267; 1029 | $la-salesforce: \f83b; 1030 | $la-sass: \f41e; 1031 | $la-satellite: \f7bf; 1032 | $la-satellite-dish: \f7c0; 1033 | $la-save: \f0c7; 1034 | $la-schlix: \f3ea; 1035 | $la-school: \f549; 1036 | $la-screwdriver: \f54a; 1037 | $la-scribd: \f28a; 1038 | $la-scroll: \f70e; 1039 | $la-sd-card: \f7c2; 1040 | $la-search: \f002; 1041 | $la-search-dollar: \f688; 1042 | $la-search-location: \f689; 1043 | $la-search-minus: \f010; 1044 | $la-search-plus: \f00e; 1045 | $la-searchengin: \f3eb; 1046 | $la-seedling: \f4d8; 1047 | $la-sellcast: \f2da; 1048 | $la-sellsy: \f213; 1049 | $la-server: \f233; 1050 | $la-servicestack: \f3ec; 1051 | $la-shapes: \f61f; 1052 | $la-share: \f064; 1053 | $la-share-alt: \f1e0; 1054 | $la-share-alt-square: \f1e1; 1055 | $la-share-square: \f14d; 1056 | $la-shekel-sign: \f20b; 1057 | $la-shield-alt: \f3ed; 1058 | $la-ship: \f21a; 1059 | $la-shipping-fast: \f48b; 1060 | $la-shirtsinbulk: \f214; 1061 | $la-shoe-prints: \f54b; 1062 | $la-shopping-bag: \f290; 1063 | $la-shopping-basket: \f291; 1064 | $la-shopping-cart: \f07a; 1065 | $la-shopware: \f5b5; 1066 | $la-shower: \f2cc; 1067 | $la-shuttle-van: \f5b6; 1068 | $la-sign: \f4d9; 1069 | $la-sign-in-alt: \f2f6; 1070 | $la-sign-language: \f2a7; 1071 | $la-sign-out-alt: \f2f5; 1072 | $la-signal: \f012; 1073 | $la-signature: \f5b7; 1074 | $la-sim-card: \f7c4; 1075 | $la-simplybuilt: \f215; 1076 | $la-sistrix: \f3ee; 1077 | $la-sitemap: \f0e8; 1078 | $la-sith: \f512; 1079 | $la-skating: \f7c5; 1080 | $la-sketch: \f7c6; 1081 | $la-skiing: \f7c9; 1082 | $la-skiing-nordic: \f7ca; 1083 | $la-skull: \f54c; 1084 | $la-skull-crossbones: \f714; 1085 | $la-skyatlas: \f216; 1086 | $la-skype: \f17e; 1087 | $la-slack: \f198; 1088 | $la-slack-hash: \f3ef; 1089 | $la-slash: \f715; 1090 | $la-sleigh: \f7cc; 1091 | $la-sliders-h: \f1de; 1092 | $la-slideshare: \f1e7; 1093 | $la-smile: \f118; 1094 | $la-smile-beam: \f5b8; 1095 | $la-smile-wink: \f4da; 1096 | $la-smog: \f75f; 1097 | $la-smoking: \f48d; 1098 | $la-smoking-ban: \f54d; 1099 | $la-sms: \f7cd; 1100 | $la-snapchat: \f2ab; 1101 | $la-snapchat-ghost: \f2ac; 1102 | $la-snapchat-square: \f2ad; 1103 | $la-snowboarding: \f7ce; 1104 | $la-snowflake: \f2dc; 1105 | $la-snowman: \f7d0; 1106 | $la-snowplow: \f7d2; 1107 | $la-socks: \f696; 1108 | $la-solar-panel: \f5ba; 1109 | $la-sort: \f0dc; 1110 | $la-sort-alpha-down: \f15d; 1111 | $la-sort-alpha-down-alt: \f881; 1112 | $la-sort-alpha-up: \f15e; 1113 | $la-sort-alpha-up-alt: \f882; 1114 | $la-sort-amount-down: \f160; 1115 | $la-sort-amount-down-alt: \f884; 1116 | $la-sort-amount-up: \f161; 1117 | $la-sort-amount-up-alt: \f885; 1118 | $la-sort-down: \f0dd; 1119 | $la-sort-numeric-down: \f162; 1120 | $la-sort-numeric-down-alt: \f886; 1121 | $la-sort-numeric-up: \f163; 1122 | $la-sort-numeric-up-alt: \f887; 1123 | $la-sort-up: \f0de; 1124 | $la-soundcloud: \f1be; 1125 | $la-sourcetree: \f7d3; 1126 | $la-spa: \f5bb; 1127 | $la-space-shuttle: \f197; 1128 | $la-speakap: \f3f3; 1129 | $la-speaker-deck: \f83c; 1130 | $la-spell-check: \f891; 1131 | $la-spider: \f717; 1132 | $la-spinner: \f110; 1133 | $la-splotch: \f5bc; 1134 | $la-spotify: \f1bc; 1135 | $la-spray-can: \f5bd; 1136 | $la-square: \f0c8; 1137 | $la-square-full: \f45c; 1138 | $la-square-root-alt: \f698; 1139 | $la-squarespace: \f5be; 1140 | $la-stack-exchange: \f18d; 1141 | $la-stack-overflow: \f16c; 1142 | $la-stackpath: \f842; 1143 | $la-stamp: \f5bf; 1144 | $la-star: \f005; 1145 | $la-star-and-crescent: \f699; 1146 | $la-star-half: \f089; 1147 | $la-star-half-alt: \f5c0; 1148 | $la-star-of-david: \f69a; 1149 | $la-star-of-life: \f621; 1150 | $la-staylinked: \f3f5; 1151 | $la-steam: \f1b6; 1152 | $la-steam-square: \f1b7; 1153 | $la-steam-symbol: \f3f6; 1154 | $la-step-backward: \f048; 1155 | $la-step-forward: \f051; 1156 | $la-stethoscope: \f0f1; 1157 | $la-sticker-mule: \f3f7; 1158 | $la-sticky-note: \f249; 1159 | $la-stop: \f04d; 1160 | $la-stop-circle: \f28d; 1161 | $la-stopwatch: \f2f2; 1162 | $la-store: \f54e; 1163 | $la-store-alt: \f54f; 1164 | $la-strava: \f428; 1165 | $la-stream: \f550; 1166 | $la-street-view: \f21d; 1167 | $la-strikethrough: \f0cc; 1168 | $la-stripe: \f429; 1169 | $la-stripe-s: \f42a; 1170 | $la-stroopwafel: \f551; 1171 | $la-studiovinari: \f3f8; 1172 | $la-stumbleupon: \f1a4; 1173 | $la-stumbleupon-circle: \f1a3; 1174 | $la-subscript: \f12c; 1175 | $la-subway: \f239; 1176 | $la-suitcase: \f0f2; 1177 | $la-suitcase-rolling: \f5c1; 1178 | $la-sun: \f185; 1179 | $la-superpowers: \f2dd; 1180 | $la-superscript: \f12b; 1181 | $la-supple: \f3f9; 1182 | $la-surprise: \f5c2; 1183 | $la-suse: \f7d6; 1184 | $la-swatchbook: \f5c3; 1185 | $la-swimmer: \f5c4; 1186 | $la-swimming-pool: \f5c5; 1187 | $la-symfony: \f83d; 1188 | $la-synagogue: \f69b; 1189 | $la-sync: \f021; 1190 | $la-sync-alt: \f2f1; 1191 | $la-syringe: \f48e; 1192 | $la-table: \f0ce; 1193 | $la-table-tennis: \f45d; 1194 | $la-tablet: \f10a; 1195 | $la-tablet-alt: \f3fa; 1196 | $la-tablets: \f490; 1197 | $la-tachometer-alt: \f3fd; 1198 | $la-tag: \f02b; 1199 | $la-tags: \f02c; 1200 | $la-tape: \f4db; 1201 | $la-tasks: \f0ae; 1202 | $la-taxi: \f1ba; 1203 | $la-teamspeak: \f4f9; 1204 | $la-teeth: \f62e; 1205 | $la-teeth-open: \f62f; 1206 | $la-telegram: \f2c6; 1207 | $la-telegram-plane: \f3fe; 1208 | $la-temperature-high: \f769; 1209 | $la-temperature-low: \f76b; 1210 | $la-tencent-weibo: \f1d5; 1211 | $la-tenge: \f7d7; 1212 | $la-terminal: \f120; 1213 | $la-text-height: \f034; 1214 | $la-text-width: \f035; 1215 | $la-th: \f00a; 1216 | $la-th-large: \f009; 1217 | $la-th-list: \f00b; 1218 | $la-the-red-yeti: \f69d; 1219 | $la-theater-masks: \f630; 1220 | $la-themeco: \f5c6; 1221 | $la-themeisle: \f2b2; 1222 | $la-thermometer: \f491; 1223 | $la-thermometer-empty: \f2cb; 1224 | $la-thermometer-full: \f2c7; 1225 | $la-thermometer-half: \f2c9; 1226 | $la-thermometer-quarter: \f2ca; 1227 | $la-thermometer-three-quarters: \f2c8; 1228 | $la-think-peaks: \f731; 1229 | $la-thumbs-down: \f165; 1230 | $la-thumbs-up: \f164; 1231 | $la-thumbtack: \f08d; 1232 | $la-ticket-alt: \f3ff; 1233 | $la-times: \f00d; 1234 | $la-times-circle: \f057; 1235 | $la-tint: \f043; 1236 | $la-tint-slash: \f5c7; 1237 | $la-tired: \f5c8; 1238 | $la-toggle-off: \f204; 1239 | $la-toggle-on: \f205; 1240 | $la-toilet: \f7d8; 1241 | $la-toilet-paper: \f71e; 1242 | $la-toolbox: \f552; 1243 | $la-tools: \f7d9; 1244 | $la-tooth: \f5c9; 1245 | $la-torah: \f6a0; 1246 | $la-torii-gate: \f6a1; 1247 | $la-tractor: \f722; 1248 | $la-trade-federation: \f513; 1249 | $la-trademark: \f25c; 1250 | $la-traffic-light: \f637; 1251 | $la-train: \f238; 1252 | $la-tram: \f7da; 1253 | $la-transgender: \f224; 1254 | $la-transgender-alt: \f225; 1255 | $la-trash: \f1f8; 1256 | $la-trash-alt: \f2ed; 1257 | $la-trash-restore: \f829; 1258 | $la-trash-restore-alt: \f82a; 1259 | $la-tree: \f1bb; 1260 | $la-trello: \f181; 1261 | $la-tripadvisor: \f262; 1262 | $la-trophy: \f091; 1263 | $la-truck: \f0d1; 1264 | $la-truck-loading: \f4de; 1265 | $la-truck-monster: \f63b; 1266 | $la-truck-moving: \f4df; 1267 | $la-truck-pickup: \f63c; 1268 | $la-tshirt: \f553; 1269 | $la-tty: \f1e4; 1270 | $la-tumblr: \f173; 1271 | $la-tumblr-square: \f174; 1272 | $la-tv: \f26c; 1273 | $la-twitch: \f1e8; 1274 | $la-twitter: \f099; 1275 | $la-twitter-square: \f081; 1276 | $la-typo3: \f42b; 1277 | $la-uber: \f402; 1278 | $la-ubuntu: \f7df; 1279 | $la-uikit: \f403; 1280 | $la-umbrella: \f0e9; 1281 | $la-umbrella-beach: \f5ca; 1282 | $la-underline: \f0cd; 1283 | $la-undo: \f0e2; 1284 | $la-undo-alt: \f2ea; 1285 | $la-uniregistry: \f404; 1286 | $la-universal-access: \f29a; 1287 | $la-university: \f19c; 1288 | $la-unlink: \f127; 1289 | $la-unlock: \f09c; 1290 | $la-unlock-alt: \f13e; 1291 | $la-untappd: \f405; 1292 | $la-upload: \f093; 1293 | $la-ups: \f7e0; 1294 | $la-usb: \f287; 1295 | $la-user: \f007; 1296 | $la-user-alt: \f406; 1297 | $la-user-alt-slash: \f4fa; 1298 | $la-user-astronaut: \f4fb; 1299 | $la-user-check: \f4fc; 1300 | $la-user-circle: \f2bd; 1301 | $la-user-clock: \f4fd; 1302 | $la-user-cog: \f4fe; 1303 | $la-user-edit: \f4ff; 1304 | $la-user-friends: \f500; 1305 | $la-user-graduate: \f501; 1306 | $la-user-injured: \f728; 1307 | $la-user-lock: \f502; 1308 | $la-user-md: \f0f0; 1309 | $la-user-minus: \f503; 1310 | $la-user-ninja: \f504; 1311 | $la-user-nurse: \f82f; 1312 | $la-user-plus: \f234; 1313 | $la-user-secret: \f21b; 1314 | $la-user-shield: \f505; 1315 | $la-user-slash: \f506; 1316 | $la-user-tag: \f507; 1317 | $la-user-tie: \f508; 1318 | $la-user-times: \f235; 1319 | $la-users: \f0c0; 1320 | $la-users-cog: \f509; 1321 | $la-usps: \f7e1; 1322 | $la-ussunnah: \f407; 1323 | $la-utensil-spoon: \f2e5; 1324 | $la-utensils: \f2e7; 1325 | $la-vaadin: \f408; 1326 | $la-vector-square: \f5cb; 1327 | $la-venus: \f221; 1328 | $la-venus-double: \f226; 1329 | $la-venus-mars: \f228; 1330 | $la-viacoin: \f237; 1331 | $la-viadeo: \f2a9; 1332 | $la-viadeo-square: \f2aa; 1333 | $la-vial: \f492; 1334 | $la-vials: \f493; 1335 | $la-viber: \f409; 1336 | $la-video: \f03d; 1337 | $la-video-slash: \f4e2; 1338 | $la-vihara: \f6a7; 1339 | $la-vimeo: \f40a; 1340 | $la-vimeo-square: \f194; 1341 | $la-vimeo-v: \f27d; 1342 | $la-vine: \f1ca; 1343 | $la-vk: \f189; 1344 | $la-vnv: \f40b; 1345 | $la-voicemail: \f897; 1346 | $la-volleyball-ball: \f45f; 1347 | $la-volume-down: \f027; 1348 | $la-volume-mute: \f6a9; 1349 | $la-volume-off: \f026; 1350 | $la-volume-up: \f028; 1351 | $la-vote-yea: \f772; 1352 | $la-vr-cardboard: \f729; 1353 | $la-vuejs: \f41f; 1354 | $la-walking: \f554; 1355 | $la-wallet: \f555; 1356 | $la-warehouse: \f494; 1357 | $la-water: \f773; 1358 | $la-wave-square: \f83e; 1359 | $la-waze: \f83f; 1360 | $la-weebly: \f5cc; 1361 | $la-weibo: \f18a; 1362 | $la-weight: \f496; 1363 | $la-weight-hanging: \f5cd; 1364 | $la-weixin: \f1d7; 1365 | $la-whatsapp: \f232; 1366 | $la-whatsapp-square: \f40c; 1367 | $la-wheelchair: \f193; 1368 | $la-whmcs: \f40d; 1369 | $la-wifi: \f1eb; 1370 | $la-wikipedia-w: \f266; 1371 | $la-wind: \f72e; 1372 | $la-window-close: \f410; 1373 | $la-window-maximize: \f2d0; 1374 | $la-window-minimize: \f2d1; 1375 | $la-window-restore: \f2d2; 1376 | $la-windows: \f17a; 1377 | $la-wine-bottle: \f72f; 1378 | $la-wine-glass: \f4e3; 1379 | $la-wine-glass-alt: \f5ce; 1380 | $la-wix: \f5cf; 1381 | $la-wizards-of-the-coast: \f730; 1382 | $la-wolf-pack-battalion: \f514; 1383 | $la-won-sign: \f159; 1384 | $la-wordpress: \f19a; 1385 | $la-wordpress-simple: \f411; 1386 | $la-wpbeginner: \f297; 1387 | $la-wpexplorer: \f2de; 1388 | $la-wpforms: \f298; 1389 | $la-wpressr: \f3e4; 1390 | $la-wrench: \f0ad; 1391 | $la-x-ray: \f497; 1392 | $la-xbox: \f412; 1393 | $la-xing: \f168; 1394 | $la-xing-square: \f169; 1395 | $la-y-combinator: \f23b; 1396 | $la-yahoo: \f19e; 1397 | $la-yammer: \f840; 1398 | $la-yandex: \f413; 1399 | $la-yandex-international: \f414; 1400 | $la-yarn: \f7e3; 1401 | $la-yelp: \f1e9; 1402 | $la-yen-sign: \f157; 1403 | $la-yin-yang: \f6ad; 1404 | $la-yoast: \f2b1; 1405 | $la-youtube: \f167; 1406 | $la-youtube-square: \f431; 1407 | $la-zhihu: \f63f; 1408 | $la-hat-cowboy: \f8c0; 1409 | $la-hat-cowboy-side: \f8c1; 1410 | $la-mdb: \f8ca; 1411 | $la-mouse: \f8cc; 1412 | $la-orcid: \f8d2; 1413 | $la-record-vinyl: \f8d9; 1414 | $la-swift: \f8e1; 1415 | $la-umbraco: \f8e8; 1416 | $la-buy-n-large: \f8a6; 1417 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/LineAwesome/line-awesome.scss: -------------------------------------------------------------------------------- 1 | @import "mixins"; 2 | @import "core"; 3 | @import "variables"; 4 | @import "path"; 5 | @import "larger"; 6 | @import "fixed-width"; 7 | @import "list"; 8 | @import "bordered_pulled"; 9 | @import "rotated-flipped"; 10 | @import "stacked"; 11 | @import "icons"; 12 | @import "screen-reader"; 13 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Base.sass: -------------------------------------------------------------------------------- 1 | 2 | // Base 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | // Set box-sizing globally to handle padding and border widths 6 | *, 7 | *:after, 8 | *:before 9 | box-sizing: inherit 10 | 11 | // The base font-size is set at 62.5% for having the convenience 12 | // of sizing rems in a way that is similar to using px: 1.6rem = 16px 13 | html 14 | box-sizing: border-box 15 | font-size: 62.5% 16 | 17 | // Default body styles 18 | body 19 | color: $color-secondary 20 | font-family: 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif 21 | font-size: 1.6em // Currently ems cause chrome bug misinterpreting rems on body element 22 | font-weight: 300 23 | letter-spacing: .01em 24 | line-height: 1.6 25 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Blockquote.sass: -------------------------------------------------------------------------------- 1 | 2 | // Blockquote 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | blockquote 6 | border-left: .3rem solid #38A169 7 | margin-left: 0 8 | margin-right: 0 9 | padding: 1rem 1.5rem 10 | color: #38A169 11 | background: #F0FFF4 12 | 13 | *:last-child 14 | margin-bottom: 0 15 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Button.sass: -------------------------------------------------------------------------------- 1 | 2 | // Button 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | .button, 6 | button, 7 | input[type='button'], 8 | input[type='reset'], 9 | input[type='submit'] 10 | background-color: $color-primary 11 | border: .1rem solid $color-primary 12 | border-radius: .4rem 13 | color: $color-initial 14 | cursor: pointer 15 | display: inline-block 16 | font-size: 1.1rem 17 | font-weight: 700 18 | height: 3.8rem 19 | letter-spacing: .1rem 20 | line-height: 3.8rem 21 | padding: 0 3.0rem 22 | text-align: center 23 | text-decoration: none 24 | text-transform: uppercase 25 | white-space: nowrap 26 | 27 | &:focus, 28 | &:hover 29 | background-color: $color-secondary 30 | border-color: $color-secondary 31 | color: $color-initial 32 | outline: 0 33 | 34 | &[disabled] 35 | cursor: default 36 | opacity: .5 37 | 38 | &:focus, 39 | &:hover 40 | background-color: $color-primary 41 | border-color: $color-primary 42 | 43 | &.button-outline 44 | background-color: transparent 45 | color: $color-primary 46 | 47 | &:focus, 48 | &:hover 49 | background-color: transparent 50 | border-color: $color-secondary 51 | color: $color-secondary 52 | 53 | &[disabled] 54 | 55 | &:focus, 56 | &:hover 57 | border-color: inherit 58 | color: $color-primary 59 | 60 | &.button-clear 61 | background-color: transparent 62 | border-color: transparent 63 | color: $color-primary 64 | 65 | &:focus, 66 | &:hover 67 | background-color: transparent 68 | border-color: transparent 69 | color: $color-secondary 70 | 71 | &[disabled] 72 | 73 | &:focus, 74 | &:hover 75 | color: $color-primary 76 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Code.sass: -------------------------------------------------------------------------------- 1 | 2 | // Code 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | code 6 | background: $color-tertiary 7 | border-radius: .4rem 8 | font-size: 86% 9 | margin: 0 .2rem 10 | padding: .2rem .5rem 11 | white-space: nowrap 12 | 13 | pre 14 | background: $color-tertiary 15 | border-left: .3rem solid $color-primary 16 | overflow-y: hidden 17 | 18 | & > code 19 | border-radius: 0 20 | display: block 21 | padding: 1rem 1.5rem 22 | white-space: pre 23 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Color.sass: -------------------------------------------------------------------------------- 1 | 2 | // Color 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | $color-initial: #fff !default 6 | $color-primary: #ed8936 !default 7 | $color-secondary: #606c76 !default 8 | $color-tertiary: #f4f5f6 !default 9 | $color-quaternary: #d1d1d1 !default 10 | $color-quinary: #e1e1e1 !default 11 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Divider.sass: -------------------------------------------------------------------------------- 1 | 2 | // Divider 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | hr 6 | border: 0 7 | border-top: .1rem solid $color-tertiary 8 | margin: 3.0rem 0 9 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Form.sass: -------------------------------------------------------------------------------- 1 | 2 | // Form 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | input[type='email'], 6 | input[type='number'], 7 | input[type='password'], 8 | input[type='search'], 9 | input[type='tel'], 10 | input[type='text'], 11 | input[type='url'], 12 | textarea, 13 | select 14 | appearance: none // Removes awkward default styles on some inputs for iOS 15 | background-color: transparent 16 | border: .1rem solid $color-quaternary 17 | border-radius: .4rem 18 | box-shadow: none 19 | box-sizing: inherit // Forced to replace inherit values of the normalize.css 20 | height: 3.8rem 21 | padding: .6rem 1.0rem // The .6rem vertically centers text on FF, ignored by Webkit 22 | width: 100% 23 | 24 | &:focus 25 | border-color: $color-primary 26 | outline: 0 27 | 28 | select 29 | background: url('data:image/svg+xml;utf8,') center right no-repeat 30 | padding-right: 3.0rem 31 | 32 | &:focus 33 | background-image: url('data:image/svg+xml;utf8,') 34 | 35 | textarea 36 | min-height: 6.5rem 37 | 38 | label, 39 | legend 40 | display: block 41 | font-size: 1.6rem 42 | font-weight: 700 43 | margin-bottom: .5rem 44 | 45 | fieldset 46 | border-width: 0 47 | padding: 0 48 | 49 | input[type='checkbox'], 50 | input[type='radio'] 51 | display: inline 52 | 53 | .label-inline 54 | display: inline-block 55 | font-weight: normal 56 | margin-left: .5rem 57 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Grid.sass: -------------------------------------------------------------------------------- 1 | 2 | // Grid 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | // .container is main centered wrapper with a max width of 112.0rem (1120px) 6 | .container 7 | margin: 0 auto 8 | max-width: 112.0rem 9 | padding: 0 2.0rem 10 | position: relative 11 | width: 100% 12 | 13 | // Using flexbox for the grid, inspired by Philip Walton: 14 | // http://philipwalton.github.io/solved-by-flexbox/demos/grids/ 15 | // By default each .column within a .row will evenly take up 16 | // available width, and the height of each .column with take 17 | // up the height of the tallest .column in the same .row 18 | .row 19 | display: flex 20 | flex-direction: column 21 | padding: 0 22 | width: 100% 23 | 24 | &.row-no-padding 25 | padding: 0 26 | 27 | &> .column 28 | padding: 0 29 | 30 | &.row-wrap 31 | flex-wrap: wrap 32 | 33 | // Vertically Align Columns 34 | // .row-* vertically aligns every .col in the .row 35 | &.row-top 36 | align-items: flex-start 37 | 38 | &.row-bottom 39 | align-items: flex-end 40 | 41 | &.row-center 42 | align-items: center 43 | 44 | &.row-stretch 45 | align-items: stretch 46 | 47 | &.row-baseline 48 | align-items: baseline 49 | 50 | .column 51 | display: block 52 | // IE 11 required specifying the flex-basis otherwise it breaks mobile 53 | flex: 1 1 auto 54 | margin-left: 0 55 | max-width: 100% 56 | width: 100% 57 | 58 | // Column Offsets 59 | &.column-offset-10 60 | margin-left: 10% 61 | 62 | &.column-offset-20 63 | margin-left: 20% 64 | 65 | &.column-offset-25 66 | margin-left: 25% 67 | 68 | &.column-offset-33, 69 | &.column-offset-34 70 | margin-left: 33.3333% 71 | 72 | &.column-offset-50 73 | margin-left: 50% 74 | 75 | &.column-offset-66, 76 | &.column-offset-67 77 | margin-left: 66.6666% 78 | 79 | &.column-offset-75 80 | margin-left: 75% 81 | 82 | &.column-offset-80 83 | margin-left: 80% 84 | 85 | &.column-offset-90 86 | margin-left: 90% 87 | 88 | // Explicit Column Percent Sizes 89 | // By default each grid column will evenly distribute 90 | // across the grid. However, you can specify individual 91 | // columns to take up a certain size of the available area 92 | &.column-10 93 | flex: 0 0 10% 94 | max-width: 10% 95 | 96 | &.column-20 97 | flex: 0 0 20% 98 | max-width: 20% 99 | 100 | &.column-25 101 | flex: 0 0 25% 102 | max-width: 25% 103 | 104 | &.column-33, 105 | &.column-34 106 | flex: 0 0 33.3333% 107 | max-width: 33.3333% 108 | 109 | &.column-40 110 | flex: 0 0 40% 111 | max-width: 40% 112 | 113 | &.column-50 114 | flex: 0 0 50% 115 | max-width: 50% 116 | 117 | &.column-60 118 | flex: 0 0 60% 119 | max-width: 60% 120 | 121 | &.column-66, 122 | &.column-67 123 | flex: 0 0 66.6666% 124 | max-width: 66.6666% 125 | 126 | &.column-75 127 | flex: 0 0 75% 128 | max-width: 75% 129 | 130 | &.column-80 131 | flex: 0 0 80% 132 | max-width: 80% 133 | 134 | &.column-90 135 | flex: 0 0 90% 136 | max-width: 90% 137 | 138 | // .column-* vertically aligns an individual .column 139 | .column-top 140 | align-self: flex-start 141 | 142 | .column-bottom 143 | align-self: flex-end 144 | 145 | .column-center 146 | align-self: center 147 | 148 | // Larger than mobile screen 149 | @media (min-width: 40.0rem) // Safari desktop has a bug using `rem`, but Safari mobile works 150 | 151 | .row 152 | flex-direction: row 153 | margin-left: -1.0rem 154 | width: calc(100% + 2.0rem) 155 | 156 | .column 157 | margin-bottom: inherit 158 | padding: 0 1.0rem 159 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Image.sass: -------------------------------------------------------------------------------- 1 | 2 | // Image 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | img 6 | max-width: 100% 7 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Link.sass: -------------------------------------------------------------------------------- 1 | 2 | // Link 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | a 6 | color: $color-primary 7 | text-decoration: none 8 | 9 | &:focus, 10 | &:hover 11 | color: $color-secondary 12 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_List.sass: -------------------------------------------------------------------------------- 1 | 2 | // List 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | dl, 6 | ol, 7 | ul 8 | list-style: none 9 | margin-top: 0 10 | padding-left: 0 11 | 12 | dl, 13 | ol, 14 | ul 15 | font-size: 90% 16 | margin: 1.5rem 0 1.5rem 3.0rem 17 | 18 | ol 19 | list-style: decimal inside 20 | 21 | ul 22 | list-style: circle inside 23 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Spacing.sass: -------------------------------------------------------------------------------- 1 | 2 | // Spacing 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | .button, 6 | button, 7 | dd, 8 | dt, 9 | li 10 | margin-bottom: 1.0rem 11 | 12 | fieldset, 13 | input, 14 | select, 15 | textarea 16 | margin-bottom: 1.5rem 17 | 18 | blockquote, 19 | dl, 20 | figure, 21 | form, 22 | ol, 23 | p, 24 | pre, 25 | table, 26 | ul 27 | margin-bottom: 2.5rem 28 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Table.sass: -------------------------------------------------------------------------------- 1 | 2 | // Table 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | table 6 | border-spacing: 0 7 | width: 100% 8 | 9 | td, 10 | th 11 | border-bottom: .1rem solid $color-quinary 12 | padding: 1.2rem 1.5rem 13 | text-align: left 14 | 15 | &:first-child 16 | padding-left: 0 17 | 18 | &:last-child 19 | padding-right: 0 20 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Typography.sass: -------------------------------------------------------------------------------- 1 | 2 | // Typography 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | b, 6 | strong 7 | font-weight: bold 8 | 9 | p 10 | margin-top: 0 11 | 12 | h1, 13 | h2, 14 | h3, 15 | h4, 16 | h5, 17 | h6 18 | font-weight: 300 19 | letter-spacing: -.1rem 20 | margin-bottom: 2.0rem 21 | margin-top: 0 22 | 23 | h1 24 | font-size: 4.6rem 25 | line-height: 1.2 26 | 27 | h2 28 | font-size: 3.6rem 29 | line-height: 1.25 30 | 31 | h3 32 | font-size: 2.8rem 33 | line-height: 1.3 34 | 35 | h4 36 | font-size: 2.2rem 37 | letter-spacing: -.08rem 38 | line-height: 1.35 39 | 40 | h5 41 | font-size: 1.8rem 42 | letter-spacing: -.05rem 43 | line-height: 1.5 44 | 45 | h6 46 | font-size: 1.6rem 47 | letter-spacing: 0 48 | line-height: 1.4 49 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/_Utility.sass: -------------------------------------------------------------------------------- 1 | 2 | // Utility 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | // Clear a float with .clearfix 6 | .clearfix 7 | 8 | &:after 9 | clear: both 10 | content: ' ' // The space content is one way to avoid an Opera bug. 11 | display: table 12 | 13 | // Float either direction 14 | .float-left 15 | float: left 16 | 17 | .float-right 18 | float: right 19 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Milligram/milligram.sass: -------------------------------------------------------------------------------- 1 | 2 | // Sass Modules 3 | // –––––––––––––––––––––––––––––––––––––––––––––––––– 4 | 5 | @import Color 6 | @import Base 7 | @import Blockquote 8 | @import Button 9 | @import Code 10 | @import Divider 11 | @import Form 12 | @import Grid 13 | @import Link 14 | @import List 15 | @import Spacing 16 | @import Table 17 | @import Typography 18 | @import Image 19 | @import Utility 20 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Normalize/Normalize.scss: -------------------------------------------------------------------------------- 1 | @import "_Variables"; 2 | @import "_VerticalRhythm"; 3 | @import "_NormalizeMixin"; 4 | 5 | @include normalize(); -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Normalize/_NormalizeMixin.scss: -------------------------------------------------------------------------------- 1 | /* Helper function for the normalize() mixin. */ 2 | @function _normalize-include($section, $exclude: null) { 3 | // Initialize the global variables needed by this function. 4 | @if not global_variable_exists(_normalize-include) { 5 | $_normalize-include: () !global; 6 | $_normalize-exclude: () !global; 7 | } 8 | // Since we are given 2 parameters, set the global variables. 9 | @if $exclude != null { 10 | $include: $section; 11 | // Sass doesn't have static variables, so the work-around is to stuff these 12 | // values into global variables so we can access them in future calls. 13 | $_normalize-include: if(type-of($include) == 'list', $include, ($include)) !global; 14 | $_normalize-exclude: if(type-of($exclude) == 'list', $exclude, ($exclude)) !global; 15 | @return true; 16 | } 17 | 18 | // Check if $section is in the $include list. 19 | @if index($_normalize-include, $section) { 20 | @return true; 21 | } 22 | // If $include is set to (all), make sure $section is not in $exclude. 23 | @else if not index($_normalize-exclude, $section) and index($_normalize-include, all) { 24 | @return true; 25 | } 26 | @return false; 27 | } 28 | 29 | @mixin normalize($include: (all), $exclude: ()) { 30 | // Initialize the helper function by passing it this mixin's parameters. 31 | $init: _normalize-include($include, $exclude); 32 | 33 | // If we've customized any font variables, we'll need extra properties. 34 | @if $base-line-height != 24px 35 | or $base-unit != 'em' 36 | or $h2-font-size != 1.5 * $base-font-size 37 | or $h3-font-size != 1.17 * $base-font-size 38 | or $h4-font-size != 1 * $base-font-size 39 | or $h5-font-size != 0.83 * $base-font-size 40 | or $h6-font-size != 0.67 * $base-font-size { 41 | $normalize-vertical-rhythm: true !global; 42 | } 43 | 44 | /*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */ 45 | 46 | @if _normalize-include(document) { 47 | /* Document 48 | ========================================================================== */ 49 | 50 | /** 51 | * 1. Correct the line height in all browsers. 52 | * 2. Prevent adjustments of font size after orientation changes in 53 | * IE on Windows Phone and in iOS. 54 | */ 55 | 56 | html { 57 | @if $base-font-family { 58 | /* Change the default font family in all browsers (opinionated). */ 59 | font-family: $base-font-family; 60 | } 61 | @if $base-font-size != 16px or $normalize-vertical-rhythm { 62 | // Correct old browser bug that prevented accessible resizing of text 63 | // when root font-size is set with px or em. 64 | font-size: ($base-font-size / 16px) * 100%; 65 | } 66 | @if $normalize-vertical-rhythm { 67 | line-height: ($base-line-height / $base-font-size) * 1em; /* 1 */ 68 | } 69 | @else { 70 | line-height: 1.15; /* 1 */ 71 | } 72 | -ms-text-size-adjust: 100%; /* 2 */ 73 | -webkit-text-size-adjust: 100%; /* 2 */ 74 | } 75 | } 76 | 77 | @if _normalize-include(sections) { 78 | /* Sections 79 | ========================================================================== */ 80 | 81 | /** 82 | * Remove the margin in all browsers (opinionated). 83 | */ 84 | 85 | body { 86 | margin: 0; 87 | } 88 | 89 | /** 90 | * Add the correct display in IE 9-. 91 | */ 92 | 93 | article, 94 | aside, 95 | footer, 96 | header, 97 | nav, 98 | section { 99 | display: block; 100 | } 101 | 102 | /** 103 | * Correct the font size and margin on `h1` elements within `section` and 104 | * `article` contexts in Chrome, Firefox, and Safari. 105 | */ 106 | 107 | h1 { 108 | @include normalize-font-size($h1-font-size); 109 | @if $normalize-vertical-rhythm { 110 | @include normalize-line-height($h1-font-size); 111 | } 112 | 113 | @if $normalize-vertical-rhythm { 114 | /* Set 1 unit of vertical rhythm on the top and bottom margins. */ 115 | @include normalize-margin(1 0, $h1-font-size); 116 | } 117 | @else { 118 | margin: 0.67em 0; 119 | } 120 | } 121 | 122 | @if $normalize-vertical-rhythm { 123 | h2 { 124 | @include normalize-font-size($h2-font-size); 125 | @include normalize-line-height($h2-font-size); 126 | @include normalize-margin(1 0, $h2-font-size); 127 | } 128 | 129 | h3 { 130 | @include normalize-font-size($h3-font-size); 131 | @include normalize-line-height($h3-font-size); 132 | @include normalize-margin(1 0, $h3-font-size); 133 | } 134 | 135 | h4 { 136 | @include normalize-font-size($h4-font-size); 137 | @include normalize-line-height($h4-font-size); 138 | @include normalize-margin(1 0, $h4-font-size); 139 | } 140 | 141 | h5 { 142 | @include normalize-font-size($h5-font-size); 143 | @include normalize-line-height($h5-font-size); 144 | @include normalize-margin(1 0, $h5-font-size); 145 | } 146 | 147 | h6 { 148 | @include normalize-font-size($h6-font-size); 149 | @include normalize-line-height($h6-font-size); 150 | @include normalize-margin(1 0, $h6-font-size); 151 | } 152 | } 153 | } 154 | 155 | @if _normalize-include(grouping) { 156 | /* Grouping content 157 | ========================================================================== */ 158 | 159 | @if $normalize-vertical-rhythm { 160 | /** 161 | * Set 1 unit of vertical rhythm on the top and bottom margin. 162 | */ 163 | 164 | blockquote { 165 | @include normalize-margin(1 $indent-amount); 166 | } 167 | 168 | dl, 169 | ol, 170 | ul { 171 | @include normalize-margin(1 0); 172 | } 173 | 174 | /** 175 | * Turn off margins on nested lists. 176 | */ 177 | 178 | ol, 179 | ul { 180 | ol, 181 | ul { 182 | margin: 0; 183 | } 184 | } 185 | 186 | dd { 187 | margin: 0 0 0 $indent-amount; 188 | } 189 | 190 | ol, 191 | ul { 192 | padding: 0 0 0 $indent-amount; 193 | } 194 | } 195 | 196 | /** 197 | * Add the correct display in IE 9-. 198 | */ 199 | 200 | figcaption, 201 | figure { 202 | display: block; 203 | } 204 | 205 | /** 206 | * Add the correct margin in IE 8. 207 | */ 208 | 209 | figure { 210 | @if $normalize-vertical-rhythm { 211 | @include normalize-margin(1 $indent-amount); 212 | } 213 | @else { 214 | margin: 1em $indent-amount; 215 | } 216 | } 217 | 218 | /** 219 | * 1. Add the correct box sizing in Firefox. 220 | * 2. Show the overflow in Edge and IE. 221 | */ 222 | 223 | hr { 224 | box-sizing: content-box; /* 1 */ 225 | height: 0; /* 1 */ 226 | overflow: visible; /* 2 */ 227 | } 228 | 229 | /** 230 | * Add the correct display in IE. 231 | */ 232 | 233 | main { 234 | display: block; 235 | } 236 | 237 | @if $normalize-vertical-rhythm { 238 | /** 239 | * Set 1 unit of vertical rhythm on the top and bottom margin. 240 | */ 241 | 242 | p, 243 | pre { 244 | @include normalize-margin(1 0); 245 | } 246 | } 247 | 248 | /** 249 | * 1. Correct the inheritance and scaling of font size in all browsers. 250 | * 2. Correct the odd `em` font sizing in all browsers. 251 | */ 252 | 253 | pre { 254 | font-family: monospace, monospace; /* 1 */ 255 | font-size: 1em; /* 2 */ 256 | } 257 | } 258 | 259 | @if _normalize-include(links) { 260 | /* Links 261 | ========================================================================== */ 262 | 263 | /** 264 | * 1. Remove the gray background on active links in IE 10. 265 | * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. 266 | */ 267 | 268 | a { 269 | background-color: transparent; /* 1 */ 270 | -webkit-text-decoration-skip: objects; /* 2 */ 271 | } 272 | } 273 | 274 | @if _normalize-include(text) { 275 | /* Text-level semantics 276 | ========================================================================== */ 277 | 278 | /** 279 | * 1. Remove the bottom border in Chrome 57- and Firefox 39-. 280 | * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. 281 | */ 282 | 283 | abbr[title] { 284 | border-bottom: none; /* 1 */ 285 | text-decoration: underline; /* 2 */ 286 | text-decoration: underline dotted; /* 2 */ 287 | } 288 | 289 | /** 290 | * Prevent the duplicate application of `bolder` by the next rule in Safari 6. 291 | */ 292 | 293 | b, 294 | strong { 295 | font-weight: inherit; 296 | } 297 | 298 | /** 299 | * Add the correct font weight in Chrome, Edge, and Safari. 300 | */ 301 | 302 | b, 303 | strong { 304 | font-weight: bolder; 305 | } 306 | 307 | /** 308 | * 1. Correct the inheritance and scaling of font size in all browsers. 309 | * 2. Correct the odd `em` font sizing in all browsers. 310 | */ 311 | 312 | code, 313 | kbd, 314 | samp { 315 | font-family: monospace, monospace; /* 1 */ 316 | font-size: 1em; /* 2 */ 317 | } 318 | 319 | /** 320 | * Add the correct font style in Android 4.3-. 321 | */ 322 | 323 | dfn { 324 | font-style: italic; 325 | } 326 | 327 | /** 328 | * Add the correct background and color in IE 9-. 329 | */ 330 | 331 | mark { 332 | background-color: #ff0; 333 | color: #000; 334 | } 335 | 336 | /** 337 | * Add the correct font size in all browsers. 338 | */ 339 | 340 | small { 341 | font-size: 80%; 342 | } 343 | 344 | /** 345 | * Prevent `sub` and `sup` elements from affecting the line height in 346 | * all browsers. 347 | */ 348 | 349 | sub, 350 | sup { 351 | font-size: 75%; 352 | line-height: 0; 353 | position: relative; 354 | vertical-align: baseline; 355 | } 356 | 357 | sub { 358 | bottom: -0.25em; 359 | } 360 | 361 | sup { 362 | top: -0.5em; 363 | } 364 | } 365 | 366 | @if _normalize-include(embedded) { 367 | /* Embedded content 368 | ========================================================================== */ 369 | 370 | /** 371 | * Add the correct display in IE 9-. 372 | */ 373 | 374 | audio, 375 | video { 376 | display: inline-block; 377 | } 378 | 379 | /** 380 | * Add the correct display in iOS 4-7. 381 | */ 382 | 383 | audio:not([controls]) { 384 | display: none; 385 | height: 0; 386 | } 387 | 388 | /** 389 | * Remove the border on images inside links in IE 10-. 390 | */ 391 | 392 | img { 393 | border-style: none; 394 | } 395 | 396 | /** 397 | * Hide the overflow in IE. 398 | */ 399 | 400 | svg:not(:root) { 401 | overflow: hidden; 402 | } 403 | } 404 | 405 | @if _normalize-include(forms) { 406 | /* Forms 407 | ========================================================================== */ 408 | 409 | /** 410 | * 1. Change the font styles in all browsers (opinionated). 411 | * 2. Remove the margin in Firefox and Safari. 412 | */ 413 | 414 | button, 415 | input, 416 | optgroup, 417 | select, 418 | textarea { 419 | font-family: if($base-font-family, $base-font-family, sans-serif); /* 1 */ 420 | font-size: 100%; /* 1 */ 421 | @if $normalize-vertical-rhythm { 422 | line-height: ($base-line-height / $base-font-size) * 1em; /* 1 */ 423 | } 424 | @else { 425 | line-height: 1.15; /* 1 */ 426 | } 427 | margin: 0; /* 2 */ 428 | } 429 | 430 | /** 431 | * Show the overflow in IE. 432 | */ 433 | 434 | button { 435 | overflow: visible; 436 | } 437 | 438 | /** 439 | * Remove the inheritance of text transform in Edge, Firefox, and IE. 440 | * 1. Remove the inheritance of text transform in Firefox. 441 | */ 442 | 443 | button, 444 | select { /* 1 */ 445 | text-transform: none; 446 | } 447 | 448 | /** 449 | * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` 450 | * controls in Android 4. 451 | * 2. Correct the inability to style clickable types in iOS and Safari. 452 | */ 453 | 454 | button, 455 | html [type="button"], /* 1 */ 456 | [type="reset"], 457 | [type="submit"] { 458 | -webkit-appearance: button; /* 2 */ 459 | } 460 | 461 | button, 462 | [type="button"], 463 | [type="reset"], 464 | [type="submit"] { 465 | 466 | /** 467 | * Remove the inner border and padding in Firefox. 468 | */ 469 | 470 | &::-moz-focus-inner { 471 | border-style: none; 472 | padding: 0; 473 | } 474 | 475 | /** 476 | * Restore the focus styles unset by the previous rule. 477 | */ 478 | 479 | &:-moz-focusring { 480 | outline: 1px dotted ButtonText; 481 | } 482 | } 483 | 484 | /** 485 | * Show the overflow in Edge. 486 | */ 487 | 488 | input { 489 | overflow: visible; 490 | } 491 | 492 | /** 493 | * 1. Add the correct box sizing in IE 10-. 494 | * 2. Remove the padding in IE 10-. 495 | */ 496 | 497 | [type="checkbox"], 498 | [type="radio"] { 499 | box-sizing: border-box; /* 1 */ 500 | padding: 0; /* 2 */ 501 | } 502 | 503 | /** 504 | * Correct the cursor style of increment and decrement buttons in Chrome. 505 | */ 506 | 507 | [type="number"]::-webkit-inner-spin-button, 508 | [type="number"]::-webkit-outer-spin-button { 509 | height: auto; 510 | } 511 | 512 | /** 513 | * 1. Correct the odd appearance in Chrome and Safari. 514 | * 2. Correct the outline style in Safari. 515 | */ 516 | 517 | [type="search"] { 518 | -webkit-appearance: textfield; /* 1 */ 519 | outline-offset: -2px; /* 2 */ 520 | 521 | /** 522 | * Remove the inner padding and cancel buttons in Chrome and Safari on macOS. 523 | */ 524 | 525 | &::-webkit-search-cancel-button, 526 | &::-webkit-search-decoration { 527 | -webkit-appearance: none; 528 | } 529 | } 530 | 531 | /** 532 | * 1. Correct the inability to style clickable types in iOS and Safari. 533 | * 2. Change font properties to `inherit` in Safari. 534 | */ 535 | 536 | ::-webkit-file-upload-button { 537 | -webkit-appearance: button; /* 1 */ 538 | font: inherit; /* 2 */ 539 | } 540 | 541 | /** 542 | * Correct the padding in Firefox. 543 | */ 544 | 545 | fieldset { 546 | padding: 0.35em 0.75em 0.625em; 547 | } 548 | 549 | /** 550 | * 1. Correct the text wrapping in Edge and IE. 551 | * 2. Correct the color inheritance from `fieldset` elements in IE. 552 | * 3. Remove the padding so developers are not caught out when they zero out 553 | * `fieldset` elements in all browsers. 554 | */ 555 | 556 | legend { 557 | box-sizing: border-box; /* 1 */ 558 | display: table; /* 1 */ 559 | max-width: 100%; /* 1 */ 560 | padding: 0; /* 3 */ 561 | color: inherit; /* 2 */ 562 | white-space: normal; /* 1 */ 563 | } 564 | 565 | /** 566 | * 1. Add the correct display in IE 9-. 567 | * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera. 568 | */ 569 | 570 | progress { 571 | display: inline-block; /* 1 */ 572 | vertical-align: baseline; /* 2 */ 573 | } 574 | 575 | /** 576 | * Remove the default vertical scrollbar in IE. 577 | */ 578 | 579 | textarea { 580 | overflow: auto; 581 | } 582 | } 583 | 584 | @if _normalize-include(interactive) { 585 | /* Interactive 586 | ========================================================================== */ 587 | 588 | /* 589 | * Add the correct display in Edge, IE, and Firefox. 590 | */ 591 | 592 | details { 593 | display: block; 594 | } 595 | 596 | /* 597 | * Add the correct display in all browsers. 598 | */ 599 | 600 | summary { 601 | display: list-item; 602 | } 603 | 604 | /* 605 | * Add the correct display in IE 9-. 606 | */ 607 | 608 | menu { 609 | display: block; 610 | 611 | @if $normalize-vertical-rhythm { 612 | /* 613 | * 1. Set 1 unit of vertical rhythm on the top and bottom margin. 614 | * 2. Set consistent space for the list style image. 615 | */ 616 | 617 | @include normalize-margin(1 0); /* 1 */ 618 | padding: 0 0 0 $indent-amount; /* 2 */ 619 | 620 | /** 621 | * Turn off margins on nested lists. 622 | */ 623 | 624 | menu &, 625 | ol &, 626 | ul & { 627 | margin: 0; 628 | } 629 | } 630 | } 631 | } 632 | 633 | @if _normalize-include(scripting) { 634 | /* Scripting 635 | ========================================================================== */ 636 | 637 | /** 638 | * Add the correct display in IE 9-. 639 | */ 640 | 641 | canvas { 642 | display: inline-block; 643 | } 644 | 645 | /** 646 | * Add the correct display in IE. 647 | */ 648 | 649 | template { 650 | display: none; 651 | } 652 | } 653 | 654 | @if _normalize-include(hidden) { 655 | /* Hidden 656 | ========================================================================== */ 657 | 658 | /** 659 | * Add the correct display in IE 10-. 660 | */ 661 | 662 | [hidden] { 663 | display: none; 664 | } 665 | } 666 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Normalize/_Variables.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Variables 3 | 4 | You can override the default values by setting the variables in your Sass 5 | before importing the normalize-scss library. 6 | */ 7 | 8 | /* The font size set on the root html element. */ 9 | $base-font-size: 16px !default; 10 | 11 | /* The base line height determines the basic unit of vertical rhythm. */ 12 | $base-line-height: 24px !default; 13 | 14 | /* 15 | The length unit in which to output vertical rhythm values. 16 | Supported values: px, em, rem. 17 | */ 18 | $base-unit: 'em' !default; 19 | 20 | /* The default font family. */ 21 | $base-font-family: null !default; 22 | 23 | /* The font sizes for h1-h6. */ 24 | $h1-font-size: 2 * $base-font-size !default; 25 | $h2-font-size: 1.5 * $base-font-size !default; 26 | $h3-font-size: 1.17 * $base-font-size !default; 27 | $h4-font-size: 1 * $base-font-size !default; 28 | $h5-font-size: 0.83 * $base-font-size !default; 29 | $h6-font-size: 0.67 * $base-font-size !default; 30 | 31 | /* The amount lists and blockquotes are indented. */ 32 | $indent-amount: 40px !default; 33 | 34 | /* 35 | The following variable controls whether normalize-scss will output 36 | font-sizes, line-heights and block-level top/bottom margins that form a basic 37 | vertical rhythm on the page, which differs from the original Normalize.css. 38 | However, changing any of the variables above will cause 39 | $normalize-vertical-rhythm to be automatically set to true. 40 | */ 41 | $normalize-vertical-rhythm: false !default; -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/Normalize/_VerticalRhythm.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Vertical Rhythm 3 | // 4 | // This is the minimal amount of code needed to create vertical rhythm in our 5 | // CSS. If you are looking for a robust solution, look at the excellent Typey 6 | // library. @see https://github.com/jptaranto/typey 7 | 8 | @function normalize-rhythm($value, $relative-to: $base-font-size, $unit: $base-unit) { 9 | @if unit($value) != px { 10 | @error "The normalize vertical-rhythm module only supports px inputs. The typey library is better."; 11 | } 12 | @if $unit == rem { 13 | @return ($value / $base-font-size) * 1rem; 14 | } 15 | @else if $unit == em { 16 | @return ($value / $relative-to) * 1em; 17 | } 18 | @else { // $unit == px 19 | @return $value; 20 | } 21 | } 22 | 23 | @mixin normalize-font-size($value, $relative-to: $base-font-size) { 24 | @if unit($value) != 'px' { 25 | @error "normalize-font-size() only supports px inputs. The typey library is better."; 26 | } 27 | font-size: normalize-rhythm($value, $relative-to); 28 | } 29 | 30 | @mixin normalize-rhythm($property, $values, $relative-to: $base-font-size) { 31 | $value-list: $values; 32 | $sep: space; 33 | @if type-of($values) == 'list' { 34 | $sep: list-separator($values); 35 | } 36 | @else { 37 | $value-list: append((), $values); 38 | } 39 | 40 | $normalized-values: (); 41 | @each $value in $value-list { 42 | @if unitless($value) and $value != 0 { 43 | $value: $value * normalize-rhythm($base-line-height, $relative-to); 44 | } 45 | $normalized-values: append($normalized-values, $value, $sep); 46 | } 47 | #{$property}: $normalized-values; 48 | } 49 | 50 | @mixin normalize-margin($values, $relative-to: $base-font-size) { 51 | @include normalize-rhythm(margin, $values, $relative-to); 52 | } 53 | 54 | @mixin normalize-line-height($font-size, $min-line-padding: 2px) { 55 | $lines: ceil($font-size / $base-line-height); 56 | // If lines are cramped include some extra leading. 57 | @if ($lines * $base-line-height - $font-size) < ($min-line-padding * 2) { 58 | $lines: $lines + 1; 59 | } 60 | @include normalize-rhythm(line-height, $lines, $font-size); 61 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/_Base.scss: -------------------------------------------------------------------------------- 1 | @import "_Variables.scss"; 2 | 3 | body { 4 | color: $grey-600; 5 | font-family: $font-family-text; 6 | font-size: $font-size-16; 7 | font-weight: $font-regular; 8 | line-height: 1.5; 9 | background-color: $grey-200; 10 | } 11 | 12 | a { 13 | color: $orange-500; 14 | transition: all 0.2s; 15 | 16 | &:hover { 17 | color: $orange-700; 18 | } 19 | } 20 | 21 | table { 22 | width: 100%; 23 | border-collapse: collapse; 24 | 25 | th { 26 | border-bottom: 2px solid $grey-400; 27 | color: $grey-500; 28 | font-weight: $font-bold; 29 | letter-spacing: .1rem; 30 | text-align: left; 31 | padding: 0 1.25rem 1.25rem; 32 | text-transform: uppercase; 33 | font-size: 1.2rem; 34 | } 35 | 36 | td { 37 | border-bottom: 2px solid $grey-100; 38 | padding: 1.25rem; 39 | text-align: left; 40 | font-weight: $font-regular; 41 | color: $grey-600; 42 | } 43 | 44 | tbody > tr:hover > td { 45 | background: $grey-100; 46 | } 47 | 48 | tbody > tr.no-items-row:hover > td { 49 | background: none; 50 | } 51 | 52 | td.actions { 53 | text-align: right; 54 | 55 | button { 56 | opacity: 0; 57 | color: $grey-500; 58 | margin-right: $size-4; 59 | 60 | &:last-child { 61 | margin-right: 0; 62 | } 63 | 64 | &:hover { 65 | color: $orange-500; 66 | } 67 | } 68 | } 69 | 70 | tr:hover > td.actions > button { 71 | opacity: 1; 72 | } 73 | 74 | .no-items { 75 | padding: 5rem; 76 | text-align: center; 77 | 78 | p { 79 | color: $grey-400; 80 | } 81 | } 82 | } 83 | 84 | form { 85 | .validation-errors { 86 | border-left: .3rem solid $red-600; 87 | margin-left: 0; 88 | margin-right: 0; 89 | padding: 1rem 1.5rem; 90 | color: $red-600; 91 | background: $red-100; 92 | list-style: none; 93 | 94 | &:last-child { 95 | margin-bottom: 0 96 | } 97 | } 98 | 99 | div { 100 | input, textarea, select { 101 | &.invalid { 102 | border-color: $red-600; 103 | } 104 | 105 | &.modified.valid { 106 | border-color: $green-600; 107 | } 108 | } 109 | 110 | .validation-message { 111 | color: $red-600; 112 | font-weight: $font-bold; 113 | margin-top: -$size-8; 114 | margin-bottom: $size-18; 115 | } 116 | } 117 | } 118 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/_Variables.scss: -------------------------------------------------------------------------------- 1 | // Global Variables 2 | 3 | // Colours 4 | $white: #fff; 5 | 6 | $orange-100: #fffaf0; 7 | $orange-200: #feebc8; 8 | $orange-300: #fbd38d; 9 | $orange-400: #f6ad55; 10 | $orange-500: #ed8936; 11 | $orange-600: #dd6820; 12 | $orange-700: #c05621; 13 | $orange-800: #9c4221; 14 | $orange-900: #7b341e; 15 | 16 | $grey-100: hsl(204, 45%, 98%); 17 | $grey-200: hsl(210, 38%, 95%); 18 | $grey-300: hsl(214, 32%, 91%); 19 | $grey-400: hsl(211, 25%, 84%); 20 | $grey-500: hsl(214, 20%, 69%); 21 | $grey-600: hsl(216, 15%, 52%); 22 | $grey-700: hsl(218, 17%, 35%); 23 | $grey-800: hsl(218, 23%, 23%); 24 | $grey-900: hsl(220, 26%, 14%); 25 | 26 | $green-100: hsl(136, 100%, 97%); 27 | $green-200: hsl(139, 73%, 87%); 28 | $green-300: hsl(141, 60%, 75%); 29 | $green-400: hsl(143, 55%, 62%); 30 | $green-500: hsl(145, 46%, 51%); 31 | $green-600: hsl(148, 48%, 43%); 32 | $green-700: hsl(150, 48%, 35%); 33 | $green-800: hsl(152, 45%, 28%); 34 | $green-900: hsl(152, 42%, 23%); 35 | 36 | $red-100: hsl(0, 100%, 98%); 37 | $red-200: hsl(0, 95%, 92%); 38 | $red-300: hsl(0, 97%, 85%); 39 | $red-400: hsl(0, 95%, 75%); 40 | $red-500: hsl(0, 88%, 68%); 41 | $red-600: hsl(0, 76%, 57%); 42 | $red-700: hsl(0, 61%, 48%); 43 | $red-800: hsl(0, 56%, 39%); 44 | $red-900: hsl(0, 47%, 31%); 45 | 46 | $yellow-100: hsl(60, 100%, 97%); 47 | $yellow-200: hsl(58, 97%, 87%); 48 | $yellow-300: hsl(55, 92%, 76%); 49 | $yellow-400: hsl(51, 89%, 67%); 50 | $yellow-500: hsl(47, 81%, 61%); 51 | $yellow-600: hsl(40, 67%, 51%); 52 | $yellow-700: hsl(36, 71%, 42%); 53 | $yellow-800: hsl(32, 75%, 34%); 54 | $yellow-900: hsl(30, 76%, 26%); 55 | 56 | 57 | // Typography 58 | @import url('https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900&display=swap'); 59 | $font-family-text: 'Roboto', sans-serif; 60 | 61 | $font-light: 300; 62 | $font-regular: 400; 63 | $font-medium: 500; 64 | $font-bold: 700; 65 | $font-black: 900; 66 | 67 | $font-size-12: 12px; 68 | $font-size-14: 14px; 69 | $font-size-16: 16px; 70 | $font-size-18: 18px; 71 | $font-size-20: 20px; 72 | $font-size-24: 24px; 73 | $font-size-30: 30px; 74 | $font-size-36: 36px; 75 | $font-size-48: 48px; 76 | $font-size-60: 60px; 77 | $font-size-72: 72px; 78 | 79 | $h1-font-size: 1.4em * 2.5; 80 | $h2-font-size: 1.4em * 2; 81 | $h3-font-size: 1.4em * 1.75; 82 | $h4-font-size: 1.4em * 1.5; 83 | $h5-font-size: 1.4em * 1.25; 84 | $h6-font-size: 1.4em; 85 | 86 | 87 | // Sizes 88 | $size-2: 2px; 89 | $size-4: 4px; 90 | $size-8: 8px; 91 | $size-12: 12px; 92 | $size-16: 16px; 93 | $size-18: 18px; 94 | $size-24: 24px; 95 | $size-32: 32px; 96 | $size-48: 48px; 97 | $size-64: 64px; 98 | $size-128: 128px; 99 | $size-192: 192px; 100 | $size-256: 256px; 101 | $size-384: 384px; 102 | $size-512: 512px; 103 | $size-640: 640px; 104 | $size-768: 768px; 105 | 106 | 107 | // Shadows 108 | //$box-shadow: 0 $size-4 $size-8 0 rgba(0,0,0,0.12), 0 $size-2 $size-4 0 rgba(0,0,0,0.08); 109 | $box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06); 110 | $box-shadow-medium: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); 111 | $box-shadow-large: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); 112 | $box-shadow-xlarge: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); 113 | $box-shadow-xxlarge: 0 25px 50px -12px rgba(0, 0, 0, 0.25); -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/Styles/blazored-repairs.scss: -------------------------------------------------------------------------------- 1 | /* Vendor Styles */ 2 | @import "Normalize/Normalize"; 3 | @import "Milligram/milligram.sass"; 4 | @import "LineAwesome/line-awesome.scss"; 5 | 6 | /* App Styles */ 7 | @import "Styles/_Variables"; 8 | @import "Styles/_Base"; 9 | @import "Shared/Card/_Card"; 10 | @import "Shared/Layout/_MainLayout"; 11 | @import "Shared/Layout/HeaderBar/_HeaderBar"; 12 | @import "Shared/Layout/NavMenu/_NavMenu"; 13 | @import "Features/Login/_Login"; -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using System.Net.Http.Json 3 | @using System.Text 4 | @using System.Text.Json 5 | @using Microsoft.AspNetCore.Authorization 6 | @using Microsoft.AspNetCore.Components.Authorization 7 | @using Microsoft.AspNetCore.Components.Forms 8 | @using Microsoft.AspNetCore.Components.Routing 9 | @using Microsoft.AspNetCore.Components.Web 10 | @using Microsoft.AspNetCore.Components.WebAssembly.Http 11 | @using Microsoft.JSInterop 12 | 13 | @using Blazored.FluentValidation 14 | 15 | @using BlazoredRepairs.Shared 16 | 17 | @using BlazoredRepairs.Client.Features 18 | @using BlazoredRepairs.Client.Features.Shared.Card 19 | @using BlazoredRepairs.Client.Features.Shared.Layout 20 | @using BlazoredRepairs.Client.Features.Shared.Layout.HeaderBar 21 | @using BlazoredRepairs.Client.Features.Shared.Layout.NavMenu 22 | @using BlazoredRepairs.Client.Features.Login 23 | 24 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/compilerconfig.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "outputFile": "wwwroot/blazored-repairs.css", 4 | "inputFile": "Styles/blazored-repairs.scss" 5 | } 6 | ] -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/compilerconfig.json.defaults: -------------------------------------------------------------------------------- 1 | { 2 | "compilers": { 3 | "less": { 4 | "autoPrefix": "", 5 | "cssComb": "none", 6 | "ieCompat": true, 7 | "strictMath": false, 8 | "strictUnits": false, 9 | "relativeUrls": true, 10 | "rootPath": "", 11 | "sourceMapRoot": "", 12 | "sourceMapBasePath": "", 13 | "sourceMap": false 14 | }, 15 | "sass": { 16 | "autoPrefix": "", 17 | "includePath": "", 18 | "indentType": "space", 19 | "indentWidth": 2, 20 | "outputStyle": "nested", 21 | "Precision": 5, 22 | "relativeUrls": true, 23 | "sourceMapRoot": "", 24 | "lineFeed": "", 25 | "sourceMap": false 26 | }, 27 | "stylus": { 28 | "sourceMap": false 29 | }, 30 | "babel": { 31 | "sourceMap": false 32 | }, 33 | "coffeescript": { 34 | "bare": false, 35 | "runtimeMode": "node", 36 | "sourceMap": false 37 | }, 38 | "handlebars": { 39 | "root": "", 40 | "noBOM": false, 41 | "name": "", 42 | "namespace": "", 43 | "knownHelpersOnly": false, 44 | "forcePartial": false, 45 | "knownHelpers": [], 46 | "commonjs": "", 47 | "amd": false, 48 | "sourceMap": false 49 | } 50 | }, 51 | "minifiers": { 52 | "css": { 53 | "enabled": true, 54 | "termSemicolons": true, 55 | "gzip": false 56 | }, 57 | "javascript": { 58 | "enabled": true, 59 | "termSemicolons": true, 60 | "gzip": false 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/blazored-repairs.min.css: -------------------------------------------------------------------------------- 1 | /*! normalize-scss | MIT/GPLv2 License | bit.ly/normalize-scss */ 2 | @import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900&display=swap");@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900&display=swap");@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900&display=swap");@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900&display=swap");@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900&display=swap");@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900&display=swap");@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,900&display=swap");html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}body{margin:0;}article,aside,footer,header,nav,section{display:block;}h1{font-size:2em;margin:.67em 0;}figcaption,figure{display:block;}figure{margin:1em 40px;}hr{box-sizing:content-box;height:0;overflow:visible;}main{display:block;}pre{font-family:monospace,monospace;font-size:1em;}a{background-color:transparent;-webkit-text-decoration-skip:objects;}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted;}b,strong{font-weight:inherit;}b,strong{font-weight:bolder;}code,kbd,samp{font-family:monospace,monospace;font-size:1em;}dfn{font-style:italic;}mark{background-color:#ff0;color:#000;}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sub{bottom:-.25em;}sup{top:-.5em;}audio,video{display:inline-block;}audio:not([controls]){display:none;height:0;}img{border-style:none;}svg:not(:root){overflow:hidden;}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0;}button{overflow:visible;}button,select{text-transform:none;}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button;}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0;}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText;}input{overflow:visible;}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0;}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto;}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px;}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit;}fieldset{padding:.35em .75em .625em;}legend{box-sizing:border-box;display:table;max-width:100%;padding:0;color:inherit;white-space:normal;}progress{display:inline-block;vertical-align:baseline;}textarea{overflow:auto;}details{display:block;}summary{display:list-item;}menu{display:block;}canvas{display:inline-block;}template{display:none;}[hidden]{display:none;}*,*:after,*:before{box-sizing:inherit;}html{box-sizing:border-box;font-size:62.5%;}body{color:#606c76;font-family:'Roboto','Helvetica Neue','Helvetica','Arial',sans-serif;font-size:1.6em;font-weight:300;letter-spacing:.01em;line-height:1.6;}blockquote{border-left:.3rem solid #38a169;margin-left:0;margin-right:0;padding:1rem 1.5rem;color:#38a169;background:#f0fff4;}blockquote *:last-child{margin-bottom:0;}.button,button,input[type='button'],input[type='reset'],input[type='submit']{background-color:#ed8936;border:.1rem solid #ed8936;border-radius:.4rem;color:#fff;cursor:pointer;display:inline-block;font-size:1.1rem;font-weight:700;height:3.8rem;letter-spacing:.1rem;line-height:3.8rem;padding:0 3rem;text-align:center;text-decoration:none;text-transform:uppercase;white-space:nowrap;}.button:focus,.button:hover,button:focus,button:hover,input[type='button']:focus,input[type='button']:hover,input[type='reset']:focus,input[type='reset']:hover,input[type='submit']:focus,input[type='submit']:hover{background-color:#606c76;border-color:#606c76;color:#fff;outline:0;}.button[disabled],button[disabled],input[type='button'][disabled],input[type='reset'][disabled],input[type='submit'][disabled]{cursor:default;opacity:.5;}.button[disabled]:focus,.button[disabled]:hover,button[disabled]:focus,button[disabled]:hover,input[type='button'][disabled]:focus,input[type='button'][disabled]:hover,input[type='reset'][disabled]:focus,input[type='reset'][disabled]:hover,input[type='submit'][disabled]:focus,input[type='submit'][disabled]:hover{background-color:#ed8936;border-color:#ed8936;}.button.button-outline,button.button-outline,input[type='button'].button-outline,input[type='reset'].button-outline,input[type='submit'].button-outline{background-color:transparent;color:#ed8936;}.button.button-outline:focus,.button.button-outline:hover,button.button-outline:focus,button.button-outline:hover,input[type='button'].button-outline:focus,input[type='button'].button-outline:hover,input[type='reset'].button-outline:focus,input[type='reset'].button-outline:hover,input[type='submit'].button-outline:focus,input[type='submit'].button-outline:hover{background-color:transparent;border-color:#606c76;color:#606c76;}.button.button-outline[disabled]:focus,.button.button-outline[disabled]:hover,button.button-outline[disabled]:focus,button.button-outline[disabled]:hover,input[type='button'].button-outline[disabled]:focus,input[type='button'].button-outline[disabled]:hover,input[type='reset'].button-outline[disabled]:focus,input[type='reset'].button-outline[disabled]:hover,input[type='submit'].button-outline[disabled]:focus,input[type='submit'].button-outline[disabled]:hover{border-color:inherit;color:#ed8936;}.button.button-clear,button.button-clear,input[type='button'].button-clear,input[type='reset'].button-clear,input[type='submit'].button-clear{background-color:transparent;border-color:transparent;color:#ed8936;}.button.button-clear:focus,.button.button-clear:hover,button.button-clear:focus,button.button-clear:hover,input[type='button'].button-clear:focus,input[type='button'].button-clear:hover,input[type='reset'].button-clear:focus,input[type='reset'].button-clear:hover,input[type='submit'].button-clear:focus,input[type='submit'].button-clear:hover{background-color:transparent;border-color:transparent;color:#606c76;}.button.button-clear[disabled]:focus,.button.button-clear[disabled]:hover,button.button-clear[disabled]:focus,button.button-clear[disabled]:hover,input[type='button'].button-clear[disabled]:focus,input[type='button'].button-clear[disabled]:hover,input[type='reset'].button-clear[disabled]:focus,input[type='reset'].button-clear[disabled]:hover,input[type='submit'].button-clear[disabled]:focus,input[type='submit'].button-clear[disabled]:hover{color:#ed8936;}code{background:#f4f5f6;border-radius:.4rem;font-size:86%;margin:0 .2rem;padding:.2rem .5rem;white-space:nowrap;}pre{background:#f4f5f6;border-left:.3rem solid #ed8936;overflow-y:hidden;}pre>code{border-radius:0;display:block;padding:1rem 1.5rem;white-space:pre;}hr{border:0;border-top:.1rem solid #f4f5f6;margin:3rem 0;}input[type='email'],input[type='number'],input[type='password'],input[type='search'],input[type='tel'],input[type='text'],input[type='url'],textarea,select{appearance:none;background-color:transparent;border:.1rem solid #d1d1d1;border-radius:.4rem;box-shadow:none;box-sizing:inherit;height:3.8rem;padding:.6rem 1rem;width:100%;}input[type='email']:focus,input[type='number']:focus,input[type='password']:focus,input[type='search']:focus,input[type='tel']:focus,input[type='text']:focus,input[type='url']:focus,textarea:focus,select:focus{border-color:#ed8936;outline:0;}select{background:url('data:image/svg+xml;utf8,') center right no-repeat;padding-right:3rem;}select:focus{background-image:url('data:image/svg+xml;utf8,');}textarea{min-height:6.5rem;}label,legend{display:block;font-size:1.6rem;font-weight:700;margin-bottom:.5rem;}fieldset{border-width:0;padding:0;}input[type='checkbox'],input[type='radio']{display:inline;}.label-inline{display:inline-block;font-weight:normal;margin-left:.5rem;}.container{margin:0 auto;max-width:112rem;padding:0 2rem;position:relative;width:100%;}.row{display:flex;flex-direction:column;padding:0;width:100%;}.row.row-no-padding{padding:0;}.row.row-no-padding>.column{padding:0;}.row.row-wrap{flex-wrap:wrap;}.row.row-top{align-items:flex-start;}.row.row-bottom{align-items:flex-end;}.row.row-center{align-items:center;}.row.row-stretch{align-items:stretch;}.row.row-baseline{align-items:baseline;}.row .column{display:block;flex:1 1 auto;margin-left:0;max-width:100%;width:100%;}.row .column.column-offset-10{margin-left:10%;}.row .column.column-offset-20{margin-left:20%;}.row .column.column-offset-25{margin-left:25%;}.row .column.column-offset-33,.row .column.column-offset-34{margin-left:33.3333%;}.row .column.column-offset-50{margin-left:50%;}.row .column.column-offset-66,.row .column.column-offset-67{margin-left:66.6666%;}.row .column.column-offset-75{margin-left:75%;}.row .column.column-offset-80{margin-left:80%;}.row .column.column-offset-90{margin-left:90%;}.row .column.column-10{flex:0 0 10%;max-width:10%;}.row .column.column-20{flex:0 0 20%;max-width:20%;}.row .column.column-25{flex:0 0 25%;max-width:25%;}.row .column.column-33,.row .column.column-34{flex:0 0 33.3333%;max-width:33.3333%;}.row .column.column-40{flex:0 0 40%;max-width:40%;}.row .column.column-50{flex:0 0 50%;max-width:50%;}.row .column.column-60{flex:0 0 60%;max-width:60%;}.row .column.column-66,.row .column.column-67{flex:0 0 66.6666%;max-width:66.6666%;}.row .column.column-75{flex:0 0 75%;max-width:75%;}.row .column.column-80{flex:0 0 80%;max-width:80%;}.row .column.column-90{flex:0 0 90%;max-width:90%;}.row .column .column-top{align-self:flex-start;}.row .column .column-bottom{align-self:flex-end;}.row .column .column-center{align-self:center;}@media(min-width:40rem){.row{flex-direction:row;margin-left:-1rem;width:calc(100% + 2rem);}.row .column{margin-bottom:inherit;padding:0 1rem;}}a{color:#ed8936;text-decoration:none;}a:focus,a:hover{color:#606c76;}dl,ol,ul{list-style:none;margin-top:0;padding-left:0;}dl dl,dl ol,dl ul,ol dl,ol ol,ol ul,ul dl,ul ol,ul ul{font-size:90%;margin:1.5rem 0 1.5rem 3rem;}ol{list-style:decimal inside;}ul{list-style:circle inside;}.button,button,dd,dt,li{margin-bottom:1rem;}fieldset,input,select,textarea{margin-bottom:1.5rem;}blockquote,dl,figure,form,ol,p,pre,table,ul{margin-bottom:2.5rem;}table{border-spacing:0;width:100%;}td,th{border-bottom:.1rem solid #e1e1e1;padding:1.2rem 1.5rem;text-align:left;}td:first-child,th:first-child{padding-left:0;}td:last-child,th:last-child{padding-right:0;}b,strong{font-weight:bold;}p{margin-top:0;}h1,h2,h3,h4,h5,h6{font-weight:300;letter-spacing:-.1rem;margin-bottom:2rem;margin-top:0;}h1{font-size:4.6rem;line-height:1.2;}h2{font-size:3.6rem;line-height:1.25;}h3{font-size:2.8rem;line-height:1.3;}h4{font-size:2.2rem;letter-spacing:-.08rem;line-height:1.35;}h5{font-size:1.8rem;letter-spacing:-.05rem;line-height:1.5;}h6{font-size:1.6rem;letter-spacing:0;line-height:1.4;}img{max-width:100%;}.clearfix:after{clear:both;content:' ';display:table;}.float-left{float:left;}.float-right{float:right;}.lar,.las,.lab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;}@font-face{font-family:Line Awesome Brands;font-style:normal;font-weight:normal;font-display:auto;src:url("/fonts/la-brands-400.eot?");src:url("/fonts/la-brands-400.eot?#iefix") format("embedded-opentype"),url("/fonts/la-brands-400.woff2") format("woff2"),url("/fonts/la-brands-400.woff") format("woff"),url("/fonts/la-brands-400.ttf") format("truetype"),url("/fonts/la-brands-400.svg#lineawesome") format("svg");}.lab{font-family:Line Awesome Brands;font-weight:400;}@font-face{font-family:Line Awesome Free;font-style:normal;font-weight:400;font-display:auto;src:url("/fonts/la-regular-400.eot?");src:url("/fonts/la-regular-400.eot?#iefix") format("embedded-opentype"),url("/fonts/la-regular-400.woff2") format("woff2"),url("/fonts/la-regular-400.woff") format("woff"),url("/fonts/la-regular-400.ttf") format("truetype"),url("/fonts/la-regular-400.svg#lineawesome") format("svg");}.lar{font-family:Line Awesome Free;font-weight:400;}@font-face{font-family:Line Awesome Free;font-style:normal;font-weight:900;font-display:auto;src:url("/fonts/la-solid-900.eot?");src:url("/fonts/la-solid-900.eot?#iefix") format("embedded-opentype"),url("/fonts/la-solid-900.woff2") format("woff2"),url("/fonts/la-solid-900.woff") format("woff"),url("/fonts/la-solid-900.ttf") format("truetype"),url("/fonts/la-solid-900.svg#lineawesome") format("svg");}.las{font-family:Line Awesome Free;font-weight:900;}.la-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em;}.la-xs{font-size:.75em;}.la-2x{font-size:1em;}.la-2x{font-size:2em;}.la-3x{font-size:3em;}.la-4x{font-size:4em;}.la-5x{font-size:5em;}.la-6x{font-size:6em;}.la-7x{font-size:7em;}.la-8x{font-size:8em;}.la-9x{font-size:9em;}.la-10x{font-size:10em;}.la-fw{text-align:center;width:1.25em;}.la-fw{width:1.25em;text-align:center;}.la-ul{padding-left:0;margin-left:1.42857em;list-style-type:none;}.la-ul>li{position:relative;}.la-li{position:absolute;left:-2em;text-align:center;width:1.42857em;line-height:inherit;}.la-li.la-lg{left:-1.14286em;}.la-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em;}.la-pull-left{float:left;}.la-pull-right{float:right;}.la.la-pull-left{margin-right:.3em;}.la.la-pull-right{margin-left:.3em;}.la.pull-left{margin-right:.3em;}.la.pull-right{margin-left:.3em;}.la-pull-left{float:left;}.la-pull-right{float:right;}.la.la-pull-left,.las.la-pull-left,.lar.la-pull-left,.lal.la-pull-left,.lab.la-pull-left{margin-right:.3em;}.la.la-pull-right,.las.la-pull-right,.lar.la-pull-right,.lal.la-pull-right,.lab.la-pull-right{margin-left:.3em;}.la-spin{-webkit-animation:la-spin 2s infinite linear;animation:la-spin 2s infinite linear;}.la-pulse{-webkit-animation:la-spin 1s infinite steps(8);animation:la-spin 1s infinite steps(8);}@-webkit-keyframes la-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg);}}@keyframes la-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg);}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg);}}.la-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg);}.la-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg);}.la-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg);}.la-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1);}.la-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1);}.la-flip-both,.la-flip-horizontal.la-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(-1,-1);transform:scale(-1,-1);}:root .la-rotate-90,:root .la-rotate-180,:root .la-rotate-270,:root .la-flip-horizontal,:root .la-flip-vertical,:root .la-flip-both{-webkit-filter:none;filter:none;}.la-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em;}.la-stack-1x,.la-stack-2x{left:0;position:absolute;text-align:center;width:100%;}.la-stack-1x{line-height:inherit;}.la-stack-2x{font-size:2em;}.la-inverse{color:#fff;}.la-500px:before{content:"";}.la-accessible-icon:before{content:"";}.la-accusoft:before{content:"";}.la-acquisitions-incorporated:before{content:"";}.la-ad:before{content:"";}.la-address-book:before{content:"";}.la-address-card:before{content:"";}.la-adjust:before{content:"";}.la-adn:before{content:"";}.la-adobe:before{content:"";}.la-adversal:before{content:"";}.la-affiliatetheme:before{content:"";}.la-air-freshener:before{content:"";}.la-airbnb:before{content:"";}.la-algolia:before{content:"";}.la-align-center:before{content:"";}.la-align-justify:before{content:"";}.la-align-left:before{content:"";}.la-align-right:before{content:"";}.la-alipay:before{content:"";}.la-allergies:before{content:"";}.la-amazon:before{content:"";}.la-amazon-pay:before{content:"";}.la-ambulance:before{content:"";}.la-american-sign-language-interpreting:before{content:"";}.la-amilia:before{content:"";}.la-anchor:before{content:"";}.la-android:before{content:"";}.la-angellist:before{content:"";}.la-angle-double-down:before{content:"";}.la-angle-double-left:before{content:"";}.la-angle-double-right:before{content:"";}.la-angle-double-up:before{content:"";}.la-angle-down:before{content:"";}.la-angle-left:before{content:"";}.la-angle-right:before{content:"";}.la-angle-up:before{content:"";}.la-angry:before{content:"";}.la-angrycreative:before{content:"";}.la-angular:before{content:"";}.la-ankh:before{content:"";}.la-app-store:before{content:"";}.la-app-store-ios:before{content:"";}.la-apper:before{content:"";}.la-apple:before{content:"";}.la-apple-alt:before{content:"";}.la-apple-pay:before{content:"";}.la-archive:before{content:"";}.la-archway:before{content:"";}.la-arrow-alt-circle-down:before{content:"";}.la-arrow-alt-circle-left:before{content:"";}.la-arrow-alt-circle-right:before{content:"";}.la-arrow-alt-circle-up:before{content:"";}.la-arrow-circle-down:before{content:"";}.la-arrow-circle-left:before{content:"";}.la-arrow-circle-right:before{content:"";}.la-arrow-circle-up:before{content:"";}.la-arrow-down:before{content:"";}.la-arrow-left:before{content:"";}.la-arrow-right:before{content:"";}.la-arrow-up:before{content:"";}.la-arrows-alt:before{content:"";}.la-arrows-alt-h:before{content:"";}.la-arrows-alt-v:before{content:"";}.la-artstation:before{content:"";}.la-assistive-listening-systems:before{content:"";}.la-asterisk:before{content:"";}.la-asymmetrik:before{content:"";}.la-at:before{content:"";}.la-atlas:before{content:"";}.la-atlassian:before{content:"";}.la-atom:before{content:"";}.la-audible:before{content:"";}.la-audio-description:before{content:"";}.la-autoprefixer:before{content:"";}.la-avianex:before{content:"";}.la-aviato:before{content:"";}.la-award:before{content:"";}.la-aws:before{content:"";}.la-baby:before{content:"";}.la-baby-carriage:before{content:"";}.la-backspace:before{content:"";}.la-backward:before{content:"";}.la-bacon:before{content:"";}.la-balance-scale:before{content:"";}.la-balance-scale-left:before{content:"";}.la-balance-scale-right:before{content:"";}.la-ban:before{content:"";}.la-band-aid:before{content:"";}.la-bandcamp:before{content:"";}.la-barcode:before{content:"";}.la-bars:before{content:"";}.la-baseball-ball:before{content:"";}.la-basketball-ball:before{content:"";}.la-bath:before{content:"";}.la-battery-empty:before{content:"";}.la-battery-full:before{content:"";}.la-battery-half:before{content:"";}.la-battery-quarter:before{content:"";}.la-battery-three-quarters:before{content:"";}.la-battle-net:before{content:"";}.la-bed:before{content:"";}.la-beer:before{content:"";}.la-behance:before{content:"";}.la-behance-square:before{content:"";}.la-bell:before{content:"";}.la-bell-slash:before{content:"";}.la-bezier-curve:before{content:"";}.la-bible:before{content:"";}.la-bicycle:before{content:"";}.la-biking:before{content:"";}.la-bimobject:before{content:"";}.la-binoculars:before{content:"";}.la-biohazard:before{content:"";}.la-birthday-cake:before{content:"";}.la-bitbucket:before{content:"";}.la-bitcoin:before{content:"";}.la-bity:before{content:"";}.la-black-tie:before{content:"";}.la-blackberry:before{content:"";}.la-blender:before{content:"";}.la-blender-phone:before{content:"";}.la-blind:before{content:"";}.la-blog:before{content:"";}.la-blogger:before{content:"";}.la-blogger-b:before{content:"";}.la-bluetooth:before{content:"";}.la-bluetooth-b:before{content:"";}.la-bold:before{content:"";}.la-bolt:before{content:"";}.la-bomb:before{content:"";}.la-bone:before{content:"";}.la-bong:before{content:"";}.la-book:before{content:"";}.la-book-dead:before{content:"";}.la-book-medical:before{content:"";}.la-book-open:before{content:"";}.la-book-reader:before{content:"";}.la-bookmark:before{content:"";}.la-bootstrap:before{content:"";}.la-border-all:before{content:"";}.la-border-none:before{content:"";}.la-border-style:before{content:"";}.la-bowling-ball:before{content:"";}.la-box:before{content:"";}.la-box-open:before{content:"";}.la-boxes:before{content:"";}.la-braille:before{content:"";}.la-brain:before{content:"";}.la-bread-slice:before{content:"";}.la-briefcase:before{content:"";}.la-briefcase-medical:before{content:"";}.la-broadcast-tower:before{content:"";}.la-broom:before{content:"";}.la-brush:before{content:"";}.la-btc:before{content:"";}.la-buffer:before{content:"";}.la-bug:before{content:"";}.la-building:before{content:"";}.la-bullhorn:before{content:"";}.la-bullseye:before{content:"";}.la-burn:before{content:"";}.la-buromobelexperte:before{content:"";}.la-bus:before{content:"";}.la-bus-alt:before{content:"";}.la-business-time:before{content:"";}.la-buysellads:before{content:"";}.la-calculator:before{content:"";}.la-calendar:before{content:"";}.la-calendar-alt:before{content:"";}.la-calendar-check:before{content:"";}.la-calendar-day:before{content:"";}.la-calendar-minus:before{content:"";}.la-calendar-plus:before{content:"";}.la-calendar-times:before{content:"";}.la-calendar-week:before{content:"";}.la-camera:before{content:"";}.la-camera-retro:before{content:"";}.la-campground:before{content:"";}.la-canadian-maple-leaf:before{content:"";}.la-candy-cane:before{content:"";}.la-cannabis:before{content:"";}.la-capsules:before{content:"";}.la-car:before{content:"";}.la-car-alt:before{content:"";}.la-car-battery:before{content:"";}.la-car-crash:before{content:"";}.la-car-side:before{content:"";}.la-caret-down:before{content:"";}.la-caret-left:before{content:"";}.la-caret-right:before{content:"";}.la-caret-square-down:before{content:"";}.la-caret-square-left:before{content:"";}.la-caret-square-right:before{content:"";}.la-caret-square-up:before{content:"";}.la-caret-up:before{content:"";}.la-carrot:before{content:"";}.la-cart-arrow-down:before{content:"";}.la-cart-plus:before{content:"";}.la-cash-register:before{content:"";}.la-cat:before{content:"";}.la-cc-amazon-pay:before{content:"";}.la-cc-amex:before{content:"";}.la-cc-apple-pay:before{content:"";}.la-cc-diners-club:before{content:"";}.la-cc-discover:before{content:"";}.la-cc-jcb:before{content:"";}.la-cc-mastercard:before{content:"";}.la-cc-paypal:before{content:"";}.la-cc-stripe:before{content:"";}.la-cc-visa:before{content:"";}.la-centercode:before{content:"";}.la-centos:before{content:"";}.la-certificate:before{content:"";}.la-chair:before{content:"";}.la-chalkboard:before{content:"";}.la-chalkboard-teacher:before{content:"";}.la-charging-station:before{content:"";}.la-chart-area:before{content:"";}.la-chart-bar:before{content:"";}.la-chart-line:before{content:"";}.la-chart-pie:before{content:"";}.la-check:before{content:"";}.la-check-circle:before{content:"";}.la-check-double:before{content:"";}.la-check-square:before{content:"";}.la-cheese:before{content:"";}.la-chess:before{content:"";}.la-chess-bishop:before{content:"";}.la-chess-board:before{content:"";}.la-chess-king:before{content:"";}.la-chess-knight:before{content:"";}.la-chess-pawn:before{content:"";}.la-chess-queen:before{content:"";}.la-chess-rook:before{content:"";}.la-chevron-circle-down:before{content:"";}.la-chevron-circle-left:before{content:"";}.la-chevron-circle-right:before{content:"";}.la-chevron-circle-up:before{content:"";}.la-chevron-down:before{content:"";}.la-chevron-left:before{content:"";}.la-chevron-right:before{content:"";}.la-chevron-up:before{content:"";}.la-child:before{content:"";}.la-chrome:before{content:"";}.la-chromecast:before{content:"";}.la-church:before{content:"";}.la-circle:before{content:"";}.la-circle-notch:before{content:"";}.la-city:before{content:"";}.la-clinic-medical:before{content:"";}.la-clipboard:before{content:"";}.la-clipboard-check:before{content:"";}.la-clipboard-list:before{content:"";}.la-clock:before{content:"";}.la-clone:before{content:"";}.la-closed-captioning:before{content:"";}.la-cloud:before{content:"";}.la-cloud-download-alt:before{content:"";}.la-cloud-meatball:before{content:"";}.la-cloud-moon:before{content:"";}.la-cloud-moon-rain:before{content:"";}.la-cloud-rain:before{content:"";}.la-cloud-showers-heavy:before{content:"";}.la-cloud-sun:before{content:"";}.la-cloud-sun-rain:before{content:"";}.la-cloud-upload-alt:before{content:"";}.la-cloudscale:before{content:"";}.la-cloudsmith:before{content:"";}.la-cloudversify:before{content:"";}.la-cocktail:before{content:"";}.la-code:before{content:"";}.la-code-branch:before{content:"";}.la-codepen:before{content:"";}.la-codiepie:before{content:"";}.la-coffee:before{content:"";}.la-cog:before{content:"";}.la-cogs:before{content:"";}.la-coins:before{content:"";}.la-columns:before{content:"";}.la-comment:before{content:"";}.la-comment-alt:before{content:"";}.la-comment-dollar:before{content:"";}.la-comment-dots:before{content:"";}.la-comment-medical:before{content:"";}.la-comment-slash:before{content:"";}.la-comments:before{content:"";}.la-comments-dollar:before{content:"";}.la-compact-disc:before{content:"";}.la-compass:before{content:"";}.la-compress:before{content:"";}.la-compress-arrows-alt:before{content:"";}.la-concierge-bell:before{content:"";}.la-confluence:before{content:"";}.la-connectdevelop:before{content:"";}.la-contao:before{content:"";}.la-cookie:before{content:"";}.la-cookie-bite:before{content:"";}.la-copy:before{content:"";}.la-copyright:before{content:"";}.la-cotton-bureau:before{content:"";}.la-couch:before{content:"";}.la-cpanel:before{content:"";}.la-creative-commons:before{content:"";}.la-creative-commons-by:before{content:"";}.la-creative-commons-nc:before{content:"";}.la-creative-commons-nc-eu:before{content:"";}.la-creative-commons-nc-jp:before{content:"";}.la-creative-commons-nd:before{content:"";}.la-creative-commons-pd:before{content:"";}.la-creative-commons-pd-alt:before{content:"";}.la-creative-commons-remix:before{content:"";}.la-creative-commons-sa:before{content:"";}.la-creative-commons-sampling:before{content:"";}.la-creative-commons-sampling-plus:before{content:"";}.la-creative-commons-share:before{content:"";}.la-creative-commons-zero:before{content:"";}.la-credit-card:before{content:"";}.la-critical-role:before{content:"";}.la-crop:before{content:"";}.la-crop-alt:before{content:"";}.la-cross:before{content:"";}.la-crosshairs:before{content:"";}.la-crow:before{content:"";}.la-crown:before{content:"";}.la-crutch:before{content:"";}.la-css3:before{content:"";}.la-css3-alt:before{content:"";}.la-cube:before{content:"";}.la-cubes:before{content:"";}.la-cut:before{content:"";}.la-cuttlefish:before{content:"";}.la-d-and-d:before{content:"";}.la-d-and-d-beyond:before{content:"";}.la-dashcube:before{content:"";}.la-database:before{content:"";}.la-deaf:before{content:"";}.la-delicious:before{content:"";}.la-democrat:before{content:"";}.la-deploydog:before{content:"";}.la-deskpro:before{content:"";}.la-desktop:before{content:"";}.la-dev:before{content:"";}.la-deviantart:before{content:"";}.la-dharmachakra:before{content:"";}.la-dhl:before{content:"";}.la-diagnoses:before{content:"";}.la-diaspora:before{content:"";}.la-dice:before{content:"";}.la-dice-d20:before{content:"";}.la-dice-d6:before{content:"";}.la-dice-five:before{content:"";}.la-dice-four:before{content:"";}.la-dice-one:before{content:"";}.la-dice-six:before{content:"";}.la-dice-three:before{content:"";}.la-dice-two:before{content:"";}.la-digg:before{content:"";}.la-digital-ocean:before{content:"";}.la-digital-tachograph:before{content:"";}.la-directions:before{content:"";}.la-discord:before{content:"";}.la-discourse:before{content:"";}.la-divide:before{content:"";}.la-dizzy:before{content:"";}.la-dna:before{content:"";}.la-dochub:before{content:"";}.la-docker:before{content:"";}.la-dog:before{content:"";}.la-dollar-sign:before{content:"";}.la-dolly:before{content:"";}.la-dolly-flatbed:before{content:"";}.la-donate:before{content:"";}.la-door-closed:before{content:"";}.la-door-open:before{content:"";}.la-dot-circle:before{content:"";}.la-dove:before{content:"";}.la-download:before{content:"";}.la-draft2digital:before{content:"";}.la-drafting-compass:before{content:"";}.la-dragon:before{content:"";}.la-draw-polygon:before{content:"";}.la-dribbble:before{content:"";}.la-dribbble-square:before{content:"";}.la-dropbox:before{content:"";}.la-drum:before{content:"";}.la-drum-steelpan:before{content:"";}.la-drumstick-bite:before{content:"";}.la-drupal:before{content:"";}.la-dumbbell:before{content:"";}.la-dumpster:before{content:"";}.la-dumpster-fire:before{content:"";}.la-dungeon:before{content:"";}.la-dyalog:before{content:"";}.la-earlybirds:before{content:"";}.la-ebay:before{content:"";}.la-edge:before{content:"";}.la-edit:before{content:"";}.la-egg:before{content:"";}.la-eject:before{content:"";}.la-elementor:before{content:"";}.la-ellipsis-h:before{content:"";}.la-ellipsis-v:before{content:"";}.la-ello:before{content:"";}.la-ember:before{content:"";}.la-empire:before{content:"";}.la-envelope:before{content:"";}.la-envelope-open:before{content:"";}.la-envelope-open-text:before{content:"";}.la-envelope-square:before{content:"";}.la-envira:before{content:"";}.la-equals:before{content:"";}.la-eraser:before{content:"";}.la-erlang:before{content:"";}.la-ethereum:before{content:"";}.la-ethernet:before{content:"";}.la-etsy:before{content:"";}.la-euro-sign:before{content:"";}.la-evernote:before{content:"";}.la-exchange-alt:before{content:"";}.la-exclamation:before{content:"";}.la-exclamation-circle:before{content:"";}.la-exclamation-triangle:before{content:"";}.la-expand:before{content:"";}.la-expand-arrows-alt:before{content:"";}.la-expeditedssl:before{content:"";}.la-external-link-alt:before{content:"";}.la-external-link-square-alt:before{content:"";}.la-eye:before{content:"";}.la-eye-dropper:before{content:"";}.la-eye-slash:before{content:"";}.la-facebook:before{content:"";}.la-facebook-f:before{content:"";}.la-facebook-messenger:before{content:"";}.la-facebook-square:before{content:"";}.la-fan:before{content:"";}.la-fantasy-flight-games:before{content:"";}.la-fast-backward:before{content:"";}.la-fast-forward:before{content:"";}.la-fax:before{content:"";}.la-feather:before{content:"";}.la-feather-alt:before{content:"";}.la-fedex:before{content:"";}.la-fedora:before{content:"";}.la-female:before{content:"";}.la-fighter-jet:before{content:"";}.la-figma:before{content:"";}.la-file:before{content:"";}.la-file-alt:before{content:"";}.la-file-archive:before{content:"";}.la-file-audio:before{content:"";}.la-file-code:before{content:"";}.la-file-contract:before{content:"";}.la-file-csv:before{content:"";}.la-file-download:before{content:"";}.la-file-excel:before{content:"";}.la-file-export:before{content:"";}.la-file-image:before{content:"";}.la-file-import:before{content:"";}.la-file-invoice:before{content:"";}.la-file-invoice-dollar:before{content:"";}.la-file-medical:before{content:"";}.la-file-medical-alt:before{content:"";}.la-file-pdf:before{content:"";}.la-file-powerpoint:before{content:"";}.la-file-prescription:before{content:"";}.la-file-signature:before{content:"";}.la-file-upload:before{content:"";}.la-file-video:before{content:"";}.la-file-word:before{content:"";}.la-fill:before{content:"";}.la-fill-drip:before{content:"";}.la-film:before{content:"";}.la-filter:before{content:"";}.la-fingerprint:before{content:"";}.la-fire:before{content:"";}.la-fire-alt:before{content:"";}.la-fire-extinguisher:before{content:"";}.la-firefox:before{content:"";}.la-first-aid:before{content:"";}.la-first-order:before{content:"";}.la-first-order-alt:before{content:"";}.la-firstdraft:before{content:"";}.la-fish:before{content:"";}.la-fist-raised:before{content:"";}.la-flag:before{content:"";}.la-flag-checkered:before{content:"";}.la-flag-usa:before{content:"";}.la-flask:before{content:"";}.la-flickr:before{content:"";}.la-flipboard:before{content:"";}.la-flushed:before{content:"";}.la-fly:before{content:"";}.la-folder:before{content:"";}.la-folder-minus:before{content:"";}.la-folder-open:before{content:"";}.la-folder-plus:before{content:"";}.la-font:before{content:"";}.la-font-awesome:before{content:"";}.la-font-awesome-alt:before{content:"";}.la-font-awesome-flag:before{content:"";}.la-fonticons:before{content:"";}.la-fonticons-fi:before{content:"";}.la-football-ball:before{content:"";}.la-fort-awesome:before{content:"";}.la-fort-awesome-alt:before{content:"";}.la-forumbee:before{content:"";}.la-forward:before{content:"";}.la-foursquare:before{content:"";}.la-free-code-camp:before{content:"";}.la-freebsd:before{content:"";}.la-frog:before{content:"";}.la-frown:before{content:"";}.la-frown-open:before{content:"";}.la-fulcrum:before{content:"";}.la-funnel-dollar:before{content:"";}.la-futbol:before{content:"";}.la-galactic-republic:before{content:"";}.la-galactic-senate:before{content:"";}.la-gamepad:before{content:"";}.la-gas-pump:before{content:"";}.la-gavel:before{content:"";}.la-gem:before{content:"";}.la-genderless:before{content:"";}.la-get-pocket:before{content:"";}.la-gg:before{content:"";}.la-gg-circle:before{content:"";}.la-ghost:before{content:"";}.la-gift:before{content:"";}.la-gifts:before{content:"";}.la-git:before{content:"";}.la-git-alt:before{content:"";}.la-git-square:before{content:"";}.la-github:before{content:"";}.la-github-alt:before{content:"";}.la-github-square:before{content:"";}.la-gitkraken:before{content:"";}.la-gitlab:before{content:"";}.la-gitter:before{content:"";}.la-glass-cheers:before{content:"";}.la-glass-martini:before{content:"";}.la-glass-martini-alt:before{content:"";}.la-glass-whiskey:before{content:"";}.la-glasses:before{content:"";}.la-glide:before{content:"";}.la-glide-g:before{content:"";}.la-globe:before{content:"";}.la-globe-africa:before{content:"";}.la-globe-americas:before{content:"";}.la-globe-asia:before{content:"";}.la-globe-europe:before{content:"";}.la-gofore:before{content:"";}.la-golf-ball:before{content:"";}.la-goodreads:before{content:"";}.la-goodreads-g:before{content:"";}.la-google:before{content:"";}.la-google-drive:before{content:"";}.la-google-play:before{content:"";}.la-google-plus:before{content:"";}.la-google-plus-g:before{content:"";}.la-google-plus-square:before{content:"";}.la-google-wallet:before{content:"";}.la-gopuram:before{content:"";}.la-graduation-cap:before{content:"";}.la-gratipay:before{content:"";}.la-grav:before{content:"";}.la-greater-than:before{content:"";}.la-greater-than-equal:before{content:"";}.la-grimace:before{content:"";}.la-grin:before{content:"";}.la-grin-alt:before{content:"";}.la-grin-beam:before{content:"";}.la-grin-beam-sweat:before{content:"";}.la-grin-hearts:before{content:"";}.la-grin-squint:before{content:"";}.la-grin-squint-tears:before{content:"";}.la-grin-stars:before{content:"";}.la-grin-tears:before{content:"";}.la-grin-tongue:before{content:"";}.la-grin-tongue-squint:before{content:"";}.la-grin-tongue-wink:before{content:"";}.la-grin-wink:before{content:"";}.la-grip-horizontal:before{content:"";}.la-grip-lines:before{content:"";}.la-grip-lines-vertical:before{content:"";}.la-grip-vertical:before{content:"";}.la-gripfire:before{content:"";}.la-grunt:before{content:"";}.la-guitar:before{content:"";}.la-gulp:before{content:"";}.la-h-square:before{content:"";}.la-hacker-news:before{content:"";}.la-hacker-news-square:before{content:"";}.la-hackerrank:before{content:"";}.la-hamburger:before{content:"";}.la-hammer:before{content:"";}.la-hamsa:before{content:"";}.la-hand-holding:before{content:"";}.la-hand-holding-heart:before{content:"";}.la-hand-holding-usd:before{content:"";}.la-hand-lizard:before{content:"";}.la-hand-middle-finger:before{content:"";}.la-hand-paper:before{content:"";}.la-hand-peace:before{content:"";}.la-hand-point-down:before{content:"";}.la-hand-point-left:before{content:"";}.la-hand-point-right:before{content:"";}.la-hand-point-up:before{content:"";}.la-hand-pointer:before{content:"";}.la-hand-rock:before{content:"";}.la-hand-scissors:before{content:"";}.la-hand-spock:before{content:"";}.la-hands:before{content:"";}.la-hands-helping:before{content:"";}.la-handshake:before{content:"";}.la-hanukiah:before{content:"";}.la-hard-hat:before{content:"";}.la-hashtag:before{content:"";}.la-hat-wizard:before{content:"";}.la-haykal:before{content:"";}.la-hdd:before{content:"";}.la-heading:before{content:"";}.la-headphones:before{content:"";}.la-headphones-alt:before{content:"";}.la-headset:before{content:"";}.la-heart:before{content:"";}.la-heart-broken:before{content:"";}.la-heartbeat:before{content:"";}.la-helicopter:before{content:"";}.la-highlighter:before{content:"";}.la-hiking:before{content:"";}.la-hippo:before{content:"";}.la-hips:before{content:"";}.la-hire-a-helper:before{content:"";}.la-history:before{content:"";}.la-hockey-puck:before{content:"";}.la-holly-berry:before{content:"";}.la-home:before{content:"";}.la-hooli:before{content:"";}.la-hornbill:before{content:"";}.la-horse:before{content:"";}.la-horse-head:before{content:"";}.la-hospital:before{content:"";}.la-hospital-alt:before{content:"";}.la-hospital-symbol:before{content:"";}.la-hot-tub:before{content:"";}.la-hotdog:before{content:"";}.la-hotel:before{content:"";}.la-hotjar:before{content:"";}.la-hourglass:before{content:"";}.la-hourglass-end:before{content:"";}.la-hourglass-half:before{content:"";}.la-hourglass-start:before{content:"";}.la-house-damage:before{content:"";}.la-houzz:before{content:"";}.la-hryvnia:before{content:"";}.la-html5:before{content:"";}.la-hubspot:before{content:"";}.la-i-cursor:before{content:"";}.la-ice-cream:before{content:"";}.la-icicles:before{content:"";}.la-icons:before{content:"";}.la-id-badge:before{content:"";}.la-id-card:before{content:"";}.la-id-card-alt:before{content:"";}.la-igloo:before{content:"";}.la-image:before{content:"";}.la-images:before{content:"";}.la-imdb:before{content:"";}.la-inbox:before{content:"";}.la-indent:before{content:"";}.la-industry:before{content:"";}.la-infinity:before{content:"";}.la-info:before{content:"";}.la-info-circle:before{content:"";}.la-instagram:before{content:"";}.la-intercom:before{content:"";}.la-internet-explorer:before{content:"";}.la-invision:before{content:"";}.la-ioxhost:before{content:"";}.la-italic:before{content:"";}.la-itch-io:before{content:"";}.la-itunes:before{content:"";}.la-itunes-note:before{content:"";}.la-java:before{content:"";}.la-jedi:before{content:"";}.la-jedi-order:before{content:"";}.la-jenkins:before{content:"";}.la-jira:before{content:"";}.la-joget:before{content:"";}.la-joint:before{content:"";}.la-joomla:before{content:"";}.la-journal-whills:before{content:"";}.la-js:before{content:"";}.la-js-square:before{content:"";}.la-jsfiddle:before{content:"";}.la-kaaba:before{content:"";}.la-kaggle:before{content:"";}.la-key:before{content:"";}.la-keybase:before{content:"";}.la-keyboard:before{content:"";}.la-keycdn:before{content:"";}.la-khanda:before{content:"";}.la-kickstarter:before{content:"";}.la-kickstarter-k:before{content:"";}.la-kiss:before{content:"";}.la-kiss-beam:before{content:"";}.la-kiss-wink-heart:before{content:"";}.la-kiwi-bird:before{content:"";}.la-korvue:before{content:"";}.la-landmark:before{content:"";}.la-language:before{content:"";}.la-laptop:before{content:"";}.la-laptop-code:before{content:"";}.la-laptop-medical:before{content:"";}.la-laravel:before{content:"";}.la-lastfm:before{content:"";}.la-lastfm-square:before{content:"";}.la-laugh:before{content:"";}.la-laugh-beam:before{content:"";}.la-laugh-squint:before{content:"";}.la-laugh-wink:before{content:"";}.la-layer-group:before{content:"";}.la-leaf:before{content:"";}.la-leanpub:before{content:"";}.la-lemon:before{content:"";}.la-less:before{content:"";}.la-less-than:before{content:"";}.la-less-than-equal:before{content:"";}.la-level-down-alt:before{content:"";}.la-level-up-alt:before{content:"";}.la-life-ring:before{content:"";}.la-lightbulb:before{content:"";}.la-line:before{content:"";}.la-link:before{content:"";}.la-linkedin:before{content:"";}.la-linkedin-in:before{content:"";}.la-linode:before{content:"";}.la-linux:before{content:"";}.la-lira-sign:before{content:"";}.la-list:before{content:"";}.la-list-alt:before{content:"";}.la-list-ol:before{content:"";}.la-list-ul:before{content:"";}.la-location-arrow:before{content:"";}.la-lock:before{content:"";}.la-lock-open:before{content:"";}.la-long-arrow-alt-down:before{content:"";}.la-long-arrow-alt-left:before{content:"";}.la-long-arrow-alt-right:before{content:"";}.la-long-arrow-alt-up:before{content:"";}.la-low-vision:before{content:"";}.la-luggage-cart:before{content:"";}.la-lyft:before{content:"";}.la-magento:before{content:"";}.la-magic:before{content:"";}.la-magnet:before{content:"";}.la-mail-bulk:before{content:"";}.la-mailchimp:before{content:"";}.la-male:before{content:"";}.la-mandalorian:before{content:"";}.la-map:before{content:"";}.la-map-marked:before{content:"";}.la-map-marked-alt:before{content:"";}.la-map-marker:before{content:"";}.la-map-marker-alt:before{content:"";}.la-map-pin:before{content:"";}.la-map-signs:before{content:"";}.la-markdown:before{content:"";}.la-marker:before{content:"";}.la-mars:before{content:"";}.la-mars-double:before{content:"";}.la-mars-stroke:before{content:"";}.la-mars-stroke-h:before{content:"";}.la-mars-stroke-v:before{content:"";}.la-mask:before{content:"";}.la-mastodon:before{content:"";}.la-maxcdn:before{content:"";}.la-medal:before{content:"";}.la-medapps:before{content:"";}.la-medium:before{content:"";}.la-medium-m:before{content:"";}.la-medkit:before{content:"";}.la-medrt:before{content:"";}.la-meetup:before{content:"";}.la-megaport:before{content:"";}.la-meh:before{content:"";}.la-meh-blank:before{content:"";}.la-meh-rolling-eyes:before{content:"";}.la-memory:before{content:"";}.la-mendeley:before{content:"";}.la-menorah:before{content:"";}.la-mercury:before{content:"";}.la-meteor:before{content:"";}.la-microchip:before{content:"";}.la-microphone:before{content:"";}.la-microphone-alt:before{content:"";}.la-microphone-alt-slash:before{content:"";}.la-microphone-slash:before{content:"";}.la-microscope:before{content:"";}.la-microsoft:before{content:"";}.la-minus:before{content:"";}.la-minus-circle:before{content:"";}.la-minus-square:before{content:"";}.la-mitten:before{content:"";}.la-mix:before{content:"";}.la-mixcloud:before{content:"";}.la-mizuni:before{content:"";}.la-mobile:before{content:"";}.la-mobile-alt:before{content:"";}.la-modx:before{content:"";}.la-monero:before{content:"";}.la-money-bill:before{content:"";}.la-money-bill-alt:before{content:"";}.la-money-bill-wave:before{content:"";}.la-money-bill-wave-alt:before{content:"";}.la-money-check:before{content:"";}.la-money-check-alt:before{content:"";}.la-monument:before{content:"";}.la-moon:before{content:"";}.la-mortar-pestle:before{content:"";}.la-mosque:before{content:"";}.la-motorcycle:before{content:"";}.la-mountain:before{content:"";}.la-mouse-pointer:before{content:"";}.la-mug-hot:before{content:"";}.la-music:before{content:"";}.la-napster:before{content:"";}.la-neos:before{content:"";}.la-network-wired:before{content:"";}.la-neuter:before{content:"";}.la-newspaper:before{content:"";}.la-nimblr:before{content:"";}.la-node:before{content:"";}.la-node-js:before{content:"";}.la-not-equal:before{content:"";}.la-notes-medical:before{content:"";}.la-npm:before{content:"";}.la-ns8:before{content:"";}.la-nutritionix:before{content:"";}.la-object-group:before{content:"";}.la-object-ungroup:before{content:"";}.la-odnoklassniki:before{content:"";}.la-odnoklassniki-square:before{content:"";}.la-oil-can:before{content:"";}.la-old-republic:before{content:"";}.la-om:before{content:"";}.la-opencart:before{content:"";}.la-openid:before{content:"";}.la-opera:before{content:"";}.la-optin-monster:before{content:"";}.la-osi:before{content:"";}.la-otter:before{content:"";}.la-outdent:before{content:"";}.la-page4:before{content:"";}.la-pagelines:before{content:"";}.la-pager:before{content:"";}.la-paint-brush:before{content:"";}.la-paint-roller:before{content:"";}.la-palette:before{content:"";}.la-palfed:before{content:"";}.la-pallet:before{content:"";}.la-paper-plane:before{content:"";}.la-paperclip:before{content:"";}.la-parachute-box:before{content:"";}.la-paragraph:before{content:"";}.la-parking:before{content:"";}.la-passport:before{content:"";}.la-pastafarianism:before{content:"";}.la-paste:before{content:"";}.la-patreon:before{content:"";}.la-pause:before{content:"";}.la-pause-circle:before{content:"";}.la-paw:before{content:"";}.la-paypal:before{content:"";}.la-peace:before{content:"";}.la-pen:before{content:"";}.la-pen-alt:before{content:"";}.la-pen-fancy:before{content:"";}.la-pen-nib:before{content:"";}.la-pen-square:before{content:"";}.la-pencil-alt:before{content:"";}.la-pencil-ruler:before{content:"";}.la-penny-arcade:before{content:"";}.la-people-carry:before{content:"";}.la-pepper-hot:before{content:"";}.la-percent:before{content:"";}.la-percentage:before{content:"";}.la-periscope:before{content:"";}.la-person-booth:before{content:"";}.la-phabricator:before{content:"";}.la-phoenix-framework:before{content:"";}.la-phoenix-squadron:before{content:"";}.la-phone:before{content:"";}.la-phone-alt:before{content:"";}.la-phone-slash:before{content:"";}.la-phone-square:before{content:"";}.la-phone-square-alt:before{content:"";}.la-phone-volume:before{content:"";}.la-photo-video:before{content:"";}.la-php:before{content:"";}.la-pied-piper:before{content:"";}.la-pied-piper-alt:before{content:"";}.la-pied-piper-hat:before{content:"";}.la-pied-piper-pp:before{content:"";}.la-piggy-bank:before{content:"";}.la-pills:before{content:"";}.la-pinterest:before{content:"";}.la-pinterest-p:before{content:"";}.la-pinterest-square:before{content:"";}.la-pizza-slice:before{content:"";}.la-place-of-worship:before{content:"";}.la-plane:before{content:"";}.la-plane-arrival:before{content:"";}.la-plane-departure:before{content:"";}.la-play:before{content:"";}.la-play-circle:before{content:"";}.la-playstation:before{content:"";}.la-plug:before{content:"";}.la-plus:before{content:"";}.la-plus-circle:before{content:"";}.la-plus-square:before{content:"";}.la-podcast:before{content:"";}.la-poll:before{content:"";}.la-poll-h:before{content:"";}.la-poo:before{content:"";}.la-poo-storm:before{content:"";}.la-poop:before{content:"";}.la-portrait:before{content:"";}.la-pound-sign:before{content:"";}.la-power-off:before{content:"";}.la-pray:before{content:"";}.la-praying-hands:before{content:"";}.la-prescription:before{content:"";}.la-prescription-bottle:before{content:"";}.la-prescription-bottle-alt:before{content:"";}.la-print:before{content:"";}.la-procedures:before{content:"";}.la-product-hunt:before{content:"";}.la-project-diagram:before{content:"";}.la-pushed:before{content:"";}.la-puzzle-piece:before{content:"";}.la-python:before{content:"";}.la-qq:before{content:"";}.la-qrcode:before{content:"";}.la-question:before{content:"";}.la-question-circle:before{content:"";}.la-quidditch:before{content:"";}.la-quinscape:before{content:"";}.la-quora:before{content:"";}.la-quote-left:before{content:"";}.la-quote-right:before{content:"";}.la-quran:before{content:"";}.la-r-project:before{content:"";}.la-radiation:before{content:"";}.la-radiation-alt:before{content:"";}.la-rainbow:before{content:"";}.la-random:before{content:"";}.la-raspberry-pi:before{content:"";}.la-ravelry:before{content:"";}.la-react:before{content:"";}.la-reacteurope:before{content:"";}.la-readme:before{content:"";}.la-rebel:before{content:"";}.la-receipt:before{content:"";}.la-recycle:before{content:"";}.la-red-river:before{content:"";}.la-reddit:before{content:"";}.la-reddit-alien:before{content:"";}.la-reddit-square:before{content:"";}.la-redhat:before{content:"";}.la-redo:before{content:"";}.la-redo-alt:before{content:"";}.la-registered:before{content:"";}.la-remove-format:before{content:"";}.la-renren:before{content:"";}.la-reply:before{content:"";}.la-reply-all:before{content:"";}.la-replyd:before{content:"";}.la-republican:before{content:"";}.la-researchgate:before{content:"";}.la-resolving:before{content:"";}.la-restroom:before{content:"";}.la-retweet:before{content:"";}.la-rev:before{content:"";}.la-ribbon:before{content:"";}.la-ring:before{content:"";}.la-road:before{content:"";}.la-robot:before{content:"";}.la-rocket:before{content:"";}.la-rocketchat:before{content:"";}.la-rockrms:before{content:"";}.la-route:before{content:"";}.la-rss:before{content:"";}.la-rss-square:before{content:"";}.la-ruble-sign:before{content:"";}.la-ruler:before{content:"";}.la-ruler-combined:before{content:"";}.la-ruler-horizontal:before{content:"";}.la-ruler-vertical:before{content:"";}.la-running:before{content:"";}.la-rupee-sign:before{content:"";}.la-sad-cry:before{content:"";}.la-sad-tear:before{content:"";}.la-safari:before{content:"";}.la-salesforce:before{content:"";}.la-sass:before{content:"";}.la-satellite:before{content:"";}.la-satellite-dish:before{content:"";}.la-save:before{content:"";}.la-schlix:before{content:"";}.la-school:before{content:"";}.la-screwdriver:before{content:"";}.la-scribd:before{content:"";}.la-scroll:before{content:"";}.la-sd-card:before{content:"";}.la-search:before{content:"";}.la-search-dollar:before{content:"";}.la-search-location:before{content:"";}.la-search-minus:before{content:"";}.la-search-plus:before{content:"";}.la-searchengin:before{content:"";}.la-seedling:before{content:"";}.la-sellcast:before{content:"";}.la-sellsy:before{content:"";}.la-server:before{content:"";}.la-servicestack:before{content:"";}.la-shapes:before{content:"";}.la-share:before{content:"";}.la-share-alt:before{content:"";}.la-share-alt-square:before{content:"";}.la-share-square:before{content:"";}.la-shekel-sign:before{content:"";}.la-shield-alt:before{content:"";}.la-ship:before{content:"";}.la-shipping-fast:before{content:"";}.la-shirtsinbulk:before{content:"";}.la-shoe-prints:before{content:"";}.la-shopping-bag:before{content:"";}.la-shopping-basket:before{content:"";}.la-shopping-cart:before{content:"";}.la-shopware:before{content:"";}.la-shower:before{content:"";}.la-shuttle-van:before{content:"";}.la-sign:before{content:"";}.la-sign-in-alt:before{content:"";}.la-sign-language:before{content:"";}.la-sign-out-alt:before{content:"";}.la-signal:before{content:"";}.la-signature:before{content:"";}.la-sim-card:before{content:"";}.la-simplybuilt:before{content:"";}.la-sistrix:before{content:"";}.la-sitemap:before{content:"";}.la-sith:before{content:"";}.la-skating:before{content:"";}.la-sketch:before{content:"";}.la-skiing:before{content:"";}.la-skiing-nordic:before{content:"";}.la-skull:before{content:"";}.la-skull-crossbones:before{content:"";}.la-skyatlas:before{content:"";}.la-skype:before{content:"";}.la-slack:before{content:"";}.la-slack-hash:before{content:"";}.la-slash:before{content:"";}.la-sleigh:before{content:"";}.la-sliders-h:before{content:"";}.la-slideshare:before{content:"";}.la-smile:before{content:"";}.la-smile-beam:before{content:"";}.la-smile-wink:before{content:"";}.la-smog:before{content:"";}.la-smoking:before{content:"";}.la-smoking-ban:before{content:"";}.la-sms:before{content:"";}.la-snapchat:before{content:"";}.la-snapchat-ghost:before{content:"";}.la-snapchat-square:before{content:"";}.la-snowboarding:before{content:"";}.la-snowflake:before{content:"";}.la-snowman:before{content:"";}.la-snowplow:before{content:"";}.la-socks:before{content:"";}.la-solar-panel:before{content:"";}.la-sort:before{content:"";}.la-sort-alpha-down:before{content:"";}.la-sort-alpha-down-alt:before{content:"";}.la-sort-alpha-up:before{content:"";}.la-sort-alpha-up-alt:before{content:"";}.la-sort-amount-down:before{content:"";}.la-sort-amount-down-alt:before{content:"";}.la-sort-amount-up:before{content:"";}.la-sort-amount-up-alt:before{content:"";}.la-sort-down:before{content:"";}.la-sort-numeric-down:before{content:"";}.la-sort-numeric-down-alt:before{content:"";}.la-sort-numeric-up:before{content:"";}.la-sort-numeric-up-alt:before{content:"";}.la-sort-up:before{content:"";}.la-soundcloud:before{content:"";}.la-sourcetree:before{content:"";}.la-spa:before{content:"";}.la-space-shuttle:before{content:"";}.la-speakap:before{content:"";}.la-speaker-deck:before{content:"";}.la-spell-check:before{content:"";}.la-spider:before{content:"";}.la-spinner:before{content:"";}.la-splotch:before{content:"";}.la-spotify:before{content:"";}.la-spray-can:before{content:"";}.la-square:before{content:"";}.la-square-full:before{content:"";}.la-square-root-alt:before{content:"";}.la-squarespace:before{content:"";}.la-stack-exchange:before{content:"";}.la-stack-overflow:before{content:"";}.la-stackpath:before{content:"";}.la-stamp:before{content:"";}.la-star:before{content:"";}.la-star-and-crescent:before{content:"";}.la-star-half:before{content:"";}.la-star-half-alt:before{content:"";}.la-star-of-david:before{content:"";}.la-star-of-life:before{content:"";}.la-staylinked:before{content:"";}.la-steam:before{content:"";}.la-steam-square:before{content:"";}.la-steam-symbol:before{content:"";}.la-step-backward:before{content:"";}.la-step-forward:before{content:"";}.la-stethoscope:before{content:"";}.la-sticker-mule:before{content:"";}.la-sticky-note:before{content:"";}.la-stop:before{content:"";}.la-stop-circle:before{content:"";}.la-stopwatch:before{content:"";}.la-store:before{content:"";}.la-store-alt:before{content:"";}.la-strava:before{content:"";}.la-stream:before{content:"";}.la-street-view:before{content:"";}.la-strikethrough:before{content:"";}.la-stripe:before{content:"";}.la-stripe-s:before{content:"";}.la-stroopwafel:before{content:"";}.la-studiovinari:before{content:"";}.la-stumbleupon:before{content:"";}.la-stumbleupon-circle:before{content:"";}.la-subscript:before{content:"";}.la-subway:before{content:"";}.la-suitcase:before{content:"";}.la-suitcase-rolling:before{content:"";}.la-sun:before{content:"";}.la-superpowers:before{content:"";}.la-superscript:before{content:"";}.la-supple:before{content:"";}.la-surprise:before{content:"";}.la-suse:before{content:"";}.la-swatchbook:before{content:"";}.la-swimmer:before{content:"";}.la-swimming-pool:before{content:"";}.la-symfony:before{content:"";}.la-synagogue:before{content:"";}.la-sync:before{content:"";}.la-sync-alt:before{content:"";}.la-syringe:before{content:"";}.la-table:before{content:"";}.la-table-tennis:before{content:"";}.la-tablet:before{content:"";}.la-tablet-alt:before{content:"";}.la-tablets:before{content:"";}.la-tachometer-alt:before{content:"";}.la-tag:before{content:"";}.la-tags:before{content:"";}.la-tape:before{content:"";}.la-tasks:before{content:"";}.la-taxi:before{content:"";}.la-teamspeak:before{content:"";}.la-teeth:before{content:"";}.la-teeth-open:before{content:"";}.la-telegram:before{content:"";}.la-telegram-plane:before{content:"";}.la-temperature-high:before{content:"";}.la-temperature-low:before{content:"";}.la-tencent-weibo:before{content:"";}.la-tenge:before{content:"";}.la-terminal:before{content:"";}.la-text-height:before{content:"";}.la-text-width:before{content:"";}.la-th:before{content:"";}.la-th-large:before{content:"";}.la-th-list:before{content:"";}.la-the-red-yeti:before{content:"";}.la-theater-masks:before{content:"";}.la-themeco:before{content:"";}.la-themeisle:before{content:"";}.la-thermometer:before{content:"";}.la-thermometer-empty:before{content:"";}.la-thermometer-full:before{content:"";}.la-thermometer-half:before{content:"";}.la-thermometer-quarter:before{content:"";}.la-thermometer-three-quarters:before{content:"";}.la-think-peaks:before{content:"";}.la-thumbs-down:before{content:"";}.la-thumbs-up:before{content:"";}.la-thumbtack:before{content:"";}.la-ticket-alt:before{content:"";}.la-times:before{content:"";}.la-times-circle:before{content:"";}.la-tint:before{content:"";}.la-tint-slash:before{content:"";}.la-tired:before{content:"";}.la-toggle-off:before{content:"";}.la-toggle-on:before{content:"";}.la-toilet:before{content:"";}.la-toilet-paper:before{content:"";}.la-toolbox:before{content:"";}.la-tools:before{content:"";}.la-tooth:before{content:"";}.la-torah:before{content:"";}.la-torii-gate:before{content:"";}.la-tractor:before{content:"";}.la-trade-federation:before{content:"";}.la-trademark:before{content:"";}.la-traffic-light:before{content:"";}.la-train:before{content:"";}.la-tram:before{content:"";}.la-transgender:before{content:"";}.la-transgender-alt:before{content:"";}.la-trash:before{content:"";}.la-trash-alt:before{content:"";}.la-trash-restore:before{content:"";}.la-trash-restore-alt:before{content:"";}.la-tree:before{content:"";}.la-trello:before{content:"";}.la-tripadvisor:before{content:"";}.la-trophy:before{content:"";}.la-truck:before{content:"";}.la-truck-loading:before{content:"";}.la-truck-monster:before{content:"";}.la-truck-moving:before{content:"";}.la-truck-pickup:before{content:"";}.la-tshirt:before{content:"";}.la-tty:before{content:"";}.la-tumblr:before{content:"";}.la-tumblr-square:before{content:"";}.la-tv:before{content:"";}.la-twitch:before{content:"";}.la-twitter:before{content:"";}.la-twitter-square:before{content:"";}.la-typo3:before{content:"";}.la-uber:before{content:"";}.la-ubuntu:before{content:"";}.la-uikit:before{content:"";}.la-umbrella:before{content:"";}.la-umbrella-beach:before{content:"";}.la-underline:before{content:"";}.la-undo:before{content:"";}.la-undo-alt:before{content:"";}.la-uniregistry:before{content:"";}.la-universal-access:before{content:"";}.la-university:before{content:"";}.la-unlink:before{content:"";}.la-unlock:before{content:"";}.la-unlock-alt:before{content:"";}.la-untappd:before{content:"";}.la-upload:before{content:"";}.la-ups:before{content:"";}.la-usb:before{content:"";}.la-user:before{content:"";}.la-user-alt:before{content:"";}.la-user-alt-slash:before{content:"";}.la-user-astronaut:before{content:"";}.la-user-check:before{content:"";}.la-user-circle:before{content:"";}.la-user-clock:before{content:"";}.la-user-cog:before{content:"";}.la-user-edit:before{content:"";}.la-user-friends:before{content:"";}.la-user-graduate:before{content:"";}.la-user-injured:before{content:"";}.la-user-lock:before{content:"";}.la-user-md:before{content:"";}.la-user-minus:before{content:"";}.la-user-ninja:before{content:"";}.la-user-nurse:before{content:"";}.la-user-plus:before{content:"";}.la-user-secret:before{content:"";}.la-user-shield:before{content:"";}.la-user-slash:before{content:"";}.la-user-tag:before{content:"";}.la-user-tie:before{content:"";}.la-user-times:before{content:"";}.la-users:before{content:"";}.la-users-cog:before{content:"";}.la-usps:before{content:"";}.la-ussunnah:before{content:"";}.la-utensil-spoon:before{content:"";}.la-utensils:before{content:"";}.la-vaadin:before{content:"";}.la-vector-square:before{content:"";}.la-venus:before{content:"";}.la-venus-double:before{content:"";}.la-venus-mars:before{content:"";}.la-viacoin:before{content:"";}.la-viadeo:before{content:"";}.la-viadeo-square:before{content:"";}.la-vial:before{content:"";}.la-vials:before{content:"";}.la-viber:before{content:"";}.la-video:before{content:"";}.la-video-slash:before{content:"";}.la-vihara:before{content:"";}.la-vimeo:before{content:"";}.la-vimeo-square:before{content:"";}.la-vimeo-v:before{content:"";}.la-vine:before{content:"";}.la-vk:before{content:"";}.la-vnv:before{content:"";}.la-voicemail:before{content:"";}.la-volleyball-ball:before{content:"";}.la-volume-down:before{content:"";}.la-volume-mute:before{content:"";}.la-volume-off:before{content:"";}.la-volume-up:before{content:"";}.la-vote-yea:before{content:"";}.la-vr-cardboard:before{content:"";}.la-vuejs:before{content:"";}.la-walking:before{content:"";}.la-wallet:before{content:"";}.la-warehouse:before{content:"";}.la-water:before{content:"";}.la-wave-square:before{content:"";}.la-waze:before{content:"";}.la-weebly:before{content:"";}.la-weibo:before{content:"";}.la-weight:before{content:"";}.la-weight-hanging:before{content:"";}.la-weixin:before{content:"";}.la-whatsapp:before{content:"";}.la-whatsapp-square:before{content:"";}.la-wheelchair:before{content:"";}.la-whmcs:before{content:"";}.la-wifi:before{content:"";}.la-wikipedia-w:before{content:"";}.la-wind:before{content:"";}.la-window-close:before{content:"";}.la-window-maximize:before{content:"";}.la-window-minimize:before{content:"";}.la-window-restore:before{content:"";}.la-windows:before{content:"";}.la-wine-bottle:before{content:"";}.la-wine-glass:before{content:"";}.la-wine-glass-alt:before{content:"";}.la-wix:before{content:"";}.la-wizards-of-the-coast:before{content:"";}.la-wolf-pack-battalion:before{content:"";}.la-won-sign:before{content:"";}.la-wordpress:before{content:"";}.la-wordpress-simple:before{content:"";}.la-wpbeginner:before{content:"";}.la-wpexplorer:before{content:"";}.la-wpforms:before{content:"";}.la-wpressr:before{content:"";}.la-wrench:before{content:"";}.la-x-ray:before{content:"";}.la-xbox:before{content:"";}.la-xing:before{content:"";}.la-xing-square:before{content:"";}.la-y-combinator:before{content:"";}.la-yahoo:before{content:"";}.la-yammer:before{content:"";}.la-yandex:before{content:"";}.la-yandex-international:before{content:"";}.la-yarn:before{content:"";}.la-yelp:before{content:"";}.la-yen-sign:before{content:"";}.la-yin-yang:before{content:"";}.la-yoast:before{content:"";}.la-youtube:before{content:"";}.la-youtube-square:before{content:"";}.la-zhihu:before{content:"";}.la-hat-cowboy:before{content:"";}.la-hat-cowboy-side:before{content:"";}.la-mdb:before{content:"";}.la-mouse:before{content:"";}.la-orcid:before{content:"";}.la-record-vinyl:before{content:"";}.la-swift:before{content:"";}.la-umbraco:before{content:"";}.la-buy-n-large:before{content:"";}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto;}body{color:#728197;font-family:"Roboto",sans-serif;font-size:16px;font-weight:400;line-height:1.5;background-color:#edf2f7;}a{color:#ed8936;transition:all .2s;}a:hover{color:#c05621;}table{width:100%;border-collapse:collapse;}table th{border-bottom:2px solid #ccd6e0;color:#a0aec0;font-weight:700;letter-spacing:.1rem;text-align:left;padding:0 1.25rem 1.25rem;text-transform:uppercase;font-size:1.2rem;}table td{border-bottom:2px solid #f8fafc;padding:1.25rem;text-align:left;font-weight:400;color:#728197;}table tbody>tr:hover>td{background:#f8fafc;}table tbody>tr.no-items-row:hover>td{background:none;}table td.actions{text-align:right;}table td.actions button{opacity:0;color:#a0aec0;margin-right:4px;}table td.actions button:last-child{margin-right:0;}table td.actions button:hover{color:#ed8936;}table tr:hover>td.actions>button{opacity:1;}table .no-items{padding:5rem;text-align:center;}table .no-items p{color:#ccd6e0;}form .validation-errors{display:flex;flex-direction:column;border-left:.3rem solid #e53e3e;margin-left:0;margin-right:0;padding:1rem 1.5rem;color:#e53e3e;background:#fff5f5;list-style:none;}form .validation-errors li:first-child{margin-top:2px;}form .validation-errors li:last-child{margin-bottom:0;}form input.invalid,form textarea.invalid,form select.invalid{border-color:#e53e3e;}form input.modified.valid,form textarea.modified.valid,form select.modified.valid{border-color:#39a26a;}form .validation-message{color:#e53e3e;font-weight:700;margin-top:-8px;margin-bottom:18px;}.card{background:#fff;padding:32px;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);border-radius:8px;margin-bottom:48px;position:relative;}.card.accent{border-top:4px solid #ed8936;}app{position:relative;display:flex;flex-direction:column;}.main{display:flex;flex-direction:row;padding:0 32px 32px 32px;}.main .sidebar{width:250px;margin-right:64px;}.main .content{flex:1;}#blazor-error-ui{background:#ffffe0;bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;z-index:1000;}#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem;}.header-bar{display:flex;justify-content:space-between;align-items:center;padding:12px 32px;margin-bottom:32px;background-color:#fff;height:64px;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);}.header-bar .logo{display:flex;align-items:center;justify-content:center;text-decoration:none;font-size:30px;font-weight:500;color:#728197;background:#fff;}.header-bar .logo .logo-text{opacity:1;transition:all .2s;margin:0;}.header-bar .logo .logo-text span{font-weight:900;color:#ed8936;}.header-bar .menu{display:flex;flex-direction:row;align-items:center;justify-content:space-between;font-size:20px;}.header-bar .menu button{display:flex;align-items:center;margin:0 16px;background:#fff;color:#dd6820;}.header-bar .menu button i{font-size:24px;}.header-bar .menu button i:hover{color:#606c76;}.header-bar .menu button:hover{color:#606c76;}.header-bar .menu a{display:flex;padding-left:16px;color:#a0aec0;text-decoration:none;}.header-bar .menu a:hover{color:#ed8936;}.header-bar .menu a.active{color:#ed8936;}.header-bar .menu a:last-child{padding-right:0;}.navmenu{display:flex;flex-direction:column;width:22rem;margin:0 64px 0 0;}.navmenu .menu-container{display:flex;flex:1;flex-direction:column;justify-content:space-between;}.navmenu .menu-container .menu{display:flex;}.navmenu .menu-container .menu ul{list-style:none;display:flex;flex-direction:column;flex:1;margin:0;padding:0;}.navmenu .menu-container .menu ul a{display:flex;align-items:baseline;padding:12px 16px;color:#728197;text-decoration:none;font-size:16px;font-weight:500;}.navmenu .menu-container .menu ul a:hover{color:#ed8936;}.navmenu .menu-container .menu ul a:hover i{color:#ed8936;}.navmenu .menu-container .menu ul a i{color:#a0aec0;margin-right:1rem;font-size:18px;}.navmenu .menu-container .menu ul a span{transition:display .2s;}.navmenu .menu-container .menu ul a.active{background-color:#fff;color:#ed8936;box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);border-radius:8px;}.navmenu .menu-container .menu ul a.active i{color:#ed8936;}.login-panel{background:#fff;padding:32px;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);border-radius:8px;margin-bottom:48px;position:relative;max-width:500px;margin:64px auto;}.login-panel.accent{border-top:4px solid #ed8936;} -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/favicon.ico -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-brands-400.eot -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-brands-400.ttf -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-brands-400.woff -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-brands-400.woff2 -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-regular-400.eot -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-regular-400.ttf -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-regular-400.woff -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-regular-400.woff2 -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.eot -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.ttf -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.woff -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/297f8ebcaf27dfc9d0adb76f814109497cd86b9d/src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.woff2 -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/index.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | Blazored Repairs 8 | 9 | 10 | 11 | 12 | 13 | 14 | Loading... 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Client/wwwroot/js/chart-wrapper.js: -------------------------------------------------------------------------------- 1 | export function buildChart(element, type, data) { 2 | let chart = new Chart(element, { 3 | type: type, 4 | data: data, 5 | options: { 6 | scales: { 7 | yAxes: [{ 8 | ticks: { 9 | beginAtZero: true, 10 | stepSize: 1 11 | } 12 | }] 13 | }, 14 | legend: { 15 | display: false 16 | } 17 | } 18 | }); 19 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Server/BlazoredRepairs.Server.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | net5.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Server/Controllers/LoginController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IdentityModel.Tokens.Jwt; 4 | using System.Security.Claims; 5 | using System.Text; 6 | using BlazoredRepairs.Shared; 7 | using Microsoft.AspNetCore.Mvc; 8 | using Microsoft.Extensions.Configuration; 9 | using Microsoft.IdentityModel.Tokens; 10 | 11 | namespace BlazoredRepairs.Server.Controllers 12 | { 13 | [ApiController, Route("api")] 14 | public class LoginController : Controller 15 | { 16 | private readonly IConfiguration _configuration; 17 | 18 | public LoginController(IConfiguration configuration) 19 | { 20 | _configuration = configuration; 21 | } 22 | 23 | [HttpPost("login")] 24 | public IActionResult Login([FromBody] LoginModel login) 25 | { 26 | var result = login.Username == "Planner" && login.Password == "Planner1!" || login.Username == "User" && login.Password == "User1!"; 27 | 28 | if (!result) return BadRequest(new LoginResult { Successful = false, Error = "Username and password are invalid." }); 29 | 30 | var claims = new List(); 31 | claims.Add(new Claim(ClaimTypes.Name, login.Username)); 32 | 33 | if (login.Username == "Planner") 34 | { 35 | claims.Add(new Claim(ClaimTypes.Role, "Planner")); 36 | } 37 | 38 | if (login.Username == "User") 39 | { 40 | claims.Add(new Claim(ClaimTypes.Role, "User")); 41 | } 42 | 43 | var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JwtSecurityKey"])); 44 | var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); 45 | var expiry = DateTime.Now.AddDays(Convert.ToInt32(_configuration["JwtExpiryInDays"])); 46 | 47 | var token = new JwtSecurityToken( 48 | _configuration["JwtIssuer"], 49 | _configuration["JwtAudience"], 50 | claims, 51 | expires: expiry, 52 | signingCredentials: creds 53 | ); 54 | 55 | return Ok(new LoginResult { Successful = true, Token = new JwtSecurityTokenHandler().WriteToken(token) }); 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Server/Controllers/RepairsController.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using System.Linq; 3 | using BlazoredRepairs.Shared; 4 | using Microsoft.AspNetCore.Authorization; 5 | using Microsoft.AspNetCore.Mvc; 6 | 7 | namespace BlazoredRepairs.Server.Controllers 8 | { 9 | [Authorize] 10 | [ApiController, Route("api")] 11 | public class RepairsController : Controller 12 | { 13 | private static List _repairs = new List 14 | { 15 | new RepairModel{ 16 | Name = "Jane Smith", 17 | Issue = "Broken boiler", 18 | Trade = "Gas", 19 | ContactNumber = "07656 545432", 20 | Complete = false 21 | }, 22 | new RepairModel{ 23 | Name = "Ron Jameson", 24 | Issue = "Fence panel missing", 25 | Trade = "Carpenter", 26 | ContactNumber = "07865 344223", 27 | Complete = false 28 | }, 29 | new RepairModel{ 30 | Name = "Terri Jones", 31 | Issue = "Leaking tap", 32 | Trade = "Plumber", 33 | ContactNumber = "01453 453423", 34 | Complete = false 35 | }, 36 | new RepairModel{ 37 | Name = "Andy Sturgen", 38 | Issue = "Roof blown off", 39 | Trade = "Roofer", 40 | ContactNumber = "01456 454534", 41 | Complete = true 42 | }, 43 | new RepairModel{ 44 | Name = "Brook Giles", 45 | Issue = "Cracked Window", 46 | Trade = "Window Fitter", 47 | ContactNumber = "01465 343558", 48 | Complete = true 49 | }, 50 | new RepairModel{ 51 | Name = "Billy Jenson", 52 | Issue = "Broken tap in bathroom", 53 | Trade = "Plumber", 54 | ContactNumber = "07865 344223", 55 | Complete = true 56 | }, 57 | new RepairModel{ 58 | Name = "Jim Kipson", 59 | Issue = "Plug socket not working", 60 | Trade = "Electrician", 61 | ContactNumber = "07465 343445", 62 | Complete = true 63 | }, 64 | new RepairModel{ 65 | Name = "Kim Fallon", 66 | Issue = "Shed collapsed", 67 | Trade = "Carpenter", 68 | ContactNumber = "01234 345678", 69 | Complete = true 70 | } 71 | 72 | }; 73 | 74 | [HttpGet("repairs")] 75 | public IActionResult GetAllRepairs() 76 | { 77 | return Ok(_repairs.OrderBy(x => x.Complete)); 78 | } 79 | 80 | [HttpPost("repairs")] 81 | public IActionResult NewRepair(RepairModel newRepair) 82 | { 83 | _repairs.Add(newRepair); 84 | return Ok(); 85 | } 86 | } 87 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Server/Program.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Microsoft.AspNetCore.Hosting; 3 | using Microsoft.Extensions.Hosting; 4 | 5 | namespace BlazoredRepairs.Server 6 | { 7 | public class Program 8 | { 9 | public async static Task Main(string[] args) 10 | { 11 | await CreateHostBuilder(args).Build().RunAsync(); 12 | } 13 | 14 | public static IHostBuilder CreateHostBuilder(string[] args) => 15 | Host.CreateDefaultBuilder(args) 16 | .ConfigureWebHostDefaults(webBuilder => 17 | { 18 | webBuilder.UseStartup(); 19 | }); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Server/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:54860/", 7 | "sslPort": 44304 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "BlazoredRepairs.Server": { 20 | "commandName": "Project", 21 | "launchBrowser": true, 22 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 23 | "environmentVariables": { 24 | "ASPNETCORE_ENVIRONMENT": "Development" 25 | }, 26 | "applicationUrl": "https://localhost:5001;http://localhost:5000" 27 | } 28 | } 29 | } -------------------------------------------------------------------------------- /src/BlazoredRepairs.Server/Startup.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Text; 3 | using FluentValidation.AspNetCore; 4 | using Microsoft.AspNetCore.Authentication.JwtBearer; 5 | using Microsoft.AspNetCore.Builder; 6 | using Microsoft.AspNetCore.Hosting; 7 | using Microsoft.Extensions.Configuration; 8 | using Microsoft.Extensions.DependencyInjection; 9 | using Microsoft.Extensions.Hosting; 10 | using Microsoft.IdentityModel.Tokens; 11 | 12 | namespace BlazoredRepairs.Server 13 | { 14 | public class Startup 15 | { 16 | public Startup(IConfiguration configuration) 17 | { 18 | Configuration = configuration; 19 | } 20 | 21 | public IConfiguration Configuration { get; } 22 | 23 | // This method gets called by the runtime. Use this method to add services to the container. 24 | public void ConfigureServices(IServiceCollection services) 25 | { 26 | services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) 27 | .AddJwtBearer(options => 28 | { 29 | options.TokenValidationParameters = new TokenValidationParameters 30 | { 31 | ValidateIssuer = true, 32 | ValidateAudience = true, 33 | ValidateLifetime = true, 34 | ValidateIssuerSigningKey = true, 35 | ValidIssuer = Configuration["JwtIssuer"], 36 | ValidAudience = Configuration["JwtAudience"], 37 | IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtSecurityKey"])) 38 | }; 39 | }); 40 | 41 | services.AddControllers(); 42 | services.AddMvc().AddFluentValidation(fv => fv.RegisterValidatorsFromAssembly(Assembly.Load("BlazoredRepairs.Shared"))); 43 | } 44 | 45 | // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 46 | public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 47 | { 48 | if (env.IsDevelopment()) 49 | { 50 | app.UseDeveloperExceptionPage(); 51 | app.UseWebAssemblyDebugging(); 52 | } 53 | 54 | app.UseHttpsRedirection(); 55 | app.UseBlazorFrameworkFiles(); 56 | app.UseStaticFiles(); 57 | app.UseRouting(); 58 | app.UseAuthentication(); 59 | app.UseAuthorization(); 60 | app.UseEndpoints(endpoints => 61 | { 62 | endpoints.MapControllers(); 63 | endpoints.MapFallbackToFile("index.html"); 64 | }); 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Server/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft": "Warning", 6 | "Microsoft.Hosting.Lifetime": "Information" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Server/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "Logging": { 3 | "LogLevel": { 4 | "Default": "Information", 5 | "Microsoft": "Warning", 6 | "Microsoft.Hosting.Lifetime": "Information" 7 | } 8 | }, 9 | "AllowedHosts": "*", 10 | "JwtSecurityKey": "RANDOM_KEY_MUST_NOT_BE_SHARED", 11 | "JwtIssuer": "https://localhost", 12 | "JwtAudience": "https://localhost", 13 | "JwtExpiryInDays": 1 14 | } 15 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Shared/BlazoredRepairs.Shared.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Shared/LoginModel.cs: -------------------------------------------------------------------------------- 1 | namespace BlazoredRepairs.Shared 2 | { 3 | public class LoginModel 4 | { 5 | public string Username { get; set; } 6 | public string Password { get; set; } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Shared/LoginResult.cs: -------------------------------------------------------------------------------- 1 | namespace BlazoredRepairs.Shared 2 | { 3 | public class LoginResult 4 | { 5 | public bool Successful { get; set; } 6 | public string Error { get; set; } 7 | public string Token { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/BlazoredRepairs.Shared/RepairModel.cs: -------------------------------------------------------------------------------- 1 | using FluentValidation; 2 | 3 | namespace BlazoredRepairs.Shared 4 | { 5 | public class RepairModel 6 | { 7 | public string Name { get; set; } 8 | public string Issue { get; set; } 9 | public string Trade { get; set; } 10 | public string ContactNumber { get; set; } 11 | public bool Complete { get; set; } 12 | } 13 | 14 | public class RepairModelValidator : AbstractValidator 15 | { 16 | public RepairModelValidator() 17 | { 18 | RuleFor(_ => _.Name).NotEmpty().WithMessage("Please enter a name"); 19 | RuleFor(_ => _.Issue).NotEmpty().WithMessage("Please enter the issue"); 20 | RuleFor(_ => _.Issue).MinimumLength(10).WithMessage("Please enter at least 10 characters"); 21 | RuleFor(_ => _.Trade).NotEmpty().WithMessage("Please select a trade"); 22 | RuleFor(_ => _.ContactNumber).NotEmpty().WithMessage("Please enter a contact number"); 23 | RuleFor(_ => _.ContactNumber).Matches(@"^(((\+44\s?\d{4}|\(?0\d{4}\)?)\s?\d{3}\s?\d{3})|((\+44\s?\d{3}|\(?0\d{3}\)?)\s?\d{3}\s?\d{4})|((\+44\s?\d{2}|\(?0\d{2}\)?)\s?\d{4}\s?\d{4}))(\s?\#(\d{4}|\d{3}))?$").WithMessage("The contact number is not valid"); 24 | } 25 | } 26 | } --------------------------------------------------------------------------------