├── src
├── BlazoredRepairs.Client
│ ├── Styles
│ │ ├── LineAwesome
│ │ │ ├── _fixed-width.scss
│ │ │ ├── _screen-reader.scss
│ │ │ ├── _core.scss
│ │ │ ├── line-awesome.scss
│ │ │ ├── _list.scss
│ │ │ ├── _stacked.scss
│ │ │ ├── _bordered_pulled.scss
│ │ │ ├── _larger.scss
│ │ │ ├── _mixins.scss
│ │ │ ├── _path.scss
│ │ │ ├── _rotated-flipped.scss
│ │ │ └── _variables.scss
│ │ ├── Milligram
│ │ │ ├── _Image.sass
│ │ │ ├── _Divider.sass
│ │ │ ├── _Link.sass
│ │ │ ├── _Blockquote.sass
│ │ │ ├── _Color.sass
│ │ │ ├── _List.sass
│ │ │ ├── _Table.sass
│ │ │ ├── _Spacing.sass
│ │ │ ├── _Utility.sass
│ │ │ ├── milligram.sass
│ │ │ ├── _Code.sass
│ │ │ ├── _Base.sass
│ │ │ ├── _Typography.sass
│ │ │ ├── _Button.sass
│ │ │ ├── _Form.sass
│ │ │ └── _Grid.sass
│ │ ├── Normalize
│ │ │ ├── Normalize.scss
│ │ │ ├── _Variables.scss
│ │ │ ├── _VerticalRhythm.scss
│ │ │ └── _NormalizeMixin.scss
│ │ ├── blazored-repairs.scss
│ │ ├── _Base.scss
│ │ └── _Variables.scss
│ ├── wwwroot
│ │ ├── favicon.ico
│ │ ├── fonts
│ │ │ ├── la-solid-900.eot
│ │ │ ├── la-solid-900.ttf
│ │ │ ├── la-brands-400.eot
│ │ │ ├── la-brands-400.ttf
│ │ │ ├── la-brands-400.woff
│ │ │ ├── la-brands-400.woff2
│ │ │ ├── la-regular-400.eot
│ │ │ ├── la-regular-400.ttf
│ │ │ ├── la-regular-400.woff
│ │ │ ├── la-solid-900.woff
│ │ │ ├── la-solid-900.woff2
│ │ │ └── la-regular-400.woff2
│ │ ├── js
│ │ │ └── chart-wrapper.js
│ │ ├── index.html
│ │ └── blazored-repairs.min.css
│ ├── compilerconfig.json
│ ├── Features
│ │ ├── Shared
│ │ │ ├── Card
│ │ │ │ ├── Card.razor
│ │ │ │ └── _Card.scss
│ │ │ └── Layout
│ │ │ │ ├── HeaderBar
│ │ │ │ ├── HeaderBar.razor
│ │ │ │ ├── UserStatus.razor
│ │ │ │ └── _HeaderBar.scss
│ │ │ │ ├── MainLayout.razor
│ │ │ │ ├── NavMenu
│ │ │ │ ├── NavMenu.razor
│ │ │ │ └── _NavMenu.scss
│ │ │ │ └── _MainLayout.scss
│ │ ├── Login
│ │ │ ├── _Login.scss
│ │ │ └── Login.razor
│ │ ├── App.razor
│ │ ├── Dashboard
│ │ │ ├── ChartData.cs
│ │ │ ├── Chart.razor
│ │ │ └── DashboardPage.razor
│ │ ├── ViewRepairs
│ │ │ └── ViewRepairPage.razor
│ │ └── NewRepair
│ │ │ └── NewRepairPage.razor
│ ├── _Imports.razor
│ ├── BlazoredRepairs.Client.csproj
│ ├── Properties
│ │ └── launchSettings.json
│ ├── Program.cs
│ ├── compilerconfig.json.defaults
│ ├── Providers
│ │ └── TokenAuthenticationStateProvider.cs
│ └── Extensions
│ │ └── StringExtensions.cs
├── BlazoredRepairs.Shared
│ ├── LoginModel.cs
│ ├── LoginResult.cs
│ ├── BlazoredRepairs.Shared.csproj
│ └── RepairModel.cs
└── BlazoredRepairs.Server
│ ├── appsettings.Development.json
│ ├── appsettings.json
│ ├── Program.cs
│ ├── Properties
│ └── launchSettings.json
│ ├── BlazoredRepairs.Server.csproj
│ ├── Controllers
│ ├── LoginController.cs
│ └── RepairsController.cs
│ └── Startup.cs
├── LICENSE
├── BlazoredRepairs.sln
└── .gitignore
/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/_screen-reader.scss:
--------------------------------------------------------------------------------
1 | .sr-only { @include sr-only(); }
2 | .sr-only-focusable { @include sr-only-focusable(); }
3 |
--------------------------------------------------------------------------------
/src/BlazoredRepairs.Client/Styles/Milligram/_Image.sass:
--------------------------------------------------------------------------------
1 |
2 | // Image
3 | // ––––––––––––––––––––––––––––––––––––––––––––––––––
4 |
5 | img
6 | max-width: 100%
7 |
--------------------------------------------------------------------------------
/src/BlazoredRepairs.Client/wwwroot/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/HEAD/src/BlazoredRepairs.Client/wwwroot/favicon.ico
--------------------------------------------------------------------------------
/src/BlazoredRepairs.Client/Styles/Normalize/Normalize.scss:
--------------------------------------------------------------------------------
1 | @import "_Variables";
2 | @import "_VerticalRhythm";
3 | @import "_NormalizeMixin";
4 |
5 | @include normalize();
--------------------------------------------------------------------------------
/src/BlazoredRepairs.Client/compilerconfig.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "outputFile": "wwwroot/blazored-repairs.css",
4 | "inputFile": "Styles/blazored-repairs.scss"
5 | }
6 | ]
--------------------------------------------------------------------------------
/src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/HEAD/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/HEAD/src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.ttf
--------------------------------------------------------------------------------
/src/BlazoredRepairs.Client/wwwroot/fonts/la-brands-400.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/HEAD/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/HEAD/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/HEAD/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/HEAD/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/HEAD/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/HEAD/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/HEAD/src/BlazoredRepairs.Client/wwwroot/fonts/la-regular-400.woff
--------------------------------------------------------------------------------
/src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/HEAD/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/HEAD/src/BlazoredRepairs.Client/wwwroot/fonts/la-solid-900.woff2
--------------------------------------------------------------------------------
/src/BlazoredRepairs.Client/wwwroot/fonts/la-regular-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nirzaf/talk-buildingnextgenblazorapps/HEAD/src/BlazoredRepairs.Client/wwwroot/fonts/la-regular-400.woff2
--------------------------------------------------------------------------------
/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/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.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.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.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/Features/Shared/Layout/HeaderBar/HeaderBar.razor:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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.Client/Features/Shared/Layout/MainLayout.razor:
--------------------------------------------------------------------------------
1 | @inherits LayoutComponentBase
2 |
3 |
4 |
5 |
6 |
9 |
10 |
11 | @Body
12 |
13 |
14 |
--------------------------------------------------------------------------------
/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/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/_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/_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/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/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/_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/Features/Shared/Layout/HeaderBar/UserStatus.razor:
--------------------------------------------------------------------------------
1 | @inject Providers.TokenAuthenticationStateProvider _tokenAuthStateProvider
2 |
3 |
4 |
8 |
--------------------------------------------------------------------------------
/src/BlazoredRepairs.Shared/BlazoredRepairs.Shared.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net5.0
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/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/_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.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.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/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/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/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/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.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/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/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/_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.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.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/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/_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/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/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/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/_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/Features/Shared/Layout/NavMenu/NavMenu.razor:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/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/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/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.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 | }
--------------------------------------------------------------------------------
/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.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.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.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 | }
--------------------------------------------------------------------------------
/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/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/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/Features/Login/Login.razor:
--------------------------------------------------------------------------------
1 | @inject HttpClient _httpClient
2 | @inject Providers.TokenAuthenticationStateProvider _tokenAuthStateProvider
3 |
4 |
5 |
Login
6 |
7 |
25 |
26 |
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/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 | | Name |
14 | Issue |
15 | Trade |
16 | Contact Number |
17 | Complete |
18 |
19 |
20 |
21 | @foreach (var item in _repairs)
22 | {
23 |
24 | | @item.Name |
25 | @item.Issue |
26 | @item.Trade |
27 | @item.ContactNumber |
28 | @(item.Complete ? "Yes" : "No") |
29 |
30 | }
31 |
32 |
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/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/_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/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/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/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/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/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/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/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.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.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.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.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.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.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/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/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/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/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;}
--------------------------------------------------------------------------------