`s.
.nav {
- display: flex;
- flex-wrap: wrap;
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
+ display: flex;
+ flex-wrap: wrap;
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
}
.nav-link {
- display: block;
- padding: $nav-link-padding-y $nav-link-padding-x;
- @include font-size($nav-link-font-size);
- font-weight: $nav-link-font-weight;
- color: $nav-link-color;
- text-decoration: if($link-decoration == none, null, none);
- @include transition($nav-link-transition);
-
- &:hover,
- &:focus {
- color: $nav-link-hover-color;
- text-decoration: if($link-hover-decoration == underline, none, null);
- }
-
- // Disabled state lightens text
- &.disabled {
- color: $nav-link-disabled-color;
- pointer-events: none;
- cursor: default;
- }
+ display: block;
+ padding: $nav-link-padding-y $nav-link-padding-x;
+ @include font-size($nav-link-font-size);
+ font-weight: $nav-link-font-weight;
+ color: $nav-link-color;
+ text-decoration: if($link-decoration == none, null, none);
+ @include transition($nav-link-transition);
+
+ display: flex;
+ align-items: center;
+
+ &:hover,
+ &:focus {
+ color: $nav-link-hover-color;
+ text-decoration: if($link-hover-decoration == underline, none, null);
+ }
+
+ // Disabled state lightens text
+ &.disabled {
+ color: $nav-link-disabled-color;
+ pointer-events: none;
+ cursor: default;
+ }
}
//
@@ -39,123 +42,119 @@
//
.nav-tabs {
- border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
-
- .nav-link {
- position: relative;
- margin-bottom: -$nav-tabs-border-width;
- background-color: $nav-tabs-link-bg;
- border: $nav-tabs-border-width solid $nav-tabs-border-color;
- @include border-top-radius($nav-tabs-border-radius);
-
- &.active {
- &:before {
- background: #FFFFFF;
- }
- }
-
- &:before {
- content: "";
- position: absolute;
- width: 93%;
- height: 3px;
- border-radius: $border-radius;
- top: 1.5px;
- left: 0;
- right: 0;
- margin: auto;
- background: #C2C9D1;
- z-index: 1;
+ border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
+
+ .nav-link {
+ position: relative;
+ margin-bottom: -$nav-tabs-border-width;
+ background-color: $nav-tabs-link-bg;
+ border: $nav-tabs-border-width solid $nav-tabs-border-color;
+ @include border-top-radius($nav-tabs-border-radius);
+
+ &.active {
+ &:before {
+ background: #ffffff;
+ }
+ }
+
+ &:before {
+ content: "";
+ position: absolute;
+ width: 93%;
+ height: 3px;
+ border-radius: $border-radius;
+ top: 1.5px;
+ left: 0;
+ right: 0;
+ margin: auto;
+ background: #c2c9d1;
+ z-index: 1;
+ }
+
+ &:hover,
+ &:focus {
+ border-color: $nav-tabs-link-hover-border-color;
+ // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link
+ isolation: isolate;
+ }
+
+ &.disabled {
+ color: $nav-link-disabled-color;
+ background-color: transparent;
+ border-color: transparent;
+ }
}
- &:hover,
- &:focus {
- border-color: $nav-tabs-link-hover-border-color;
- //background: $nav-tabs-link-hover-bg;
- // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link
- isolation: isolate;
+ .nav-link.active,
+ .nav-item.show .nav-link {
+ color: $nav-tabs-link-active-color;
+ background-color: $nav-tabs-link-active-bg;
+ border-color: $nav-tabs-link-active-border-color;
}
- &.disabled {
- color: $nav-link-disabled-color;
- background-color: transparent;
- border-color: transparent;
+ .dropdown-menu {
+ // Make dropdown border overlap tab border
+ margin-top: -$nav-tabs-border-width;
+ // Remove the top rounded corners here since there is a hard edge above the menu
+ @include border-top-radius(0);
}
- }
-
- .nav-link.active,
- .nav-item.show .nav-link {
- color: $nav-tabs-link-active-color;
- background-color: $nav-tabs-link-active-bg;
- border-color: $nav-tabs-link-active-border-color;
- }
-
- .dropdown-menu {
- // Make dropdown border overlap tab border
- margin-top: -$nav-tabs-border-width;
- // Remove the top rounded corners here since there is a hard edge above the menu
- @include border-top-radius(0);
- }
}
-
//
// Pills
//
.nav-pills {
- .nav-link {
- background: none;
- border: 0;
- @include border-radius($nav-pills-border-radius);
- }
-
- .nav-link.active,
- .show > .nav-link {
- color: $nav-pills-link-active-color;
- @include gradient-bg($nav-pills-link-active-bg);
- }
-}
+ .nav-link {
+ background: none;
+ border: 0;
+ @include border-radius($nav-pills-border-radius);
+ }
+ .nav-link.active,
+ .show > .nav-link {
+ color: $nav-pills-link-active-color;
+ @include gradient-bg($nav-pills-link-active-bg);
+ }
+}
//
// Justified variants
//
.nav-fill {
- > .nav-link,
- .nav-item {
- flex: 1 1 auto;
- text-align: center;
- }
+ > .nav-link,
+ .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+ }
}
.nav-justified {
- > .nav-link,
- .nav-item {
- flex-basis: 0;
- flex-grow: 1;
- text-align: center;
- }
+ > .nav-link,
+ .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+ }
}
.nav-fill,
.nav-justified {
- .nav-item .nav-link {
- width: 100%; // Make sure button will grow
- }
+ .nav-item .nav-link {
+ width: 100%; // Make sure button will grow
+ }
}
-
// Tabbable tabs
//
// Hide tabbable panes to start, show them when `.active`
.tab-content {
- > .tab-pane {
- display: none;
- }
- > .active {
- display: block;
- }
+ > .tab-pane {
+ display: none;
+ }
+ > .active {
+ display: block;
+ }
}
diff --git a/src/assets/styles/bootstrap/_navbar.scss b/src/assets/styles/bootstrap/_navbar.scss
index 2ccef11b7..001dfc988 100644
--- a/src/assets/styles/bootstrap/_navbar.scss
+++ b/src/assets/styles/bootstrap/_navbar.scss
@@ -193,13 +193,42 @@
.navbar-toggler {
display: none;
}
+
+ .offcanvas-header {
+ display: none;
+ }
+
+ .offcanvas {
+ position: inherit;
+ bottom: 0;
+ z-index: 1000;
+ flex-grow: 1;
+ visibility: visible !important; // stylelint-disable-line declaration-no-important
+ background-color: transparent;
+ border-right: 0;
+ border-left: 0;
+ @include transition(none);
+ transform: none;
+ }
+ .offcanvas-top,
+ .offcanvas-bottom {
+ height: auto;
+ border-top: 0;
+ border-bottom: 0;
+ }
+
+ .offcanvas-body {
+ display: flex;
+ flex-grow: 0;
+ padding: 0;
+ overflow-y: visible;
+ }
}
}
}
}
// scss-docs-end navbar-expand-loop
-
// Navbar themes
//
// Styles for switching between navbars with light or dark background.
diff --git a/src/assets/styles/bootstrap/_offcanvas.scss b/src/assets/styles/bootstrap/_offcanvas.scss
index 1eeb98966..a089c2a08 100644
--- a/src/assets/styles/bootstrap/_offcanvas.scss
+++ b/src/assets/styles/bootstrap/_offcanvas.scss
@@ -14,14 +14,21 @@
@include transition(transform $offcanvas-transition-duration ease-in-out);
}
+.offcanvas-backdrop {
+ @include overlay-backdrop($zindex-offcanvas-backdrop, $offcanvas-backdrop-bg, $offcanvas-backdrop-opacity);
+}
+
.offcanvas-header {
display: flex;
+ align-items: center;
justify-content: space-between;
padding: $offcanvas-padding-y $offcanvas-padding-x;
.btn-close {
- padding: ($offcanvas-padding-y / 2) ($offcanvas-padding-x / 2);
- margin: ($offcanvas-padding-y / -2) ($offcanvas-padding-x / -2) ($offcanvas-padding-y / -2) auto;
+ padding: ($offcanvas-padding-y * .5) ($offcanvas-padding-x * .5);
+ margin-top: $offcanvas-padding-y * -.5;
+ margin-right: $offcanvas-padding-x * -.5;
+ margin-bottom: $offcanvas-padding-y * -.5;
}
}
@@ -52,6 +59,16 @@
transform: translateX(100%);
}
+.offcanvas-top {
+ top: 0;
+ right: 0;
+ left: 0;
+ height: $offcanvas-vertical-height;
+ max-height: 100%;
+ border-bottom: $offcanvas-border-width solid $offcanvas-border-color;
+ transform: translateY(-100%);
+}
+
.offcanvas-bottom {
right: 0;
left: 0;
@@ -64,14 +81,3 @@
.offcanvas.show {
transform: none;
}
-
-.offcanvas-backdrop::before {
- position: fixed;
- top: 0;
- left: 0;
- z-index: $zindex-offcanvas - 1;
- width: 100vw;
- height: 100vh;
- content: "";
- background-color: $offcanvas-body-backdrop-color;
-}
diff --git a/src/assets/styles/bootstrap/_placeholders.scss b/src/assets/styles/bootstrap/_placeholders.scss
new file mode 100644
index 000000000..2f647cc9b
--- /dev/null
+++ b/src/assets/styles/bootstrap/_placeholders.scss
@@ -0,0 +1,51 @@
+.placeholder {
+ display: inline-block;
+ min-height: 1em;
+ vertical-align: middle;
+ cursor: wait;
+ background-color: currentColor;
+ opacity: $placeholder-opacity-max;
+
+ &.btn::before {
+ display: inline-block;
+ content: "";
+ }
+}
+
+// Sizing
+.placeholder-xs {
+ min-height: .6em;
+}
+
+.placeholder-sm {
+ min-height: .8em;
+}
+
+.placeholder-lg {
+ min-height: 1.2em;
+}
+
+// Animation
+.placeholder-glow {
+ .placeholder {
+ animation: placeholder-glow 2s ease-in-out infinite;
+ }
+}
+
+@keyframes placeholder-glow {
+ 50% {
+ opacity: $placeholder-opacity-min;
+ }
+}
+
+.placeholder-wave {
+ mask-image: linear-gradient(130deg, $black 55%, rgba(0, 0, 0, (1 - $placeholder-opacity-min)) 75%, $black 95%);
+ mask-size: 200% 100%;
+ animation: placeholder-wave 2s linear infinite;
+}
+
+@keyframes placeholder-wave {
+ 100% {
+ mask-position: -200% 0%;
+ }
+}
diff --git a/src/assets/styles/bootstrap/_popover.scss b/src/assets/styles/bootstrap/_popover.scss
index a55555e2e..3b8208e16 100644
--- a/src/assets/styles/bootstrap/_popover.scss
+++ b/src/assets/styles/bootstrap/_popover.scss
@@ -40,13 +40,13 @@
&::before {
bottom: 0;
- border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
+ border-width: $popover-arrow-height ($popover-arrow-width * .5) 0;
border-top-color: $popover-arrow-outer-color;
}
&::after {
bottom: $popover-border-width;
- border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
+ border-width: $popover-arrow-height ($popover-arrow-width * .5) 0;
border-top-color: $popover-arrow-color;
}
}
@@ -60,13 +60,13 @@
&::before {
left: 0;
- border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
+ border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0;
border-right-color: $popover-arrow-outer-color;
}
&::after {
left: $popover-border-width;
- border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
+ border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0;
border-right-color: $popover-arrow-color;
}
}
@@ -78,13 +78,13 @@
&::before {
top: 0;
- border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
+ border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5);
border-bottom-color: $popover-arrow-outer-color;
}
&::after {
top: $popover-border-width;
- border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
+ border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5);
border-bottom-color: $popover-arrow-color;
}
}
@@ -96,7 +96,7 @@
left: 50%;
display: block;
width: $popover-arrow-width;
- margin-left: -$popover-arrow-width / 2;
+ margin-left: -$popover-arrow-width * .5;
content: "";
border-bottom: $popover-border-width solid $popover-header-bg;
}
@@ -110,13 +110,13 @@
&::before {
right: 0;
- border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
+ border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height;
border-left-color: $popover-arrow-outer-color;
}
&::after {
right: $popover-border-width;
- border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
+ border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height;
border-left-color: $popover-arrow-color;
}
}
@@ -144,7 +144,7 @@
@include font-size($font-size-base);
color: $popover-header-color;
background-color: $popover-header-bg;
- border-bottom: $popover-border-width solid shade-color($popover-header-bg, 10%);
+ border-bottom: $popover-border-width solid $popover-border-color;
@include border-top-radius($popover-inner-border-radius);
&:empty {
diff --git a/src/assets/styles/bootstrap/_reboot.scss b/src/assets/styles/bootstrap/_reboot.scss
index 352046988..4345886d4 100644
--- a/src/assets/styles/bootstrap/_reboot.scss
+++ b/src/assets/styles/bootstrap/_reboot.scss
@@ -1,6 +1,5 @@
// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
-
// Reboot
//
// Normalization of HTML elements, manually forked from Normalize.css to remove
@@ -8,7 +7,6 @@
//
// Normalize is licensed MIT. https://github.com/necolas/normalize.css
-
// Document
//
// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
@@ -16,26 +14,27 @@
*,
*::before,
*::after {
- box-sizing: border-box;
+ line-height: normal;
+ box-sizing: border-box;
}
-
// Root
//
// Ability to the value of the root font sizes, affecting the value of `rem`.
// null by default, thus nothing is generated.
:root {
- font-size: $font-size-root;
+ @if $font-size-root != null {
+ font-size: var(--#{$variable-prefix}-root-font-size);
+ }
- @if $enable-smooth-scroll {
- @media (prefers-reduced-motion: no-preference) {
- scroll-behavior: smooth;
+ @if $enable-smooth-scroll {
+ @media (prefers-reduced-motion: no-preference) {
+ scroll-behavior: smooth;
+ }
}
- }
}
-
// Body
//
// 1. Remove the margin in all browsers.
@@ -43,19 +42,20 @@
// 3. Prevent adjustments of font size after orientation changes in iOS.
// 4. Change the default tap highlight to be completely transparent in iOS.
+// scss-docs-start reboot-body-rules
body {
- margin: 0; // 1
- font-family: $font-family-base;
- @include font-size($font-size-base);
- font-weight: $font-weight-base;
- line-height: $line-height-base;
- color: $body-color;
- text-align: $body-text-align;
- background-color: $body-bg; // 2
- -webkit-text-size-adjust: 100%; // 3
- -webkit-tap-highlight-color: rgba($black, 0); // 4
-}
-
+ margin: 0; // 1
+ font-family: var(--#{$variable-prefix}body-font-family);
+ @include font-size(var(--#{$variable-prefix}body-font-size));
+ font-weight: var(--#{$variable-prefix}body-font-weight);
+ line-height: var(--#{$variable-prefix}body-line-height);
+ color: var(--#{$variable-prefix}body-color);
+ text-align: var(--#{$variable-prefix}body-text-align);
+ background-color: var(--#{$variable-prefix}body-bg); // 2
+ -webkit-text-size-adjust: 100%; // 3
+ -webkit-tap-highlight-color: rgba($black, 0); // 4
+}
+// scss-docs-end reboot-body-rules
// Content grouping
//
@@ -63,18 +63,17 @@ body {
// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field
hr {
- margin: $hr-margin-y 0;
- color: $hr-color; // 1
- background-color: currentColor;
- border: 0;
- opacity: $hr-opacity;
+ margin: $hr-margin-y 0;
+ color: $hr-color; // 1
+ background-color: rgba(black,.2);
+ border: 0;
+ opacity: $hr-opacity;
}
hr:not([size]) {
- height: $hr-height; // 2
+ height: $hr-height; // 2
}
-
// Typography
//
// 1. Remove top margins from headings
@@ -82,57 +81,55 @@ hr:not([size]) {
// margin for easier control within type scales as it avoids margin collapsing.
%heading {
- margin-top: 0; // 1
- margin-bottom: $headings-margin-bottom;
- font-family: $headings-font-family;
- font-style: $headings-font-style;
- font-weight: $headings-font-weight;
- line-height: $headings-line-height;
- color: $headings-color;
+ margin-top: 0; // 1
+ margin-bottom: $headings-margin-bottom;
+ font-family: $headings-font-family;
+ font-style: $headings-font-style;
+ font-weight: $headings-font-weight;
+ line-height: $headings-line-height;
+ color: $headings-color;
}
h1 {
- @extend %heading;
- @include font-size($h1-font-size);
+ @extend %heading;
+ @include font-size($h1-font-size);
}
h2 {
- @extend %heading;
- @include font-size($h2-font-size);
+ @extend %heading;
+ @include font-size($h2-font-size);
}
h3 {
- @extend %heading;
- @include font-size($h3-font-size);
+ @extend %heading;
+ @include font-size($h3-font-size);
}
h4 {
- @extend %heading;
- @include font-size($h4-font-size);
+ @extend %heading;
+ @include font-size($h4-font-size);
}
h5 {
- @extend %heading;
- @include font-size($h5-font-size);
+ @extend %heading;
+ @include font-size($h5-font-size);
}
h6 {
- @extend %heading;
- @include font-size($h6-font-size);
+ @extend %heading;
+ @include font-size($h6-font-size);
}
-
// Reset margins on paragraphs
//
// Similarly, the top margin on ``s get reset. However, we also reset the
// bottom margin to use `rem` units instead of `em`.
p {
- margin-top: 0;
- margin-bottom: $paragraph-margin-bottom;
+ margin-top: 0;
+ margin-bottom: $paragraph-margin-bottom;
}
-
// Abbreviations
//
// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin
@@ -141,89 +138,83 @@ p {
// 4. Prevent the text-decoration to be skipped.
abbr[title],
-abbr[data-bs-original-title] { // 1
- text-decoration: underline dotted; // 2
- cursor: help; // 3
- text-decoration-skip-ink: none; // 4
+abbr[data-bs-original-title] {
+ // 1
+ text-decoration: underline dotted; // 2
+ cursor: help; // 3
+ text-decoration-skip-ink: none; // 4
}
-
// Address
address {
- margin-bottom: 1rem;
- font-style: normal;
- line-height: inherit;
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
}
-
// Lists
ol,
ul {
- padding-left: 2rem;
+ padding-left: 2rem;
}
ol,
ul,
dl {
- margin-top: 0;
- margin-bottom: 1rem;
+ margin-top: 0;
+ margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
- margin-bottom: 0;
+ margin-bottom: 0;
}
dt {
- font-weight: $dt-font-weight;
+ font-weight: $dt-font-weight;
}
// 1. Undo browser default
dd {
- margin-bottom: .5rem;
- margin-left: 0; // 1
+ margin-bottom: 0.5rem;
+ margin-left: 0; // 1
}
-
// Blockquote
blockquote {
- margin: 0 0 1rem;
+ margin: 0 0 1rem;
}
-
// Strong
//
// Add the correct font weight in Chrome, Edge, and Safari
b,
strong {
- font-weight: $font-weight-bolder;
+ font-weight: $font-weight-bolder;
}
-
// Small
//
// Add the correct font size in all browsers
small {
- @include font-size($small-font-size);
+ @include font-size($small-font-size);
}
-
// Mark
mark {
- padding: $mark-padding;
- background-color: $mark-bg;
+ padding: $mark-padding;
+ background-color: $mark-bg;
}
-
// Sub and Sup
//
// Prevent `sub` and `sup` elements from affecting the line height in
@@ -231,26 +222,29 @@ mark {
sub,
sup {
- position: relative;
- @include font-size($sub-sup-font-size);
- line-height: 0;
- vertical-align: baseline;
+ position: relative;
+ @include font-size($sub-sup-font-size);
+ line-height: 0;
+ vertical-align: baseline;
}
-sub { bottom: -.25em; }
-sup { top: -.5em; }
-
+sub {
+ bottom: -0.25em;
+}
+sup {
+ top: -0.5em;
+}
// Links
a {
- color: $link-color;
- text-decoration: $link-decoration;
+ color: $link-color;
+ text-decoration: $link-decoration;
- &:hover {
- color: $link-hover-color;
- text-decoration: $link-hover-decoration;
- }
+ &:hover {
+ color: $link-hover-color;
+ text-decoration: $link-hover-decoration;
+ }
}
// And undo these styles for placeholder links/named anchors (without href).
@@ -259,24 +253,25 @@ a {
// See https://github.com/twbs/bootstrap/issues/19402
a:not([href]):not([class]) {
- &,
- &:hover {
- color: inherit;
- text-decoration: none;
- }
+ &,
+ &:hover {
+ color: inherit;
+ text-decoration: none;
+ }
}
-
// Code
pre,
code,
kbd,
samp {
- font-family: $font-family-code;
- @include font-size(1em); // Correct the odd `em` font sizing in all browsers.
- direction: ltr #{"/* rtl:ignore */"};
- unicode-bidi: bidi-override;
+ font-family: $font-family-code;
+ @include font-size(
+ 1em
+ ); // Correct the odd `em` font sizing in all browsers.
+ direction: ltr #{"/* rtl:ignore */"};
+ unicode-bidi: bidi-override;
}
// 1. Remove browser default top margin
@@ -284,78 +279,75 @@ samp {
// 3. Don't allow content to break outside
pre {
- display: block;
- margin-top: 0; // 1
- margin-bottom: 1rem; // 2
- overflow: auto; // 3
- @include font-size($code-font-size);
- color: $pre-color;
-
- // Account for some code outputs that place code tags in pre tags
- code {
- @include font-size(inherit);
- color: inherit;
- word-break: normal;
- }
+ display: block;
+ margin-top: 0; // 1
+ margin-bottom: 1rem; // 2
+ overflow: auto; // 3
+ @include font-size($code-font-size);
+ color: $pre-color;
+
+ // Account for some code outputs that place code tags in pre tags
+ code {
+ @include font-size(inherit);
+ color: inherit;
+ word-break: normal;
+ }
}
code {
- @include font-size($code-font-size);
- color: $code-color;
- word-wrap: break-word;
+ @include font-size($code-font-size);
+ color: $code-color;
+ word-wrap: break-word;
- // Streamline the style when inside anchors to avoid broken underline and more
- a > & {
- color: inherit;
- }
+ // Streamline the style when inside anchors to avoid broken underline and more
+ a > & {
+ color: inherit;
+ }
}
kbd {
- padding: $kbd-padding-y $kbd-padding-x;
- @include font-size($kbd-font-size);
- color: $kbd-color;
- background-color: $kbd-bg;
- @include border-radius($border-radius-sm);
-
- kbd {
- padding: 0;
- @include font-size(1em);
- font-weight: $nested-kbd-font-weight;
- }
+ padding: $kbd-padding-y $kbd-padding-x;
+ @include font-size($kbd-font-size);
+ color: $kbd-color;
+ background-color: $kbd-bg;
+ @include border-radius($border-radius-sm);
+
+ kbd {
+ padding: 0;
+ @include font-size(1em);
+ font-weight: $nested-kbd-font-weight;
+ }
}
-
// Figures
//
// Apply a consistent margin strategy (matches our type styles).
figure {
- margin: 0 0 1rem;
+ margin: 0 0 1rem;
}
-
// Images and content
img,
svg {
- vertical-align: middle;
+ vertical-align: middle;
}
-
// Tables
//
// Prevent double borders
table {
- caption-side: bottom;
- border-collapse: collapse;
+ caption-side: bottom;
+ border-collapse: collapse;
}
caption {
- padding-top: $table-cell-padding-y;
- padding-bottom: $table-cell-padding-y;
- color: $table-caption-color;
- text-align: left;
+ padding-top: $table-cell-padding-y;
+ padding-bottom: $table-cell-padding-y;
+ color: $table-caption-color;
+ text-align: left;
}
// 1. Removes font-weight bold by inheriting
@@ -363,9 +355,9 @@ caption {
// 3. Fix alignment for Safari
th {
- font-weight: $table-th-font-weight; // 1
- text-align: inherit; // 2
- text-align: -webkit-match-parent; // 3
+ font-weight: $table-th-font-weight; // 1
+ text-align: inherit; // 2
+ text-align: -webkit-match-parent; // 3
}
thead,
@@ -374,26 +366,25 @@ tfoot,
tr,
td,
th {
- border-color: inherit;
- border-style: solid;
- border-width: 0;
+ border-color: inherit;
+ border-style: solid;
+ border-width: 0;
}
-
// Forms
//
// 1. Allow labels to use `margin` for spacing.
label {
- display: inline-block; // 1
+ display: inline-block; // 1
}
// Remove the default `border-radius` that macOS Chrome adds.
// See https://github.com/twbs/bootstrap/issues/24093
button {
- // stylelint-disable-next-line property-disallowed-list
- border-radius: 0;
+ // stylelint-disable-next-line property-disallowed-list
+ border-radius: 0;
}
// Explicitly remove focus outline in Chromium when it shouldn't be
@@ -402,7 +393,7 @@ button {
// confused and applies its very visible two-tone outline anyway.
button:focus:not(:focus-visible) {
- outline: 0;
+ outline: 0;
}
// 1. Remove the margin in Firefox and Safari
@@ -412,40 +403,40 @@ button,
select,
optgroup,
textarea {
- margin: 0; // 1
- font-family: inherit;
- @include font-size(inherit);
- line-height: inherit;
+ margin: 0; // 1
+ font-family: inherit;
+ @include font-size(inherit);
+ line-height: inherit;
}
// Remove the inheritance of text transform in Firefox
button,
select {
- text-transform: none;
+ text-transform: none;
}
// Set the cursor for non-`` buttons
//
// Details at https://github.com/twbs/bootstrap/pull/30562
[role="button"] {
- cursor: pointer;
+ cursor: pointer;
}
select {
- // Remove the inheritance of word-wrap in Safari.
- // See https://github.com/twbs/bootstrap/issues/24990
- word-wrap: normal;
+ // Remove the inheritance of word-wrap in Safari.
+ // See https://github.com/twbs/bootstrap/issues/24990
+ word-wrap: normal;
- // Undo the opacity change from Chrome
- &:disabled {
- opacity: 1;
- }
+ // Undo the opacity change from Chrome
+ &:disabled {
+ opacity: 1;
+ }
}
// Remove the dropdown arrow in Chrome from inputs built with datalists.
// See https://stackoverflow.com/a/54997118
[list]::-webkit-calendar-picker-indicator {
- display: none;
+ display: none;
}
// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
@@ -457,26 +448,26 @@ button,
[type="button"], // 1
[type="reset"],
[type="submit"] {
- -webkit-appearance: button; // 2
+ -webkit-appearance: button; // 2
- @if $enable-button-pointers {
- &:not(:disabled) {
- cursor: pointer; // 3
+ @if $enable-button-pointers {
+ &:not(:disabled) {
+ cursor: pointer; // 3
+ }
}
- }
}
// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.
::-moz-focus-inner {
- padding: 0;
- border-style: none;
+ padding: 0;
+ border-style: none;
}
// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.
textarea {
- resize: vertical; // 1
+ resize: vertical; // 1
}
// 1. Browsers set a default `min-width: min-content;` on fieldsets,
@@ -487,10 +478,10 @@ textarea {
// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.
fieldset {
- min-width: 0; // 1
- padding: 0; // 2
- margin: 0; // 2
- border: 0; // 2
+ min-width: 0; // 1
+ padding: 0; // 2
+ margin: 0; // 2
+ border: 0; // 2
}
// 1. By using `float: left`, the legend will behave like a block element.
@@ -499,17 +490,17 @@ fieldset {
// See https://github.com/twbs/bootstrap/issues/29712
legend {
- float: left; // 1
- width: 100%;
- padding: 0;
- margin-bottom: $legend-margin-bottom;
- @include font-size($legend-font-size);
- font-weight: $legend-font-weight;
- line-height: inherit;
+ float: left; // 1
+ width: 100%;
+ padding: 0;
+ margin-bottom: $legend-margin-bottom;
+ @include font-size($legend-font-size);
+ font-weight: $legend-font-weight;
+ line-height: inherit;
- + * {
- clear: left; // 2
- }
+ + * {
+ clear: left; // 2
+ }
}
// Fix height of inputs with a type of datetime-local, date, month, week, or time
@@ -522,11 +513,11 @@ legend {
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
- padding: 0;
+ padding: 0;
}
::-webkit-inner-spin-button {
- height: auto;
+ height: auto;
}
// 1. Correct the outline style in Safari.
@@ -536,8 +527,8 @@ legend {
// https://github.com/twbs/bootstrap/issues/11586.
[type="search"] {
- outline-offset: -2px; // 1
- -webkit-appearance: textfield; // 2
+ outline-offset: -2px; // 1
+ -webkit-appearance: textfield; // 2
}
// 1. A few input types should stay LTR
@@ -557,40 +548,39 @@ legend {
// Remove the inner padding in Chrome and Safari on macOS.
::-webkit-search-decoration {
- -webkit-appearance: none;
+ -webkit-appearance: none;
}
// Remove padding around color pickers in webkit browsers
::-webkit-color-swatch-wrapper {
- padding: 0;
+ padding: 0;
}
-
// Inherit font family and line height for file input buttons
::file-selector-button {
- font: inherit;
+ font: inherit;
}
// 1. Change font properties to `inherit`
// 2. Correct the inability to style clickable types in iOS and Safari.
::-webkit-file-upload-button {
- font: inherit; // 1
- -webkit-appearance: button; // 2
+ font: inherit; // 1
+ -webkit-appearance: button; // 2
}
// Correct element displays
output {
- display: inline-block;
+ display: inline-block;
}
// Remove border from iframe
iframe {
- border: 0;
+ border: 0;
}
// Summary
@@ -598,24 +588,22 @@ iframe {
// 1. Add the correct display in all browsers
summary {
- display: list-item; // 1
- cursor: pointer;
+ display: list-item; // 1
+ cursor: pointer;
}
-
// Progress
//
// Add the correct vertical alignment in Chrome, Firefox, and Opera.
progress {
- vertical-align: baseline;
+ vertical-align: baseline;
}
-
// Hidden attribute
//
// Always hide an element with the `hidden` HTML attribute.
[hidden] {
- display: none !important;
+ display: none !important;
}
diff --git a/src/assets/styles/bootstrap/_root.scss b/src/assets/styles/bootstrap/_root.scss
index 768d6343f..189b2b3bb 100644
--- a/src/assets/styles/bootstrap/_root.scss
+++ b/src/assets/styles/bootstrap/_root.scss
@@ -1,16 +1,53 @@
:root {
- // Custom variable values only support SassScript inside `#{}`.
+ // Note: Custom variable values only support SassScript inside `#{}`.
+
+ // Colors
+ //
+ // Generate palettes for full colors, grays, and theme colors.
+
@each $color, $value in $colors {
--#{$variable-prefix}#{$color}: #{$value};
}
+ @each $color, $value in $grays {
+ --#{$variable-prefix}gray-#{$color}: #{$value};
+ }
+
@each $color, $value in $theme-colors {
--#{$variable-prefix}#{$color}: #{$value};
}
- // Use `inspect` for lists so that quoted items keep the quotes.
+ @each $color, $value in $theme-colors-rgb {
+ --#{$variable-prefix}#{$color}-rgb: #{$value};
+ }
+
+ --#{$variable-prefix}white-rgb: #{to-rgb($white)};
+ --#{$variable-prefix}black-rgb: #{to-rgb($black)};
+ --#{$variable-prefix}body-rgb: #{to-rgb($body-color)};
+
+ // Fonts
+
+ // Note: Use `inspect` for lists so that quoted items keep the quotes.
// See https://github.com/sass/sass/issues/2383#issuecomment-336349172
--#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};
--#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};
--#{$variable-prefix}gradient: #{$gradient};
+
+ // Root and body
+ // stylelint-disable custom-property-empty-line-before
+ // scss-docs-start root-body-variables
+ @if $font-size-root != null {
+ --#{$variable-prefix}root-font-size: #{$font-size-root};
+ }
+ --#{$variable-prefix}body-font-family: #{$font-family-base};
+ --#{$variable-prefix}body-font-size: #{$font-size-base};
+ --#{$variable-prefix}body-font-weight: #{$font-weight-base};
+ --#{$variable-prefix}body-line-height: #{$line-height-base};
+ --#{$variable-prefix}body-color: #{$body-color};
+ @if $body-text-align != null {
+ --#{$variable-prefix}body-text-align: #{$body-text-align};
+ }
+ --#{$variable-prefix}body-bg: #{$body-bg};
+ // scss-docs-end root-body-variables
+ // stylelint-enable custom-property-empty-line-before
}
diff --git a/src/assets/styles/bootstrap/_spinners.scss b/src/assets/styles/bootstrap/_spinners.scss
index 8e19bae51..a4a2c77cf 100644
--- a/src/assets/styles/bootstrap/_spinners.scss
+++ b/src/assets/styles/bootstrap/_spinners.scss
@@ -12,7 +12,7 @@
display: inline-block;
width: $spinner-width;
height: $spinner-height;
- vertical-align: text-bottom;
+ vertical-align: $spinner-vertical-align;
border: $spinner-border-width solid currentColor;
border-right-color: transparent;
// stylelint-disable-next-line property-disallowed-list
@@ -46,7 +46,7 @@
display: inline-block;
width: $spinner-width;
height: $spinner-height;
- vertical-align: text-bottom;
+ vertical-align: $spinner-vertical-align;
background-color: currentColor;
// stylelint-disable-next-line property-disallowed-list
border-radius: 50%;
diff --git a/src/assets/styles/bootstrap/_tables.scss b/src/assets/styles/bootstrap/_tables.scss
index 50368293a..92556ba05 100644
--- a/src/assets/styles/bootstrap/_tables.scss
+++ b/src/assets/styles/bootstrap/_tables.scss
@@ -4,6 +4,7 @@
.table {
--#{$variable-prefix}table-bg: #{$table-bg};
+ --#{$variable-prefix}table-accent-bg: #{$table-accent-bg};
--#{$variable-prefix}table-striped-color: #{$table-striped-color};
--#{$variable-prefix}table-striped-bg: #{$table-striped-bg};
--#{$variable-prefix}table-active-color: #{$table-active-color};
diff --git a/src/assets/styles/bootstrap/_toasts.scss b/src/assets/styles/bootstrap/_toasts.scss
index 5c533d7f5..0a2d6ec87 100644
--- a/src/assets/styles/bootstrap/_toasts.scss
+++ b/src/assets/styles/bootstrap/_toasts.scss
@@ -10,11 +10,11 @@
box-shadow: $toast-box-shadow;
@include border-radius($toast-border-radius);
- &:not(.showing):not(.show) {
+ &.showing {
opacity: 0;
}
- &.hide {
+ &:not(.show) {
display: none;
}
}
@@ -40,7 +40,7 @@
@include border-top-radius(subtract($toast-border-radius, $toast-border-width));
.btn-close {
- margin-right: $toast-padding-x / -2;
+ margin-right: $toast-padding-x * -.5;
margin-left: $toast-padding-x;
}
}
diff --git a/src/assets/styles/bootstrap/_tooltip.scss b/src/assets/styles/bootstrap/_tooltip.scss
index 2993bf7de..75ff07838 100644
--- a/src/assets/styles/bootstrap/_tooltip.scss
+++ b/src/assets/styles/bootstrap/_tooltip.scss
@@ -37,7 +37,7 @@
&::before {
top: -1px;
- border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
+ border-width: $tooltip-arrow-height ($tooltip-arrow-width * .5) 0;
border-top-color: $tooltip-arrow-color;
}
}
@@ -53,7 +53,7 @@
&::before {
right: -1px;
- border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
+ border-width: ($tooltip-arrow-width * .5) $tooltip-arrow-height ($tooltip-arrow-width * .5) 0;
border-right-color: $tooltip-arrow-color;
}
}
@@ -67,7 +67,7 @@
&::before {
bottom: -1px;
- border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
+ border-width: 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height;
border-bottom-color: $tooltip-arrow-color;
}
}
@@ -83,7 +83,7 @@
&::before {
left: -1px;
- border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
+ border-width: ($tooltip-arrow-width * .5) 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height;
border-left-color: $tooltip-arrow-color;
}
}
diff --git a/src/assets/styles/bootstrap/_transitions.scss b/src/assets/styles/bootstrap/_transitions.scss
index 2905df45c..bfb26aa8a 100644
--- a/src/assets/styles/bootstrap/_transitions.scss
+++ b/src/assets/styles/bootstrap/_transitions.scss
@@ -17,5 +17,11 @@
height: 0;
overflow: hidden;
@include transition($transition-collapse);
+
+ &.collapse-horizontal {
+ width: 0;
+ height: auto;
+ @include transition($transition-collapse-width);
+ }
}
// scss-docs-end collapse-classes
diff --git a/src/assets/styles/bootstrap/_utilities.scss b/src/assets/styles/bootstrap/_utilities.scss
index 3c927cf59..7c6c72319 100644
--- a/src/assets/styles/bootstrap/_utilities.scss
+++ b/src/assets/styles/bootstrap/_utilities.scss
@@ -24,11 +24,32 @@ $utilities: map-merge(
)
),
// scss-docs-end utils-float
+ // Opacity utilities
+ // scss-docs-start utils-opacity
+ "opacity": (
+ property: opacity,
+ values: (
+ 0: 0,
+ 25: .25,
+ 50: .5,
+ 75: .75,
+ 100: 1,
+ )
+ ),
+ // scss-docs-end utils-opacity
// scss-docs-start utils-overflow
"overflow": (
property: overflow,
values: auto hidden visible scroll,
),
+ "overflow-x": (
+ property: overflow-x,
+ values: auto hidden visible scroll,
+ ),
+ "overflow-y": (
+ property: overflow-y,
+ values: auto hidden visible scroll,
+ ),
// scss-docs-end utils-overflow
// scss-docs-start utils-display
"display": (
@@ -501,32 +522,55 @@ $utilities: map-merge(
"color": (
property: color,
class: text,
+ local-vars: (
+ "text-opacity": 1
+ ),
values: map-merge(
- $theme-colors,
+ $utilities-text-colors,
(
- "white": $white,
- "body": $body-color,
"muted": $text-muted,
- "black-50": rgba($black, .5),
- "white-50": rgba($white, .5),
+ "black-50": rgba($black, .5), // deprecated
+ "white-50": rgba($white, .5), // deprecated
"reset": inherit,
)
)
),
+ "text-opacity": (
+ css-var: true,
+ class: text-opacity,
+ values: (
+ 25: .25,
+ 50: .5,
+ 75: .75,
+ 100: 1
+ )
+ ),
// scss-docs-end utils-color
// scss-docs-start utils-bg-color
"background-color": (
property: background-color,
class: bg,
+ local-vars: (
+ "bg-opacity": 1
+ ),
values: map-merge(
- $theme-colors,
+ $utilities-bg-colors,
(
- "body": $body-bg,
- "white": $white,
"transparent": transparent
)
)
),
+ "bg-opacity": (
+ css-var: true,
+ class: bg-opacity,
+ values: (
+ 10: .1,
+ 25: .25,
+ 50: .5,
+ 75: .75,
+ 100: 1
+ )
+ ),
// scss-docs-end utils-bg-color
"gradient": (
property: background-image,
diff --git a/src/assets/styles/bootstrap/_variables.scss b/src/assets/styles/bootstrap/_variables.scss
index 9649b47cb..eb668b31f 100644
--- a/src/assets/styles/bootstrap/_variables.scss
+++ b/src/assets/styles/bootstrap/_variables.scss
@@ -40,13 +40,13 @@ $blue: #0d6efd !default;
$indigo: #6610f2 !default;
$purple: #6f42c1 !default;
$pink: #d63384 !default;
-$red: #dc3545 !default;
+$red: #a81a12 !default;
$orange: #fd7e14 !default;
$yellow: #ffc107 !default;
-$green: #198754 !default;
+$green: #00800b !default;
$teal: #20c997 !default;
$cyan: #0dcaf0 !default;
-$muted: #B6BEC5 !default;
+$muted: #B6BEC5 !default;
// scss-docs-end color-variables
// scss-docs-start colors-map
@@ -72,16 +72,44 @@ $colors: (
// scss-docs-start theme-color-variables
$primary: #1E7295 !default;
$secondary: #185D79 !default;
-$success: #008026 !default;
+$tertiary: #2DABC2 !default;
+$quaternary: #2B91A7 !default;
+$mirage: #131e25 !default;
+$aztec: #0d171d !default;
+$cello-light: #21516e !default;
+$cello-dark: #1e465e !default;
+$pale-sky: #677181 !default;
+$oslo-gray: #8F9297 !default;
+$gainsboro: #d9d9d9 !default;
+$ghost: #c8cad0 !default;
+$gray-chateau: #a3a7b1 !default;
+$gable-green: #1C323F !default;
+$william: #3d5f6e !default;
+$bluewood: #304059 !default;
+$success: $green !default;
$info: $cyan !default;
$warning: $yellow !default;
-$danger: #982F31 !default;
+$danger: $red !default;
+
$light: #DFDFDF !default;
-$dark: $gray-900 !default;
+$dark: rgba(28,28,32,.9803921568627451) !default;
+$light-dark: $gray-800 !default;
// scss-docs-end theme-color-variables
-.bg-primary-split {
- background: repeating-linear-gradient(#1E7295, #1E7295 49.9%, #185D79 50.1%, #185D79 100%);
+$bg-tertiary-split-background: repeating-linear-gradient($tertiary, $tertiary 50%, $quaternary 50%, $quaternary 100%) !default;
+$bg-mirage-split-background: repeating-linear-gradient($mirage, $mirage 50%, $aztec 50%, $aztec 100%) !default;
+$bg-cello-split-background: repeating-linear-gradient($cello-light, $cello-light 50%, $cello-dark 50%, $cello-dark 100%) !default;
+
+.bg-tertiary-split {
+ background: $bg-tertiary-split-background;
+}
+
+.bg-mirage-split {
+ background: $bg-mirage-split-background;
+}
+
+.bg-cello-split {
+ background: $bg-cello-split-background;
}
// scss-docs-start theme-colors-map
@@ -94,12 +122,19 @@ $theme-colors: (
"danger": $danger,
"light": $light,
"dark": $dark,
+ "light-dark": $light-dark,
"white": $white,
"black": $black,
- "muted": $muted
+ "muted": $muted,
+ "purple": $purple,
+ "gainsboro": $gainsboro
) !default;
// scss-docs-end theme-colors-map
+// scss-docs-start theme-colors-rgb
+$theme-colors-rgb: map-loop($theme-colors, to-rgb, "$value") !default;
+// scss-docs-end theme-colors-rgb
+
// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.
// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast
$min-contrast-ratio: 4.5 !default;
@@ -208,6 +243,126 @@ $cyan-600: shade-color($cyan, 20%) !default;
$cyan-700: shade-color($cyan, 40%) !default;
$cyan-800: shade-color($cyan, 60%) !default;
$cyan-900: shade-color($cyan, 80%) !default;
+
+$blues: (
+ "blue-100": $blue-100,
+ "blue-200": $blue-200,
+ "blue-300": $blue-300,
+ "blue-400": $blue-400,
+ "blue-500": $blue-500,
+ "blue-600": $blue-600,
+ "blue-700": $blue-700,
+ "blue-800": $blue-800,
+ "blue-900": $blue-900
+) !default;
+
+$indigos: (
+ "indigo-100": $indigo-100,
+ "indigo-200": $indigo-200,
+ "indigo-300": $indigo-300,
+ "indigo-400": $indigo-400,
+ "indigo-500": $indigo-500,
+ "indigo-600": $indigo-600,
+ "indigo-700": $indigo-700,
+ "indigo-800": $indigo-800,
+ "indigo-900": $indigo-900
+) !default;
+
+$purples: (
+ "purple-100": $purple-200,
+ "purple-200": $purple-100,
+ "purple-300": $purple-300,
+ "purple-400": $purple-400,
+ "purple-500": $purple-500,
+ "purple-600": $purple-600,
+ "purple-700": $purple-700,
+ "purple-800": $purple-800,
+ "purple-900": $purple-900
+) !default;
+
+$pinks: (
+ "pink-100": $pink-100,
+ "pink-200": $pink-200,
+ "pink-300": $pink-300,
+ "pink-400": $pink-400,
+ "pink-500": $pink-500,
+ "pink-600": $pink-600,
+ "pink-700": $pink-700,
+ "pink-800": $pink-800,
+ "pink-900": $pink-900
+) !default;
+
+$reds: (
+ "red-100": $red-100,
+ "red-200": $red-200,
+ "red-300": $red-300,
+ "red-400": $red-400,
+ "red-500": $red-500,
+ "red-600": $red-600,
+ "red-700": $red-700,
+ "red-800": $red-800,
+ "red-900": $red-900
+) !default;
+
+$oranges: (
+ "orange-100": $orange-100,
+ "orange-200": $orange-200,
+ "orange-300": $orange-300,
+ "orange-400": $orange-400,
+ "orange-500": $orange-500,
+ "orange-600": $orange-600,
+ "orange-700": $orange-700,
+ "orange-800": $orange-800,
+ "orange-900": $orange-900
+) !default;
+
+$yellows: (
+ "yellow-100": $yellow-100,
+ "yellow-200": $yellow-200,
+ "yellow-300": $yellow-300,
+ "yellow-400": $yellow-400,
+ "yellow-500": $yellow-500,
+ "yellow-600": $yellow-600,
+ "yellow-700": $yellow-700,
+ "yellow-800": $yellow-800,
+ "yellow-900": $yellow-900
+) !default;
+
+$greens: (
+ "green-100": $green-100,
+ "green-200": $green-200,
+ "green-300": $green-300,
+ "green-400": $green-400,
+ "green-500": $green-500,
+ "green-600": $green-600,
+ "green-700": $green-700,
+ "green-800": $green-800,
+ "green-900": $green-900
+) !default;
+
+$teals: (
+ "teal-100": $teal-100,
+ "teal-200": $teal-200,
+ "teal-300": $teal-300,
+ "teal-400": $teal-400,
+ "teal-500": $teal-500,
+ "teal-600": $teal-600,
+ "teal-700": $teal-700,
+ "teal-800": $teal-800,
+ "teal-900": $teal-900
+) !default;
+
+$cyans: (
+ "cyan-100": $cyan-100,
+ "cyan-200": $cyan-200,
+ "cyan-300": $cyan-300,
+ "cyan-400": $cyan-400,
+ "cyan-500": $cyan-500,
+ "cyan-600": $cyan-600,
+ "cyan-700": $cyan-700,
+ "cyan-800": $cyan-800,
+ "cyan-900": $cyan-900
+) !default;
// fusv-enable
// Characters which are escaped by the escape-svg function
@@ -231,6 +386,7 @@ $enable-transitions: true !default;
$enable-reduced-motion: true !default;
$enable-smooth-scroll: true !default;
$enable-grid-classes: true !default;
+$enable-cssgrid: true !default;
$enable-button-pointers: true !default;
$enable-rfs: true !default;
$enable-validation-icons: true !default;
@@ -260,8 +416,8 @@ $gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;
$spacer: 1rem !default;
$spacers: (
0: 0,
- 1: $spacer / 4,
- 2: $spacer / 2,
+ 1: $spacer * .25,
+ 2: $spacer * .5,
3: $spacer,
4: $spacer * 1.5,
5: $spacer * 3,
@@ -277,6 +433,11 @@ $negative-spacers: if($enable-negative-margins, negativify-map($spacers), null)
// scss-docs-start position-map
$position-values: (
0: 0,
+ 1: $spacer * 0.25,
+ 2: $spacer * 0.5,
+ 3: $spacer,
+ 4: $spacer * 1.5,
+ 5: $spacer * 3,
50: 50%,
100: 100%
) !default;
@@ -290,12 +451,34 @@ $body-bg: $black !default;
$body-color: $white !default;
$body-text-align: null !default;
+// Utilities maps
+//
+// Extends the default `$theme-colors` maps to help create our utilities.
+
+// scss-docs-start utilities-colors
+$utilities-colors: map-merge(
+ $theme-colors-rgb,
+ (
+ "black": to-rgb($black),
+ "white": to-rgb($white),
+ "body": to-rgb($body-color)
+ )
+) !default;
+// scss-docs-end utilities-colors
+
+// scss-docs-start utilities-text-colors
+$utilities-text-colors: map-loop($utilities-colors, rgba-css-var, "$key", "text") !default;
+// scss-docs-end utilities-text-colors
+
+// scss-docs-start utilities-bg-colors
+$utilities-bg-colors: map-loop($utilities-colors, rgba-css-var, "$key", "bg") !default;
+// scss-docs-end utilities-bg-colors
// Links
//
// Style anchor elements.
-$link-color: $primary !default;
+$link-color: $body-color !default;
$link-decoration: underline !default;
$link-shade-percentage: 20% !default;
$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;
@@ -354,13 +537,13 @@ $container-max-widths: (
$grid-columns: 12 !default;
$grid-gutter-width: 16px !default;
-$grid-row-columns: 6 !default;
+$grid-row-columns: 18 !default; //6
$gutters: $spacers !default;
// Container padding
-$container-padding-x: $grid-gutter-width / 2 !default;
+$container-padding-x: $grid-gutter-width * .5 !default;
// Components
@@ -407,6 +590,7 @@ $transition-base: all .2s ease-in-out !default;
$transition-fade: opacity .15s linear !default;
// scss-docs-start collapse-transition
$transition-collapse: height .35s ease !default;
+$transition-collapse-width: width .35s ease !default;
// scss-docs-end collapse-transition
// stylelint-disable function-disallowed-list
@@ -426,14 +610,14 @@ $aspect-ratios: (
// scss-docs-start font-variables
// stylelint-disable value-keyword-case
-$font-family-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
+$font-family-sans-serif: Ubuntu !default;
$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
// stylelint-enable value-keyword-case
$font-family-base: var(--#{$variable-prefix}font-sans-serif) !default;
$font-family-code: var(--#{$variable-prefix}font-monospace) !default;
-// $font-size-root effects the value of `rem`, which is used for as well font sizes, paddings and margins
-// $font-size-base effects the font size of the body text
+// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins
+// $font-size-base affects the font size of the body text
$font-size-root: null !default;
$font-size-base: .9rem !default; // Assumes the browser default, typically `16px`
$font-size-sm: $font-size-base * .875 !default;
@@ -476,11 +660,11 @@ $font-sizes: (
// scss-docs-end font-sizes
// scss-docs-start headings-variables
-$headings-margin-bottom: $spacer / 2 !default;
+$headings-margin-bottom: $spacer * .5 !default;
$headings-font-family: null !default;
$headings-font-style: null !default;
$headings-font-weight: 500 !default;
-$headings-line-height: 1.2 !default;
+$headings-line-height: unset !default;
$headings-color: null !default;
// scss-docs-end headings-variables
@@ -516,9 +700,9 @@ $blockquote-footer-color: $gray-600 !default;
$blockquote-footer-font-size: $small-font-size !default;
$hr-margin-y: $spacer !default;
-$hr-color: inherit !default;
+$hr-color: rgba($white, 0.1) !default;
$hr-height: $border-width !default;
-$hr-opacity: .25 !default;
+$hr-opacity: .5 !default;
$legend-margin-bottom: .5rem !default;
$legend-font-size: 1.5rem !default;
@@ -548,8 +732,9 @@ $table-cell-padding-x-sm: .25rem !default;
$table-cell-vertical-align: top !default;
-$table-color: $body-color !default;
+$table-color: $black !default;
$table-bg: transparent !default;
+$table-accent-bg: transparent !default;
$table-th-font-weight: null !default;
@@ -642,9 +827,10 @@ $btn-padding-x-lg: $input-btn-padding-x-lg !default;
$btn-font-size-lg: $input-btn-font-size-lg !default;
$btn-border-width: $input-btn-border-width !default;
+$btn-border-colour: rgba($black,.1) !default;
$btn-font-weight: $font-weight-normal !default;
-$btn-box-shadow: inset 0 2px 0 rgba($white, .15), 0 1px 1px rgba($black, .1) !default;
+$btn-box-shadow: inset 0 2px 0 rgba($white, .15), inset 0 -2px rgba($black,.1), 0 1px rgba($black, .1) !default;
$btn-focus-width: $input-btn-focus-width !default;
$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;
$btn-disabled-opacity: .65 !default;
@@ -732,13 +918,15 @@ $input-height-border: $input-border-width * 2 !default;
$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;
$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;
-$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y / 2) !default;
+$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;
$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;
$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;
$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;
$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
+
+$form-color-width: 3rem !default;
// scss-docs-end form-input-variables
// scss-docs-start form-check-variables
@@ -753,7 +941,7 @@ $form-check-transition: null !default;
$form-check-input-active-filter: brightness(90%) !default;
$form-check-input-bg: $input-bg !default;
-$form-check-input-border: 1px solid rgba(0, 0, 0, .25) !default;
+$form-check-input-border: 1px solid rgba($black, .25) !default;
$form-check-input-border-radius: .25em !default;
$form-check-radio-border-radius: 50% !default;
$form-check-input-focus-border: $input-focus-border-color !default;
@@ -840,6 +1028,8 @@ $form-select-font-size-sm: $input-font-size-sm !default;
$form-select-padding-y-lg: $input-padding-y-lg !default;
$form-select-padding-x-lg: $input-padding-x-lg !default;
$form-select-font-size-lg: $input-font-size-lg !default;
+
+$form-select-transition: $input-transition !default;
// scss-docs-end form-select-variables
// scss-docs-start form-range-variables
@@ -871,6 +1061,7 @@ $form-file-button-hover-bg: shade-color($form-file-button-bg, 5%) !default
// scss-docs-start form-floating-variables
$form-floating-height: add(3.5rem, $input-height-border) !default;
+$form-floating-line-height: 1.25 !default;
$form-floating-padding-x: $input-padding-x !default;
$form-floating-padding-y: 1rem !default;
$form-floating-input-padding-t: 1.625rem !default;
@@ -917,9 +1108,10 @@ $form-validation-states: (
$zindex-dropdown: 1000 !default;
$zindex-sticky: 1020 !default;
$zindex-fixed: 1030 !default;
-$zindex-offcanvas: 1040 !default;
+$zindex-offcanvas-backdrop: 1040 !default;
+$zindex-offcanvas: 1045 !default;
$zindex-modal-backdrop: 1050 !default;
-$zindex-modal: 1060 !default;
+$zindex-modal: 1055 !default;
$zindex-popover: 1070 !default;
$zindex-tooltip: 1080 !default;
// scss-docs-end zindex-stack
@@ -956,7 +1148,7 @@ $nav-pills-link-active-bg: $component-active-bg !default;
// Navbar
// scss-docs-start navbar-variables
-$navbar-padding-y: $spacer / 2 !default;
+$navbar-padding-y: $spacer * .5 !default;
$navbar-padding-x: null !default;
$navbar-nav-link-padding-x: .5rem !default;
@@ -965,7 +1157,7 @@ $navbar-brand-font-size: $font-size-lg !default;
// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link
$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;
$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;
-$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;
+$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;
$navbar-brand-margin-end: 1rem !default;
$navbar-toggler-padding-y: .25rem !default;
@@ -1015,7 +1207,7 @@ $dropdown-border-radius: $border-radius !default;
$dropdown-border-width: $border-width !default;
$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;
$dropdown-divider-bg: $dropdown-border-color !default;
-$dropdown-divider-margin-y: $spacer / 2 !default;
+$dropdown-divider-margin-y: $spacer * .5 !default;
$dropdown-box-shadow: $box-shadow !default;
$dropdown-link-color: $gray-900 !default;
@@ -1027,7 +1219,7 @@ $dropdown-link-active-bg: $component-active-bg !default;
$dropdown-link-disabled-color: $gray-500 !default;
-$dropdown-item-padding-y: $spacer / 4 !default;
+$dropdown-item-padding-y: $spacer * .25 !default;
$dropdown-item-padding-x: $spacer !default;
$dropdown-header-color: $gray-600 !default;
@@ -1091,17 +1283,25 @@ $pagination-border-radius-lg: $border-radius-lg !default;
// scss-docs-end pagination-variables
+// Placeholders
+
+// scss-docs-start placeholders
+$placeholder-opacity-max: .5 !default;
+$placeholder-opacity-min: .2 !default;
+// scss-docs-end placeholders
+
// Cards
// scss-docs-start card-variables
$card-spacer-y: $spacer !default;
$card-spacer-x: $spacer !default;
-$card-title-spacer-y: $spacer / 2 !default;
+$card-title-spacer-y: $spacer * .5 !default;
$card-border-width: $border-width !default;
-$card-border-radius: $border-radius !default;
$card-border-color: rgba($black, .125) !default;
+$card-border-radius: $border-radius !default;
+$card-box-shadow: null !default;
$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;
-$card-cap-padding-y: $card-spacer-y / 2 !default;
+$card-cap-padding-y: $card-spacer-y * .5 !default;
$card-cap-padding-x: $card-spacer-x !default;
$card-cap-bg: rgba($black, .03) !default;
$card-cap-color: null !default;
@@ -1109,7 +1309,7 @@ $card-height: null !default;
$card-color: null !default;
$card-bg: $white !default;
$card-img-overlay-padding: $spacer !default;
-$card-group-margin: $grid-gutter-width / 2 !default;
+$card-group-margin: $grid-gutter-width * .5 !default;
// scss-docs-end card-variables
// Accordion
@@ -1139,10 +1339,10 @@ $accordion-button-focus-border-color: $input-focus-border-color !default;
$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;
$accordion-icon-width: 1.25rem !default;
-$accordion-icon-color: $accordion-color !default;
+$accordion-icon-color: $accordion-button-color !default;
$accordion-icon-active-color: $accordion-button-active-color !default;
$accordion-icon-transition: transform .2s ease-in-out !default;
-$accordion-icon-transform: rotate(180deg) !default;
+$accordion-icon-transform: rotate(-180deg) !default;
$accordion-button-icon: url("data:image/svg+xml, ") !default;
$accordion-button-active-icon: url("data:image/svg+xml, ") !default;
@@ -1157,8 +1357,8 @@ $tooltip-color: $white !default;
$tooltip-bg: $black !default;
$tooltip-border-radius: $border-radius !default;
$tooltip-opacity: .9 !default;
-$tooltip-padding-y: $spacer / 4 !default;
-$tooltip-padding-x: $spacer / 2 !default;
+$tooltip-padding-y: $spacer * .25 !default;
+$tooltip-padding-x: $spacer * .5 !default;
$tooltip-margin: 0 !default;
$tooltip-arrow-width: .8rem !default;
@@ -1174,22 +1374,22 @@ $form-feedback-tooltip-font-size: $tooltip-font-size !default;
$form-feedback-tooltip-line-height: null !default;
$form-feedback-tooltip-opacity: $tooltip-opacity !default;
$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;
-// scss-docs-start tooltip-feedback-variables
+// scss-docs-end tooltip-feedback-variables
// Popovers
// scss-docs-start popover-variables
$popover-font-size: $font-size-sm !default;
-$popover-bg: $white !default;
+$popover-bg: $light !default;
$popover-max-width: 276px !default;
$popover-border-width: $border-width !default;
-$popover-border-color: rgba($black, .2) !default;
-$popover-border-radius: $border-radius-lg !default;
+$popover-border-color: $border-color !default;
+$popover-border-radius: $border-radius !default;
$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;
$popover-box-shadow: $box-shadow !default;
-$popover-header-bg: shade-color($popover-bg, 6%) !default;
+$popover-header-bg: $primary !default;
$popover-header-color: $headings-color !default;
$popover-header-padding-y: .5rem !default;
$popover-header-padding-x: $spacer !default;
@@ -1324,7 +1524,7 @@ $list-group-border-color: rgba($black, .125) !default;
$list-group-border-width: $border-width !default;
$list-group-border-radius: $border-radius !default;
-$list-group-item-padding-y: $spacer / 2 !default;
+$list-group-item-padding-y: $spacer * .5 !default;
$list-group-item-padding-x: $spacer !default;
$list-group-item-bg-scale: -80% !default;
$list-group-item-color-scale: 40% !default;
@@ -1423,6 +1623,7 @@ $carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;
// scss-docs-start spinner-variables
$spinner-width: 2rem !default;
$spinner-height: $spinner-width !default;
+$spinner-vertical-align: -.125em !default;
$spinner-border-width: .25em !default;
$spinner-animation-speed: .75s !default;
@@ -1463,8 +1664,9 @@ $offcanvas-border-width: $modal-content-border-width !default;
$offcanvas-title-line-height: $modal-title-line-height !default;
$offcanvas-bg-color: $modal-content-bg !default;
$offcanvas-color: $modal-content-color !default;
-$offcanvas-body-backdrop-color: rgba($modal-backdrop-bg, $modal-backdrop-opacity) !default;
$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;
+$offcanvas-backdrop-bg: $modal-backdrop-bg !default;
+$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;
// scss-docs-end offcanvas-variables
// Code
diff --git a/src/assets/styles/bootstrap/bootstrap-grid.scss b/src/assets/styles/bootstrap/bootstrap-grid.scss
index 8116a0ff7..2c68fbbf7 100644
--- a/src/assets/styles/bootstrap/bootstrap-grid.scss
+++ b/src/assets/styles/bootstrap/bootstrap-grid.scss
@@ -1,5 +1,5 @@
/*!
- * Bootstrap Grid v5.0.0-beta3 (https://getbootstrap.com/)
+ * Bootstrap Grid v5.1.0 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
diff --git a/src/assets/styles/bootstrap/bootstrap-reboot.scss b/src/assets/styles/bootstrap/bootstrap-reboot.scss
index 3eff8820a..0c4bbe589 100644
--- a/src/assets/styles/bootstrap/bootstrap-reboot.scss
+++ b/src/assets/styles/bootstrap/bootstrap-reboot.scss
@@ -1,5 +1,5 @@
/*!
- * Bootstrap Reboot v5.0.0-beta3 (https://getbootstrap.com/)
+ * Bootstrap Reboot v5.1.0 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
diff --git a/src/assets/styles/bootstrap/bootstrap-utilities.scss b/src/assets/styles/bootstrap/bootstrap-utilities.scss
index 9331d8097..297e825fa 100644
--- a/src/assets/styles/bootstrap/bootstrap-utilities.scss
+++ b/src/assets/styles/bootstrap/bootstrap-utilities.scss
@@ -1,5 +1,5 @@
/*!
- * Bootstrap Utilities v5.0.0-beta3 (https://getbootstrap.com/)
+ * Bootstrap Utilities v5.1.0 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
diff --git a/src/assets/styles/bootstrap/bootstrap.scss b/src/assets/styles/bootstrap/bootstrap.scss
index 1a975a3db..e42b4b457 100644
--- a/src/assets/styles/bootstrap/bootstrap.scss
+++ b/src/assets/styles/bootstrap/bootstrap.scss
@@ -1,5 +1,5 @@
/*!
- * Bootstrap v5.0.0-beta3 (https://getbootstrap.com/)
+ * Bootstrap v5.1.0 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
@@ -43,6 +43,7 @@
@import "carousel";
@import "spinners";
@import "offcanvas";
+@import "placeholders";
// Helpers
@import "helpers";
diff --git a/src/assets/styles/bootstrap/forms/_floating-labels.scss b/src/assets/styles/bootstrap/forms/_floating-labels.scss
index 8b2e2b8eb..2f4295480 100644
--- a/src/assets/styles/bootstrap/forms/_floating-labels.scss
+++ b/src/assets/styles/bootstrap/forms/_floating-labels.scss
@@ -4,7 +4,7 @@
> .form-control,
> .form-select {
height: $form-floating-height;
- padding: $form-floating-padding-y $form-floating-padding-x;
+ line-height: $form-floating-line-height;
}
> label {
@@ -21,6 +21,8 @@
// stylelint-disable no-duplicate-selectors
> .form-control {
+ padding: $form-floating-padding-y $form-floating-padding-x;
+
&::placeholder {
color: transparent;
}
diff --git a/src/assets/styles/bootstrap/forms/_form-check.scss b/src/assets/styles/bootstrap/forms/_form-check.scss
index b34250a71..402c59547 100644
--- a/src/assets/styles/bootstrap/forms/_form-check.scss
+++ b/src/assets/styles/bootstrap/forms/_form-check.scss
@@ -17,7 +17,7 @@
.form-check-input {
width: $form-check-input-width;
height: $form-check-input-width;
- margin-top: ($line-height-base - $form-check-input-width) / 2; // line-height minus check height
+ //margin-top: ($line-height-base - $form-check-input-width) * .5; // line-height minus check height
vertical-align: top;
background-color: $form-check-input-bg;
background-repeat: no-repeat;
diff --git a/src/assets/styles/bootstrap/forms/_form-control.scss b/src/assets/styles/bootstrap/forms/_form-control.scss
index 9728b91f3..96423c530 100644
--- a/src/assets/styles/bootstrap/forms/_form-control.scss
+++ b/src/assets/styles/bootstrap/forms/_form-control.scss
@@ -199,7 +199,7 @@ textarea {
// stylelint-enable selector-no-qualifying-type
.form-control-color {
- max-width: 3rem;
+ width: $form-color-width;
height: auto; // Override fixed browser height
padding: $input-padding-y;
diff --git a/src/assets/styles/bootstrap/forms/_form-range.scss b/src/assets/styles/bootstrap/forms/_form-range.scss
index ae1d841d5..6de42132e 100644
--- a/src/assets/styles/bootstrap/forms/_form-range.scss
+++ b/src/assets/styles/bootstrap/forms/_form-range.scss
@@ -27,7 +27,7 @@
&::-webkit-slider-thumb {
width: $form-range-thumb-width;
height: $form-range-thumb-height;
- margin-top: ($form-range-track-height - $form-range-thumb-height) / 2; // Webkit specific
+ margin-top: ($form-range-track-height - $form-range-thumb-height) * .5; // Webkit specific
@include gradient-bg($form-range-thumb-bg);
border: $form-range-thumb-border;
@include border-radius($form-range-thumb-border-radius);
diff --git a/src/assets/styles/bootstrap/forms/_form-select.scss b/src/assets/styles/bootstrap/forms/_form-select.scss
index 15d5061ad..4506a979a 100644
--- a/src/assets/styles/bootstrap/forms/_form-select.scss
+++ b/src/assets/styles/bootstrap/forms/_form-select.scss
@@ -7,6 +7,8 @@
display: block;
width: 100%;
padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;
+ // stylelint-disable-next-line property-no-vendor-prefix
+ -moz-padding-start: subtract($form-select-padding-x, 3px); // See https://github.com/twbs/bootstrap/issues/32636
font-family: $form-select-font-family;
@include font-size($form-select-font-size);
font-weight: $form-select-font-weight;
@@ -20,6 +22,7 @@
border: $form-select-border-width solid $form-select-border-color;
@include border-radius($form-select-border-radius, 0);
@include box-shadow($form-select-box-shadow);
+ @include transition($form-select-transition);
appearance: none;
&:focus {
diff --git a/src/assets/styles/bootstrap/helpers/_stacks.scss b/src/assets/styles/bootstrap/helpers/_stacks.scss
new file mode 100644
index 000000000..6cd237ae6
--- /dev/null
+++ b/src/assets/styles/bootstrap/helpers/_stacks.scss
@@ -0,0 +1,15 @@
+// scss-docs-start stacks
+.hstack {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ align-self: stretch;
+}
+
+.vstack {
+ display: flex;
+ flex: 1 1 auto;
+ flex-direction: column;
+ align-self: stretch;
+}
+// scss-docs-end stacks
diff --git a/src/assets/styles/bootstrap/helpers/_vr.scss b/src/assets/styles/bootstrap/helpers/_vr.scss
new file mode 100644
index 000000000..37f864777
--- /dev/null
+++ b/src/assets/styles/bootstrap/helpers/_vr.scss
@@ -0,0 +1,8 @@
+.vr {
+ display: inline-block;
+ align-self: stretch;
+ width: 1px;
+ min-height: 1em;
+ background-color: currentColor;
+ opacity: $hr-opacity;
+}
diff --git a/src/assets/styles/bootstrap/mixins/_backdrop.scss b/src/assets/styles/bootstrap/mixins/_backdrop.scss
new file mode 100644
index 000000000..9705ae9ee
--- /dev/null
+++ b/src/assets/styles/bootstrap/mixins/_backdrop.scss
@@ -0,0 +1,14 @@
+// Shared between modals and offcanvases
+@mixin overlay-backdrop($zindex, $backdrop-bg, $backdrop-opacity) {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: $zindex;
+ width: 100vw;
+ height: 100vh;
+ background-color: $backdrop-bg;
+
+ // Fade for backdrop
+ &.fade { opacity: 0; }
+ &.show { opacity: $backdrop-opacity; }
+}
diff --git a/src/assets/styles/bootstrap/mixins/_buttons.scss b/src/assets/styles/bootstrap/mixins/_buttons.scss
index c06fa4a98..b67499668 100644
--- a/src/assets/styles/bootstrap/mixins/_buttons.scss
+++ b/src/assets/styles/bootstrap/mixins/_buttons.scss
@@ -11,7 +11,7 @@
$hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),
$hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),
$hover-color: color-contrast($hover-background),
- $active-background: if($color == $color-contrast-light, shade-color($background,$btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
+ $active-background: if($color == $color-contrast-light, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
$active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),
$active-color: color-contrast($active-background),
$disabled-background: $background,
diff --git a/src/assets/styles/bootstrap/mixins/_color-scheme.scss b/src/assets/styles/bootstrap/mixins/_color-scheme.scss
new file mode 100644
index 000000000..90497aa0a
--- /dev/null
+++ b/src/assets/styles/bootstrap/mixins/_color-scheme.scss
@@ -0,0 +1,7 @@
+// scss-docs-start mixin-color-scheme
+@mixin color-scheme($name) {
+ @media (prefers-color-scheme: #{$name}) {
+ @content;
+ }
+}
+// scss-docs-end mixin-color-scheme
diff --git a/src/assets/styles/bootstrap/mixins/_forms.scss b/src/assets/styles/bootstrap/mixins/_forms.scss
index a1e0849df..dc5bdb0b9 100644
--- a/src/assets/styles/bootstrap/mixins/_forms.scss
+++ b/src/assets/styles/bootstrap/mixins/_forms.scss
@@ -88,10 +88,13 @@
border-color: $color;
@if $enable-validation-icons {
- padding-right: $form-select-feedback-icon-padding-end;
- background-image: escape-svg($form-select-indicator), escape-svg($icon);
- background-position: $form-select-bg-position, $form-select-feedback-icon-position;
- background-size: $form-select-bg-size, $form-select-feedback-icon-size;
+ &:not([multiple]):not([size]),
+ &:not([multiple])[size="1"] {
+ padding-right: $form-select-feedback-icon-padding-end;
+ background-image: escape-svg($form-select-indicator), escape-svg($icon);
+ background-position: $form-select-bg-position, $form-select-feedback-icon-position;
+ background-size: $form-select-bg-size, $form-select-feedback-icon-size;
+ }
}
&:focus {
@@ -127,7 +130,14 @@
.input-group .form-control,
.input-group .form-select {
@include form-validation-state-selector($state) {
- z-index: 3;
+ @if $state == "valid" {
+ z-index: 1;
+ } @else if $state == "invalid" {
+ z-index: 2;
+ }
+ &:focus {
+ z-index: 3;
+ }
}
}
}
diff --git a/src/assets/styles/bootstrap/mixins/_grid.scss b/src/assets/styles/bootstrap/mixins/_grid.scss
index 92bb88ad4..59cc56376 100644
--- a/src/assets/styles/bootstrap/mixins/_grid.scss
+++ b/src/assets/styles/bootstrap/mixins/_grid.scss
@@ -1,4 +1,4 @@
-/// Grid system
+// Grid system
//
// Generate semantic grid columns with these mixins.
@@ -8,8 +8,8 @@
display: flex;
flex-wrap: wrap;
margin-top: calc(var(--#{$variable-prefix}gutter-y) * -1); // stylelint-disable-line function-disallowed-list
- margin-right: calc(var(--#{$variable-prefix}gutter-x) / -2); // stylelint-disable-line function-disallowed-list
- margin-left: calc(var(--#{$variable-prefix}gutter-x) / -2); // stylelint-disable-line function-disallowed-list
+ margin-right: calc(var(--#{$variable-prefix}gutter-x) * -.5); // stylelint-disable-line function-disallowed-list
+ margin-left: calc(var(--#{$variable-prefix}gutter-x) * -.5); // stylelint-disable-line function-disallowed-list
}
@mixin make-col-ready($gutter: $grid-gutter-width) {
@@ -21,14 +21,20 @@
flex-shrink: 0;
width: 100%;
max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid
- padding-right: calc(var(--#{$variable-prefix}gutter-x) / 2); // stylelint-disable-line function-disallowed-list
- padding-left: calc(var(--#{$variable-prefix}gutter-x) / 2); // stylelint-disable-line function-disallowed-list
+ padding-right: calc(var(--#{$variable-prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list
+ padding-left: calc(var(--#{$variable-prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list
margin-top: var(--#{$variable-prefix}gutter-y);
}
-@mixin make-col($size, $columns: $grid-columns) {
- flex: 0 0 auto;
- width: percentage($size / $columns);
+@mixin make-col($size: false, $columns: $grid-columns) {
+ @if $size {
+ flex: 0 0 auto;
+ width: percentage(divide($size, $columns));
+
+ } @else {
+ flex: 1 1 0;
+ max-width: 100%;
+ }
}
@mixin make-col-auto() {
@@ -37,7 +43,7 @@
}
@mixin make-col-offset($size, $columns: $grid-columns) {
- $num: $size / $columns;
+ $num: divide($size, $columns);
margin-left: if($num == 0, 0, percentage($num));
}
@@ -49,7 +55,7 @@
@mixin row-cols($count) {
> * {
flex: 0 0 auto;
- width: 100% / $count;
+ width: divide(100%, $count);
}
}
@@ -118,3 +124,27 @@
}
}
}
+
+@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {
+ @each $breakpoint in map-keys($breakpoints) {
+ $infix: breakpoint-infix($breakpoint, $breakpoints);
+
+ @include media-breakpoint-up($breakpoint, $breakpoints) {
+ @if $columns > 0 {
+ @for $i from 1 through $columns {
+ .g-col#{$infix}-#{$i} {
+ grid-column: auto / span $i;
+ }
+ }
+
+ // Start with `1` because `0` is and invalid value.
+ // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.
+ @for $i from 1 through ($columns - 1) {
+ .g-start#{$infix}-#{$i} {
+ grid-column-start: $i;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/assets/styles/bootstrap/mixins/_utilities.scss b/src/assets/styles/bootstrap/mixins/_utilities.scss
index 4d2370a0b..e871b4233 100644
--- a/src/assets/styles/bootstrap/mixins/_utilities.scss
+++ b/src/assets/styles/bootstrap/mixins/_utilities.scss
@@ -41,25 +41,46 @@
}
}
+ $is-css-var: map-get($utility, css-var);
+ $is-local-vars: map-get($utility, local-vars);
$is-rtl: map-get($utility, rtl);
@if $value != null {
@if $is-rtl == false {
/* rtl:begin:remove */
}
- .#{$property-class + $infix + $property-class-modifier} {
- @each $property in $properties {
- #{$property}: $value if($enable-important-utilities, !important, null);
+
+ @if $is-css-var {
+ .#{$property-class + $infix + $property-class-modifier} {
+ --#{$variable-prefix}#{$property-class}: #{$value};
}
- }
- @each $pseudo in $state {
- .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {
+ @each $pseudo in $state {
+ .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {
+ --#{$variable-prefix}#{$property-class}: #{$value};
+ }
+ }
+ } @else {
+ .#{$property-class + $infix + $property-class-modifier} {
@each $property in $properties {
+ @if $is-local-vars {
+ @each $local-var, $value in $is-local-vars {
+ --#{$variable-prefix}#{$local-var}: #{$value};
+ }
+ }
#{$property}: $value if($enable-important-utilities, !important, null);
}
}
+
+ @each $pseudo in $state {
+ .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {
+ @each $property in $properties {
+ #{$property}: $value if($enable-important-utilities, !important, null);
+ }
+ }
+ }
}
+
@if $is-rtl == false {
/* rtl:end:remove */
}
diff --git a/src/assets/styles/bootstrap/vendor/_rfs.scss b/src/assets/styles/bootstrap/vendor/_rfs.scss
index 798753ecb..7e9a6c7a8 100644
--- a/src/assets/styles/bootstrap/vendor/_rfs.scss
+++ b/src/assets/styles/bootstrap/vendor/_rfs.scss
@@ -4,7 +4,7 @@
//
// Automated responsive values for font sizes, paddings, margins and much more
//
-// Licensed under MIT (https://github.com/twbs/rfs/blob/master/LICENSE)
+// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)
// Configuration
@@ -52,12 +52,54 @@ $enable-rfs: true !default;
// Cache $rfs-base-value unit
$rfs-base-value-unit: unit($rfs-base-value);
+@function divide($dividend, $divisor, $precision: 10) {
+ $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);
+ $dividend: abs($dividend);
+ $divisor: abs($divisor);
+ @if $dividend == 0 {
+ @return 0;
+ }
+ @if $divisor == 0 {
+ @error "Cannot divide by 0";
+ }
+ $remainder: $dividend;
+ $result: 0;
+ $factor: 10;
+ @while ($remainder > 0 and $precision >= 0) {
+ $quotient: 0;
+ @while ($remainder >= $divisor) {
+ $remainder: $remainder - $divisor;
+ $quotient: $quotient + 1;
+ }
+ $result: $result * 10 + $quotient;
+ $factor: $factor * .1;
+ $remainder: $remainder * 10;
+ $precision: $precision - 1;
+ @if ($precision < 0 and $remainder >= $divisor * 5) {
+ $result: $result + 1;
+ }
+ }
+ $result: $result * $factor * $sign;
+ $dividend-unit: unit($dividend);
+ $divisor-unit: unit($divisor);
+ $unit-map: (
+ "px": 1px,
+ "rem": 1rem,
+ "em": 1em,
+ "%": 1%
+ );
+ @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {
+ $result: $result * map-get($unit-map, $dividend-unit);
+ }
+ @return $result;
+}
+
// Remove px-unit from $rfs-base-value for calculations
@if $rfs-base-value-unit == px {
- $rfs-base-value: $rfs-base-value / ($rfs-base-value * 0 + 1);
+ $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);
}
@else if $rfs-base-value-unit == rem {
- $rfs-base-value: $rfs-base-value / ($rfs-base-value * 0 + 1 / $rfs-rem-value);
+ $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));
}
// Cache $rfs-breakpoint unit to prevent multiple calls
@@ -65,14 +107,14 @@ $rfs-breakpoint-unit-cache: unit($rfs-breakpoint);
// Remove unit from $rfs-breakpoint for calculations
@if $rfs-breakpoint-unit-cache == px {
- $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);
+ $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);
}
@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == "em" {
- $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);
+ $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));
}
// Calculate the media query value
-$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit});
+$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});
$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);
$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);
@@ -164,11 +206,11 @@ $rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height
@if $unit == px {
// Convert to rem if needed
- $val: $val + ' ' + if($rfs-unit == rem, #{$value / ($value * 0 + $rfs-rem-value)}rem, $value);
+ $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);
}
@else if $unit == rem {
// Convert to px if needed
- $val: $val + ' ' + if($rfs-unit == px, #{$value / ($value * 0 + 1) * $rfs-rem-value}px, $value);
+ $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);
}
@else {
// If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value
@@ -205,21 +247,21 @@ $rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height
@else {
// Remove unit from $value for calculations
- $value: $value / ($value * 0 + if($unit == px, 1, 1 / $rfs-rem-value));
+ $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));
// Only add the media query if the value is greater than the minimum value
@if abs($value) <= $rfs-base-value or not $enable-rfs {
- $val: $val + ' ' + if($rfs-unit == rem, #{$value / $rfs-rem-value}rem, #{$value}px);
+ $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);
}
@else {
// Calculate the minimum value
- $value-min: $rfs-base-value + (abs($value) - $rfs-base-value) / $rfs-factor;
+ $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);
// Calculate difference between $value and the minimum value
$value-diff: abs($value) - $value-min;
// Base value formatting
- $min-width: if($rfs-unit == rem, #{$value-min / $rfs-rem-value}rem, #{$value-min}px);
+ $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);
// Use negative value if needed
$min-width: if($value < 0, -$min-width, $min-width);
@@ -228,7 +270,7 @@ $rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height
$variable-unit: if($rfs-two-dimensional, vmin, vw);
// Calculate the variable width between 0 and $rfs-breakpoint
- $variable-width: #{$value-diff * 100 / $rfs-breakpoint}#{$variable-unit};
+ $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};
// Return the calculated value
$val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';
diff --git a/src/assets/styles/fontawesome/_animated.scss b/src/assets/styles/fontawesome/_animated.scss
deleted file mode 100644
index 7c7c0e173..000000000
--- a/src/assets/styles/fontawesome/_animated.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-// Animated Icons
-// --------------------------
-
-.#{$fa-css-prefix}-spin {
- animation: fa-spin 2s infinite linear;
-}
-
-.#{$fa-css-prefix}-pulse {
- animation: fa-spin 1s infinite steps(8);
-}
-
-@keyframes fa-spin {
- 0% {
- transform: rotate(0deg);
- }
-
- 100% {
- transform: rotate(360deg);
- }
-}
diff --git a/src/assets/styles/fontawesome/_bordered-pulled.scss b/src/assets/styles/fontawesome/_bordered-pulled.scss
deleted file mode 100644
index c8c4274c4..000000000
--- a/src/assets/styles/fontawesome/_bordered-pulled.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-// Bordered & Pulled
-// -------------------------
-
-.#{$fa-css-prefix}-border {
- border: solid .08em $fa-border-color;
- border-radius: .1em;
- padding: .2em .25em .15em;
-}
-
-.#{$fa-css-prefix}-pull-left { float: left; }
-.#{$fa-css-prefix}-pull-right { float: right; }
-
-.#{$fa-css-prefix},
-.fas,
-.far,
-.fal,
-.fab {
- &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
- &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
-}
diff --git a/src/assets/styles/fontawesome/_core.scss b/src/assets/styles/fontawesome/_core.scss
deleted file mode 100644
index cbd4cf7c1..000000000
--- a/src/assets/styles/fontawesome/_core.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-// Base Class Definition
-// -------------------------
-
-.#{$fa-css-prefix},
-.fas,
-.far,
-.fal,
-.fad,
-.fab {
- -moz-osx-font-smoothing: grayscale;
- -webkit-font-smoothing: antialiased;
- display: inline-block;
- font-style: normal;
- font-variant: normal;
- text-rendering: auto;
- line-height: 1;
-}
-
-%fa-icon {
- @include fa-icon;
-}
diff --git a/src/assets/styles/fontawesome/_fixed-width.scss b/src/assets/styles/fontawesome/_fixed-width.scss
deleted file mode 100644
index 970641ff4..000000000
--- a/src/assets/styles/fontawesome/_fixed-width.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-// Fixed Width Icons
-// -------------------------
-.#{$fa-css-prefix}-fw {
- text-align: center;
- width: $fa-fw-width;
-}
diff --git a/src/assets/styles/fontawesome/_icons.scss b/src/assets/styles/fontawesome/_icons.scss
deleted file mode 100644
index fa3ac0737..000000000
--- a/src/assets/styles/fontawesome/_icons.scss
+++ /dev/null
@@ -1,1451 +0,0 @@
-/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
-readers do not read off random characters that represent icons */
-
-.#{$fa-css-prefix}-500px:before { content: fa-content($fa-var-500px); }
-.#{$fa-css-prefix}-accessible-icon:before { content: fa-content($fa-var-accessible-icon); }
-.#{$fa-css-prefix}-accusoft:before { content: fa-content($fa-var-accusoft); }
-.#{$fa-css-prefix}-acquisitions-incorporated:before { content: fa-content($fa-var-acquisitions-incorporated); }
-.#{$fa-css-prefix}-ad:before { content: fa-content($fa-var-ad); }
-.#{$fa-css-prefix}-address-book:before { content: fa-content($fa-var-address-book); }
-.#{$fa-css-prefix}-address-card:before { content: fa-content($fa-var-address-card); }
-.#{$fa-css-prefix}-adjust:before { content: fa-content($fa-var-adjust); }
-.#{$fa-css-prefix}-adn:before { content: fa-content($fa-var-adn); }
-.#{$fa-css-prefix}-adobe:before { content: fa-content($fa-var-adobe); }
-.#{$fa-css-prefix}-adversal:before { content: fa-content($fa-var-adversal); }
-.#{$fa-css-prefix}-affiliatetheme:before { content: fa-content($fa-var-affiliatetheme); }
-.#{$fa-css-prefix}-air-freshener:before { content: fa-content($fa-var-air-freshener); }
-.#{$fa-css-prefix}-airbnb:before { content: fa-content($fa-var-airbnb); }
-.#{$fa-css-prefix}-algolia:before { content: fa-content($fa-var-algolia); }
-.#{$fa-css-prefix}-align-center:before { content: fa-content($fa-var-align-center); }
-.#{$fa-css-prefix}-align-justify:before { content: fa-content($fa-var-align-justify); }
-.#{$fa-css-prefix}-align-left:before { content: fa-content($fa-var-align-left); }
-.#{$fa-css-prefix}-align-right:before { content: fa-content($fa-var-align-right); }
-.#{$fa-css-prefix}-alipay:before { content: fa-content($fa-var-alipay); }
-.#{$fa-css-prefix}-allergies:before { content: fa-content($fa-var-allergies); }
-.#{$fa-css-prefix}-amazon:before { content: fa-content($fa-var-amazon); }
-.#{$fa-css-prefix}-amazon-pay:before { content: fa-content($fa-var-amazon-pay); }
-.#{$fa-css-prefix}-ambulance:before { content: fa-content($fa-var-ambulance); }
-.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: fa-content($fa-var-american-sign-language-interpreting); }
-.#{$fa-css-prefix}-amilia:before { content: fa-content($fa-var-amilia); }
-.#{$fa-css-prefix}-anchor:before { content: fa-content($fa-var-anchor); }
-.#{$fa-css-prefix}-android:before { content: fa-content($fa-var-android); }
-.#{$fa-css-prefix}-angellist:before { content: fa-content($fa-var-angellist); }
-.#{$fa-css-prefix}-angle-double-down:before { content: fa-content($fa-var-angle-double-down); }
-.#{$fa-css-prefix}-angle-double-left:before { content: fa-content($fa-var-angle-double-left); }
-.#{$fa-css-prefix}-angle-double-right:before { content: fa-content($fa-var-angle-double-right); }
-.#{$fa-css-prefix}-angle-double-up:before { content: fa-content($fa-var-angle-double-up); }
-.#{$fa-css-prefix}-angle-down:before { content: fa-content($fa-var-angle-down); }
-.#{$fa-css-prefix}-angle-left:before { content: fa-content($fa-var-angle-left); }
-.#{$fa-css-prefix}-angle-right:before { content: fa-content($fa-var-angle-right); }
-.#{$fa-css-prefix}-angle-up:before { content: fa-content($fa-var-angle-up); }
-.#{$fa-css-prefix}-angry:before { content: fa-content($fa-var-angry); }
-.#{$fa-css-prefix}-angrycreative:before { content: fa-content($fa-var-angrycreative); }
-.#{$fa-css-prefix}-angular:before { content: fa-content($fa-var-angular); }
-.#{$fa-css-prefix}-ankh:before { content: fa-content($fa-var-ankh); }
-.#{$fa-css-prefix}-app-store:before { content: fa-content($fa-var-app-store); }
-.#{$fa-css-prefix}-app-store-ios:before { content: fa-content($fa-var-app-store-ios); }
-.#{$fa-css-prefix}-apper:before { content: fa-content($fa-var-apper); }
-.#{$fa-css-prefix}-apple:before { content: fa-content($fa-var-apple); }
-.#{$fa-css-prefix}-apple-alt:before { content: fa-content($fa-var-apple-alt); }
-.#{$fa-css-prefix}-apple-pay:before { content: fa-content($fa-var-apple-pay); }
-.#{$fa-css-prefix}-archive:before { content: fa-content($fa-var-archive); }
-.#{$fa-css-prefix}-archway:before { content: fa-content($fa-var-archway); }
-.#{$fa-css-prefix}-arrow-alt-circle-down:before { content: fa-content($fa-var-arrow-alt-circle-down); }
-.#{$fa-css-prefix}-arrow-alt-circle-left:before { content: fa-content($fa-var-arrow-alt-circle-left); }
-.#{$fa-css-prefix}-arrow-alt-circle-right:before { content: fa-content($fa-var-arrow-alt-circle-right); }
-.#{$fa-css-prefix}-arrow-alt-circle-up:before { content: fa-content($fa-var-arrow-alt-circle-up); }
-.#{$fa-css-prefix}-arrow-circle-down:before { content: fa-content($fa-var-arrow-circle-down); }
-.#{$fa-css-prefix}-arrow-circle-left:before { content: fa-content($fa-var-arrow-circle-left); }
-.#{$fa-css-prefix}-arrow-circle-right:before { content: fa-content($fa-var-arrow-circle-right); }
-.#{$fa-css-prefix}-arrow-circle-up:before { content: fa-content($fa-var-arrow-circle-up); }
-.#{$fa-css-prefix}-arrow-down:before { content: fa-content($fa-var-arrow-down); }
-.#{$fa-css-prefix}-arrow-left:before { content: fa-content($fa-var-arrow-left); }
-.#{$fa-css-prefix}-arrow-right:before { content: fa-content($fa-var-arrow-right); }
-.#{$fa-css-prefix}-arrow-up:before { content: fa-content($fa-var-arrow-up); }
-.#{$fa-css-prefix}-arrows-alt:before { content: fa-content($fa-var-arrows-alt); }
-.#{$fa-css-prefix}-arrows-alt-h:before { content: fa-content($fa-var-arrows-alt-h); }
-.#{$fa-css-prefix}-arrows-alt-v:before { content: fa-content($fa-var-arrows-alt-v); }
-.#{$fa-css-prefix}-artstation:before { content: fa-content($fa-var-artstation); }
-.#{$fa-css-prefix}-assistive-listening-systems:before { content: fa-content($fa-var-assistive-listening-systems); }
-.#{$fa-css-prefix}-asterisk:before { content: fa-content($fa-var-asterisk); }
-.#{$fa-css-prefix}-asymmetrik:before { content: fa-content($fa-var-asymmetrik); }
-.#{$fa-css-prefix}-at:before { content: fa-content($fa-var-at); }
-.#{$fa-css-prefix}-atlas:before { content: fa-content($fa-var-atlas); }
-.#{$fa-css-prefix}-atlassian:before { content: fa-content($fa-var-atlassian); }
-.#{$fa-css-prefix}-atom:before { content: fa-content($fa-var-atom); }
-.#{$fa-css-prefix}-audible:before { content: fa-content($fa-var-audible); }
-.#{$fa-css-prefix}-audio-description:before { content: fa-content($fa-var-audio-description); }
-.#{$fa-css-prefix}-autoprefixer:before { content: fa-content($fa-var-autoprefixer); }
-.#{$fa-css-prefix}-avianex:before { content: fa-content($fa-var-avianex); }
-.#{$fa-css-prefix}-aviato:before { content: fa-content($fa-var-aviato); }
-.#{$fa-css-prefix}-award:before { content: fa-content($fa-var-award); }
-.#{$fa-css-prefix}-aws:before { content: fa-content($fa-var-aws); }
-.#{$fa-css-prefix}-baby:before { content: fa-content($fa-var-baby); }
-.#{$fa-css-prefix}-baby-carriage:before { content: fa-content($fa-var-baby-carriage); }
-.#{$fa-css-prefix}-backspace:before { content: fa-content($fa-var-backspace); }
-.#{$fa-css-prefix}-backward:before { content: fa-content($fa-var-backward); }
-.#{$fa-css-prefix}-bacon:before { content: fa-content($fa-var-bacon); }
-.#{$fa-css-prefix}-bacteria:before { content: fa-content($fa-var-bacteria); }
-.#{$fa-css-prefix}-bacterium:before { content: fa-content($fa-var-bacterium); }
-.#{$fa-css-prefix}-bahai:before { content: fa-content($fa-var-bahai); }
-.#{$fa-css-prefix}-balance-scale:before { content: fa-content($fa-var-balance-scale); }
-.#{$fa-css-prefix}-balance-scale-left:before { content: fa-content($fa-var-balance-scale-left); }
-.#{$fa-css-prefix}-balance-scale-right:before { content: fa-content($fa-var-balance-scale-right); }
-.#{$fa-css-prefix}-ban:before { content: fa-content($fa-var-ban); }
-.#{$fa-css-prefix}-band-aid:before { content: fa-content($fa-var-band-aid); }
-.#{$fa-css-prefix}-bandcamp:before { content: fa-content($fa-var-bandcamp); }
-.#{$fa-css-prefix}-barcode:before { content: fa-content($fa-var-barcode); }
-.#{$fa-css-prefix}-bars:before { content: fa-content($fa-var-bars); }
-.#{$fa-css-prefix}-baseball-ball:before { content: fa-content($fa-var-baseball-ball); }
-.#{$fa-css-prefix}-basketball-ball:before { content: fa-content($fa-var-basketball-ball); }
-.#{$fa-css-prefix}-bath:before { content: fa-content($fa-var-bath); }
-.#{$fa-css-prefix}-battery-empty:before { content: fa-content($fa-var-battery-empty); }
-.#{$fa-css-prefix}-battery-full:before { content: fa-content($fa-var-battery-full); }
-.#{$fa-css-prefix}-battery-half:before { content: fa-content($fa-var-battery-half); }
-.#{$fa-css-prefix}-battery-quarter:before { content: fa-content($fa-var-battery-quarter); }
-.#{$fa-css-prefix}-battery-three-quarters:before { content: fa-content($fa-var-battery-three-quarters); }
-.#{$fa-css-prefix}-battle-net:before { content: fa-content($fa-var-battle-net); }
-.#{$fa-css-prefix}-bed:before { content: fa-content($fa-var-bed); }
-.#{$fa-css-prefix}-beer:before { content: fa-content($fa-var-beer); }
-.#{$fa-css-prefix}-behance:before { content: fa-content($fa-var-behance); }
-.#{$fa-css-prefix}-behance-square:before { content: fa-content($fa-var-behance-square); }
-.#{$fa-css-prefix}-bell:before { content: fa-content($fa-var-bell); }
-.#{$fa-css-prefix}-bell-slash:before { content: fa-content($fa-var-bell-slash); }
-.#{$fa-css-prefix}-bezier-curve:before { content: fa-content($fa-var-bezier-curve); }
-.#{$fa-css-prefix}-bible:before { content: fa-content($fa-var-bible); }
-.#{$fa-css-prefix}-bicycle:before { content: fa-content($fa-var-bicycle); }
-.#{$fa-css-prefix}-biking:before { content: fa-content($fa-var-biking); }
-.#{$fa-css-prefix}-bimobject:before { content: fa-content($fa-var-bimobject); }
-.#{$fa-css-prefix}-binoculars:before { content: fa-content($fa-var-binoculars); }
-.#{$fa-css-prefix}-biohazard:before { content: fa-content($fa-var-biohazard); }
-.#{$fa-css-prefix}-birthday-cake:before { content: fa-content($fa-var-birthday-cake); }
-.#{$fa-css-prefix}-bitbucket:before { content: fa-content($fa-var-bitbucket); }
-.#{$fa-css-prefix}-bitcoin:before { content: fa-content($fa-var-bitcoin); }
-.#{$fa-css-prefix}-bity:before { content: fa-content($fa-var-bity); }
-.#{$fa-css-prefix}-black-tie:before { content: fa-content($fa-var-black-tie); }
-.#{$fa-css-prefix}-blackberry:before { content: fa-content($fa-var-blackberry); }
-.#{$fa-css-prefix}-blender:before { content: fa-content($fa-var-blender); }
-.#{$fa-css-prefix}-blender-phone:before { content: fa-content($fa-var-blender-phone); }
-.#{$fa-css-prefix}-blind:before { content: fa-content($fa-var-blind); }
-.#{$fa-css-prefix}-blog:before { content: fa-content($fa-var-blog); }
-.#{$fa-css-prefix}-blogger:before { content: fa-content($fa-var-blogger); }
-.#{$fa-css-prefix}-blogger-b:before { content: fa-content($fa-var-blogger-b); }
-.#{$fa-css-prefix}-bluetooth:before { content: fa-content($fa-var-bluetooth); }
-.#{$fa-css-prefix}-bluetooth-b:before { content: fa-content($fa-var-bluetooth-b); }
-.#{$fa-css-prefix}-bold:before { content: fa-content($fa-var-bold); }
-.#{$fa-css-prefix}-bolt:before { content: fa-content($fa-var-bolt); }
-.#{$fa-css-prefix}-bomb:before { content: fa-content($fa-var-bomb); }
-.#{$fa-css-prefix}-bone:before { content: fa-content($fa-var-bone); }
-.#{$fa-css-prefix}-bong:before { content: fa-content($fa-var-bong); }
-.#{$fa-css-prefix}-book:before { content: fa-content($fa-var-book); }
-.#{$fa-css-prefix}-book-dead:before { content: fa-content($fa-var-book-dead); }
-.#{$fa-css-prefix}-book-medical:before { content: fa-content($fa-var-book-medical); }
-.#{$fa-css-prefix}-book-open:before { content: fa-content($fa-var-book-open); }
-.#{$fa-css-prefix}-book-reader:before { content: fa-content($fa-var-book-reader); }
-.#{$fa-css-prefix}-bookmark:before { content: fa-content($fa-var-bookmark); }
-.#{$fa-css-prefix}-bootstrap:before { content: fa-content($fa-var-bootstrap); }
-.#{$fa-css-prefix}-border-all:before { content: fa-content($fa-var-border-all); }
-.#{$fa-css-prefix}-border-none:before { content: fa-content($fa-var-border-none); }
-.#{$fa-css-prefix}-border-style:before { content: fa-content($fa-var-border-style); }
-.#{$fa-css-prefix}-bowling-ball:before { content: fa-content($fa-var-bowling-ball); }
-.#{$fa-css-prefix}-box:before { content: fa-content($fa-var-box); }
-.#{$fa-css-prefix}-box-open:before { content: fa-content($fa-var-box-open); }
-.#{$fa-css-prefix}-box-tissue:before { content: fa-content($fa-var-box-tissue); }
-.#{$fa-css-prefix}-boxes:before { content: fa-content($fa-var-boxes); }
-.#{$fa-css-prefix}-braille:before { content: fa-content($fa-var-braille); }
-.#{$fa-css-prefix}-brain:before { content: fa-content($fa-var-brain); }
-.#{$fa-css-prefix}-bread-slice:before { content: fa-content($fa-var-bread-slice); }
-.#{$fa-css-prefix}-briefcase:before { content: fa-content($fa-var-briefcase); }
-.#{$fa-css-prefix}-briefcase-medical:before { content: fa-content($fa-var-briefcase-medical); }
-.#{$fa-css-prefix}-broadcast-tower:before { content: fa-content($fa-var-broadcast-tower); }
-.#{$fa-css-prefix}-broom:before { content: fa-content($fa-var-broom); }
-.#{$fa-css-prefix}-brush:before { content: fa-content($fa-var-brush); }
-.#{$fa-css-prefix}-btc:before { content: fa-content($fa-var-btc); }
-.#{$fa-css-prefix}-buffer:before { content: fa-content($fa-var-buffer); }
-.#{$fa-css-prefix}-bug:before { content: fa-content($fa-var-bug); }
-.#{$fa-css-prefix}-building:before { content: fa-content($fa-var-building); }
-.#{$fa-css-prefix}-bullhorn:before { content: fa-content($fa-var-bullhorn); }
-.#{$fa-css-prefix}-bullseye:before { content: fa-content($fa-var-bullseye); }
-.#{$fa-css-prefix}-burn:before { content: fa-content($fa-var-burn); }
-.#{$fa-css-prefix}-buromobelexperte:before { content: fa-content($fa-var-buromobelexperte); }
-.#{$fa-css-prefix}-bus:before { content: fa-content($fa-var-bus); }
-.#{$fa-css-prefix}-bus-alt:before { content: fa-content($fa-var-bus-alt); }
-.#{$fa-css-prefix}-business-time:before { content: fa-content($fa-var-business-time); }
-.#{$fa-css-prefix}-buy-n-large:before { content: fa-content($fa-var-buy-n-large); }
-.#{$fa-css-prefix}-buysellads:before { content: fa-content($fa-var-buysellads); }
-.#{$fa-css-prefix}-calculator:before { content: fa-content($fa-var-calculator); }
-.#{$fa-css-prefix}-calendar:before { content: fa-content($fa-var-calendar); }
-.#{$fa-css-prefix}-calendar-alt:before { content: fa-content($fa-var-calendar-alt); }
-.#{$fa-css-prefix}-calendar-check:before { content: fa-content($fa-var-calendar-check); }
-.#{$fa-css-prefix}-calendar-day:before { content: fa-content($fa-var-calendar-day); }
-.#{$fa-css-prefix}-calendar-minus:before { content: fa-content($fa-var-calendar-minus); }
-.#{$fa-css-prefix}-calendar-plus:before { content: fa-content($fa-var-calendar-plus); }
-.#{$fa-css-prefix}-calendar-times:before { content: fa-content($fa-var-calendar-times); }
-.#{$fa-css-prefix}-calendar-week:before { content: fa-content($fa-var-calendar-week); }
-.#{$fa-css-prefix}-camera:before { content: fa-content($fa-var-camera); }
-.#{$fa-css-prefix}-camera-retro:before { content: fa-content($fa-var-camera-retro); }
-.#{$fa-css-prefix}-campground:before { content: fa-content($fa-var-campground); }
-.#{$fa-css-prefix}-canadian-maple-leaf:before { content: fa-content($fa-var-canadian-maple-leaf); }
-.#{$fa-css-prefix}-candy-cane:before { content: fa-content($fa-var-candy-cane); }
-.#{$fa-css-prefix}-cannabis:before { content: fa-content($fa-var-cannabis); }
-.#{$fa-css-prefix}-capsules:before { content: fa-content($fa-var-capsules); }
-.#{$fa-css-prefix}-car:before { content: fa-content($fa-var-car); }
-.#{$fa-css-prefix}-car-alt:before { content: fa-content($fa-var-car-alt); }
-.#{$fa-css-prefix}-car-battery:before { content: fa-content($fa-var-car-battery); }
-.#{$fa-css-prefix}-car-crash:before { content: fa-content($fa-var-car-crash); }
-.#{$fa-css-prefix}-car-side:before { content: fa-content($fa-var-car-side); }
-.#{$fa-css-prefix}-caravan:before { content: fa-content($fa-var-caravan); }
-.#{$fa-css-prefix}-caret-down:before { content: fa-content($fa-var-caret-down); }
-.#{$fa-css-prefix}-caret-left:before { content: fa-content($fa-var-caret-left); }
-.#{$fa-css-prefix}-caret-right:before { content: fa-content($fa-var-caret-right); }
-.#{$fa-css-prefix}-caret-square-down:before { content: fa-content($fa-var-caret-square-down); }
-.#{$fa-css-prefix}-caret-square-left:before { content: fa-content($fa-var-caret-square-left); }
-.#{$fa-css-prefix}-caret-square-right:before { content: fa-content($fa-var-caret-square-right); }
-.#{$fa-css-prefix}-caret-square-up:before { content: fa-content($fa-var-caret-square-up); }
-.#{$fa-css-prefix}-caret-up:before { content: fa-content($fa-var-caret-up); }
-.#{$fa-css-prefix}-carrot:before { content: fa-content($fa-var-carrot); }
-.#{$fa-css-prefix}-cart-arrow-down:before { content: fa-content($fa-var-cart-arrow-down); }
-.#{$fa-css-prefix}-cart-plus:before { content: fa-content($fa-var-cart-plus); }
-.#{$fa-css-prefix}-cash-register:before { content: fa-content($fa-var-cash-register); }
-.#{$fa-css-prefix}-cat:before { content: fa-content($fa-var-cat); }
-.#{$fa-css-prefix}-cc-amazon-pay:before { content: fa-content($fa-var-cc-amazon-pay); }
-.#{$fa-css-prefix}-cc-amex:before { content: fa-content($fa-var-cc-amex); }
-.#{$fa-css-prefix}-cc-apple-pay:before { content: fa-content($fa-var-cc-apple-pay); }
-.#{$fa-css-prefix}-cc-diners-club:before { content: fa-content($fa-var-cc-diners-club); }
-.#{$fa-css-prefix}-cc-discover:before { content: fa-content($fa-var-cc-discover); }
-.#{$fa-css-prefix}-cc-jcb:before { content: fa-content($fa-var-cc-jcb); }
-.#{$fa-css-prefix}-cc-mastercard:before { content: fa-content($fa-var-cc-mastercard); }
-.#{$fa-css-prefix}-cc-paypal:before { content: fa-content($fa-var-cc-paypal); }
-.#{$fa-css-prefix}-cc-stripe:before { content: fa-content($fa-var-cc-stripe); }
-.#{$fa-css-prefix}-cc-visa:before { content: fa-content($fa-var-cc-visa); }
-.#{$fa-css-prefix}-centercode:before { content: fa-content($fa-var-centercode); }
-.#{$fa-css-prefix}-centos:before { content: fa-content($fa-var-centos); }
-.#{$fa-css-prefix}-certificate:before { content: fa-content($fa-var-certificate); }
-.#{$fa-css-prefix}-chair:before { content: fa-content($fa-var-chair); }
-.#{$fa-css-prefix}-chalkboard:before { content: fa-content($fa-var-chalkboard); }
-.#{$fa-css-prefix}-chalkboard-teacher:before { content: fa-content($fa-var-chalkboard-teacher); }
-.#{$fa-css-prefix}-charging-station:before { content: fa-content($fa-var-charging-station); }
-.#{$fa-css-prefix}-chart-area:before { content: fa-content($fa-var-chart-area); }
-.#{$fa-css-prefix}-chart-bar:before { content: fa-content($fa-var-chart-bar); }
-.#{$fa-css-prefix}-chart-line:before { content: fa-content($fa-var-chart-line); }
-.#{$fa-css-prefix}-chart-pie:before { content: fa-content($fa-var-chart-pie); }
-.#{$fa-css-prefix}-check:before { content: fa-content($fa-var-check); }
-.#{$fa-css-prefix}-check-circle:before { content: fa-content($fa-var-check-circle); }
-.#{$fa-css-prefix}-check-double:before { content: fa-content($fa-var-check-double); }
-.#{$fa-css-prefix}-check-square:before { content: fa-content($fa-var-check-square); }
-.#{$fa-css-prefix}-cheese:before { content: fa-content($fa-var-cheese); }
-.#{$fa-css-prefix}-chess:before { content: fa-content($fa-var-chess); }
-.#{$fa-css-prefix}-chess-bishop:before { content: fa-content($fa-var-chess-bishop); }
-.#{$fa-css-prefix}-chess-board:before { content: fa-content($fa-var-chess-board); }
-.#{$fa-css-prefix}-chess-king:before { content: fa-content($fa-var-chess-king); }
-.#{$fa-css-prefix}-chess-knight:before { content: fa-content($fa-var-chess-knight); }
-.#{$fa-css-prefix}-chess-pawn:before { content: fa-content($fa-var-chess-pawn); }
-.#{$fa-css-prefix}-chess-queen:before { content: fa-content($fa-var-chess-queen); }
-.#{$fa-css-prefix}-chess-rook:before { content: fa-content($fa-var-chess-rook); }
-.#{$fa-css-prefix}-chevron-circle-down:before { content: fa-content($fa-var-chevron-circle-down); }
-.#{$fa-css-prefix}-chevron-circle-left:before { content: fa-content($fa-var-chevron-circle-left); }
-.#{$fa-css-prefix}-chevron-circle-right:before { content: fa-content($fa-var-chevron-circle-right); }
-.#{$fa-css-prefix}-chevron-circle-up:before { content: fa-content($fa-var-chevron-circle-up); }
-.#{$fa-css-prefix}-chevron-down:before { content: fa-content($fa-var-chevron-down); }
-.#{$fa-css-prefix}-chevron-left:before { content: fa-content($fa-var-chevron-left); }
-.#{$fa-css-prefix}-chevron-right:before { content: fa-content($fa-var-chevron-right); }
-.#{$fa-css-prefix}-chevron-up:before { content: fa-content($fa-var-chevron-up); }
-.#{$fa-css-prefix}-child:before { content: fa-content($fa-var-child); }
-.#{$fa-css-prefix}-chrome:before { content: fa-content($fa-var-chrome); }
-.#{$fa-css-prefix}-chromecast:before { content: fa-content($fa-var-chromecast); }
-.#{$fa-css-prefix}-church:before { content: fa-content($fa-var-church); }
-.#{$fa-css-prefix}-circle:before { content: fa-content($fa-var-circle); }
-.#{$fa-css-prefix}-circle-notch:before { content: fa-content($fa-var-circle-notch); }
-.#{$fa-css-prefix}-city:before { content: fa-content($fa-var-city); }
-.#{$fa-css-prefix}-clinic-medical:before { content: fa-content($fa-var-clinic-medical); }
-.#{$fa-css-prefix}-clipboard:before { content: fa-content($fa-var-clipboard); }
-.#{$fa-css-prefix}-clipboard-check:before { content: fa-content($fa-var-clipboard-check); }
-.#{$fa-css-prefix}-clipboard-list:before { content: fa-content($fa-var-clipboard-list); }
-.#{$fa-css-prefix}-clock:before { content: fa-content($fa-var-clock); }
-.#{$fa-css-prefix}-clone:before { content: fa-content($fa-var-clone); }
-.#{$fa-css-prefix}-closed-captioning:before { content: fa-content($fa-var-closed-captioning); }
-.#{$fa-css-prefix}-cloud:before { content: fa-content($fa-var-cloud); }
-.#{$fa-css-prefix}-cloud-download-alt:before { content: fa-content($fa-var-cloud-download-alt); }
-.#{$fa-css-prefix}-cloud-meatball:before { content: fa-content($fa-var-cloud-meatball); }
-.#{$fa-css-prefix}-cloud-moon:before { content: fa-content($fa-var-cloud-moon); }
-.#{$fa-css-prefix}-cloud-moon-rain:before { content: fa-content($fa-var-cloud-moon-rain); }
-.#{$fa-css-prefix}-cloud-rain:before { content: fa-content($fa-var-cloud-rain); }
-.#{$fa-css-prefix}-cloud-showers-heavy:before { content: fa-content($fa-var-cloud-showers-heavy); }
-.#{$fa-css-prefix}-cloud-sun:before { content: fa-content($fa-var-cloud-sun); }
-.#{$fa-css-prefix}-cloud-sun-rain:before { content: fa-content($fa-var-cloud-sun-rain); }
-.#{$fa-css-prefix}-cloud-upload-alt:before { content: fa-content($fa-var-cloud-upload-alt); }
-.#{$fa-css-prefix}-cloudscale:before { content: fa-content($fa-var-cloudscale); }
-.#{$fa-css-prefix}-cloudsmith:before { content: fa-content($fa-var-cloudsmith); }
-.#{$fa-css-prefix}-cloudversify:before { content: fa-content($fa-var-cloudversify); }
-.#{$fa-css-prefix}-cocktail:before { content: fa-content($fa-var-cocktail); }
-.#{$fa-css-prefix}-code:before { content: fa-content($fa-var-code); }
-.#{$fa-css-prefix}-code-branch:before { content: fa-content($fa-var-code-branch); }
-.#{$fa-css-prefix}-codepen:before { content: fa-content($fa-var-codepen); }
-.#{$fa-css-prefix}-codiepie:before { content: fa-content($fa-var-codiepie); }
-.#{$fa-css-prefix}-coffee:before { content: fa-content($fa-var-coffee); }
-.#{$fa-css-prefix}-cog:before { content: fa-content($fa-var-cog); }
-.#{$fa-css-prefix}-cogs:before { content: fa-content($fa-var-cogs); }
-.#{$fa-css-prefix}-coins:before { content: fa-content($fa-var-coins); }
-.#{$fa-css-prefix}-columns:before { content: fa-content($fa-var-columns); }
-.#{$fa-css-prefix}-comment:before { content: fa-content($fa-var-comment); }
-.#{$fa-css-prefix}-comment-alt:before { content: fa-content($fa-var-comment-alt); }
-.#{$fa-css-prefix}-comment-dollar:before { content: fa-content($fa-var-comment-dollar); }
-.#{$fa-css-prefix}-comment-dots:before { content: fa-content($fa-var-comment-dots); }
-.#{$fa-css-prefix}-comment-medical:before { content: fa-content($fa-var-comment-medical); }
-.#{$fa-css-prefix}-comment-slash:before { content: fa-content($fa-var-comment-slash); }
-.#{$fa-css-prefix}-comments:before { content: fa-content($fa-var-comments); }
-.#{$fa-css-prefix}-comments-dollar:before { content: fa-content($fa-var-comments-dollar); }
-.#{$fa-css-prefix}-compact-disc:before { content: fa-content($fa-var-compact-disc); }
-.#{$fa-css-prefix}-compass:before { content: fa-content($fa-var-compass); }
-.#{$fa-css-prefix}-compress:before { content: fa-content($fa-var-compress); }
-.#{$fa-css-prefix}-compress-alt:before { content: fa-content($fa-var-compress-alt); }
-.#{$fa-css-prefix}-compress-arrows-alt:before { content: fa-content($fa-var-compress-arrows-alt); }
-.#{$fa-css-prefix}-concierge-bell:before { content: fa-content($fa-var-concierge-bell); }
-.#{$fa-css-prefix}-confluence:before { content: fa-content($fa-var-confluence); }
-.#{$fa-css-prefix}-connectdevelop:before { content: fa-content($fa-var-connectdevelop); }
-.#{$fa-css-prefix}-contao:before { content: fa-content($fa-var-contao); }
-.#{$fa-css-prefix}-cookie:before { content: fa-content($fa-var-cookie); }
-.#{$fa-css-prefix}-cookie-bite:before { content: fa-content($fa-var-cookie-bite); }
-.#{$fa-css-prefix}-copy:before { content: fa-content($fa-var-copy); }
-.#{$fa-css-prefix}-copyright:before { content: fa-content($fa-var-copyright); }
-.#{$fa-css-prefix}-cotton-bureau:before { content: fa-content($fa-var-cotton-bureau); }
-.#{$fa-css-prefix}-couch:before { content: fa-content($fa-var-couch); }
-.#{$fa-css-prefix}-cpanel:before { content: fa-content($fa-var-cpanel); }
-.#{$fa-css-prefix}-creative-commons:before { content: fa-content($fa-var-creative-commons); }
-.#{$fa-css-prefix}-creative-commons-by:before { content: fa-content($fa-var-creative-commons-by); }
-.#{$fa-css-prefix}-creative-commons-nc:before { content: fa-content($fa-var-creative-commons-nc); }
-.#{$fa-css-prefix}-creative-commons-nc-eu:before { content: fa-content($fa-var-creative-commons-nc-eu); }
-.#{$fa-css-prefix}-creative-commons-nc-jp:before { content: fa-content($fa-var-creative-commons-nc-jp); }
-.#{$fa-css-prefix}-creative-commons-nd:before { content: fa-content($fa-var-creative-commons-nd); }
-.#{$fa-css-prefix}-creative-commons-pd:before { content: fa-content($fa-var-creative-commons-pd); }
-.#{$fa-css-prefix}-creative-commons-pd-alt:before { content: fa-content($fa-var-creative-commons-pd-alt); }
-.#{$fa-css-prefix}-creative-commons-remix:before { content: fa-content($fa-var-creative-commons-remix); }
-.#{$fa-css-prefix}-creative-commons-sa:before { content: fa-content($fa-var-creative-commons-sa); }
-.#{$fa-css-prefix}-creative-commons-sampling:before { content: fa-content($fa-var-creative-commons-sampling); }
-.#{$fa-css-prefix}-creative-commons-sampling-plus:before { content: fa-content($fa-var-creative-commons-sampling-plus); }
-.#{$fa-css-prefix}-creative-commons-share:before { content: fa-content($fa-var-creative-commons-share); }
-.#{$fa-css-prefix}-creative-commons-zero:before { content: fa-content($fa-var-creative-commons-zero); }
-.#{$fa-css-prefix}-credit-card:before { content: fa-content($fa-var-credit-card); }
-.#{$fa-css-prefix}-critical-role:before { content: fa-content($fa-var-critical-role); }
-.#{$fa-css-prefix}-crop:before { content: fa-content($fa-var-crop); }
-.#{$fa-css-prefix}-crop-alt:before { content: fa-content($fa-var-crop-alt); }
-.#{$fa-css-prefix}-cross:before { content: fa-content($fa-var-cross); }
-.#{$fa-css-prefix}-crosshairs:before { content: fa-content($fa-var-crosshairs); }
-.#{$fa-css-prefix}-crow:before { content: fa-content($fa-var-crow); }
-.#{$fa-css-prefix}-crown:before { content: fa-content($fa-var-crown); }
-.#{$fa-css-prefix}-crutch:before { content: fa-content($fa-var-crutch); }
-.#{$fa-css-prefix}-css3:before { content: fa-content($fa-var-css3); }
-.#{$fa-css-prefix}-css3-alt:before { content: fa-content($fa-var-css3-alt); }
-.#{$fa-css-prefix}-cube:before { content: fa-content($fa-var-cube); }
-.#{$fa-css-prefix}-cubes:before { content: fa-content($fa-var-cubes); }
-.#{$fa-css-prefix}-cut:before { content: fa-content($fa-var-cut); }
-.#{$fa-css-prefix}-cuttlefish:before { content: fa-content($fa-var-cuttlefish); }
-.#{$fa-css-prefix}-d-and-d:before { content: fa-content($fa-var-d-and-d); }
-.#{$fa-css-prefix}-d-and-d-beyond:before { content: fa-content($fa-var-d-and-d-beyond); }
-.#{$fa-css-prefix}-dailymotion:before { content: fa-content($fa-var-dailymotion); }
-.#{$fa-css-prefix}-dashcube:before { content: fa-content($fa-var-dashcube); }
-.#{$fa-css-prefix}-database:before { content: fa-content($fa-var-database); }
-.#{$fa-css-prefix}-deaf:before { content: fa-content($fa-var-deaf); }
-.#{$fa-css-prefix}-deezer:before { content: fa-content($fa-var-deezer); }
-.#{$fa-css-prefix}-delicious:before { content: fa-content($fa-var-delicious); }
-.#{$fa-css-prefix}-democrat:before { content: fa-content($fa-var-democrat); }
-.#{$fa-css-prefix}-deploydog:before { content: fa-content($fa-var-deploydog); }
-.#{$fa-css-prefix}-deskpro:before { content: fa-content($fa-var-deskpro); }
-.#{$fa-css-prefix}-desktop:before { content: fa-content($fa-var-desktop); }
-.#{$fa-css-prefix}-dev:before { content: fa-content($fa-var-dev); }
-.#{$fa-css-prefix}-deviantart:before { content: fa-content($fa-var-deviantart); }
-.#{$fa-css-prefix}-dharmachakra:before { content: fa-content($fa-var-dharmachakra); }
-.#{$fa-css-prefix}-dhl:before { content: fa-content($fa-var-dhl); }
-.#{$fa-css-prefix}-diagnoses:before { content: fa-content($fa-var-diagnoses); }
-.#{$fa-css-prefix}-diaspora:before { content: fa-content($fa-var-diaspora); }
-.#{$fa-css-prefix}-dice:before { content: fa-content($fa-var-dice); }
-.#{$fa-css-prefix}-dice-d20:before { content: fa-content($fa-var-dice-d20); }
-.#{$fa-css-prefix}-dice-d6:before { content: fa-content($fa-var-dice-d6); }
-.#{$fa-css-prefix}-dice-five:before { content: fa-content($fa-var-dice-five); }
-.#{$fa-css-prefix}-dice-four:before { content: fa-content($fa-var-dice-four); }
-.#{$fa-css-prefix}-dice-one:before { content: fa-content($fa-var-dice-one); }
-.#{$fa-css-prefix}-dice-six:before { content: fa-content($fa-var-dice-six); }
-.#{$fa-css-prefix}-dice-three:before { content: fa-content($fa-var-dice-three); }
-.#{$fa-css-prefix}-dice-two:before { content: fa-content($fa-var-dice-two); }
-.#{$fa-css-prefix}-digg:before { content: fa-content($fa-var-digg); }
-.#{$fa-css-prefix}-digital-ocean:before { content: fa-content($fa-var-digital-ocean); }
-.#{$fa-css-prefix}-digital-tachograph:before { content: fa-content($fa-var-digital-tachograph); }
-.#{$fa-css-prefix}-directions:before { content: fa-content($fa-var-directions); }
-.#{$fa-css-prefix}-discord:before { content: fa-content($fa-var-discord); }
-.#{$fa-css-prefix}-discourse:before { content: fa-content($fa-var-discourse); }
-.#{$fa-css-prefix}-disease:before { content: fa-content($fa-var-disease); }
-.#{$fa-css-prefix}-divide:before { content: fa-content($fa-var-divide); }
-.#{$fa-css-prefix}-dizzy:before { content: fa-content($fa-var-dizzy); }
-.#{$fa-css-prefix}-dna:before { content: fa-content($fa-var-dna); }
-.#{$fa-css-prefix}-dochub:before { content: fa-content($fa-var-dochub); }
-.#{$fa-css-prefix}-docker:before { content: fa-content($fa-var-docker); }
-.#{$fa-css-prefix}-dog:before { content: fa-content($fa-var-dog); }
-.#{$fa-css-prefix}-dollar-sign:before { content: fa-content($fa-var-dollar-sign); }
-.#{$fa-css-prefix}-dolly:before { content: fa-content($fa-var-dolly); }
-.#{$fa-css-prefix}-dolly-flatbed:before { content: fa-content($fa-var-dolly-flatbed); }
-.#{$fa-css-prefix}-donate:before { content: fa-content($fa-var-donate); }
-.#{$fa-css-prefix}-door-closed:before { content: fa-content($fa-var-door-closed); }
-.#{$fa-css-prefix}-door-open:before { content: fa-content($fa-var-door-open); }
-.#{$fa-css-prefix}-dot-circle:before { content: fa-content($fa-var-dot-circle); }
-.#{$fa-css-prefix}-dove:before { content: fa-content($fa-var-dove); }
-.#{$fa-css-prefix}-download:before { content: fa-content($fa-var-download); }
-.#{$fa-css-prefix}-draft2digital:before { content: fa-content($fa-var-draft2digital); }
-.#{$fa-css-prefix}-drafting-compass:before { content: fa-content($fa-var-drafting-compass); }
-.#{$fa-css-prefix}-dragon:before { content: fa-content($fa-var-dragon); }
-.#{$fa-css-prefix}-draw-polygon:before { content: fa-content($fa-var-draw-polygon); }
-.#{$fa-css-prefix}-dribbble:before { content: fa-content($fa-var-dribbble); }
-.#{$fa-css-prefix}-dribbble-square:before { content: fa-content($fa-var-dribbble-square); }
-.#{$fa-css-prefix}-dropbox:before { content: fa-content($fa-var-dropbox); }
-.#{$fa-css-prefix}-drum:before { content: fa-content($fa-var-drum); }
-.#{$fa-css-prefix}-drum-steelpan:before { content: fa-content($fa-var-drum-steelpan); }
-.#{$fa-css-prefix}-drumstick-bite:before { content: fa-content($fa-var-drumstick-bite); }
-.#{$fa-css-prefix}-drupal:before { content: fa-content($fa-var-drupal); }
-.#{$fa-css-prefix}-dumbbell:before { content: fa-content($fa-var-dumbbell); }
-.#{$fa-css-prefix}-dumpster:before { content: fa-content($fa-var-dumpster); }
-.#{$fa-css-prefix}-dumpster-fire:before { content: fa-content($fa-var-dumpster-fire); }
-.#{$fa-css-prefix}-dungeon:before { content: fa-content($fa-var-dungeon); }
-.#{$fa-css-prefix}-dyalog:before { content: fa-content($fa-var-dyalog); }
-.#{$fa-css-prefix}-earlybirds:before { content: fa-content($fa-var-earlybirds); }
-.#{$fa-css-prefix}-ebay:before { content: fa-content($fa-var-ebay); }
-.#{$fa-css-prefix}-edge:before { content: fa-content($fa-var-edge); }
-.#{$fa-css-prefix}-edge-legacy:before { content: fa-content($fa-var-edge-legacy); }
-.#{$fa-css-prefix}-edit:before { content: fa-content($fa-var-edit); }
-.#{$fa-css-prefix}-egg:before { content: fa-content($fa-var-egg); }
-.#{$fa-css-prefix}-eject:before { content: fa-content($fa-var-eject); }
-.#{$fa-css-prefix}-elementor:before { content: fa-content($fa-var-elementor); }
-.#{$fa-css-prefix}-ellipsis-h:before { content: fa-content($fa-var-ellipsis-h); }
-.#{$fa-css-prefix}-ellipsis-v:before { content: fa-content($fa-var-ellipsis-v); }
-.#{$fa-css-prefix}-ello:before { content: fa-content($fa-var-ello); }
-.#{$fa-css-prefix}-ember:before { content: fa-content($fa-var-ember); }
-.#{$fa-css-prefix}-empire:before { content: fa-content($fa-var-empire); }
-.#{$fa-css-prefix}-envelope:before { content: fa-content($fa-var-envelope); }
-.#{$fa-css-prefix}-envelope-open:before { content: fa-content($fa-var-envelope-open); }
-.#{$fa-css-prefix}-envelope-open-text:before { content: fa-content($fa-var-envelope-open-text); }
-.#{$fa-css-prefix}-envelope-square:before { content: fa-content($fa-var-envelope-square); }
-.#{$fa-css-prefix}-envira:before { content: fa-content($fa-var-envira); }
-.#{$fa-css-prefix}-equals:before { content: fa-content($fa-var-equals); }
-.#{$fa-css-prefix}-eraser:before { content: fa-content($fa-var-eraser); }
-.#{$fa-css-prefix}-erlang:before { content: fa-content($fa-var-erlang); }
-.#{$fa-css-prefix}-ethereum:before { content: fa-content($fa-var-ethereum); }
-.#{$fa-css-prefix}-ethernet:before { content: fa-content($fa-var-ethernet); }
-.#{$fa-css-prefix}-etsy:before { content: fa-content($fa-var-etsy); }
-.#{$fa-css-prefix}-euro-sign:before { content: fa-content($fa-var-euro-sign); }
-.#{$fa-css-prefix}-evernote:before { content: fa-content($fa-var-evernote); }
-.#{$fa-css-prefix}-exchange-alt:before { content: fa-content($fa-var-exchange-alt); }
-.#{$fa-css-prefix}-exclamation:before { content: fa-content($fa-var-exclamation); }
-.#{$fa-css-prefix}-exclamation-circle:before { content: fa-content($fa-var-exclamation-circle); }
-.#{$fa-css-prefix}-exclamation-triangle:before { content: fa-content($fa-var-exclamation-triangle); }
-.#{$fa-css-prefix}-expand:before { content: fa-content($fa-var-expand); }
-.#{$fa-css-prefix}-expand-alt:before { content: fa-content($fa-var-expand-alt); }
-.#{$fa-css-prefix}-expand-arrows-alt:before { content: fa-content($fa-var-expand-arrows-alt); }
-.#{$fa-css-prefix}-expeditedssl:before { content: fa-content($fa-var-expeditedssl); }
-.#{$fa-css-prefix}-external-link-alt:before { content: fa-content($fa-var-external-link-alt); }
-.#{$fa-css-prefix}-external-link-square-alt:before { content: fa-content($fa-var-external-link-square-alt); }
-.#{$fa-css-prefix}-eye:before { content: fa-content($fa-var-eye); }
-.#{$fa-css-prefix}-eye-dropper:before { content: fa-content($fa-var-eye-dropper); }
-.#{$fa-css-prefix}-eye-slash:before { content: fa-content($fa-var-eye-slash); }
-.#{$fa-css-prefix}-facebook:before { content: fa-content($fa-var-facebook); }
-.#{$fa-css-prefix}-facebook-f:before { content: fa-content($fa-var-facebook-f); }
-.#{$fa-css-prefix}-facebook-messenger:before { content: fa-content($fa-var-facebook-messenger); }
-.#{$fa-css-prefix}-facebook-square:before { content: fa-content($fa-var-facebook-square); }
-.#{$fa-css-prefix}-fan:before { content: fa-content($fa-var-fan); }
-.#{$fa-css-prefix}-fantasy-flight-games:before { content: fa-content($fa-var-fantasy-flight-games); }
-.#{$fa-css-prefix}-fast-backward:before { content: fa-content($fa-var-fast-backward); }
-.#{$fa-css-prefix}-fast-forward:before { content: fa-content($fa-var-fast-forward); }
-.#{$fa-css-prefix}-faucet:before { content: fa-content($fa-var-faucet); }
-.#{$fa-css-prefix}-fax:before { content: fa-content($fa-var-fax); }
-.#{$fa-css-prefix}-feather:before { content: fa-content($fa-var-feather); }
-.#{$fa-css-prefix}-feather-alt:before { content: fa-content($fa-var-feather-alt); }
-.#{$fa-css-prefix}-fedex:before { content: fa-content($fa-var-fedex); }
-.#{$fa-css-prefix}-fedora:before { content: fa-content($fa-var-fedora); }
-.#{$fa-css-prefix}-female:before { content: fa-content($fa-var-female); }
-.#{$fa-css-prefix}-fighter-jet:before { content: fa-content($fa-var-fighter-jet); }
-.#{$fa-css-prefix}-figma:before { content: fa-content($fa-var-figma); }
-.#{$fa-css-prefix}-file:before { content: fa-content($fa-var-file); }
-.#{$fa-css-prefix}-file-alt:before { content: fa-content($fa-var-file-alt); }
-.#{$fa-css-prefix}-file-archive:before { content: fa-content($fa-var-file-archive); }
-.#{$fa-css-prefix}-file-audio:before { content: fa-content($fa-var-file-audio); }
-.#{$fa-css-prefix}-file-code:before { content: fa-content($fa-var-file-code); }
-.#{$fa-css-prefix}-file-contract:before { content: fa-content($fa-var-file-contract); }
-.#{$fa-css-prefix}-file-csv:before { content: fa-content($fa-var-file-csv); }
-.#{$fa-css-prefix}-file-download:before { content: fa-content($fa-var-file-download); }
-.#{$fa-css-prefix}-file-excel:before { content: fa-content($fa-var-file-excel); }
-.#{$fa-css-prefix}-file-export:before { content: fa-content($fa-var-file-export); }
-.#{$fa-css-prefix}-file-image:before { content: fa-content($fa-var-file-image); }
-.#{$fa-css-prefix}-file-import:before { content: fa-content($fa-var-file-import); }
-.#{$fa-css-prefix}-file-invoice:before { content: fa-content($fa-var-file-invoice); }
-.#{$fa-css-prefix}-file-invoice-dollar:before { content: fa-content($fa-var-file-invoice-dollar); }
-.#{$fa-css-prefix}-file-medical:before { content: fa-content($fa-var-file-medical); }
-.#{$fa-css-prefix}-file-medical-alt:before { content: fa-content($fa-var-file-medical-alt); }
-.#{$fa-css-prefix}-file-pdf:before { content: fa-content($fa-var-file-pdf); }
-.#{$fa-css-prefix}-file-powerpoint:before { content: fa-content($fa-var-file-powerpoint); }
-.#{$fa-css-prefix}-file-prescription:before { content: fa-content($fa-var-file-prescription); }
-.#{$fa-css-prefix}-file-signature:before { content: fa-content($fa-var-file-signature); }
-.#{$fa-css-prefix}-file-upload:before { content: fa-content($fa-var-file-upload); }
-.#{$fa-css-prefix}-file-video:before { content: fa-content($fa-var-file-video); }
-.#{$fa-css-prefix}-file-word:before { content: fa-content($fa-var-file-word); }
-.#{$fa-css-prefix}-fill:before { content: fa-content($fa-var-fill); }
-.#{$fa-css-prefix}-fill-drip:before { content: fa-content($fa-var-fill-drip); }
-.#{$fa-css-prefix}-film:before { content: fa-content($fa-var-film); }
-.#{$fa-css-prefix}-filter:before { content: fa-content($fa-var-filter); }
-.#{$fa-css-prefix}-fingerprint:before { content: fa-content($fa-var-fingerprint); }
-.#{$fa-css-prefix}-fire:before { content: fa-content($fa-var-fire); }
-.#{$fa-css-prefix}-fire-alt:before { content: fa-content($fa-var-fire-alt); }
-.#{$fa-css-prefix}-fire-extinguisher:before { content: fa-content($fa-var-fire-extinguisher); }
-.#{$fa-css-prefix}-firefox:before { content: fa-content($fa-var-firefox); }
-.#{$fa-css-prefix}-firefox-browser:before { content: fa-content($fa-var-firefox-browser); }
-.#{$fa-css-prefix}-first-aid:before { content: fa-content($fa-var-first-aid); }
-.#{$fa-css-prefix}-first-order:before { content: fa-content($fa-var-first-order); }
-.#{$fa-css-prefix}-first-order-alt:before { content: fa-content($fa-var-first-order-alt); }
-.#{$fa-css-prefix}-firstdraft:before { content: fa-content($fa-var-firstdraft); }
-.#{$fa-css-prefix}-fish:before { content: fa-content($fa-var-fish); }
-.#{$fa-css-prefix}-fist-raised:before { content: fa-content($fa-var-fist-raised); }
-.#{$fa-css-prefix}-flag:before { content: fa-content($fa-var-flag); }
-.#{$fa-css-prefix}-flag-checkered:before { content: fa-content($fa-var-flag-checkered); }
-.#{$fa-css-prefix}-flag-usa:before { content: fa-content($fa-var-flag-usa); }
-.#{$fa-css-prefix}-flask:before { content: fa-content($fa-var-flask); }
-.#{$fa-css-prefix}-flickr:before { content: fa-content($fa-var-flickr); }
-.#{$fa-css-prefix}-flipboard:before { content: fa-content($fa-var-flipboard); }
-.#{$fa-css-prefix}-flushed:before { content: fa-content($fa-var-flushed); }
-.#{$fa-css-prefix}-fly:before { content: fa-content($fa-var-fly); }
-.#{$fa-css-prefix}-folder:before { content: fa-content($fa-var-folder); }
-.#{$fa-css-prefix}-folder-minus:before { content: fa-content($fa-var-folder-minus); }
-.#{$fa-css-prefix}-folder-open:before { content: fa-content($fa-var-folder-open); }
-.#{$fa-css-prefix}-folder-plus:before { content: fa-content($fa-var-folder-plus); }
-.#{$fa-css-prefix}-font:before { content: fa-content($fa-var-font); }
-.#{$fa-css-prefix}-font-awesome:before { content: fa-content($fa-var-font-awesome); }
-.#{$fa-css-prefix}-font-awesome-alt:before { content: fa-content($fa-var-font-awesome-alt); }
-.#{$fa-css-prefix}-font-awesome-flag:before { content: fa-content($fa-var-font-awesome-flag); }
-.#{$fa-css-prefix}-font-awesome-logo-full:before { content: fa-content($fa-var-font-awesome-logo-full); }
-.#{$fa-css-prefix}-fonticons:before { content: fa-content($fa-var-fonticons); }
-.#{$fa-css-prefix}-fonticons-fi:before { content: fa-content($fa-var-fonticons-fi); }
-.#{$fa-css-prefix}-football-ball:before { content: fa-content($fa-var-football-ball); }
-.#{$fa-css-prefix}-fort-awesome:before { content: fa-content($fa-var-fort-awesome); }
-.#{$fa-css-prefix}-fort-awesome-alt:before { content: fa-content($fa-var-fort-awesome-alt); }
-.#{$fa-css-prefix}-forumbee:before { content: fa-content($fa-var-forumbee); }
-.#{$fa-css-prefix}-forward:before { content: fa-content($fa-var-forward); }
-.#{$fa-css-prefix}-foursquare:before { content: fa-content($fa-var-foursquare); }
-.#{$fa-css-prefix}-free-code-camp:before { content: fa-content($fa-var-free-code-camp); }
-.#{$fa-css-prefix}-freebsd:before { content: fa-content($fa-var-freebsd); }
-.#{$fa-css-prefix}-frog:before { content: fa-content($fa-var-frog); }
-.#{$fa-css-prefix}-frown:before { content: fa-content($fa-var-frown); }
-.#{$fa-css-prefix}-frown-open:before { content: fa-content($fa-var-frown-open); }
-.#{$fa-css-prefix}-fulcrum:before { content: fa-content($fa-var-fulcrum); }
-.#{$fa-css-prefix}-funnel-dollar:before { content: fa-content($fa-var-funnel-dollar); }
-.#{$fa-css-prefix}-futbol:before { content: fa-content($fa-var-futbol); }
-.#{$fa-css-prefix}-galactic-republic:before { content: fa-content($fa-var-galactic-republic); }
-.#{$fa-css-prefix}-galactic-senate:before { content: fa-content($fa-var-galactic-senate); }
-.#{$fa-css-prefix}-gamepad:before { content: fa-content($fa-var-gamepad); }
-.#{$fa-css-prefix}-gas-pump:before { content: fa-content($fa-var-gas-pump); }
-.#{$fa-css-prefix}-gavel:before { content: fa-content($fa-var-gavel); }
-.#{$fa-css-prefix}-gem:before { content: fa-content($fa-var-gem); }
-.#{$fa-css-prefix}-genderless:before { content: fa-content($fa-var-genderless); }
-.#{$fa-css-prefix}-get-pocket:before { content: fa-content($fa-var-get-pocket); }
-.#{$fa-css-prefix}-gg:before { content: fa-content($fa-var-gg); }
-.#{$fa-css-prefix}-gg-circle:before { content: fa-content($fa-var-gg-circle); }
-.#{$fa-css-prefix}-ghost:before { content: fa-content($fa-var-ghost); }
-.#{$fa-css-prefix}-gift:before { content: fa-content($fa-var-gift); }
-.#{$fa-css-prefix}-gifts:before { content: fa-content($fa-var-gifts); }
-.#{$fa-css-prefix}-git:before { content: fa-content($fa-var-git); }
-.#{$fa-css-prefix}-git-alt:before { content: fa-content($fa-var-git-alt); }
-.#{$fa-css-prefix}-git-square:before { content: fa-content($fa-var-git-square); }
-.#{$fa-css-prefix}-github:before { content: fa-content($fa-var-github); }
-.#{$fa-css-prefix}-github-alt:before { content: fa-content($fa-var-github-alt); }
-.#{$fa-css-prefix}-github-square:before { content: fa-content($fa-var-github-square); }
-.#{$fa-css-prefix}-gitkraken:before { content: fa-content($fa-var-gitkraken); }
-.#{$fa-css-prefix}-gitlab:before { content: fa-content($fa-var-gitlab); }
-.#{$fa-css-prefix}-gitter:before { content: fa-content($fa-var-gitter); }
-.#{$fa-css-prefix}-glass-cheers:before { content: fa-content($fa-var-glass-cheers); }
-.#{$fa-css-prefix}-glass-martini:before { content: fa-content($fa-var-glass-martini); }
-.#{$fa-css-prefix}-glass-martini-alt:before { content: fa-content($fa-var-glass-martini-alt); }
-.#{$fa-css-prefix}-glass-whiskey:before { content: fa-content($fa-var-glass-whiskey); }
-.#{$fa-css-prefix}-glasses:before { content: fa-content($fa-var-glasses); }
-.#{$fa-css-prefix}-glide:before { content: fa-content($fa-var-glide); }
-.#{$fa-css-prefix}-glide-g:before { content: fa-content($fa-var-glide-g); }
-.#{$fa-css-prefix}-globe:before { content: fa-content($fa-var-globe); }
-.#{$fa-css-prefix}-globe-africa:before { content: fa-content($fa-var-globe-africa); }
-.#{$fa-css-prefix}-globe-americas:before { content: fa-content($fa-var-globe-americas); }
-.#{$fa-css-prefix}-globe-asia:before { content: fa-content($fa-var-globe-asia); }
-.#{$fa-css-prefix}-globe-europe:before { content: fa-content($fa-var-globe-europe); }
-.#{$fa-css-prefix}-gofore:before { content: fa-content($fa-var-gofore); }
-.#{$fa-css-prefix}-golf-ball:before { content: fa-content($fa-var-golf-ball); }
-.#{$fa-css-prefix}-goodreads:before { content: fa-content($fa-var-goodreads); }
-.#{$fa-css-prefix}-goodreads-g:before { content: fa-content($fa-var-goodreads-g); }
-.#{$fa-css-prefix}-google:before { content: fa-content($fa-var-google); }
-.#{$fa-css-prefix}-google-drive:before { content: fa-content($fa-var-google-drive); }
-.#{$fa-css-prefix}-google-pay:before { content: fa-content($fa-var-google-pay); }
-.#{$fa-css-prefix}-google-play:before { content: fa-content($fa-var-google-play); }
-.#{$fa-css-prefix}-google-plus:before { content: fa-content($fa-var-google-plus); }
-.#{$fa-css-prefix}-google-plus-g:before { content: fa-content($fa-var-google-plus-g); }
-.#{$fa-css-prefix}-google-plus-square:before { content: fa-content($fa-var-google-plus-square); }
-.#{$fa-css-prefix}-google-wallet:before { content: fa-content($fa-var-google-wallet); }
-.#{$fa-css-prefix}-gopuram:before { content: fa-content($fa-var-gopuram); }
-.#{$fa-css-prefix}-graduation-cap:before { content: fa-content($fa-var-graduation-cap); }
-.#{$fa-css-prefix}-gratipay:before { content: fa-content($fa-var-gratipay); }
-.#{$fa-css-prefix}-grav:before { content: fa-content($fa-var-grav); }
-.#{$fa-css-prefix}-greater-than:before { content: fa-content($fa-var-greater-than); }
-.#{$fa-css-prefix}-greater-than-equal:before { content: fa-content($fa-var-greater-than-equal); }
-.#{$fa-css-prefix}-grimace:before { content: fa-content($fa-var-grimace); }
-.#{$fa-css-prefix}-grin:before { content: fa-content($fa-var-grin); }
-.#{$fa-css-prefix}-grin-alt:before { content: fa-content($fa-var-grin-alt); }
-.#{$fa-css-prefix}-grin-beam:before { content: fa-content($fa-var-grin-beam); }
-.#{$fa-css-prefix}-grin-beam-sweat:before { content: fa-content($fa-var-grin-beam-sweat); }
-.#{$fa-css-prefix}-grin-hearts:before { content: fa-content($fa-var-grin-hearts); }
-.#{$fa-css-prefix}-grin-squint:before { content: fa-content($fa-var-grin-squint); }
-.#{$fa-css-prefix}-grin-squint-tears:before { content: fa-content($fa-var-grin-squint-tears); }
-.#{$fa-css-prefix}-grin-stars:before { content: fa-content($fa-var-grin-stars); }
-.#{$fa-css-prefix}-grin-tears:before { content: fa-content($fa-var-grin-tears); }
-.#{$fa-css-prefix}-grin-tongue:before { content: fa-content($fa-var-grin-tongue); }
-.#{$fa-css-prefix}-grin-tongue-squint:before { content: fa-content($fa-var-grin-tongue-squint); }
-.#{$fa-css-prefix}-grin-tongue-wink:before { content: fa-content($fa-var-grin-tongue-wink); }
-.#{$fa-css-prefix}-grin-wink:before { content: fa-content($fa-var-grin-wink); }
-.#{$fa-css-prefix}-grip-horizontal:before { content: fa-content($fa-var-grip-horizontal); }
-.#{$fa-css-prefix}-grip-lines:before { content: fa-content($fa-var-grip-lines); }
-.#{$fa-css-prefix}-grip-lines-vertical:before { content: fa-content($fa-var-grip-lines-vertical); }
-.#{$fa-css-prefix}-grip-vertical:before { content: fa-content($fa-var-grip-vertical); }
-.#{$fa-css-prefix}-gripfire:before { content: fa-content($fa-var-gripfire); }
-.#{$fa-css-prefix}-grunt:before { content: fa-content($fa-var-grunt); }
-.#{$fa-css-prefix}-guitar:before { content: fa-content($fa-var-guitar); }
-.#{$fa-css-prefix}-gulp:before { content: fa-content($fa-var-gulp); }
-.#{$fa-css-prefix}-h-square:before { content: fa-content($fa-var-h-square); }
-.#{$fa-css-prefix}-hacker-news:before { content: fa-content($fa-var-hacker-news); }
-.#{$fa-css-prefix}-hacker-news-square:before { content: fa-content($fa-var-hacker-news-square); }
-.#{$fa-css-prefix}-hackerrank:before { content: fa-content($fa-var-hackerrank); }
-.#{$fa-css-prefix}-hamburger:before { content: fa-content($fa-var-hamburger); }
-.#{$fa-css-prefix}-hammer:before { content: fa-content($fa-var-hammer); }
-.#{$fa-css-prefix}-hamsa:before { content: fa-content($fa-var-hamsa); }
-.#{$fa-css-prefix}-hand-holding:before { content: fa-content($fa-var-hand-holding); }
-.#{$fa-css-prefix}-hand-holding-heart:before { content: fa-content($fa-var-hand-holding-heart); }
-.#{$fa-css-prefix}-hand-holding-medical:before { content: fa-content($fa-var-hand-holding-medical); }
-.#{$fa-css-prefix}-hand-holding-usd:before { content: fa-content($fa-var-hand-holding-usd); }
-.#{$fa-css-prefix}-hand-holding-water:before { content: fa-content($fa-var-hand-holding-water); }
-.#{$fa-css-prefix}-hand-lizard:before { content: fa-content($fa-var-hand-lizard); }
-.#{$fa-css-prefix}-hand-middle-finger:before { content: fa-content($fa-var-hand-middle-finger); }
-.#{$fa-css-prefix}-hand-paper:before { content: fa-content($fa-var-hand-paper); }
-.#{$fa-css-prefix}-hand-peace:before { content: fa-content($fa-var-hand-peace); }
-.#{$fa-css-prefix}-hand-point-down:before { content: fa-content($fa-var-hand-point-down); }
-.#{$fa-css-prefix}-hand-point-left:before { content: fa-content($fa-var-hand-point-left); }
-.#{$fa-css-prefix}-hand-point-right:before { content: fa-content($fa-var-hand-point-right); }
-.#{$fa-css-prefix}-hand-point-up:before { content: fa-content($fa-var-hand-point-up); }
-.#{$fa-css-prefix}-hand-pointer:before { content: fa-content($fa-var-hand-pointer); }
-.#{$fa-css-prefix}-hand-rock:before { content: fa-content($fa-var-hand-rock); }
-.#{$fa-css-prefix}-hand-scissors:before { content: fa-content($fa-var-hand-scissors); }
-.#{$fa-css-prefix}-hand-sparkles:before { content: fa-content($fa-var-hand-sparkles); }
-.#{$fa-css-prefix}-hand-spock:before { content: fa-content($fa-var-hand-spock); }
-.#{$fa-css-prefix}-hands:before { content: fa-content($fa-var-hands); }
-.#{$fa-css-prefix}-hands-helping:before { content: fa-content($fa-var-hands-helping); }
-.#{$fa-css-prefix}-hands-wash:before { content: fa-content($fa-var-hands-wash); }
-.#{$fa-css-prefix}-handshake:before { content: fa-content($fa-var-handshake); }
-.#{$fa-css-prefix}-handshake-alt-slash:before { content: fa-content($fa-var-handshake-alt-slash); }
-.#{$fa-css-prefix}-handshake-slash:before { content: fa-content($fa-var-handshake-slash); }
-.#{$fa-css-prefix}-hanukiah:before { content: fa-content($fa-var-hanukiah); }
-.#{$fa-css-prefix}-hard-hat:before { content: fa-content($fa-var-hard-hat); }
-.#{$fa-css-prefix}-hashtag:before { content: fa-content($fa-var-hashtag); }
-.#{$fa-css-prefix}-hat-cowboy:before { content: fa-content($fa-var-hat-cowboy); }
-.#{$fa-css-prefix}-hat-cowboy-side:before { content: fa-content($fa-var-hat-cowboy-side); }
-.#{$fa-css-prefix}-hat-wizard:before { content: fa-content($fa-var-hat-wizard); }
-.#{$fa-css-prefix}-hdd:before { content: fa-content($fa-var-hdd); }
-.#{$fa-css-prefix}-head-side-cough:before { content: fa-content($fa-var-head-side-cough); }
-.#{$fa-css-prefix}-head-side-cough-slash:before { content: fa-content($fa-var-head-side-cough-slash); }
-.#{$fa-css-prefix}-head-side-mask:before { content: fa-content($fa-var-head-side-mask); }
-.#{$fa-css-prefix}-head-side-virus:before { content: fa-content($fa-var-head-side-virus); }
-.#{$fa-css-prefix}-heading:before { content: fa-content($fa-var-heading); }
-.#{$fa-css-prefix}-headphones:before { content: fa-content($fa-var-headphones); }
-.#{$fa-css-prefix}-headphones-alt:before { content: fa-content($fa-var-headphones-alt); }
-.#{$fa-css-prefix}-headset:before { content: fa-content($fa-var-headset); }
-.#{$fa-css-prefix}-heart:before { content: fa-content($fa-var-heart); }
-.#{$fa-css-prefix}-heart-broken:before { content: fa-content($fa-var-heart-broken); }
-.#{$fa-css-prefix}-heartbeat:before { content: fa-content($fa-var-heartbeat); }
-.#{$fa-css-prefix}-helicopter:before { content: fa-content($fa-var-helicopter); }
-.#{$fa-css-prefix}-highlighter:before { content: fa-content($fa-var-highlighter); }
-.#{$fa-css-prefix}-hiking:before { content: fa-content($fa-var-hiking); }
-.#{$fa-css-prefix}-hippo:before { content: fa-content($fa-var-hippo); }
-.#{$fa-css-prefix}-hips:before { content: fa-content($fa-var-hips); }
-.#{$fa-css-prefix}-hire-a-helper:before { content: fa-content($fa-var-hire-a-helper); }
-.#{$fa-css-prefix}-history:before { content: fa-content($fa-var-history); }
-.#{$fa-css-prefix}-hockey-puck:before { content: fa-content($fa-var-hockey-puck); }
-.#{$fa-css-prefix}-holly-berry:before { content: fa-content($fa-var-holly-berry); }
-.#{$fa-css-prefix}-home:before { content: fa-content($fa-var-home); }
-.#{$fa-css-prefix}-hooli:before { content: fa-content($fa-var-hooli); }
-.#{$fa-css-prefix}-hornbill:before { content: fa-content($fa-var-hornbill); }
-.#{$fa-css-prefix}-horse:before { content: fa-content($fa-var-horse); }
-.#{$fa-css-prefix}-horse-head:before { content: fa-content($fa-var-horse-head); }
-.#{$fa-css-prefix}-hospital:before { content: fa-content($fa-var-hospital); }
-.#{$fa-css-prefix}-hospital-alt:before { content: fa-content($fa-var-hospital-alt); }
-.#{$fa-css-prefix}-hospital-symbol:before { content: fa-content($fa-var-hospital-symbol); }
-.#{$fa-css-prefix}-hospital-user:before { content: fa-content($fa-var-hospital-user); }
-.#{$fa-css-prefix}-hot-tub:before { content: fa-content($fa-var-hot-tub); }
-.#{$fa-css-prefix}-hotdog:before { content: fa-content($fa-var-hotdog); }
-.#{$fa-css-prefix}-hotel:before { content: fa-content($fa-var-hotel); }
-.#{$fa-css-prefix}-hotjar:before { content: fa-content($fa-var-hotjar); }
-.#{$fa-css-prefix}-hourglass:before { content: fa-content($fa-var-hourglass); }
-.#{$fa-css-prefix}-hourglass-end:before { content: fa-content($fa-var-hourglass-end); }
-.#{$fa-css-prefix}-hourglass-half:before { content: fa-content($fa-var-hourglass-half); }
-.#{$fa-css-prefix}-hourglass-start:before { content: fa-content($fa-var-hourglass-start); }
-.#{$fa-css-prefix}-house-damage:before { content: fa-content($fa-var-house-damage); }
-.#{$fa-css-prefix}-house-user:before { content: fa-content($fa-var-house-user); }
-.#{$fa-css-prefix}-houzz:before { content: fa-content($fa-var-houzz); }
-.#{$fa-css-prefix}-hryvnia:before { content: fa-content($fa-var-hryvnia); }
-.#{$fa-css-prefix}-html5:before { content: fa-content($fa-var-html5); }
-.#{$fa-css-prefix}-hubspot:before { content: fa-content($fa-var-hubspot); }
-.#{$fa-css-prefix}-i-cursor:before { content: fa-content($fa-var-i-cursor); }
-.#{$fa-css-prefix}-ice-cream:before { content: fa-content($fa-var-ice-cream); }
-.#{$fa-css-prefix}-icicles:before { content: fa-content($fa-var-icicles); }
-.#{$fa-css-prefix}-icons:before { content: fa-content($fa-var-icons); }
-.#{$fa-css-prefix}-id-badge:before { content: fa-content($fa-var-id-badge); }
-.#{$fa-css-prefix}-id-card:before { content: fa-content($fa-var-id-card); }
-.#{$fa-css-prefix}-id-card-alt:before { content: fa-content($fa-var-id-card-alt); }
-.#{$fa-css-prefix}-ideal:before { content: fa-content($fa-var-ideal); }
-.#{$fa-css-prefix}-igloo:before { content: fa-content($fa-var-igloo); }
-.#{$fa-css-prefix}-image:before { content: fa-content($fa-var-image); }
-.#{$fa-css-prefix}-images:before { content: fa-content($fa-var-images); }
-.#{$fa-css-prefix}-imdb:before { content: fa-content($fa-var-imdb); }
-.#{$fa-css-prefix}-inbox:before { content: fa-content($fa-var-inbox); }
-.#{$fa-css-prefix}-indent:before { content: fa-content($fa-var-indent); }
-.#{$fa-css-prefix}-industry:before { content: fa-content($fa-var-industry); }
-.#{$fa-css-prefix}-infinity:before { content: fa-content($fa-var-infinity); }
-.#{$fa-css-prefix}-info:before { content: fa-content($fa-var-info); }
-.#{$fa-css-prefix}-info-circle:before { content: fa-content($fa-var-info-circle); }
-.#{$fa-css-prefix}-instagram:before { content: fa-content($fa-var-instagram); }
-.#{$fa-css-prefix}-instagram-square:before { content: fa-content($fa-var-instagram-square); }
-.#{$fa-css-prefix}-intercom:before { content: fa-content($fa-var-intercom); }
-.#{$fa-css-prefix}-internet-explorer:before { content: fa-content($fa-var-internet-explorer); }
-.#{$fa-css-prefix}-invision:before { content: fa-content($fa-var-invision); }
-.#{$fa-css-prefix}-ioxhost:before { content: fa-content($fa-var-ioxhost); }
-.#{$fa-css-prefix}-italic:before { content: fa-content($fa-var-italic); }
-.#{$fa-css-prefix}-itch-io:before { content: fa-content($fa-var-itch-io); }
-.#{$fa-css-prefix}-itunes:before { content: fa-content($fa-var-itunes); }
-.#{$fa-css-prefix}-itunes-note:before { content: fa-content($fa-var-itunes-note); }
-.#{$fa-css-prefix}-java:before { content: fa-content($fa-var-java); }
-.#{$fa-css-prefix}-jedi:before { content: fa-content($fa-var-jedi); }
-.#{$fa-css-prefix}-jedi-order:before { content: fa-content($fa-var-jedi-order); }
-.#{$fa-css-prefix}-jenkins:before { content: fa-content($fa-var-jenkins); }
-.#{$fa-css-prefix}-jira:before { content: fa-content($fa-var-jira); }
-.#{$fa-css-prefix}-joget:before { content: fa-content($fa-var-joget); }
-.#{$fa-css-prefix}-joint:before { content: fa-content($fa-var-joint); }
-.#{$fa-css-prefix}-joomla:before { content: fa-content($fa-var-joomla); }
-.#{$fa-css-prefix}-journal-whills:before { content: fa-content($fa-var-journal-whills); }
-.#{$fa-css-prefix}-js:before { content: fa-content($fa-var-js); }
-.#{$fa-css-prefix}-js-square:before { content: fa-content($fa-var-js-square); }
-.#{$fa-css-prefix}-jsfiddle:before { content: fa-content($fa-var-jsfiddle); }
-.#{$fa-css-prefix}-kaaba:before { content: fa-content($fa-var-kaaba); }
-.#{$fa-css-prefix}-kaggle:before { content: fa-content($fa-var-kaggle); }
-.#{$fa-css-prefix}-key:before { content: fa-content($fa-var-key); }
-.#{$fa-css-prefix}-keybase:before { content: fa-content($fa-var-keybase); }
-.#{$fa-css-prefix}-keyboard:before { content: fa-content($fa-var-keyboard); }
-.#{$fa-css-prefix}-keycdn:before { content: fa-content($fa-var-keycdn); }
-.#{$fa-css-prefix}-khanda:before { content: fa-content($fa-var-khanda); }
-.#{$fa-css-prefix}-kickstarter:before { content: fa-content($fa-var-kickstarter); }
-.#{$fa-css-prefix}-kickstarter-k:before { content: fa-content($fa-var-kickstarter-k); }
-.#{$fa-css-prefix}-kiss:before { content: fa-content($fa-var-kiss); }
-.#{$fa-css-prefix}-kiss-beam:before { content: fa-content($fa-var-kiss-beam); }
-.#{$fa-css-prefix}-kiss-wink-heart:before { content: fa-content($fa-var-kiss-wink-heart); }
-.#{$fa-css-prefix}-kiwi-bird:before { content: fa-content($fa-var-kiwi-bird); }
-.#{$fa-css-prefix}-korvue:before { content: fa-content($fa-var-korvue); }
-.#{$fa-css-prefix}-landmark:before { content: fa-content($fa-var-landmark); }
-.#{$fa-css-prefix}-language:before { content: fa-content($fa-var-language); }
-.#{$fa-css-prefix}-laptop:before { content: fa-content($fa-var-laptop); }
-.#{$fa-css-prefix}-laptop-code:before { content: fa-content($fa-var-laptop-code); }
-.#{$fa-css-prefix}-laptop-house:before { content: fa-content($fa-var-laptop-house); }
-.#{$fa-css-prefix}-laptop-medical:before { content: fa-content($fa-var-laptop-medical); }
-.#{$fa-css-prefix}-laravel:before { content: fa-content($fa-var-laravel); }
-.#{$fa-css-prefix}-lastfm:before { content: fa-content($fa-var-lastfm); }
-.#{$fa-css-prefix}-lastfm-square:before { content: fa-content($fa-var-lastfm-square); }
-.#{$fa-css-prefix}-laugh:before { content: fa-content($fa-var-laugh); }
-.#{$fa-css-prefix}-laugh-beam:before { content: fa-content($fa-var-laugh-beam); }
-.#{$fa-css-prefix}-laugh-squint:before { content: fa-content($fa-var-laugh-squint); }
-.#{$fa-css-prefix}-laugh-wink:before { content: fa-content($fa-var-laugh-wink); }
-.#{$fa-css-prefix}-layer-group:before { content: fa-content($fa-var-layer-group); }
-.#{$fa-css-prefix}-leaf:before { content: fa-content($fa-var-leaf); }
-.#{$fa-css-prefix}-leanpub:before { content: fa-content($fa-var-leanpub); }
-.#{$fa-css-prefix}-lemon:before { content: fa-content($fa-var-lemon); }
-.#{$fa-css-prefix}-less:before { content: fa-content($fa-var-less); }
-.#{$fa-css-prefix}-less-than:before { content: fa-content($fa-var-less-than); }
-.#{$fa-css-prefix}-less-than-equal:before { content: fa-content($fa-var-less-than-equal); }
-.#{$fa-css-prefix}-level-down-alt:before { content: fa-content($fa-var-level-down-alt); }
-.#{$fa-css-prefix}-level-up-alt:before { content: fa-content($fa-var-level-up-alt); }
-.#{$fa-css-prefix}-life-ring:before { content: fa-content($fa-var-life-ring); }
-.#{$fa-css-prefix}-lightbulb:before { content: fa-content($fa-var-lightbulb); }
-.#{$fa-css-prefix}-line:before { content: fa-content($fa-var-line); }
-.#{$fa-css-prefix}-link:before { content: fa-content($fa-var-link); }
-.#{$fa-css-prefix}-linkedin:before { content: fa-content($fa-var-linkedin); }
-.#{$fa-css-prefix}-linkedin-in:before { content: fa-content($fa-var-linkedin-in); }
-.#{$fa-css-prefix}-linode:before { content: fa-content($fa-var-linode); }
-.#{$fa-css-prefix}-linux:before { content: fa-content($fa-var-linux); }
-.#{$fa-css-prefix}-lira-sign:before { content: fa-content($fa-var-lira-sign); }
-.#{$fa-css-prefix}-list:before { content: fa-content($fa-var-list); }
-.#{$fa-css-prefix}-list-alt:before { content: fa-content($fa-var-list-alt); }
-.#{$fa-css-prefix}-list-ol:before { content: fa-content($fa-var-list-ol); }
-.#{$fa-css-prefix}-list-ul:before { content: fa-content($fa-var-list-ul); }
-.#{$fa-css-prefix}-location-arrow:before { content: fa-content($fa-var-location-arrow); }
-.#{$fa-css-prefix}-lock:before { content: fa-content($fa-var-lock); }
-.#{$fa-css-prefix}-lock-open:before { content: fa-content($fa-var-lock-open); }
-.#{$fa-css-prefix}-long-arrow-alt-down:before { content: fa-content($fa-var-long-arrow-alt-down); }
-.#{$fa-css-prefix}-long-arrow-alt-left:before { content: fa-content($fa-var-long-arrow-alt-left); }
-.#{$fa-css-prefix}-long-arrow-alt-right:before { content: fa-content($fa-var-long-arrow-alt-right); }
-.#{$fa-css-prefix}-long-arrow-alt-up:before { content: fa-content($fa-var-long-arrow-alt-up); }
-.#{$fa-css-prefix}-low-vision:before { content: fa-content($fa-var-low-vision); }
-.#{$fa-css-prefix}-luggage-cart:before { content: fa-content($fa-var-luggage-cart); }
-.#{$fa-css-prefix}-lungs:before { content: fa-content($fa-var-lungs); }
-.#{$fa-css-prefix}-lungs-virus:before { content: fa-content($fa-var-lungs-virus); }
-.#{$fa-css-prefix}-lyft:before { content: fa-content($fa-var-lyft); }
-.#{$fa-css-prefix}-magento:before { content: fa-content($fa-var-magento); }
-.#{$fa-css-prefix}-magic:before { content: fa-content($fa-var-magic); }
-.#{$fa-css-prefix}-magnet:before { content: fa-content($fa-var-magnet); }
-.#{$fa-css-prefix}-mail-bulk:before { content: fa-content($fa-var-mail-bulk); }
-.#{$fa-css-prefix}-mailchimp:before { content: fa-content($fa-var-mailchimp); }
-.#{$fa-css-prefix}-male:before { content: fa-content($fa-var-male); }
-.#{$fa-css-prefix}-mandalorian:before { content: fa-content($fa-var-mandalorian); }
-.#{$fa-css-prefix}-map:before { content: fa-content($fa-var-map); }
-.#{$fa-css-prefix}-map-marked:before { content: fa-content($fa-var-map-marked); }
-.#{$fa-css-prefix}-map-marked-alt:before { content: fa-content($fa-var-map-marked-alt); }
-.#{$fa-css-prefix}-map-marker:before { content: fa-content($fa-var-map-marker); }
-.#{$fa-css-prefix}-map-marker-alt:before { content: fa-content($fa-var-map-marker-alt); }
-.#{$fa-css-prefix}-map-pin:before { content: fa-content($fa-var-map-pin); }
-.#{$fa-css-prefix}-map-signs:before { content: fa-content($fa-var-map-signs); }
-.#{$fa-css-prefix}-markdown:before { content: fa-content($fa-var-markdown); }
-.#{$fa-css-prefix}-marker:before { content: fa-content($fa-var-marker); }
-.#{$fa-css-prefix}-mars:before { content: fa-content($fa-var-mars); }
-.#{$fa-css-prefix}-mars-double:before { content: fa-content($fa-var-mars-double); }
-.#{$fa-css-prefix}-mars-stroke:before { content: fa-content($fa-var-mars-stroke); }
-.#{$fa-css-prefix}-mars-stroke-h:before { content: fa-content($fa-var-mars-stroke-h); }
-.#{$fa-css-prefix}-mars-stroke-v:before { content: fa-content($fa-var-mars-stroke-v); }
-.#{$fa-css-prefix}-mask:before { content: fa-content($fa-var-mask); }
-.#{$fa-css-prefix}-mastodon:before { content: fa-content($fa-var-mastodon); }
-.#{$fa-css-prefix}-maxcdn:before { content: fa-content($fa-var-maxcdn); }
-.#{$fa-css-prefix}-mdb:before { content: fa-content($fa-var-mdb); }
-.#{$fa-css-prefix}-medal:before { content: fa-content($fa-var-medal); }
-.#{$fa-css-prefix}-medapps:before { content: fa-content($fa-var-medapps); }
-.#{$fa-css-prefix}-medium:before { content: fa-content($fa-var-medium); }
-.#{$fa-css-prefix}-medium-m:before { content: fa-content($fa-var-medium-m); }
-.#{$fa-css-prefix}-medkit:before { content: fa-content($fa-var-medkit); }
-.#{$fa-css-prefix}-medrt:before { content: fa-content($fa-var-medrt); }
-.#{$fa-css-prefix}-meetup:before { content: fa-content($fa-var-meetup); }
-.#{$fa-css-prefix}-megaport:before { content: fa-content($fa-var-megaport); }
-.#{$fa-css-prefix}-meh:before { content: fa-content($fa-var-meh); }
-.#{$fa-css-prefix}-meh-blank:before { content: fa-content($fa-var-meh-blank); }
-.#{$fa-css-prefix}-meh-rolling-eyes:before { content: fa-content($fa-var-meh-rolling-eyes); }
-.#{$fa-css-prefix}-memory:before { content: fa-content($fa-var-memory); }
-.#{$fa-css-prefix}-mendeley:before { content: fa-content($fa-var-mendeley); }
-.#{$fa-css-prefix}-menorah:before { content: fa-content($fa-var-menorah); }
-.#{$fa-css-prefix}-mercury:before { content: fa-content($fa-var-mercury); }
-.#{$fa-css-prefix}-meteor:before { content: fa-content($fa-var-meteor); }
-.#{$fa-css-prefix}-microblog:before { content: fa-content($fa-var-microblog); }
-.#{$fa-css-prefix}-microchip:before { content: fa-content($fa-var-microchip); }
-.#{$fa-css-prefix}-microphone:before { content: fa-content($fa-var-microphone); }
-.#{$fa-css-prefix}-microphone-alt:before { content: fa-content($fa-var-microphone-alt); }
-.#{$fa-css-prefix}-microphone-alt-slash:before { content: fa-content($fa-var-microphone-alt-slash); }
-.#{$fa-css-prefix}-microphone-slash:before { content: fa-content($fa-var-microphone-slash); }
-.#{$fa-css-prefix}-microscope:before { content: fa-content($fa-var-microscope); }
-.#{$fa-css-prefix}-microsoft:before { content: fa-content($fa-var-microsoft); }
-.#{$fa-css-prefix}-minus:before { content: fa-content($fa-var-minus); }
-.#{$fa-css-prefix}-minus-circle:before { content: fa-content($fa-var-minus-circle); }
-.#{$fa-css-prefix}-minus-square:before { content: fa-content($fa-var-minus-square); }
-.#{$fa-css-prefix}-mitten:before { content: fa-content($fa-var-mitten); }
-.#{$fa-css-prefix}-mix:before { content: fa-content($fa-var-mix); }
-.#{$fa-css-prefix}-mixcloud:before { content: fa-content($fa-var-mixcloud); }
-.#{$fa-css-prefix}-mixer:before { content: fa-content($fa-var-mixer); }
-.#{$fa-css-prefix}-mizuni:before { content: fa-content($fa-var-mizuni); }
-.#{$fa-css-prefix}-mobile:before { content: fa-content($fa-var-mobile); }
-.#{$fa-css-prefix}-mobile-alt:before { content: fa-content($fa-var-mobile-alt); }
-.#{$fa-css-prefix}-modx:before { content: fa-content($fa-var-modx); }
-.#{$fa-css-prefix}-monero:before { content: fa-content($fa-var-monero); }
-.#{$fa-css-prefix}-money-bill:before { content: fa-content($fa-var-money-bill); }
-.#{$fa-css-prefix}-money-bill-alt:before { content: fa-content($fa-var-money-bill-alt); }
-.#{$fa-css-prefix}-money-bill-wave:before { content: fa-content($fa-var-money-bill-wave); }
-.#{$fa-css-prefix}-money-bill-wave-alt:before { content: fa-content($fa-var-money-bill-wave-alt); }
-.#{$fa-css-prefix}-money-check:before { content: fa-content($fa-var-money-check); }
-.#{$fa-css-prefix}-money-check-alt:before { content: fa-content($fa-var-money-check-alt); }
-.#{$fa-css-prefix}-monument:before { content: fa-content($fa-var-monument); }
-.#{$fa-css-prefix}-moon:before { content: fa-content($fa-var-moon); }
-.#{$fa-css-prefix}-mortar-pestle:before { content: fa-content($fa-var-mortar-pestle); }
-.#{$fa-css-prefix}-mosque:before { content: fa-content($fa-var-mosque); }
-.#{$fa-css-prefix}-motorcycle:before { content: fa-content($fa-var-motorcycle); }
-.#{$fa-css-prefix}-mountain:before { content: fa-content($fa-var-mountain); }
-.#{$fa-css-prefix}-mouse:before { content: fa-content($fa-var-mouse); }
-.#{$fa-css-prefix}-mouse-pointer:before { content: fa-content($fa-var-mouse-pointer); }
-.#{$fa-css-prefix}-mug-hot:before { content: fa-content($fa-var-mug-hot); }
-.#{$fa-css-prefix}-music:before { content: fa-content($fa-var-music); }
-.#{$fa-css-prefix}-napster:before { content: fa-content($fa-var-napster); }
-.#{$fa-css-prefix}-neos:before { content: fa-content($fa-var-neos); }
-.#{$fa-css-prefix}-network-wired:before { content: fa-content($fa-var-network-wired); }
-.#{$fa-css-prefix}-neuter:before { content: fa-content($fa-var-neuter); }
-.#{$fa-css-prefix}-newspaper:before { content: fa-content($fa-var-newspaper); }
-.#{$fa-css-prefix}-nimblr:before { content: fa-content($fa-var-nimblr); }
-.#{$fa-css-prefix}-node:before { content: fa-content($fa-var-node); }
-.#{$fa-css-prefix}-node-js:before { content: fa-content($fa-var-node-js); }
-.#{$fa-css-prefix}-not-equal:before { content: fa-content($fa-var-not-equal); }
-.#{$fa-css-prefix}-notes-medical:before { content: fa-content($fa-var-notes-medical); }
-.#{$fa-css-prefix}-npm:before { content: fa-content($fa-var-npm); }
-.#{$fa-css-prefix}-ns8:before { content: fa-content($fa-var-ns8); }
-.#{$fa-css-prefix}-nutritionix:before { content: fa-content($fa-var-nutritionix); }
-.#{$fa-css-prefix}-object-group:before { content: fa-content($fa-var-object-group); }
-.#{$fa-css-prefix}-object-ungroup:before { content: fa-content($fa-var-object-ungroup); }
-.#{$fa-css-prefix}-odnoklassniki:before { content: fa-content($fa-var-odnoklassniki); }
-.#{$fa-css-prefix}-odnoklassniki-square:before { content: fa-content($fa-var-odnoklassniki-square); }
-.#{$fa-css-prefix}-oil-can:before { content: fa-content($fa-var-oil-can); }
-.#{$fa-css-prefix}-old-republic:before { content: fa-content($fa-var-old-republic); }
-.#{$fa-css-prefix}-om:before { content: fa-content($fa-var-om); }
-.#{$fa-css-prefix}-opencart:before { content: fa-content($fa-var-opencart); }
-.#{$fa-css-prefix}-openid:before { content: fa-content($fa-var-openid); }
-.#{$fa-css-prefix}-opera:before { content: fa-content($fa-var-opera); }
-.#{$fa-css-prefix}-optin-monster:before { content: fa-content($fa-var-optin-monster); }
-.#{$fa-css-prefix}-orcid:before { content: fa-content($fa-var-orcid); }
-.#{$fa-css-prefix}-osi:before { content: fa-content($fa-var-osi); }
-.#{$fa-css-prefix}-otter:before { content: fa-content($fa-var-otter); }
-.#{$fa-css-prefix}-outdent:before { content: fa-content($fa-var-outdent); }
-.#{$fa-css-prefix}-page4:before { content: fa-content($fa-var-page4); }
-.#{$fa-css-prefix}-pagelines:before { content: fa-content($fa-var-pagelines); }
-.#{$fa-css-prefix}-pager:before { content: fa-content($fa-var-pager); }
-.#{$fa-css-prefix}-paint-brush:before { content: fa-content($fa-var-paint-brush); }
-.#{$fa-css-prefix}-paint-roller:before { content: fa-content($fa-var-paint-roller); }
-.#{$fa-css-prefix}-palette:before { content: fa-content($fa-var-palette); }
-.#{$fa-css-prefix}-palfed:before { content: fa-content($fa-var-palfed); }
-.#{$fa-css-prefix}-pallet:before { content: fa-content($fa-var-pallet); }
-.#{$fa-css-prefix}-paper-plane:before { content: fa-content($fa-var-paper-plane); }
-.#{$fa-css-prefix}-paperclip:before { content: fa-content($fa-var-paperclip); }
-.#{$fa-css-prefix}-parachute-box:before { content: fa-content($fa-var-parachute-box); }
-.#{$fa-css-prefix}-paragraph:before { content: fa-content($fa-var-paragraph); }
-.#{$fa-css-prefix}-parking:before { content: fa-content($fa-var-parking); }
-.#{$fa-css-prefix}-passport:before { content: fa-content($fa-var-passport); }
-.#{$fa-css-prefix}-pastafarianism:before { content: fa-content($fa-var-pastafarianism); }
-.#{$fa-css-prefix}-paste:before { content: fa-content($fa-var-paste); }
-.#{$fa-css-prefix}-patreon:before { content: fa-content($fa-var-patreon); }
-.#{$fa-css-prefix}-pause:before { content: fa-content($fa-var-pause); }
-.#{$fa-css-prefix}-pause-circle:before { content: fa-content($fa-var-pause-circle); }
-.#{$fa-css-prefix}-paw:before { content: fa-content($fa-var-paw); }
-.#{$fa-css-prefix}-paypal:before { content: fa-content($fa-var-paypal); }
-.#{$fa-css-prefix}-peace:before { content: fa-content($fa-var-peace); }
-.#{$fa-css-prefix}-pen:before { content: fa-content($fa-var-pen); }
-.#{$fa-css-prefix}-pen-alt:before { content: fa-content($fa-var-pen-alt); }
-.#{$fa-css-prefix}-pen-fancy:before { content: fa-content($fa-var-pen-fancy); }
-.#{$fa-css-prefix}-pen-nib:before { content: fa-content($fa-var-pen-nib); }
-.#{$fa-css-prefix}-pen-square:before { content: fa-content($fa-var-pen-square); }
-.#{$fa-css-prefix}-pencil-alt:before { content: fa-content($fa-var-pencil-alt); }
-.#{$fa-css-prefix}-pencil-ruler:before { content: fa-content($fa-var-pencil-ruler); }
-.#{$fa-css-prefix}-penny-arcade:before { content: fa-content($fa-var-penny-arcade); }
-.#{$fa-css-prefix}-people-arrows:before { content: fa-content($fa-var-people-arrows); }
-.#{$fa-css-prefix}-people-carry:before { content: fa-content($fa-var-people-carry); }
-.#{$fa-css-prefix}-pepper-hot:before { content: fa-content($fa-var-pepper-hot); }
-.#{$fa-css-prefix}-percent:before { content: fa-content($fa-var-percent); }
-.#{$fa-css-prefix}-percentage:before { content: fa-content($fa-var-percentage); }
-.#{$fa-css-prefix}-periscope:before { content: fa-content($fa-var-periscope); }
-.#{$fa-css-prefix}-person-booth:before { content: fa-content($fa-var-person-booth); }
-.#{$fa-css-prefix}-phabricator:before { content: fa-content($fa-var-phabricator); }
-.#{$fa-css-prefix}-phoenix-framework:before { content: fa-content($fa-var-phoenix-framework); }
-.#{$fa-css-prefix}-phoenix-squadron:before { content: fa-content($fa-var-phoenix-squadron); }
-.#{$fa-css-prefix}-phone:before { content: fa-content($fa-var-phone); }
-.#{$fa-css-prefix}-phone-alt:before { content: fa-content($fa-var-phone-alt); }
-.#{$fa-css-prefix}-phone-slash:before { content: fa-content($fa-var-phone-slash); }
-.#{$fa-css-prefix}-phone-square:before { content: fa-content($fa-var-phone-square); }
-.#{$fa-css-prefix}-phone-square-alt:before { content: fa-content($fa-var-phone-square-alt); }
-.#{$fa-css-prefix}-phone-volume:before { content: fa-content($fa-var-phone-volume); }
-.#{$fa-css-prefix}-photo-video:before { content: fa-content($fa-var-photo-video); }
-.#{$fa-css-prefix}-php:before { content: fa-content($fa-var-php); }
-.#{$fa-css-prefix}-pied-piper:before { content: fa-content($fa-var-pied-piper); }
-.#{$fa-css-prefix}-pied-piper-alt:before { content: fa-content($fa-var-pied-piper-alt); }
-.#{$fa-css-prefix}-pied-piper-hat:before { content: fa-content($fa-var-pied-piper-hat); }
-.#{$fa-css-prefix}-pied-piper-pp:before { content: fa-content($fa-var-pied-piper-pp); }
-.#{$fa-css-prefix}-pied-piper-square:before { content: fa-content($fa-var-pied-piper-square); }
-.#{$fa-css-prefix}-piggy-bank:before { content: fa-content($fa-var-piggy-bank); }
-.#{$fa-css-prefix}-pills:before { content: fa-content($fa-var-pills); }
-.#{$fa-css-prefix}-pinterest:before { content: fa-content($fa-var-pinterest); }
-.#{$fa-css-prefix}-pinterest-p:before { content: fa-content($fa-var-pinterest-p); }
-.#{$fa-css-prefix}-pinterest-square:before { content: fa-content($fa-var-pinterest-square); }
-.#{$fa-css-prefix}-pizza-slice:before { content: fa-content($fa-var-pizza-slice); }
-.#{$fa-css-prefix}-place-of-worship:before { content: fa-content($fa-var-place-of-worship); }
-.#{$fa-css-prefix}-plane:before { content: fa-content($fa-var-plane); }
-.#{$fa-css-prefix}-plane-arrival:before { content: fa-content($fa-var-plane-arrival); }
-.#{$fa-css-prefix}-plane-departure:before { content: fa-content($fa-var-plane-departure); }
-.#{$fa-css-prefix}-plane-slash:before { content: fa-content($fa-var-plane-slash); }
-.#{$fa-css-prefix}-play:before { content: fa-content($fa-var-play); }
-.#{$fa-css-prefix}-play-circle:before { content: fa-content($fa-var-play-circle); }
-.#{$fa-css-prefix}-playstation:before { content: fa-content($fa-var-playstation); }
-.#{$fa-css-prefix}-plug:before { content: fa-content($fa-var-plug); }
-.#{$fa-css-prefix}-plus:before { content: fa-content($fa-var-plus); }
-.#{$fa-css-prefix}-plus-circle:before { content: fa-content($fa-var-plus-circle); }
-.#{$fa-css-prefix}-plus-square:before { content: fa-content($fa-var-plus-square); }
-.#{$fa-css-prefix}-podcast:before { content: fa-content($fa-var-podcast); }
-.#{$fa-css-prefix}-poll:before { content: fa-content($fa-var-poll); }
-.#{$fa-css-prefix}-poll-h:before { content: fa-content($fa-var-poll-h); }
-.#{$fa-css-prefix}-poo:before { content: fa-content($fa-var-poo); }
-.#{$fa-css-prefix}-poo-storm:before { content: fa-content($fa-var-poo-storm); }
-.#{$fa-css-prefix}-poop:before { content: fa-content($fa-var-poop); }
-.#{$fa-css-prefix}-portrait:before { content: fa-content($fa-var-portrait); }
-.#{$fa-css-prefix}-pound-sign:before { content: fa-content($fa-var-pound-sign); }
-.#{$fa-css-prefix}-power-off:before { content: fa-content($fa-var-power-off); }
-.#{$fa-css-prefix}-pray:before { content: fa-content($fa-var-pray); }
-.#{$fa-css-prefix}-praying-hands:before { content: fa-content($fa-var-praying-hands); }
-.#{$fa-css-prefix}-prescription:before { content: fa-content($fa-var-prescription); }
-.#{$fa-css-prefix}-prescription-bottle:before { content: fa-content($fa-var-prescription-bottle); }
-.#{$fa-css-prefix}-prescription-bottle-alt:before { content: fa-content($fa-var-prescription-bottle-alt); }
-.#{$fa-css-prefix}-print:before { content: fa-content($fa-var-print); }
-.#{$fa-css-prefix}-procedures:before { content: fa-content($fa-var-procedures); }
-.#{$fa-css-prefix}-product-hunt:before { content: fa-content($fa-var-product-hunt); }
-.#{$fa-css-prefix}-project-diagram:before { content: fa-content($fa-var-project-diagram); }
-.#{$fa-css-prefix}-pump-medical:before { content: fa-content($fa-var-pump-medical); }
-.#{$fa-css-prefix}-pump-soap:before { content: fa-content($fa-var-pump-soap); }
-.#{$fa-css-prefix}-pushed:before { content: fa-content($fa-var-pushed); }
-.#{$fa-css-prefix}-puzzle-piece:before { content: fa-content($fa-var-puzzle-piece); }
-.#{$fa-css-prefix}-python:before { content: fa-content($fa-var-python); }
-.#{$fa-css-prefix}-qq:before { content: fa-content($fa-var-qq); }
-.#{$fa-css-prefix}-qrcode:before { content: fa-content($fa-var-qrcode); }
-.#{$fa-css-prefix}-question:before { content: fa-content($fa-var-question); }
-.#{$fa-css-prefix}-question-circle:before { content: fa-content($fa-var-question-circle); }
-.#{$fa-css-prefix}-quidditch:before { content: fa-content($fa-var-quidditch); }
-.#{$fa-css-prefix}-quinscape:before { content: fa-content($fa-var-quinscape); }
-.#{$fa-css-prefix}-quora:before { content: fa-content($fa-var-quora); }
-.#{$fa-css-prefix}-quote-left:before { content: fa-content($fa-var-quote-left); }
-.#{$fa-css-prefix}-quote-right:before { content: fa-content($fa-var-quote-right); }
-.#{$fa-css-prefix}-quran:before { content: fa-content($fa-var-quran); }
-.#{$fa-css-prefix}-r-project:before { content: fa-content($fa-var-r-project); }
-.#{$fa-css-prefix}-radiation:before { content: fa-content($fa-var-radiation); }
-.#{$fa-css-prefix}-radiation-alt:before { content: fa-content($fa-var-radiation-alt); }
-.#{$fa-css-prefix}-rainbow:before { content: fa-content($fa-var-rainbow); }
-.#{$fa-css-prefix}-random:before { content: fa-content($fa-var-random); }
-.#{$fa-css-prefix}-raspberry-pi:before { content: fa-content($fa-var-raspberry-pi); }
-.#{$fa-css-prefix}-ravelry:before { content: fa-content($fa-var-ravelry); }
-.#{$fa-css-prefix}-react:before { content: fa-content($fa-var-react); }
-.#{$fa-css-prefix}-reacteurope:before { content: fa-content($fa-var-reacteurope); }
-.#{$fa-css-prefix}-readme:before { content: fa-content($fa-var-readme); }
-.#{$fa-css-prefix}-rebel:before { content: fa-content($fa-var-rebel); }
-.#{$fa-css-prefix}-receipt:before { content: fa-content($fa-var-receipt); }
-.#{$fa-css-prefix}-record-vinyl:before { content: fa-content($fa-var-record-vinyl); }
-.#{$fa-css-prefix}-recycle:before { content: fa-content($fa-var-recycle); }
-.#{$fa-css-prefix}-red-river:before { content: fa-content($fa-var-red-river); }
-.#{$fa-css-prefix}-reddit:before { content: fa-content($fa-var-reddit); }
-.#{$fa-css-prefix}-reddit-alien:before { content: fa-content($fa-var-reddit-alien); }
-.#{$fa-css-prefix}-reddit-square:before { content: fa-content($fa-var-reddit-square); }
-.#{$fa-css-prefix}-redhat:before { content: fa-content($fa-var-redhat); }
-.#{$fa-css-prefix}-redo:before { content: fa-content($fa-var-redo); }
-.#{$fa-css-prefix}-redo-alt:before { content: fa-content($fa-var-redo-alt); }
-.#{$fa-css-prefix}-registered:before { content: fa-content($fa-var-registered); }
-.#{$fa-css-prefix}-remove-format:before { content: fa-content($fa-var-remove-format); }
-.#{$fa-css-prefix}-renren:before { content: fa-content($fa-var-renren); }
-.#{$fa-css-prefix}-reply:before { content: fa-content($fa-var-reply); }
-.#{$fa-css-prefix}-reply-all:before { content: fa-content($fa-var-reply-all); }
-.#{$fa-css-prefix}-replyd:before { content: fa-content($fa-var-replyd); }
-.#{$fa-css-prefix}-republican:before { content: fa-content($fa-var-republican); }
-.#{$fa-css-prefix}-researchgate:before { content: fa-content($fa-var-researchgate); }
-.#{$fa-css-prefix}-resolving:before { content: fa-content($fa-var-resolving); }
-.#{$fa-css-prefix}-restroom:before { content: fa-content($fa-var-restroom); }
-.#{$fa-css-prefix}-retweet:before { content: fa-content($fa-var-retweet); }
-.#{$fa-css-prefix}-rev:before { content: fa-content($fa-var-rev); }
-.#{$fa-css-prefix}-ribbon:before { content: fa-content($fa-var-ribbon); }
-.#{$fa-css-prefix}-ring:before { content: fa-content($fa-var-ring); }
-.#{$fa-css-prefix}-road:before { content: fa-content($fa-var-road); }
-.#{$fa-css-prefix}-robot:before { content: fa-content($fa-var-robot); }
-.#{$fa-css-prefix}-rocket:before { content: fa-content($fa-var-rocket); }
-.#{$fa-css-prefix}-rocketchat:before { content: fa-content($fa-var-rocketchat); }
-.#{$fa-css-prefix}-rockrms:before { content: fa-content($fa-var-rockrms); }
-.#{$fa-css-prefix}-route:before { content: fa-content($fa-var-route); }
-.#{$fa-css-prefix}-rss:before { content: fa-content($fa-var-rss); }
-.#{$fa-css-prefix}-rss-square:before { content: fa-content($fa-var-rss-square); }
-.#{$fa-css-prefix}-ruble-sign:before { content: fa-content($fa-var-ruble-sign); }
-.#{$fa-css-prefix}-ruler:before { content: fa-content($fa-var-ruler); }
-.#{$fa-css-prefix}-ruler-combined:before { content: fa-content($fa-var-ruler-combined); }
-.#{$fa-css-prefix}-ruler-horizontal:before { content: fa-content($fa-var-ruler-horizontal); }
-.#{$fa-css-prefix}-ruler-vertical:before { content: fa-content($fa-var-ruler-vertical); }
-.#{$fa-css-prefix}-running:before { content: fa-content($fa-var-running); }
-.#{$fa-css-prefix}-rupee-sign:before { content: fa-content($fa-var-rupee-sign); }
-.#{$fa-css-prefix}-rust:before { content: fa-content($fa-var-rust); }
-.#{$fa-css-prefix}-sad-cry:before { content: fa-content($fa-var-sad-cry); }
-.#{$fa-css-prefix}-sad-tear:before { content: fa-content($fa-var-sad-tear); }
-.#{$fa-css-prefix}-safari:before { content: fa-content($fa-var-safari); }
-.#{$fa-css-prefix}-salesforce:before { content: fa-content($fa-var-salesforce); }
-.#{$fa-css-prefix}-sass:before { content: fa-content($fa-var-sass); }
-.#{$fa-css-prefix}-satellite:before { content: fa-content($fa-var-satellite); }
-.#{$fa-css-prefix}-satellite-dish:before { content: fa-content($fa-var-satellite-dish); }
-.#{$fa-css-prefix}-save:before { content: fa-content($fa-var-save); }
-.#{$fa-css-prefix}-schlix:before { content: fa-content($fa-var-schlix); }
-.#{$fa-css-prefix}-school:before { content: fa-content($fa-var-school); }
-.#{$fa-css-prefix}-screwdriver:before { content: fa-content($fa-var-screwdriver); }
-.#{$fa-css-prefix}-scribd:before { content: fa-content($fa-var-scribd); }
-.#{$fa-css-prefix}-scroll:before { content: fa-content($fa-var-scroll); }
-.#{$fa-css-prefix}-sd-card:before { content: fa-content($fa-var-sd-card); }
-.#{$fa-css-prefix}-search:before { content: fa-content($fa-var-search); }
-.#{$fa-css-prefix}-search-dollar:before { content: fa-content($fa-var-search-dollar); }
-.#{$fa-css-prefix}-search-location:before { content: fa-content($fa-var-search-location); }
-.#{$fa-css-prefix}-search-minus:before { content: fa-content($fa-var-search-minus); }
-.#{$fa-css-prefix}-search-plus:before { content: fa-content($fa-var-search-plus); }
-.#{$fa-css-prefix}-searchengin:before { content: fa-content($fa-var-searchengin); }
-.#{$fa-css-prefix}-seedling:before { content: fa-content($fa-var-seedling); }
-.#{$fa-css-prefix}-sellcast:before { content: fa-content($fa-var-sellcast); }
-.#{$fa-css-prefix}-sellsy:before { content: fa-content($fa-var-sellsy); }
-.#{$fa-css-prefix}-server:before { content: fa-content($fa-var-server); }
-.#{$fa-css-prefix}-servicestack:before { content: fa-content($fa-var-servicestack); }
-.#{$fa-css-prefix}-shapes:before { content: fa-content($fa-var-shapes); }
-.#{$fa-css-prefix}-share:before { content: fa-content($fa-var-share); }
-.#{$fa-css-prefix}-share-alt:before { content: fa-content($fa-var-share-alt); }
-.#{$fa-css-prefix}-share-alt-square:before { content: fa-content($fa-var-share-alt-square); }
-.#{$fa-css-prefix}-share-square:before { content: fa-content($fa-var-share-square); }
-.#{$fa-css-prefix}-shekel-sign:before { content: fa-content($fa-var-shekel-sign); }
-.#{$fa-css-prefix}-shield-alt:before { content: fa-content($fa-var-shield-alt); }
-.#{$fa-css-prefix}-shield-virus:before { content: fa-content($fa-var-shield-virus); }
-.#{$fa-css-prefix}-ship:before { content: fa-content($fa-var-ship); }
-.#{$fa-css-prefix}-shipping-fast:before { content: fa-content($fa-var-shipping-fast); }
-.#{$fa-css-prefix}-shirtsinbulk:before { content: fa-content($fa-var-shirtsinbulk); }
-.#{$fa-css-prefix}-shoe-prints:before { content: fa-content($fa-var-shoe-prints); }
-.#{$fa-css-prefix}-shopify:before { content: fa-content($fa-var-shopify); }
-.#{$fa-css-prefix}-shopping-bag:before { content: fa-content($fa-var-shopping-bag); }
-.#{$fa-css-prefix}-shopping-basket:before { content: fa-content($fa-var-shopping-basket); }
-.#{$fa-css-prefix}-shopping-cart:before { content: fa-content($fa-var-shopping-cart); }
-.#{$fa-css-prefix}-shopware:before { content: fa-content($fa-var-shopware); }
-.#{$fa-css-prefix}-shower:before { content: fa-content($fa-var-shower); }
-.#{$fa-css-prefix}-shuttle-van:before { content: fa-content($fa-var-shuttle-van); }
-.#{$fa-css-prefix}-sign:before { content: fa-content($fa-var-sign); }
-.#{$fa-css-prefix}-sign-in-alt:before { content: fa-content($fa-var-sign-in-alt); }
-.#{$fa-css-prefix}-sign-language:before { content: fa-content($fa-var-sign-language); }
-.#{$fa-css-prefix}-sign-out-alt:before { content: fa-content($fa-var-sign-out-alt); }
-.#{$fa-css-prefix}-signal:before { content: fa-content($fa-var-signal); }
-.#{$fa-css-prefix}-signature:before { content: fa-content($fa-var-signature); }
-.#{$fa-css-prefix}-sim-card:before { content: fa-content($fa-var-sim-card); }
-.#{$fa-css-prefix}-simplybuilt:before { content: fa-content($fa-var-simplybuilt); }
-.#{$fa-css-prefix}-sink:before { content: fa-content($fa-var-sink); }
-.#{$fa-css-prefix}-sistrix:before { content: fa-content($fa-var-sistrix); }
-.#{$fa-css-prefix}-sitemap:before { content: fa-content($fa-var-sitemap); }
-.#{$fa-css-prefix}-sith:before { content: fa-content($fa-var-sith); }
-.#{$fa-css-prefix}-skating:before { content: fa-content($fa-var-skating); }
-.#{$fa-css-prefix}-sketch:before { content: fa-content($fa-var-sketch); }
-.#{$fa-css-prefix}-skiing:before { content: fa-content($fa-var-skiing); }
-.#{$fa-css-prefix}-skiing-nordic:before { content: fa-content($fa-var-skiing-nordic); }
-.#{$fa-css-prefix}-skull:before { content: fa-content($fa-var-skull); }
-.#{$fa-css-prefix}-skull-crossbones:before { content: fa-content($fa-var-skull-crossbones); }
-.#{$fa-css-prefix}-skyatlas:before { content: fa-content($fa-var-skyatlas); }
-.#{$fa-css-prefix}-skype:before { content: fa-content($fa-var-skype); }
-.#{$fa-css-prefix}-slack:before { content: fa-content($fa-var-slack); }
-.#{$fa-css-prefix}-slack-hash:before { content: fa-content($fa-var-slack-hash); }
-.#{$fa-css-prefix}-slash:before { content: fa-content($fa-var-slash); }
-.#{$fa-css-prefix}-sleigh:before { content: fa-content($fa-var-sleigh); }
-.#{$fa-css-prefix}-sliders-h:before { content: fa-content($fa-var-sliders-h); }
-.#{$fa-css-prefix}-slideshare:before { content: fa-content($fa-var-slideshare); }
-.#{$fa-css-prefix}-smile:before { content: fa-content($fa-var-smile); }
-.#{$fa-css-prefix}-smile-beam:before { content: fa-content($fa-var-smile-beam); }
-.#{$fa-css-prefix}-smile-wink:before { content: fa-content($fa-var-smile-wink); }
-.#{$fa-css-prefix}-smog:before { content: fa-content($fa-var-smog); }
-.#{$fa-css-prefix}-smoking:before { content: fa-content($fa-var-smoking); }
-.#{$fa-css-prefix}-smoking-ban:before { content: fa-content($fa-var-smoking-ban); }
-.#{$fa-css-prefix}-sms:before { content: fa-content($fa-var-sms); }
-.#{$fa-css-prefix}-snapchat:before { content: fa-content($fa-var-snapchat); }
-.#{$fa-css-prefix}-snapchat-ghost:before { content: fa-content($fa-var-snapchat-ghost); }
-.#{$fa-css-prefix}-snapchat-square:before { content: fa-content($fa-var-snapchat-square); }
-.#{$fa-css-prefix}-snowboarding:before { content: fa-content($fa-var-snowboarding); }
-.#{$fa-css-prefix}-snowflake:before { content: fa-content($fa-var-snowflake); }
-.#{$fa-css-prefix}-snowman:before { content: fa-content($fa-var-snowman); }
-.#{$fa-css-prefix}-snowplow:before { content: fa-content($fa-var-snowplow); }
-.#{$fa-css-prefix}-soap:before { content: fa-content($fa-var-soap); }
-.#{$fa-css-prefix}-socks:before { content: fa-content($fa-var-socks); }
-.#{$fa-css-prefix}-solar-panel:before { content: fa-content($fa-var-solar-panel); }
-.#{$fa-css-prefix}-sort:before { content: fa-content($fa-var-sort); }
-.#{$fa-css-prefix}-sort-alpha-down:before { content: fa-content($fa-var-sort-alpha-down); }
-.#{$fa-css-prefix}-sort-alpha-down-alt:before { content: fa-content($fa-var-sort-alpha-down-alt); }
-.#{$fa-css-prefix}-sort-alpha-up:before { content: fa-content($fa-var-sort-alpha-up); }
-.#{$fa-css-prefix}-sort-alpha-up-alt:before { content: fa-content($fa-var-sort-alpha-up-alt); }
-.#{$fa-css-prefix}-sort-amount-down:before { content: fa-content($fa-var-sort-amount-down); }
-.#{$fa-css-prefix}-sort-amount-down-alt:before { content: fa-content($fa-var-sort-amount-down-alt); }
-.#{$fa-css-prefix}-sort-amount-up:before { content: fa-content($fa-var-sort-amount-up); }
-.#{$fa-css-prefix}-sort-amount-up-alt:before { content: fa-content($fa-var-sort-amount-up-alt); }
-.#{$fa-css-prefix}-sort-down:before { content: fa-content($fa-var-sort-down); }
-.#{$fa-css-prefix}-sort-numeric-down:before { content: fa-content($fa-var-sort-numeric-down); }
-.#{$fa-css-prefix}-sort-numeric-down-alt:before { content: fa-content($fa-var-sort-numeric-down-alt); }
-.#{$fa-css-prefix}-sort-numeric-up:before { content: fa-content($fa-var-sort-numeric-up); }
-.#{$fa-css-prefix}-sort-numeric-up-alt:before { content: fa-content($fa-var-sort-numeric-up-alt); }
-.#{$fa-css-prefix}-sort-up:before { content: fa-content($fa-var-sort-up); }
-.#{$fa-css-prefix}-soundcloud:before { content: fa-content($fa-var-soundcloud); }
-.#{$fa-css-prefix}-sourcetree:before { content: fa-content($fa-var-sourcetree); }
-.#{$fa-css-prefix}-spa:before { content: fa-content($fa-var-spa); }
-.#{$fa-css-prefix}-space-shuttle:before { content: fa-content($fa-var-space-shuttle); }
-.#{$fa-css-prefix}-speakap:before { content: fa-content($fa-var-speakap); }
-.#{$fa-css-prefix}-speaker-deck:before { content: fa-content($fa-var-speaker-deck); }
-.#{$fa-css-prefix}-spell-check:before { content: fa-content($fa-var-spell-check); }
-.#{$fa-css-prefix}-spider:before { content: fa-content($fa-var-spider); }
-.#{$fa-css-prefix}-spinner:before { content: fa-content($fa-var-spinner); }
-.#{$fa-css-prefix}-splotch:before { content: fa-content($fa-var-splotch); }
-.#{$fa-css-prefix}-spotify:before { content: fa-content($fa-var-spotify); }
-.#{$fa-css-prefix}-spray-can:before { content: fa-content($fa-var-spray-can); }
-.#{$fa-css-prefix}-square:before { content: fa-content($fa-var-square); }
-.#{$fa-css-prefix}-square-full:before { content: fa-content($fa-var-square-full); }
-.#{$fa-css-prefix}-square-root-alt:before { content: fa-content($fa-var-square-root-alt); }
-.#{$fa-css-prefix}-squarespace:before { content: fa-content($fa-var-squarespace); }
-.#{$fa-css-prefix}-stack-exchange:before { content: fa-content($fa-var-stack-exchange); }
-.#{$fa-css-prefix}-stack-overflow:before { content: fa-content($fa-var-stack-overflow); }
-.#{$fa-css-prefix}-stackpath:before { content: fa-content($fa-var-stackpath); }
-.#{$fa-css-prefix}-stamp:before { content: fa-content($fa-var-stamp); }
-.#{$fa-css-prefix}-star:before { content: fa-content($fa-var-star); }
-.#{$fa-css-prefix}-star-and-crescent:before { content: fa-content($fa-var-star-and-crescent); }
-.#{$fa-css-prefix}-star-half:before { content: fa-content($fa-var-star-half); }
-.#{$fa-css-prefix}-star-half-alt:before { content: fa-content($fa-var-star-half-alt); }
-.#{$fa-css-prefix}-star-of-david:before { content: fa-content($fa-var-star-of-david); }
-.#{$fa-css-prefix}-star-of-life:before { content: fa-content($fa-var-star-of-life); }
-.#{$fa-css-prefix}-staylinked:before { content: fa-content($fa-var-staylinked); }
-.#{$fa-css-prefix}-steam:before { content: fa-content($fa-var-steam); }
-.#{$fa-css-prefix}-steam-square:before { content: fa-content($fa-var-steam-square); }
-.#{$fa-css-prefix}-steam-symbol:before { content: fa-content($fa-var-steam-symbol); }
-.#{$fa-css-prefix}-step-backward:before { content: fa-content($fa-var-step-backward); }
-.#{$fa-css-prefix}-step-forward:before { content: fa-content($fa-var-step-forward); }
-.#{$fa-css-prefix}-stethoscope:before { content: fa-content($fa-var-stethoscope); }
-.#{$fa-css-prefix}-sticker-mule:before { content: fa-content($fa-var-sticker-mule); }
-.#{$fa-css-prefix}-sticky-note:before { content: fa-content($fa-var-sticky-note); }
-.#{$fa-css-prefix}-stop:before { content: fa-content($fa-var-stop); }
-.#{$fa-css-prefix}-stop-circle:before { content: fa-content($fa-var-stop-circle); }
-.#{$fa-css-prefix}-stopwatch:before { content: fa-content($fa-var-stopwatch); }
-.#{$fa-css-prefix}-stopwatch-20:before { content: fa-content($fa-var-stopwatch-20); }
-.#{$fa-css-prefix}-store:before { content: fa-content($fa-var-store); }
-.#{$fa-css-prefix}-store-alt:before { content: fa-content($fa-var-store-alt); }
-.#{$fa-css-prefix}-store-alt-slash:before { content: fa-content($fa-var-store-alt-slash); }
-.#{$fa-css-prefix}-store-slash:before { content: fa-content($fa-var-store-slash); }
-.#{$fa-css-prefix}-strava:before { content: fa-content($fa-var-strava); }
-.#{$fa-css-prefix}-stream:before { content: fa-content($fa-var-stream); }
-.#{$fa-css-prefix}-street-view:before { content: fa-content($fa-var-street-view); }
-.#{$fa-css-prefix}-strikethrough:before { content: fa-content($fa-var-strikethrough); }
-.#{$fa-css-prefix}-stripe:before { content: fa-content($fa-var-stripe); }
-.#{$fa-css-prefix}-stripe-s:before { content: fa-content($fa-var-stripe-s); }
-.#{$fa-css-prefix}-stroopwafel:before { content: fa-content($fa-var-stroopwafel); }
-.#{$fa-css-prefix}-studiovinari:before { content: fa-content($fa-var-studiovinari); }
-.#{$fa-css-prefix}-stumbleupon:before { content: fa-content($fa-var-stumbleupon); }
-.#{$fa-css-prefix}-stumbleupon-circle:before { content: fa-content($fa-var-stumbleupon-circle); }
-.#{$fa-css-prefix}-subscript:before { content: fa-content($fa-var-subscript); }
-.#{$fa-css-prefix}-subway:before { content: fa-content($fa-var-subway); }
-.#{$fa-css-prefix}-suitcase:before { content: fa-content($fa-var-suitcase); }
-.#{$fa-css-prefix}-suitcase-rolling:before { content: fa-content($fa-var-suitcase-rolling); }
-.#{$fa-css-prefix}-sun:before { content: fa-content($fa-var-sun); }
-.#{$fa-css-prefix}-superpowers:before { content: fa-content($fa-var-superpowers); }
-.#{$fa-css-prefix}-superscript:before { content: fa-content($fa-var-superscript); }
-.#{$fa-css-prefix}-supple:before { content: fa-content($fa-var-supple); }
-.#{$fa-css-prefix}-surprise:before { content: fa-content($fa-var-surprise); }
-.#{$fa-css-prefix}-suse:before { content: fa-content($fa-var-suse); }
-.#{$fa-css-prefix}-swatchbook:before { content: fa-content($fa-var-swatchbook); }
-.#{$fa-css-prefix}-swift:before { content: fa-content($fa-var-swift); }
-.#{$fa-css-prefix}-swimmer:before { content: fa-content($fa-var-swimmer); }
-.#{$fa-css-prefix}-swimming-pool:before { content: fa-content($fa-var-swimming-pool); }
-.#{$fa-css-prefix}-symfony:before { content: fa-content($fa-var-symfony); }
-.#{$fa-css-prefix}-synagogue:before { content: fa-content($fa-var-synagogue); }
-.#{$fa-css-prefix}-sync:before { content: fa-content($fa-var-sync); }
-.#{$fa-css-prefix}-sync-alt:before { content: fa-content($fa-var-sync-alt); }
-.#{$fa-css-prefix}-syringe:before { content: fa-content($fa-var-syringe); }
-.#{$fa-css-prefix}-table:before { content: fa-content($fa-var-table); }
-.#{$fa-css-prefix}-table-tennis:before { content: fa-content($fa-var-table-tennis); }
-.#{$fa-css-prefix}-tablet:before { content: fa-content($fa-var-tablet); }
-.#{$fa-css-prefix}-tablet-alt:before { content: fa-content($fa-var-tablet-alt); }
-.#{$fa-css-prefix}-tablets:before { content: fa-content($fa-var-tablets); }
-.#{$fa-css-prefix}-tachometer-alt:before { content: fa-content($fa-var-tachometer-alt); }
-.#{$fa-css-prefix}-tag:before { content: fa-content($fa-var-tag); }
-.#{$fa-css-prefix}-tags:before { content: fa-content($fa-var-tags); }
-.#{$fa-css-prefix}-tape:before { content: fa-content($fa-var-tape); }
-.#{$fa-css-prefix}-tasks:before { content: fa-content($fa-var-tasks); }
-.#{$fa-css-prefix}-taxi:before { content: fa-content($fa-var-taxi); }
-.#{$fa-css-prefix}-teamspeak:before { content: fa-content($fa-var-teamspeak); }
-.#{$fa-css-prefix}-teeth:before { content: fa-content($fa-var-teeth); }
-.#{$fa-css-prefix}-teeth-open:before { content: fa-content($fa-var-teeth-open); }
-.#{$fa-css-prefix}-telegram:before { content: fa-content($fa-var-telegram); }
-.#{$fa-css-prefix}-telegram-plane:before { content: fa-content($fa-var-telegram-plane); }
-.#{$fa-css-prefix}-temperature-high:before { content: fa-content($fa-var-temperature-high); }
-.#{$fa-css-prefix}-temperature-low:before { content: fa-content($fa-var-temperature-low); }
-.#{$fa-css-prefix}-tencent-weibo:before { content: fa-content($fa-var-tencent-weibo); }
-.#{$fa-css-prefix}-tenge:before { content: fa-content($fa-var-tenge); }
-.#{$fa-css-prefix}-terminal:before { content: fa-content($fa-var-terminal); }
-.#{$fa-css-prefix}-text-height:before { content: fa-content($fa-var-text-height); }
-.#{$fa-css-prefix}-text-width:before { content: fa-content($fa-var-text-width); }
-.#{$fa-css-prefix}-th:before { content: fa-content($fa-var-th); }
-.#{$fa-css-prefix}-th-large:before { content: fa-content($fa-var-th-large); }
-.#{$fa-css-prefix}-th-list:before { content: fa-content($fa-var-th-list); }
-.#{$fa-css-prefix}-the-red-yeti:before { content: fa-content($fa-var-the-red-yeti); }
-.#{$fa-css-prefix}-theater-masks:before { content: fa-content($fa-var-theater-masks); }
-.#{$fa-css-prefix}-themeco:before { content: fa-content($fa-var-themeco); }
-.#{$fa-css-prefix}-themeisle:before { content: fa-content($fa-var-themeisle); }
-.#{$fa-css-prefix}-thermometer:before { content: fa-content($fa-var-thermometer); }
-.#{$fa-css-prefix}-thermometer-empty:before { content: fa-content($fa-var-thermometer-empty); }
-.#{$fa-css-prefix}-thermometer-full:before { content: fa-content($fa-var-thermometer-full); }
-.#{$fa-css-prefix}-thermometer-half:before { content: fa-content($fa-var-thermometer-half); }
-.#{$fa-css-prefix}-thermometer-quarter:before { content: fa-content($fa-var-thermometer-quarter); }
-.#{$fa-css-prefix}-thermometer-three-quarters:before { content: fa-content($fa-var-thermometer-three-quarters); }
-.#{$fa-css-prefix}-think-peaks:before { content: fa-content($fa-var-think-peaks); }
-.#{$fa-css-prefix}-thumbs-down:before { content: fa-content($fa-var-thumbs-down); }
-.#{$fa-css-prefix}-thumbs-up:before { content: fa-content($fa-var-thumbs-up); }
-.#{$fa-css-prefix}-thumbtack:before { content: fa-content($fa-var-thumbtack); }
-.#{$fa-css-prefix}-ticket-alt:before { content: fa-content($fa-var-ticket-alt); }
-.#{$fa-css-prefix}-tiktok:before { content: fa-content($fa-var-tiktok); }
-.#{$fa-css-prefix}-times:before { content: fa-content($fa-var-times); }
-.#{$fa-css-prefix}-times-circle:before { content: fa-content($fa-var-times-circle); }
-.#{$fa-css-prefix}-tint:before { content: fa-content($fa-var-tint); }
-.#{$fa-css-prefix}-tint-slash:before { content: fa-content($fa-var-tint-slash); }
-.#{$fa-css-prefix}-tired:before { content: fa-content($fa-var-tired); }
-.#{$fa-css-prefix}-toggle-off:before { content: fa-content($fa-var-toggle-off); }
-.#{$fa-css-prefix}-toggle-on:before { content: fa-content($fa-var-toggle-on); }
-.#{$fa-css-prefix}-toilet:before { content: fa-content($fa-var-toilet); }
-.#{$fa-css-prefix}-toilet-paper:before { content: fa-content($fa-var-toilet-paper); }
-.#{$fa-css-prefix}-toilet-paper-slash:before { content: fa-content($fa-var-toilet-paper-slash); }
-.#{$fa-css-prefix}-toolbox:before { content: fa-content($fa-var-toolbox); }
-.#{$fa-css-prefix}-tools:before { content: fa-content($fa-var-tools); }
-.#{$fa-css-prefix}-tooth:before { content: fa-content($fa-var-tooth); }
-.#{$fa-css-prefix}-torah:before { content: fa-content($fa-var-torah); }
-.#{$fa-css-prefix}-torii-gate:before { content: fa-content($fa-var-torii-gate); }
-.#{$fa-css-prefix}-tractor:before { content: fa-content($fa-var-tractor); }
-.#{$fa-css-prefix}-trade-federation:before { content: fa-content($fa-var-trade-federation); }
-.#{$fa-css-prefix}-trademark:before { content: fa-content($fa-var-trademark); }
-.#{$fa-css-prefix}-traffic-light:before { content: fa-content($fa-var-traffic-light); }
-.#{$fa-css-prefix}-trailer:before { content: fa-content($fa-var-trailer); }
-.#{$fa-css-prefix}-train:before { content: fa-content($fa-var-train); }
-.#{$fa-css-prefix}-tram:before { content: fa-content($fa-var-tram); }
-.#{$fa-css-prefix}-transgender:before { content: fa-content($fa-var-transgender); }
-.#{$fa-css-prefix}-transgender-alt:before { content: fa-content($fa-var-transgender-alt); }
-.#{$fa-css-prefix}-trash:before { content: fa-content($fa-var-trash); }
-.#{$fa-css-prefix}-trash-alt:before { content: fa-content($fa-var-trash-alt); }
-.#{$fa-css-prefix}-trash-restore:before { content: fa-content($fa-var-trash-restore); }
-.#{$fa-css-prefix}-trash-restore-alt:before { content: fa-content($fa-var-trash-restore-alt); }
-.#{$fa-css-prefix}-tree:before { content: fa-content($fa-var-tree); }
-.#{$fa-css-prefix}-trello:before { content: fa-content($fa-var-trello); }
-.#{$fa-css-prefix}-tripadvisor:before { content: fa-content($fa-var-tripadvisor); }
-.#{$fa-css-prefix}-trophy:before { content: fa-content($fa-var-trophy); }
-.#{$fa-css-prefix}-truck:before { content: fa-content($fa-var-truck); }
-.#{$fa-css-prefix}-truck-loading:before { content: fa-content($fa-var-truck-loading); }
-.#{$fa-css-prefix}-truck-monster:before { content: fa-content($fa-var-truck-monster); }
-.#{$fa-css-prefix}-truck-moving:before { content: fa-content($fa-var-truck-moving); }
-.#{$fa-css-prefix}-truck-pickup:before { content: fa-content($fa-var-truck-pickup); }
-.#{$fa-css-prefix}-tshirt:before { content: fa-content($fa-var-tshirt); }
-.#{$fa-css-prefix}-tty:before { content: fa-content($fa-var-tty); }
-.#{$fa-css-prefix}-tumblr:before { content: fa-content($fa-var-tumblr); }
-.#{$fa-css-prefix}-tumblr-square:before { content: fa-content($fa-var-tumblr-square); }
-.#{$fa-css-prefix}-tv:before { content: fa-content($fa-var-tv); }
-.#{$fa-css-prefix}-twitch:before { content: fa-content($fa-var-twitch); }
-.#{$fa-css-prefix}-twitter:before { content: fa-content($fa-var-twitter); }
-.#{$fa-css-prefix}-twitter-square:before { content: fa-content($fa-var-twitter-square); }
-.#{$fa-css-prefix}-typo3:before { content: fa-content($fa-var-typo3); }
-.#{$fa-css-prefix}-uber:before { content: fa-content($fa-var-uber); }
-.#{$fa-css-prefix}-ubuntu:before { content: fa-content($fa-var-ubuntu); }
-.#{$fa-css-prefix}-uikit:before { content: fa-content($fa-var-uikit); }
-.#{$fa-css-prefix}-umbraco:before { content: fa-content($fa-var-umbraco); }
-.#{$fa-css-prefix}-umbrella:before { content: fa-content($fa-var-umbrella); }
-.#{$fa-css-prefix}-umbrella-beach:before { content: fa-content($fa-var-umbrella-beach); }
-.#{$fa-css-prefix}-underline:before { content: fa-content($fa-var-underline); }
-.#{$fa-css-prefix}-undo:before { content: fa-content($fa-var-undo); }
-.#{$fa-css-prefix}-undo-alt:before { content: fa-content($fa-var-undo-alt); }
-.#{$fa-css-prefix}-uniregistry:before { content: fa-content($fa-var-uniregistry); }
-.#{$fa-css-prefix}-unity:before { content: fa-content($fa-var-unity); }
-.#{$fa-css-prefix}-universal-access:before { content: fa-content($fa-var-universal-access); }
-.#{$fa-css-prefix}-university:before { content: fa-content($fa-var-university); }
-.#{$fa-css-prefix}-unlink:before { content: fa-content($fa-var-unlink); }
-.#{$fa-css-prefix}-unlock:before { content: fa-content($fa-var-unlock); }
-.#{$fa-css-prefix}-unlock-alt:before { content: fa-content($fa-var-unlock-alt); }
-.#{$fa-css-prefix}-unsplash:before { content: fa-content($fa-var-unsplash); }
-.#{$fa-css-prefix}-untappd:before { content: fa-content($fa-var-untappd); }
-.#{$fa-css-prefix}-upload:before { content: fa-content($fa-var-upload); }
-.#{$fa-css-prefix}-ups:before { content: fa-content($fa-var-ups); }
-.#{$fa-css-prefix}-usb:before { content: fa-content($fa-var-usb); }
-.#{$fa-css-prefix}-user:before { content: fa-content($fa-var-user); }
-.#{$fa-css-prefix}-user-alt:before { content: fa-content($fa-var-user-alt); }
-.#{$fa-css-prefix}-user-alt-slash:before { content: fa-content($fa-var-user-alt-slash); }
-.#{$fa-css-prefix}-user-astronaut:before { content: fa-content($fa-var-user-astronaut); }
-.#{$fa-css-prefix}-user-check:before { content: fa-content($fa-var-user-check); }
-.#{$fa-css-prefix}-user-circle:before { content: fa-content($fa-var-user-circle); }
-.#{$fa-css-prefix}-user-clock:before { content: fa-content($fa-var-user-clock); }
-.#{$fa-css-prefix}-user-cog:before { content: fa-content($fa-var-user-cog); }
-.#{$fa-css-prefix}-user-edit:before { content: fa-content($fa-var-user-edit); }
-.#{$fa-css-prefix}-user-friends:before { content: fa-content($fa-var-user-friends); }
-.#{$fa-css-prefix}-user-graduate:before { content: fa-content($fa-var-user-graduate); }
-.#{$fa-css-prefix}-user-injured:before { content: fa-content($fa-var-user-injured); }
-.#{$fa-css-prefix}-user-lock:before { content: fa-content($fa-var-user-lock); }
-.#{$fa-css-prefix}-user-md:before { content: fa-content($fa-var-user-md); }
-.#{$fa-css-prefix}-user-minus:before { content: fa-content($fa-var-user-minus); }
-.#{$fa-css-prefix}-user-ninja:before { content: fa-content($fa-var-user-ninja); }
-.#{$fa-css-prefix}-user-nurse:before { content: fa-content($fa-var-user-nurse); }
-.#{$fa-css-prefix}-user-plus:before { content: fa-content($fa-var-user-plus); }
-.#{$fa-css-prefix}-user-secret:before { content: fa-content($fa-var-user-secret); }
-.#{$fa-css-prefix}-user-shield:before { content: fa-content($fa-var-user-shield); }
-.#{$fa-css-prefix}-user-slash:before { content: fa-content($fa-var-user-slash); }
-.#{$fa-css-prefix}-user-tag:before { content: fa-content($fa-var-user-tag); }
-.#{$fa-css-prefix}-user-tie:before { content: fa-content($fa-var-user-tie); }
-.#{$fa-css-prefix}-user-times:before { content: fa-content($fa-var-user-times); }
-.#{$fa-css-prefix}-users:before { content: fa-content($fa-var-users); }
-.#{$fa-css-prefix}-users-cog:before { content: fa-content($fa-var-users-cog); }
-.#{$fa-css-prefix}-users-slash:before { content: fa-content($fa-var-users-slash); }
-.#{$fa-css-prefix}-usps:before { content: fa-content($fa-var-usps); }
-.#{$fa-css-prefix}-ussunnah:before { content: fa-content($fa-var-ussunnah); }
-.#{$fa-css-prefix}-utensil-spoon:before { content: fa-content($fa-var-utensil-spoon); }
-.#{$fa-css-prefix}-utensils:before { content: fa-content($fa-var-utensils); }
-.#{$fa-css-prefix}-vaadin:before { content: fa-content($fa-var-vaadin); }
-.#{$fa-css-prefix}-vector-square:before { content: fa-content($fa-var-vector-square); }
-.#{$fa-css-prefix}-venus:before { content: fa-content($fa-var-venus); }
-.#{$fa-css-prefix}-venus-double:before { content: fa-content($fa-var-venus-double); }
-.#{$fa-css-prefix}-venus-mars:before { content: fa-content($fa-var-venus-mars); }
-.#{$fa-css-prefix}-viacoin:before { content: fa-content($fa-var-viacoin); }
-.#{$fa-css-prefix}-viadeo:before { content: fa-content($fa-var-viadeo); }
-.#{$fa-css-prefix}-viadeo-square:before { content: fa-content($fa-var-viadeo-square); }
-.#{$fa-css-prefix}-vial:before { content: fa-content($fa-var-vial); }
-.#{$fa-css-prefix}-vials:before { content: fa-content($fa-var-vials); }
-.#{$fa-css-prefix}-viber:before { content: fa-content($fa-var-viber); }
-.#{$fa-css-prefix}-video:before { content: fa-content($fa-var-video); }
-.#{$fa-css-prefix}-video-slash:before { content: fa-content($fa-var-video-slash); }
-.#{$fa-css-prefix}-vihara:before { content: fa-content($fa-var-vihara); }
-.#{$fa-css-prefix}-vimeo:before { content: fa-content($fa-var-vimeo); }
-.#{$fa-css-prefix}-vimeo-square:before { content: fa-content($fa-var-vimeo-square); }
-.#{$fa-css-prefix}-vimeo-v:before { content: fa-content($fa-var-vimeo-v); }
-.#{$fa-css-prefix}-vine:before { content: fa-content($fa-var-vine); }
-.#{$fa-css-prefix}-virus:before { content: fa-content($fa-var-virus); }
-.#{$fa-css-prefix}-virus-slash:before { content: fa-content($fa-var-virus-slash); }
-.#{$fa-css-prefix}-viruses:before { content: fa-content($fa-var-viruses); }
-.#{$fa-css-prefix}-vk:before { content: fa-content($fa-var-vk); }
-.#{$fa-css-prefix}-vnv:before { content: fa-content($fa-var-vnv); }
-.#{$fa-css-prefix}-voicemail:before { content: fa-content($fa-var-voicemail); }
-.#{$fa-css-prefix}-volleyball-ball:before { content: fa-content($fa-var-volleyball-ball); }
-.#{$fa-css-prefix}-volume-down:before { content: fa-content($fa-var-volume-down); }
-.#{$fa-css-prefix}-volume-mute:before { content: fa-content($fa-var-volume-mute); }
-.#{$fa-css-prefix}-volume-off:before { content: fa-content($fa-var-volume-off); }
-.#{$fa-css-prefix}-volume-up:before { content: fa-content($fa-var-volume-up); }
-.#{$fa-css-prefix}-vote-yea:before { content: fa-content($fa-var-vote-yea); }
-.#{$fa-css-prefix}-vr-cardboard:before { content: fa-content($fa-var-vr-cardboard); }
-.#{$fa-css-prefix}-vuejs:before { content: fa-content($fa-var-vuejs); }
-.#{$fa-css-prefix}-walking:before { content: fa-content($fa-var-walking); }
-.#{$fa-css-prefix}-wallet:before { content: fa-content($fa-var-wallet); }
-.#{$fa-css-prefix}-warehouse:before { content: fa-content($fa-var-warehouse); }
-.#{$fa-css-prefix}-water:before { content: fa-content($fa-var-water); }
-.#{$fa-css-prefix}-wave-square:before { content: fa-content($fa-var-wave-square); }
-.#{$fa-css-prefix}-waze:before { content: fa-content($fa-var-waze); }
-.#{$fa-css-prefix}-weebly:before { content: fa-content($fa-var-weebly); }
-.#{$fa-css-prefix}-weibo:before { content: fa-content($fa-var-weibo); }
-.#{$fa-css-prefix}-weight:before { content: fa-content($fa-var-weight); }
-.#{$fa-css-prefix}-weight-hanging:before { content: fa-content($fa-var-weight-hanging); }
-.#{$fa-css-prefix}-weixin:before { content: fa-content($fa-var-weixin); }
-.#{$fa-css-prefix}-whatsapp:before { content: fa-content($fa-var-whatsapp); }
-.#{$fa-css-prefix}-whatsapp-square:before { content: fa-content($fa-var-whatsapp-square); }
-.#{$fa-css-prefix}-wheelchair:before { content: fa-content($fa-var-wheelchair); }
-.#{$fa-css-prefix}-whmcs:before { content: fa-content($fa-var-whmcs); }
-.#{$fa-css-prefix}-wifi:before { content: fa-content($fa-var-wifi); }
-.#{$fa-css-prefix}-wikipedia-w:before { content: fa-content($fa-var-wikipedia-w); }
-.#{$fa-css-prefix}-wind:before { content: fa-content($fa-var-wind); }
-.#{$fa-css-prefix}-window-close:before { content: fa-content($fa-var-window-close); }
-.#{$fa-css-prefix}-window-maximize:before { content: fa-content($fa-var-window-maximize); }
-.#{$fa-css-prefix}-window-minimize:before { content: fa-content($fa-var-window-minimize); }
-.#{$fa-css-prefix}-window-restore:before { content: fa-content($fa-var-window-restore); }
-.#{$fa-css-prefix}-windows:before { content: fa-content($fa-var-windows); }
-.#{$fa-css-prefix}-wine-bottle:before { content: fa-content($fa-var-wine-bottle); }
-.#{$fa-css-prefix}-wine-glass:before { content: fa-content($fa-var-wine-glass); }
-.#{$fa-css-prefix}-wine-glass-alt:before { content: fa-content($fa-var-wine-glass-alt); }
-.#{$fa-css-prefix}-wix:before { content: fa-content($fa-var-wix); }
-.#{$fa-css-prefix}-wizards-of-the-coast:before { content: fa-content($fa-var-wizards-of-the-coast); }
-.#{$fa-css-prefix}-wolf-pack-battalion:before { content: fa-content($fa-var-wolf-pack-battalion); }
-.#{$fa-css-prefix}-won-sign:before { content: fa-content($fa-var-won-sign); }
-.#{$fa-css-prefix}-wordpress:before { content: fa-content($fa-var-wordpress); }
-.#{$fa-css-prefix}-wordpress-simple:before { content: fa-content($fa-var-wordpress-simple); }
-.#{$fa-css-prefix}-wpbeginner:before { content: fa-content($fa-var-wpbeginner); }
-.#{$fa-css-prefix}-wpexplorer:before { content: fa-content($fa-var-wpexplorer); }
-.#{$fa-css-prefix}-wpforms:before { content: fa-content($fa-var-wpforms); }
-.#{$fa-css-prefix}-wpressr:before { content: fa-content($fa-var-wpressr); }
-.#{$fa-css-prefix}-wrench:before { content: fa-content($fa-var-wrench); }
-.#{$fa-css-prefix}-x-ray:before { content: fa-content($fa-var-x-ray); }
-.#{$fa-css-prefix}-xbox:before { content: fa-content($fa-var-xbox); }
-.#{$fa-css-prefix}-xing:before { content: fa-content($fa-var-xing); }
-.#{$fa-css-prefix}-xing-square:before { content: fa-content($fa-var-xing-square); }
-.#{$fa-css-prefix}-y-combinator:before { content: fa-content($fa-var-y-combinator); }
-.#{$fa-css-prefix}-yahoo:before { content: fa-content($fa-var-yahoo); }
-.#{$fa-css-prefix}-yammer:before { content: fa-content($fa-var-yammer); }
-.#{$fa-css-prefix}-yandex:before { content: fa-content($fa-var-yandex); }
-.#{$fa-css-prefix}-yandex-international:before { content: fa-content($fa-var-yandex-international); }
-.#{$fa-css-prefix}-yarn:before { content: fa-content($fa-var-yarn); }
-.#{$fa-css-prefix}-yelp:before { content: fa-content($fa-var-yelp); }
-.#{$fa-css-prefix}-yen-sign:before { content: fa-content($fa-var-yen-sign); }
-.#{$fa-css-prefix}-yin-yang:before { content: fa-content($fa-var-yin-yang); }
-.#{$fa-css-prefix}-yoast:before { content: fa-content($fa-var-yoast); }
-.#{$fa-css-prefix}-youtube:before { content: fa-content($fa-var-youtube); }
-.#{$fa-css-prefix}-youtube-square:before { content: fa-content($fa-var-youtube-square); }
-.#{$fa-css-prefix}-zhihu:before { content: fa-content($fa-var-zhihu); }
diff --git a/src/assets/styles/fontawesome/_larger.scss b/src/assets/styles/fontawesome/_larger.scss
deleted file mode 100644
index 27c2ad5fc..000000000
--- a/src/assets/styles/fontawesome/_larger.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-// Icon Sizes
-// -------------------------
-
-// makes the font 33% larger relative to the icon container
-.#{$fa-css-prefix}-lg {
- font-size: (4em / 3);
- line-height: (3em / 4);
- vertical-align: -.0667em;
-}
-
-.#{$fa-css-prefix}-xs {
- font-size: .75em;
-}
-
-.#{$fa-css-prefix}-sm {
- font-size: .875em;
-}
-
-@for $i from 1 through 10 {
- .#{$fa-css-prefix}-#{$i}x {
- font-size: $i * 1em;
- }
-}
diff --git a/src/assets/styles/fontawesome/_list.scss b/src/assets/styles/fontawesome/_list.scss
deleted file mode 100644
index 8ebf33333..000000000
--- a/src/assets/styles/fontawesome/_list.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-// List Icons
-// -------------------------
-
-.#{$fa-css-prefix}-ul {
- list-style-type: none;
- margin-left: $fa-li-width * 5/4;
- padding-left: 0;
-
- > li { position: relative; }
-}
-
-.#{$fa-css-prefix}-li {
- left: -$fa-li-width;
- position: absolute;
- text-align: center;
- width: $fa-li-width;
- line-height: inherit;
-}
diff --git a/src/assets/styles/fontawesome/_mixins.scss b/src/assets/styles/fontawesome/_mixins.scss
deleted file mode 100644
index 55baeeba3..000000000
--- a/src/assets/styles/fontawesome/_mixins.scss
+++ /dev/null
@@ -1,56 +0,0 @@
-// Mixins
-// --------------------------
-
-@mixin fa-icon {
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- display: inline-block;
- font-style: normal;
- font-variant: normal;
- font-weight: normal;
- line-height: 1;
-}
-
-@mixin fa-icon-rotate($degrees, $rotation) {
- -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})";
- transform: rotate($degrees);
-}
-
-@mixin fa-icon-flip($horiz, $vert, $rotation) {
- -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)";
- transform: scale($horiz, $vert);
-}
-
-
-// Only display content to screen readers. A la Bootstrap 4.
-//
-// See: http://a11yproject.com/posts/how-to-hide-content/
-
-@mixin sr-only {
- border: 0;
- clip: rect(0, 0, 0, 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-
-// Use in conjunction with .sr-only to only display content when it's focused.
-//
-// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
-//
-// Credit: HTML5 Boilerplate
-
-@mixin sr-only-focusable {
- &:active,
- &:focus {
- clip: auto;
- height: auto;
- margin: 0;
- overflow: visible;
- position: static;
- width: auto;
- }
-}
diff --git a/src/assets/styles/fontawesome/_rotated-flipped.scss b/src/assets/styles/fontawesome/_rotated-flipped.scss
deleted file mode 100644
index 164d97219..000000000
--- a/src/assets/styles/fontawesome/_rotated-flipped.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-// Rotated & Flipped Icons
-// -------------------------
-
-.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
-.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
-.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
-
-.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
-.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
-.#{$fa-css-prefix}-flip-both, .#{$fa-css-prefix}-flip-horizontal.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(-1, -1, 2); }
-
-// Hook for IE8-9
-// -------------------------
-
-:root {
- .#{$fa-css-prefix}-rotate-90,
- .#{$fa-css-prefix}-rotate-180,
- .#{$fa-css-prefix}-rotate-270,
- .#{$fa-css-prefix}-flip-horizontal,
- .#{$fa-css-prefix}-flip-vertical,
- .#{$fa-css-prefix}-flip-both {
- filter: none;
- }
-}
diff --git a/src/assets/styles/fontawesome/_screen-reader.scss b/src/assets/styles/fontawesome/_screen-reader.scss
deleted file mode 100644
index 5d0ab262f..000000000
--- a/src/assets/styles/fontawesome/_screen-reader.scss
+++ /dev/null
@@ -1,5 +0,0 @@
-// Screen Readers
-// -------------------------
-
-.sr-only { @include sr-only; }
-.sr-only-focusable { @include sr-only-focusable; }
diff --git a/src/assets/styles/fontawesome/_shims.scss b/src/assets/styles/fontawesome/_shims.scss
deleted file mode 100644
index d1753445c..000000000
--- a/src/assets/styles/fontawesome/_shims.scss
+++ /dev/null
@@ -1,2066 +0,0 @@
-.#{$fa-css-prefix}.#{$fa-css-prefix}-glass:before { content: fa-content($fa-var-glass-martini); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-meetup {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-star-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-star-o:before { content: fa-content($fa-var-star); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-remove:before { content: fa-content($fa-var-times); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-close:before { content: fa-content($fa-var-times); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-gear:before { content: fa-content($fa-var-cog); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-trash-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-trash-o:before { content: fa-content($fa-var-trash-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-o:before { content: fa-content($fa-var-file); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-clock-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-clock-o:before { content: fa-content($fa-var-clock); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-down {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-down:before { content: fa-content($fa-var-arrow-alt-circle-down); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-up {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-up:before { content: fa-content($fa-var-arrow-alt-circle-up); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-play-circle-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-play-circle-o:before { content: fa-content($fa-var-play-circle); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-repeat:before { content: fa-content($fa-var-redo); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-rotate-right:before { content: fa-content($fa-var-redo); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-refresh:before { content: fa-content($fa-var-sync); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-list-alt {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-dedent:before { content: fa-content($fa-var-outdent); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-video-camera:before { content: fa-content($fa-var-video); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-picture-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-picture-o:before { content: fa-content($fa-var-image); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-photo {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-photo:before { content: fa-content($fa-var-image); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-image {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-image:before { content: fa-content($fa-var-image); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pencil:before { content: fa-content($fa-var-pencil-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-map-marker:before { content: fa-content($fa-var-map-marker-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pencil-square-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pencil-square-o:before { content: fa-content($fa-var-edit); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-share-square-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-share-square-o:before { content: fa-content($fa-var-share-square); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-check-square-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-check-square-o:before { content: fa-content($fa-var-check-square); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrows:before { content: fa-content($fa-var-arrows-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-times-circle-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-times-circle-o:before { content: fa-content($fa-var-times-circle); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-check-circle-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-check-circle-o:before { content: fa-content($fa-var-check-circle); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-mail-forward:before { content: fa-content($fa-var-share); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-expand:before { content: fa-content($fa-var-expand-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-compress:before { content: fa-content($fa-var-compress-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-eye {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-eye-slash {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-warning:before { content: fa-content($fa-var-exclamation-triangle); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar:before { content: fa-content($fa-var-calendar-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrows-v:before { content: fa-content($fa-var-arrows-alt-v); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrows-h:before { content: fa-content($fa-var-arrows-alt-h); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bar-chart {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bar-chart:before { content: fa-content($fa-var-chart-bar); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bar-chart-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bar-chart-o:before { content: fa-content($fa-var-chart-bar); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-twitter-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-gears:before { content: fa-content($fa-var-cogs); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-up {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-up:before { content: fa-content($fa-var-thumbs-up); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-down {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-thumbs-o-down:before { content: fa-content($fa-var-thumbs-down); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-heart-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-heart-o:before { content: fa-content($fa-var-heart); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sign-out:before { content: fa-content($fa-var-sign-out-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin-square:before { content: fa-content($fa-var-linkedin); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-thumb-tack:before { content: fa-content($fa-var-thumbtack); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-external-link:before { content: fa-content($fa-var-external-link-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sign-in:before { content: fa-content($fa-var-sign-in-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-github-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-lemon-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-lemon-o:before { content: fa-content($fa-var-lemon); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-square-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-square-o:before { content: fa-content($fa-var-square); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bookmark-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bookmark-o:before { content: fa-content($fa-var-bookmark); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-twitter {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook:before { content: fa-content($fa-var-facebook-f); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-f {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-f:before { content: fa-content($fa-var-facebook-f); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-github {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-credit-card {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-feed:before { content: fa-content($fa-var-rss); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hdd-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hdd-o:before { content: fa-content($fa-var-hdd); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-right {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-right:before { content: fa-content($fa-var-hand-point-right); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-left {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-left:before { content: fa-content($fa-var-hand-point-left); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-up {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-up:before { content: fa-content($fa-var-hand-point-up); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-down {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-o-down:before { content: fa-content($fa-var-hand-point-down); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrows-alt:before { content: fa-content($fa-var-expand-arrows-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-group:before { content: fa-content($fa-var-users); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-chain:before { content: fa-content($fa-var-link); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-scissors:before { content: fa-content($fa-var-cut); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-files-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-files-o:before { content: fa-content($fa-var-copy); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-floppy-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-floppy-o:before { content: fa-content($fa-var-save); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-navicon:before { content: fa-content($fa-var-bars); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-reorder:before { content: fa-content($fa-var-bars); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pinterest {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pinterest-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus:before { content: fa-content($fa-var-google-plus-g); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-money {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-money:before { content: fa-content($fa-var-money-bill-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-unsorted:before { content: fa-content($fa-var-sort); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-desc:before { content: fa-content($fa-var-sort-down); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-asc:before { content: fa-content($fa-var-sort-up); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-linkedin:before { content: fa-content($fa-var-linkedin-in); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-rotate-left:before { content: fa-content($fa-var-undo); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-legal:before { content: fa-content($fa-var-gavel); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-tachometer:before { content: fa-content($fa-var-tachometer-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-dashboard:before { content: fa-content($fa-var-tachometer-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-comment-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-comment-o:before { content: fa-content($fa-var-comment); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-comments-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-comments-o:before { content: fa-content($fa-var-comments); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-flash:before { content: fa-content($fa-var-bolt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-clipboard {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-paste {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-paste:before { content: fa-content($fa-var-clipboard); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-lightbulb-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-lightbulb-o:before { content: fa-content($fa-var-lightbulb); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-exchange:before { content: fa-content($fa-var-exchange-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cloud-download:before { content: fa-content($fa-var-cloud-download-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cloud-upload:before { content: fa-content($fa-var-cloud-upload-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bell-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bell-o:before { content: fa-content($fa-var-bell); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cutlery:before { content: fa-content($fa-var-utensils); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-text-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-text-o:before { content: fa-content($fa-var-file-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-building-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-building-o:before { content: fa-content($fa-var-building); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hospital-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hospital-o:before { content: fa-content($fa-var-hospital); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-tablet:before { content: fa-content($fa-var-tablet-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-mobile:before { content: fa-content($fa-var-mobile-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-mobile-phone:before { content: fa-content($fa-var-mobile-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-circle-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-circle-o:before { content: fa-content($fa-var-circle); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-mail-reply:before { content: fa-content($fa-var-reply); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-github-alt {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-folder-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-folder-o:before { content: fa-content($fa-var-folder); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-folder-open-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-folder-open-o:before { content: fa-content($fa-var-folder-open); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-smile-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-smile-o:before { content: fa-content($fa-var-smile); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-frown-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-frown-o:before { content: fa-content($fa-var-frown); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-meh-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-meh-o:before { content: fa-content($fa-var-meh); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-keyboard-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-keyboard-o:before { content: fa-content($fa-var-keyboard); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-flag-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-flag-o:before { content: fa-content($fa-var-flag); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-mail-reply-all:before { content: fa-content($fa-var-reply-all); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-o:before { content: fa-content($fa-var-star-half); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-empty {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-empty:before { content: fa-content($fa-var-star-half); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-full {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-star-half-full:before { content: fa-content($fa-var-star-half); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-code-fork:before { content: fa-content($fa-var-code-branch); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-chain-broken:before { content: fa-content($fa-var-unlink); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-shield:before { content: fa-content($fa-var-shield-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-o:before { content: fa-content($fa-var-calendar); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-maxcdn {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-html5 {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-css3 {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-ticket:before { content: fa-content($fa-var-ticket-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-minus-square-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-minus-square-o:before { content: fa-content($fa-var-minus-square); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-level-up:before { content: fa-content($fa-var-level-up-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-level-down:before { content: fa-content($fa-var-level-down-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pencil-square:before { content: fa-content($fa-var-pen-square); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-external-link-square:before { content: fa-content($fa-var-external-link-square-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-compass {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-down {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-down:before { content: fa-content($fa-var-caret-square-down); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-down {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-down:before { content: fa-content($fa-var-caret-square-down); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-up {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-up:before { content: fa-content($fa-var-caret-square-up); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-up {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-up:before { content: fa-content($fa-var-caret-square-up); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-right {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-right:before { content: fa-content($fa-var-caret-square-right); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-right {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-right:before { content: fa-content($fa-var-caret-square-right); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-eur:before { content: fa-content($fa-var-euro-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-euro:before { content: fa-content($fa-var-euro-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-gbp:before { content: fa-content($fa-var-pound-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-usd:before { content: fa-content($fa-var-dollar-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-dollar:before { content: fa-content($fa-var-dollar-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-inr:before { content: fa-content($fa-var-rupee-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-rupee:before { content: fa-content($fa-var-rupee-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-jpy:before { content: fa-content($fa-var-yen-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cny:before { content: fa-content($fa-var-yen-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-rmb:before { content: fa-content($fa-var-yen-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-yen:before { content: fa-content($fa-var-yen-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-rub:before { content: fa-content($fa-var-ruble-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-ruble:before { content: fa-content($fa-var-ruble-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-rouble:before { content: fa-content($fa-var-ruble-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-krw:before { content: fa-content($fa-var-won-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-won:before { content: fa-content($fa-var-won-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-btc {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bitcoin {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bitcoin:before { content: fa-content($fa-var-btc); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-text:before { content: fa-content($fa-var-file-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-alpha-asc:before { content: fa-content($fa-var-sort-alpha-down); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-alpha-desc:before { content: fa-content($fa-var-sort-alpha-down-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-amount-asc:before { content: fa-content($fa-var-sort-amount-down); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-amount-desc:before { content: fa-content($fa-var-sort-amount-down-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-numeric-asc:before { content: fa-content($fa-var-sort-numeric-down); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sort-numeric-desc:before { content: fa-content($fa-var-sort-numeric-down-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-youtube-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-youtube {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-xing {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-xing-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-youtube-play {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-youtube-play:before { content: fa-content($fa-var-youtube); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-dropbox {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-stack-overflow {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-instagram {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-flickr {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-adn {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bitbucket {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bitbucket-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bitbucket-square:before { content: fa-content($fa-var-bitbucket); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-tumblr {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-tumblr-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-down:before { content: fa-content($fa-var-long-arrow-alt-down); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-up:before { content: fa-content($fa-var-long-arrow-alt-up); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-left:before { content: fa-content($fa-var-long-arrow-alt-left); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-long-arrow-right:before { content: fa-content($fa-var-long-arrow-alt-right); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-apple {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-windows {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-android {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-linux {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-dribbble {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-skype {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-foursquare {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-trello {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-gratipay {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-gittip {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-gittip:before { content: fa-content($fa-var-gratipay); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sun-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sun-o:before { content: fa-content($fa-var-sun); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-moon-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-moon-o:before { content: fa-content($fa-var-moon); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-vk {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-weibo {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-renren {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pagelines {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-stack-exchange {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-right {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-right:before { content: fa-content($fa-var-arrow-alt-circle-right); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-left {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-arrow-circle-o-left:before { content: fa-content($fa-var-arrow-alt-circle-left); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-left {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-caret-square-o-left:before { content: fa-content($fa-var-caret-square-left); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-left {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-toggle-left:before { content: fa-content($fa-var-caret-square-left); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-dot-circle-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-dot-circle-o:before { content: fa-content($fa-var-dot-circle); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-vimeo-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-try:before { content: fa-content($fa-var-lira-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-turkish-lira:before { content: fa-content($fa-var-lira-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-plus-square-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-plus-square-o:before { content: fa-content($fa-var-plus-square); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-slack {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-wordpress {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-openid {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-institution:before { content: fa-content($fa-var-university); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bank:before { content: fa-content($fa-var-university); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-mortar-board:before { content: fa-content($fa-var-graduation-cap); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-yahoo {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-google {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-reddit {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-reddit-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-stumbleupon-circle {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-stumbleupon {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-delicious {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-digg {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pied-piper-pp {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pied-piper-alt {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-drupal {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-joomla {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-spoon:before { content: fa-content($fa-var-utensil-spoon); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-behance {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-behance-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-steam {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-steam-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-automobile:before { content: fa-content($fa-var-car); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-o:before { content: fa-content($fa-var-envelope); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-spotify {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-deviantart {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-soundcloud {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-pdf-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-pdf-o:before { content: fa-content($fa-var-file-pdf); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-word-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-word-o:before { content: fa-content($fa-var-file-word); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-excel-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-excel-o:before { content: fa-content($fa-var-file-excel); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-powerpoint-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-powerpoint-o:before { content: fa-content($fa-var-file-powerpoint); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-image-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-image-o:before { content: fa-content($fa-var-file-image); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-photo-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-photo-o:before { content: fa-content($fa-var-file-image); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-picture-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-picture-o:before { content: fa-content($fa-var-file-image); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-archive-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-archive-o:before { content: fa-content($fa-var-file-archive); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-zip-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-zip-o:before { content: fa-content($fa-var-file-archive); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-audio-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-audio-o:before { content: fa-content($fa-var-file-audio); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-sound-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-sound-o:before { content: fa-content($fa-var-file-audio); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-video-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-video-o:before { content: fa-content($fa-var-file-video); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-movie-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-movie-o:before { content: fa-content($fa-var-file-video); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-code-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-file-code-o:before { content: fa-content($fa-var-file-code); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-vine {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-codepen {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-jsfiddle {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-life-ring {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-life-bouy {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-life-bouy:before { content: fa-content($fa-var-life-ring); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-life-buoy {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-life-buoy:before { content: fa-content($fa-var-life-ring); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-life-saver {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-life-saver:before { content: fa-content($fa-var-life-ring); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-support {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-support:before { content: fa-content($fa-var-life-ring); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-circle-o-notch:before { content: fa-content($fa-var-circle-notch); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-rebel {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-ra {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-ra:before { content: fa-content($fa-var-rebel); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-resistance {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-resistance:before { content: fa-content($fa-var-rebel); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-empire {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-ge {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-ge:before { content: fa-content($fa-var-empire); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-git-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-git {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hacker-news {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-y-combinator-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-y-combinator-square:before { content: fa-content($fa-var-hacker-news); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-yc-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-yc-square:before { content: fa-content($fa-var-hacker-news); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-tencent-weibo {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-qq {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-weixin {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-wechat {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-wechat:before { content: fa-content($fa-var-weixin); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-send:before { content: fa-content($fa-var-paper-plane); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-paper-plane-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-paper-plane-o:before { content: fa-content($fa-var-paper-plane); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-send-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-send-o:before { content: fa-content($fa-var-paper-plane); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-circle-thin {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-circle-thin:before { content: fa-content($fa-var-circle); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-header:before { content: fa-content($fa-var-heading); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sliders:before { content: fa-content($fa-var-sliders-h); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-futbol-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-futbol-o:before { content: fa-content($fa-var-futbol); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-soccer-ball-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-soccer-ball-o:before { content: fa-content($fa-var-futbol); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-slideshare {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-twitch {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-yelp {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-newspaper-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-newspaper-o:before { content: fa-content($fa-var-newspaper); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-paypal {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-google-wallet {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-visa {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-mastercard {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-discover {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-amex {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-paypal {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-stripe {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bell-slash-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bell-slash-o:before { content: fa-content($fa-var-bell-slash); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-trash:before { content: fa-content($fa-var-trash-alt); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-copyright {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-eyedropper:before { content: fa-content($fa-var-eye-dropper); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-area-chart:before { content: fa-content($fa-var-chart-area); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pie-chart:before { content: fa-content($fa-var-chart-pie); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-line-chart:before { content: fa-content($fa-var-chart-line); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-lastfm {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-lastfm-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-ioxhost {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-angellist {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cc {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cc:before { content: fa-content($fa-var-closed-captioning); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-ils:before { content: fa-content($fa-var-shekel-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-shekel:before { content: fa-content($fa-var-shekel-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sheqel:before { content: fa-content($fa-var-shekel-sign); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-meanpath {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-meanpath:before { content: fa-content($fa-var-font-awesome); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-buysellads {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-connectdevelop {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-dashcube {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-forumbee {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-leanpub {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sellsy {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-shirtsinbulk {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-simplybuilt {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-skyatlas {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-diamond {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-diamond:before { content: fa-content($fa-var-gem); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-intersex:before { content: fa-content($fa-var-transgender); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-official {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-facebook-official:before { content: fa-content($fa-var-facebook); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pinterest-p {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-whatsapp {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hotel:before { content: fa-content($fa-var-bed); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-viacoin {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-medium {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-y-combinator {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-yc {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-yc:before { content: fa-content($fa-var-y-combinator); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-optin-monster {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-opencart {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-expeditedssl {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-battery-4:before { content: fa-content($fa-var-battery-full); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-battery:before { content: fa-content($fa-var-battery-full); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-battery-3:before { content: fa-content($fa-var-battery-three-quarters); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-battery-2:before { content: fa-content($fa-var-battery-half); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-battery-1:before { content: fa-content($fa-var-battery-quarter); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-battery-0:before { content: fa-content($fa-var-battery-empty); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-object-group {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-object-ungroup {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sticky-note-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-sticky-note-o:before { content: fa-content($fa-var-sticky-note); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-jcb {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cc-diners-club {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-clone {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-o:before { content: fa-content($fa-var-hourglass); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-1:before { content: fa-content($fa-var-hourglass-start); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-2:before { content: fa-content($fa-var-hourglass-half); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hourglass-3:before { content: fa-content($fa-var-hourglass-end); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-rock-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-rock-o:before { content: fa-content($fa-var-hand-rock); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-grab-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-grab-o:before { content: fa-content($fa-var-hand-rock); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-paper-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-paper-o:before { content: fa-content($fa-var-hand-paper); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-stop-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-stop-o:before { content: fa-content($fa-var-hand-paper); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-scissors-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-scissors-o:before { content: fa-content($fa-var-hand-scissors); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-lizard-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-lizard-o:before { content: fa-content($fa-var-hand-lizard); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-spock-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-spock-o:before { content: fa-content($fa-var-hand-spock); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-pointer-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-pointer-o:before { content: fa-content($fa-var-hand-pointer); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-peace-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hand-peace-o:before { content: fa-content($fa-var-hand-peace); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-registered {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-creative-commons {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-gg {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-gg-circle {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-tripadvisor {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-odnoklassniki {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-odnoklassniki-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-get-pocket {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-wikipedia-w {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-safari {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-chrome {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-firefox {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-opera {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-internet-explorer {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-television:before { content: fa-content($fa-var-tv); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-contao {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-500px {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-amazon {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-plus-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-plus-o:before { content: fa-content($fa-var-calendar-plus); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-minus-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-minus-o:before { content: fa-content($fa-var-calendar-minus); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-times-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-times-o:before { content: fa-content($fa-var-calendar-times); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-check-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-calendar-check-o:before { content: fa-content($fa-var-calendar-check); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-map-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-map-o:before { content: fa-content($fa-var-map); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-commenting:before { content: fa-content($fa-var-comment-dots); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-commenting-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-commenting-o:before { content: fa-content($fa-var-comment-dots); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-houzz {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-vimeo {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-vimeo:before { content: fa-content($fa-var-vimeo-v); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-black-tie {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-fonticons {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-reddit-alien {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-edge {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-credit-card-alt:before { content: fa-content($fa-var-credit-card); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-codiepie {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-modx {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-fort-awesome {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-usb {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-product-hunt {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-mixcloud {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-scribd {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pause-circle-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pause-circle-o:before { content: fa-content($fa-var-pause-circle); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-stop-circle-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-stop-circle-o:before { content: fa-content($fa-var-stop-circle); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bluetooth {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bluetooth-b {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-gitlab {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-wpbeginner {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-wpforms {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-envira {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-wheelchair-alt {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-wheelchair-alt:before { content: fa-content($fa-var-accessible-icon); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-question-circle-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-question-circle-o:before { content: fa-content($fa-var-question-circle); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-volume-control-phone:before { content: fa-content($fa-var-phone-volume); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-asl-interpreting:before { content: fa-content($fa-var-american-sign-language-interpreting); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-deafness:before { content: fa-content($fa-var-deaf); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-hard-of-hearing:before { content: fa-content($fa-var-deaf); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-glide {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-glide-g {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-signing:before { content: fa-content($fa-var-sign-language); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-viadeo {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-viadeo-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-snapchat {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-snapchat-ghost {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-snapchat-square {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-pied-piper {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-first-order {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-yoast {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-themeisle {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-official {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-official:before { content: fa-content($fa-var-google-plus); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-circle {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-google-plus-circle:before { content: fa-content($fa-var-google-plus); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-font-awesome {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-fa {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-fa:before { content: fa-content($fa-var-font-awesome); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-handshake-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-handshake-o:before { content: fa-content($fa-var-handshake); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-open-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-envelope-open-o:before { content: fa-content($fa-var-envelope-open); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-linode {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-address-book-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-address-book-o:before { content: fa-content($fa-var-address-book); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-vcard:before { content: fa-content($fa-var-address-card); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-address-card-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-address-card-o:before { content: fa-content($fa-var-address-card); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-vcard-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-vcard-o:before { content: fa-content($fa-var-address-card); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-user-circle-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-user-circle-o:before { content: fa-content($fa-var-user-circle); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-user-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-user-o:before { content: fa-content($fa-var-user); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-id-badge {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-drivers-license:before { content: fa-content($fa-var-id-card); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-id-card-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-id-card-o:before { content: fa-content($fa-var-id-card); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-drivers-license-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-drivers-license-o:before { content: fa-content($fa-var-id-card); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-quora {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-free-code-camp {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-telegram {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-4:before { content: fa-content($fa-var-thermometer-full); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer:before { content: fa-content($fa-var-thermometer-full); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-3:before { content: fa-content($fa-var-thermometer-three-quarters); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-2:before { content: fa-content($fa-var-thermometer-half); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-1:before { content: fa-content($fa-var-thermometer-quarter); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-thermometer-0:before { content: fa-content($fa-var-thermometer-empty); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bathtub:before { content: fa-content($fa-var-bath); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-s15:before { content: fa-content($fa-var-bath); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-window-maximize {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-window-restore {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-times-rectangle:before { content: fa-content($fa-var-window-close); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-window-close-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-window-close-o:before { content: fa-content($fa-var-window-close); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-times-rectangle-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-times-rectangle-o:before { content: fa-content($fa-var-window-close); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-bandcamp {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-grav {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-etsy {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-imdb {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-ravelry {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-eercast {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-eercast:before { content: fa-content($fa-var-sellcast); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-snowflake-o {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
-.#{$fa-css-prefix}.#{$fa-css-prefix}-snowflake-o:before { content: fa-content($fa-var-snowflake); }
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-superpowers {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-wpexplorer {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
-
-.#{$fa-css-prefix}.#{$fa-css-prefix}-cab:before { content: fa-content($fa-var-taxi); }
-
diff --git a/src/assets/styles/fontawesome/_stacked.scss b/src/assets/styles/fontawesome/_stacked.scss
deleted file mode 100644
index ae7ef4e8e..000000000
--- a/src/assets/styles/fontawesome/_stacked.scss
+++ /dev/null
@@ -1,31 +0,0 @@
-// Stacked Icons
-// -------------------------
-
-.#{$fa-css-prefix}-stack {
- display: inline-block;
- height: 2em;
- line-height: 2em;
- position: relative;
- vertical-align: middle;
- width: ($fa-fw-width*2);
-}
-
-.#{$fa-css-prefix}-stack-1x,
-.#{$fa-css-prefix}-stack-2x {
- left: 0;
- position: absolute;
- text-align: center;
- width: 100%;
-}
-
-.#{$fa-css-prefix}-stack-1x {
- line-height: inherit;
-}
-
-.#{$fa-css-prefix}-stack-2x {
- font-size: 2em;
-}
-
-.#{$fa-css-prefix}-inverse {
- color: $fa-inverse;
-}
diff --git a/src/assets/styles/fontawesome/_variables.scss b/src/assets/styles/fontawesome/_variables.scss
deleted file mode 100644
index 7c0e2cafc..000000000
--- a/src/assets/styles/fontawesome/_variables.scss
+++ /dev/null
@@ -1,1468 +0,0 @@
-// Variables
-// --------------------------
-
-$fa-font-path: "../../webfonts" !default;
-$fa-font-size-base: 16px !default;
-$fa-font-display: block !default;
-$fa-css-prefix: fa !default;
-$fa-version: "5.14.0" !default;
-$fa-border-color: #eee !default;
-$fa-inverse: #fff !default;
-$fa-li-width: 2em !default;
-$fa-fw-width: (20em / 16);
-$fa-primary-opacity: 1 !default;
-$fa-secondary-opacity: .4 !default;
-
-// Convenience function used to set content property
-@function fa-content($fa-var) {
- @return unquote("\"#{ $fa-var }\"");
-}
-
-$fa-var-500px: \f26e;
-$fa-var-accessible-icon: \f368;
-$fa-var-accusoft: \f369;
-$fa-var-acquisitions-incorporated: \f6af;
-$fa-var-ad: \f641;
-$fa-var-address-book: \f2b9;
-$fa-var-address-card: \f2bb;
-$fa-var-adjust: \f042;
-$fa-var-adn: \f170;
-$fa-var-adobe: \f778;
-$fa-var-adversal: \f36a;
-$fa-var-affiliatetheme: \f36b;
-$fa-var-air-freshener: \f5d0;
-$fa-var-airbnb: \f834;
-$fa-var-algolia: \f36c;
-$fa-var-align-center: \f037;
-$fa-var-align-justify: \f039;
-$fa-var-align-left: \f036;
-$fa-var-align-right: \f038;
-$fa-var-alipay: \f642;
-$fa-var-allergies: \f461;
-$fa-var-amazon: \f270;
-$fa-var-amazon-pay: \f42c;
-$fa-var-ambulance: \f0f9;
-$fa-var-american-sign-language-interpreting: \f2a3;
-$fa-var-amilia: \f36d;
-$fa-var-anchor: \f13d;
-$fa-var-android: \f17b;
-$fa-var-angellist: \f209;
-$fa-var-angle-double-down: \f103;
-$fa-var-angle-double-left: \f100;
-$fa-var-angle-double-right: \f101;
-$fa-var-angle-double-up: \f102;
-$fa-var-angle-down: \f107;
-$fa-var-angle-left: \f104;
-$fa-var-angle-right: \f105;
-$fa-var-angle-up: \f106;
-$fa-var-angry: \f556;
-$fa-var-angrycreative: \f36e;
-$fa-var-angular: \f420;
-$fa-var-ankh: \f644;
-$fa-var-app-store: \f36f;
-$fa-var-app-store-ios: \f370;
-$fa-var-apper: \f371;
-$fa-var-apple: \f179;
-$fa-var-apple-alt: \f5d1;
-$fa-var-apple-pay: \f415;
-$fa-var-archive: \f187;
-$fa-var-archway: \f557;
-$fa-var-arrow-alt-circle-down: \f358;
-$fa-var-arrow-alt-circle-left: \f359;
-$fa-var-arrow-alt-circle-right: \f35a;
-$fa-var-arrow-alt-circle-up: \f35b;
-$fa-var-arrow-circle-down: \f0ab;
-$fa-var-arrow-circle-left: \f0a8;
-$fa-var-arrow-circle-right: \f0a9;
-$fa-var-arrow-circle-up: \f0aa;
-$fa-var-arrow-down: \f063;
-$fa-var-arrow-left: \f060;
-$fa-var-arrow-right: \f061;
-$fa-var-arrow-up: \f062;
-$fa-var-arrows-alt: \f0b2;
-$fa-var-arrows-alt-h: \f337;
-$fa-var-arrows-alt-v: \f338;
-$fa-var-artstation: \f77a;
-$fa-var-assistive-listening-systems: \f2a2;
-$fa-var-asterisk: \f069;
-$fa-var-asymmetrik: \f372;
-$fa-var-at: \f1fa;
-$fa-var-atlas: \f558;
-$fa-var-atlassian: \f77b;
-$fa-var-atom: \f5d2;
-$fa-var-audible: \f373;
-$fa-var-audio-description: \f29e;
-$fa-var-autoprefixer: \f41c;
-$fa-var-avianex: \f374;
-$fa-var-aviato: \f421;
-$fa-var-award: \f559;
-$fa-var-aws: \f375;
-$fa-var-baby: \f77c;
-$fa-var-baby-carriage: \f77d;
-$fa-var-backspace: \f55a;
-$fa-var-backward: \f04a;
-$fa-var-bacon: \f7e5;
-$fa-var-bacteria: \e059;
-$fa-var-bacterium: \e05a;
-$fa-var-bahai: \f666;
-$fa-var-balance-scale: \f24e;
-$fa-var-balance-scale-left: \f515;
-$fa-var-balance-scale-right: \f516;
-$fa-var-ban: \f05e;
-$fa-var-band-aid: \f462;
-$fa-var-bandcamp: \f2d5;
-$fa-var-barcode: \f02a;
-$fa-var-bars: \f0c9;
-$fa-var-baseball-ball: \f433;
-$fa-var-basketball-ball: \f434;
-$fa-var-bath: \f2cd;
-$fa-var-battery-empty: \f244;
-$fa-var-battery-full: \f240;
-$fa-var-battery-half: \f242;
-$fa-var-battery-quarter: \f243;
-$fa-var-battery-three-quarters: \f241;
-$fa-var-battle-net: \f835;
-$fa-var-bed: \f236;
-$fa-var-beer: \f0fc;
-$fa-var-behance: \f1b4;
-$fa-var-behance-square: \f1b5;
-$fa-var-bell: \f0f3;
-$fa-var-bell-slash: \f1f6;
-$fa-var-bezier-curve: \f55b;
-$fa-var-bible: \f647;
-$fa-var-bicycle: \f206;
-$fa-var-biking: \f84a;
-$fa-var-bimobject: \f378;
-$fa-var-binoculars: \f1e5;
-$fa-var-biohazard: \f780;
-$fa-var-birthday-cake: \f1fd;
-$fa-var-bitbucket: \f171;
-$fa-var-bitcoin: \f379;
-$fa-var-bity: \f37a;
-$fa-var-black-tie: \f27e;
-$fa-var-blackberry: \f37b;
-$fa-var-blender: \f517;
-$fa-var-blender-phone: \f6b6;
-$fa-var-blind: \f29d;
-$fa-var-blog: \f781;
-$fa-var-blogger: \f37c;
-$fa-var-blogger-b: \f37d;
-$fa-var-bluetooth: \f293;
-$fa-var-bluetooth-b: \f294;
-$fa-var-bold: \f032;
-$fa-var-bolt: \f0e7;
-$fa-var-bomb: \f1e2;
-$fa-var-bone: \f5d7;
-$fa-var-bong: \f55c;
-$fa-var-book: \f02d;
-$fa-var-book-dead: \f6b7;
-$fa-var-book-medical: \f7e6;
-$fa-var-book-open: \f518;
-$fa-var-book-reader: \f5da;
-$fa-var-bookmark: \f02e;
-$fa-var-bootstrap: \f836;
-$fa-var-border-all: \f84c;
-$fa-var-border-none: \f850;
-$fa-var-border-style: \f853;
-$fa-var-bowling-ball: \f436;
-$fa-var-box: \f466;
-$fa-var-box-open: \f49e;
-$fa-var-box-tissue: \e05b;
-$fa-var-boxes: \f468;
-$fa-var-braille: \f2a1;
-$fa-var-brain: \f5dc;
-$fa-var-bread-slice: \f7ec;
-$fa-var-briefcase: \f0b1;
-$fa-var-briefcase-medical: \f469;
-$fa-var-broadcast-tower: \f519;
-$fa-var-broom: \f51a;
-$fa-var-brush: \f55d;
-$fa-var-btc: \f15a;
-$fa-var-buffer: \f837;
-$fa-var-bug: \f188;
-$fa-var-building: \f1ad;
-$fa-var-bullhorn: \f0a1;
-$fa-var-bullseye: \f140;
-$fa-var-burn: \f46a;
-$fa-var-buromobelexperte: \f37f;
-$fa-var-bus: \f207;
-$fa-var-bus-alt: \f55e;
-$fa-var-business-time: \f64a;
-$fa-var-buy-n-large: \f8a6;
-$fa-var-buysellads: \f20d;
-$fa-var-calculator: \f1ec;
-$fa-var-calendar: \f133;
-$fa-var-calendar-alt: \f073;
-$fa-var-calendar-check: \f274;
-$fa-var-calendar-day: \f783;
-$fa-var-calendar-minus: \f272;
-$fa-var-calendar-plus: \f271;
-$fa-var-calendar-times: \f273;
-$fa-var-calendar-week: \f784;
-$fa-var-camera: \f030;
-$fa-var-camera-retro: \f083;
-$fa-var-campground: \f6bb;
-$fa-var-canadian-maple-leaf: \f785;
-$fa-var-candy-cane: \f786;
-$fa-var-cannabis: \f55f;
-$fa-var-capsules: \f46b;
-$fa-var-car: \f1b9;
-$fa-var-car-alt: \f5de;
-$fa-var-car-battery: \f5df;
-$fa-var-car-crash: \f5e1;
-$fa-var-car-side: \f5e4;
-$fa-var-caravan: \f8ff;
-$fa-var-caret-down: \f0d7;
-$fa-var-caret-left: \f0d9;
-$fa-var-caret-right: \f0da;
-$fa-var-caret-square-down: \f150;
-$fa-var-caret-square-left: \f191;
-$fa-var-caret-square-right: \f152;
-$fa-var-caret-square-up: \f151;
-$fa-var-caret-up: \f0d8;
-$fa-var-carrot: \f787;
-$fa-var-cart-arrow-down: \f218;
-$fa-var-cart-plus: \f217;
-$fa-var-cash-register: \f788;
-$fa-var-cat: \f6be;
-$fa-var-cc-amazon-pay: \f42d;
-$fa-var-cc-amex: \f1f3;
-$fa-var-cc-apple-pay: \f416;
-$fa-var-cc-diners-club: \f24c;
-$fa-var-cc-discover: \f1f2;
-$fa-var-cc-jcb: \f24b;
-$fa-var-cc-mastercard: \f1f1;
-$fa-var-cc-paypal: \f1f4;
-$fa-var-cc-stripe: \f1f5;
-$fa-var-cc-visa: \f1f0;
-$fa-var-centercode: \f380;
-$fa-var-centos: \f789;
-$fa-var-certificate: \f0a3;
-$fa-var-chair: \f6c0;
-$fa-var-chalkboard: \f51b;
-$fa-var-chalkboard-teacher: \f51c;
-$fa-var-charging-station: \f5e7;
-$fa-var-chart-area: \f1fe;
-$fa-var-chart-bar: \f080;
-$fa-var-chart-line: \f201;
-$fa-var-chart-pie: \f200;
-$fa-var-check: \f00c;
-$fa-var-check-circle: \f058;
-$fa-var-check-double: \f560;
-$fa-var-check-square: \f14a;
-$fa-var-cheese: \f7ef;
-$fa-var-chess: \f439;
-$fa-var-chess-bishop: \f43a;
-$fa-var-chess-board: \f43c;
-$fa-var-chess-king: \f43f;
-$fa-var-chess-knight: \f441;
-$fa-var-chess-pawn: \f443;
-$fa-var-chess-queen: \f445;
-$fa-var-chess-rook: \f447;
-$fa-var-chevron-circle-down: \f13a;
-$fa-var-chevron-circle-left: \f137;
-$fa-var-chevron-circle-right: \f138;
-$fa-var-chevron-circle-up: \f139;
-$fa-var-chevron-down: \f078;
-$fa-var-chevron-left: \f053;
-$fa-var-chevron-right: \f054;
-$fa-var-chevron-up: \f077;
-$fa-var-child: \f1ae;
-$fa-var-chrome: \f268;
-$fa-var-chromecast: \f838;
-$fa-var-church: \f51d;
-$fa-var-circle: \f111;
-$fa-var-circle-notch: \f1ce;
-$fa-var-city: \f64f;
-$fa-var-clinic-medical: \f7f2;
-$fa-var-clipboard: \f328;
-$fa-var-clipboard-check: \f46c;
-$fa-var-clipboard-list: \f46d;
-$fa-var-clock: \f017;
-$fa-var-clone: \f24d;
-$fa-var-closed-captioning: \f20a;
-$fa-var-cloud: \f0c2;
-$fa-var-cloud-download-alt: \f381;
-$fa-var-cloud-meatball: \f73b;
-$fa-var-cloud-moon: \f6c3;
-$fa-var-cloud-moon-rain: \f73c;
-$fa-var-cloud-rain: \f73d;
-$fa-var-cloud-showers-heavy: \f740;
-$fa-var-cloud-sun: \f6c4;
-$fa-var-cloud-sun-rain: \f743;
-$fa-var-cloud-upload-alt: \f382;
-$fa-var-cloudscale: \f383;
-$fa-var-cloudsmith: \f384;
-$fa-var-cloudversify: \f385;
-$fa-var-cocktail: \f561;
-$fa-var-code: \f121;
-$fa-var-code-branch: \f126;
-$fa-var-codepen: \f1cb;
-$fa-var-codiepie: \f284;
-$fa-var-coffee: \f0f4;
-$fa-var-cog: \f013;
-$fa-var-cogs: \f085;
-$fa-var-coins: \f51e;
-$fa-var-columns: \f0db;
-$fa-var-comment: \f075;
-$fa-var-comment-alt: \f27a;
-$fa-var-comment-dollar: \f651;
-$fa-var-comment-dots: \f4ad;
-$fa-var-comment-medical: \f7f5;
-$fa-var-comment-slash: \f4b3;
-$fa-var-comments: \f086;
-$fa-var-comments-dollar: \f653;
-$fa-var-compact-disc: \f51f;
-$fa-var-compass: \f14e;
-$fa-var-compress: \f066;
-$fa-var-compress-alt: \f422;
-$fa-var-compress-arrows-alt: \f78c;
-$fa-var-concierge-bell: \f562;
-$fa-var-confluence: \f78d;
-$fa-var-connectdevelop: \f20e;
-$fa-var-contao: \f26d;
-$fa-var-cookie: \f563;
-$fa-var-cookie-bite: \f564;
-$fa-var-copy: \f0c5;
-$fa-var-copyright: \f1f9;
-$fa-var-cotton-bureau: \f89e;
-$fa-var-couch: \f4b8;
-$fa-var-cpanel: \f388;
-$fa-var-creative-commons: \f25e;
-$fa-var-creative-commons-by: \f4e7;
-$fa-var-creative-commons-nc: \f4e8;
-$fa-var-creative-commons-nc-eu: \f4e9;
-$fa-var-creative-commons-nc-jp: \f4ea;
-$fa-var-creative-commons-nd: \f4eb;
-$fa-var-creative-commons-pd: \f4ec;
-$fa-var-creative-commons-pd-alt: \f4ed;
-$fa-var-creative-commons-remix: \f4ee;
-$fa-var-creative-commons-sa: \f4ef;
-$fa-var-creative-commons-sampling: \f4f0;
-$fa-var-creative-commons-sampling-plus: \f4f1;
-$fa-var-creative-commons-share: \f4f2;
-$fa-var-creative-commons-zero: \f4f3;
-$fa-var-credit-card: \f09d;
-$fa-var-critical-role: \f6c9;
-$fa-var-crop: \f125;
-$fa-var-crop-alt: \f565;
-$fa-var-cross: \f654;
-$fa-var-crosshairs: \f05b;
-$fa-var-crow: \f520;
-$fa-var-crown: \f521;
-$fa-var-crutch: \f7f7;
-$fa-var-css3: \f13c;
-$fa-var-css3-alt: \f38b;
-$fa-var-cube: \f1b2;
-$fa-var-cubes: \f1b3;
-$fa-var-cut: \f0c4;
-$fa-var-cuttlefish: \f38c;
-$fa-var-d-and-d: \f38d;
-$fa-var-d-and-d-beyond: \f6ca;
-$fa-var-dailymotion: \e052;
-$fa-var-dashcube: \f210;
-$fa-var-database: \f1c0;
-$fa-var-deaf: \f2a4;
-$fa-var-deezer: \e077;
-$fa-var-delicious: \f1a5;
-$fa-var-democrat: \f747;
-$fa-var-deploydog: \f38e;
-$fa-var-deskpro: \f38f;
-$fa-var-desktop: \f108;
-$fa-var-dev: \f6cc;
-$fa-var-deviantart: \f1bd;
-$fa-var-dharmachakra: \f655;
-$fa-var-dhl: \f790;
-$fa-var-diagnoses: \f470;
-$fa-var-diaspora: \f791;
-$fa-var-dice: \f522;
-$fa-var-dice-d20: \f6cf;
-$fa-var-dice-d6: \f6d1;
-$fa-var-dice-five: \f523;
-$fa-var-dice-four: \f524;
-$fa-var-dice-one: \f525;
-$fa-var-dice-six: \f526;
-$fa-var-dice-three: \f527;
-$fa-var-dice-two: \f528;
-$fa-var-digg: \f1a6;
-$fa-var-digital-ocean: \f391;
-$fa-var-digital-tachograph: \f566;
-$fa-var-directions: \f5eb;
-$fa-var-discord: \f392;
-$fa-var-discourse: \f393;
-$fa-var-disease: \f7fa;
-$fa-var-divide: \f529;
-$fa-var-dizzy: \f567;
-$fa-var-dna: \f471;
-$fa-var-dochub: \f394;
-$fa-var-docker: \f395;
-$fa-var-dog: \f6d3;
-$fa-var-dollar-sign: \f155;
-$fa-var-dolly: \f472;
-$fa-var-dolly-flatbed: \f474;
-$fa-var-donate: \f4b9;
-$fa-var-door-closed: \f52a;
-$fa-var-door-open: \f52b;
-$fa-var-dot-circle: \f192;
-$fa-var-dove: \f4ba;
-$fa-var-download: \f019;
-$fa-var-draft2digital: \f396;
-$fa-var-drafting-compass: \f568;
-$fa-var-dragon: \f6d5;
-$fa-var-draw-polygon: \f5ee;
-$fa-var-dribbble: \f17d;
-$fa-var-dribbble-square: \f397;
-$fa-var-dropbox: \f16b;
-$fa-var-drum: \f569;
-$fa-var-drum-steelpan: \f56a;
-$fa-var-drumstick-bite: \f6d7;
-$fa-var-drupal: \f1a9;
-$fa-var-dumbbell: \f44b;
-$fa-var-dumpster: \f793;
-$fa-var-dumpster-fire: \f794;
-$fa-var-dungeon: \f6d9;
-$fa-var-dyalog: \f399;
-$fa-var-earlybirds: \f39a;
-$fa-var-ebay: \f4f4;
-$fa-var-edge: \f282;
-$fa-var-edge-legacy: \e078;
-$fa-var-edit: \f044;
-$fa-var-egg: \f7fb;
-$fa-var-eject: \f052;
-$fa-var-elementor: \f430;
-$fa-var-ellipsis-h: \f141;
-$fa-var-ellipsis-v: \f142;
-$fa-var-ello: \f5f1;
-$fa-var-ember: \f423;
-$fa-var-empire: \f1d1;
-$fa-var-envelope: \f0e0;
-$fa-var-envelope-open: \f2b6;
-$fa-var-envelope-open-text: \f658;
-$fa-var-envelope-square: \f199;
-$fa-var-envira: \f299;
-$fa-var-equals: \f52c;
-$fa-var-eraser: \f12d;
-$fa-var-erlang: \f39d;
-$fa-var-ethereum: \f42e;
-$fa-var-ethernet: \f796;
-$fa-var-etsy: \f2d7;
-$fa-var-euro-sign: \f153;
-$fa-var-evernote: \f839;
-$fa-var-exchange-alt: \f362;
-$fa-var-exclamation: \f12a;
-$fa-var-exclamation-circle: \f06a;
-$fa-var-exclamation-triangle: \f071;
-$fa-var-expand: \f065;
-$fa-var-expand-alt: \f424;
-$fa-var-expand-arrows-alt: \f31e;
-$fa-var-expeditedssl: \f23e;
-$fa-var-external-link-alt: \f35d;
-$fa-var-external-link-square-alt: \f360;
-$fa-var-eye: \f06e;
-$fa-var-eye-dropper: \f1fb;
-$fa-var-eye-slash: \f070;
-$fa-var-facebook: \f09a;
-$fa-var-facebook-f: \f39e;
-$fa-var-facebook-messenger: \f39f;
-$fa-var-facebook-square: \f082;
-$fa-var-fan: \f863;
-$fa-var-fantasy-flight-games: \f6dc;
-$fa-var-fast-backward: \f049;
-$fa-var-fast-forward: \f050;
-$fa-var-faucet: \e005;
-$fa-var-fax: \f1ac;
-$fa-var-feather: \f52d;
-$fa-var-feather-alt: \f56b;
-$fa-var-fedex: \f797;
-$fa-var-fedora: \f798;
-$fa-var-female: \f182;
-$fa-var-fighter-jet: \f0fb;
-$fa-var-figma: \f799;
-$fa-var-file: \f15b;
-$fa-var-file-alt: \f15c;
-$fa-var-file-archive: \f1c6;
-$fa-var-file-audio: \f1c7;
-$fa-var-file-code: \f1c9;
-$fa-var-file-contract: \f56c;
-$fa-var-file-csv: \f6dd;
-$fa-var-file-download: \f56d;
-$fa-var-file-excel: \f1c3;
-$fa-var-file-export: \f56e;
-$fa-var-file-image: \f1c5;
-$fa-var-file-import: \f56f;
-$fa-var-file-invoice: \f570;
-$fa-var-file-invoice-dollar: \f571;
-$fa-var-file-medical: \f477;
-$fa-var-file-medical-alt: \f478;
-$fa-var-file-pdf: \f1c1;
-$fa-var-file-powerpoint: \f1c4;
-$fa-var-file-prescription: \f572;
-$fa-var-file-signature: \f573;
-$fa-var-file-upload: \f574;
-$fa-var-file-video: \f1c8;
-$fa-var-file-word: \f1c2;
-$fa-var-fill: \f575;
-$fa-var-fill-drip: \f576;
-$fa-var-film: \f008;
-$fa-var-filter: \f0b0;
-$fa-var-fingerprint: \f577;
-$fa-var-fire: \f06d;
-$fa-var-fire-alt: \f7e4;
-$fa-var-fire-extinguisher: \f134;
-$fa-var-firefox: \f269;
-$fa-var-firefox-browser: \e007;
-$fa-var-first-aid: \f479;
-$fa-var-first-order: \f2b0;
-$fa-var-first-order-alt: \f50a;
-$fa-var-firstdraft: \f3a1;
-$fa-var-fish: \f578;
-$fa-var-fist-raised: \f6de;
-$fa-var-flag: \f024;
-$fa-var-flag-checkered: \f11e;
-$fa-var-flag-usa: \f74d;
-$fa-var-flask: \f0c3;
-$fa-var-flickr: \f16e;
-$fa-var-flipboard: \f44d;
-$fa-var-flushed: \f579;
-$fa-var-fly: \f417;
-$fa-var-folder: \f07b;
-$fa-var-folder-minus: \f65d;
-$fa-var-folder-open: \f07c;
-$fa-var-folder-plus: \f65e;
-$fa-var-font: \f031;
-$fa-var-font-awesome: \f2b4;
-$fa-var-font-awesome-alt: \f35c;
-$fa-var-font-awesome-flag: \f425;
-$fa-var-font-awesome-logo-full: \f4e6;
-$fa-var-fonticons: \f280;
-$fa-var-fonticons-fi: \f3a2;
-$fa-var-football-ball: \f44e;
-$fa-var-fort-awesome: \f286;
-$fa-var-fort-awesome-alt: \f3a3;
-$fa-var-forumbee: \f211;
-$fa-var-forward: \f04e;
-$fa-var-foursquare: \f180;
-$fa-var-free-code-camp: \f2c5;
-$fa-var-freebsd: \f3a4;
-$fa-var-frog: \f52e;
-$fa-var-frown: \f119;
-$fa-var-frown-open: \f57a;
-$fa-var-fulcrum: \f50b;
-$fa-var-funnel-dollar: \f662;
-$fa-var-futbol: \f1e3;
-$fa-var-galactic-republic: \f50c;
-$fa-var-galactic-senate: \f50d;
-$fa-var-gamepad: \f11b;
-$fa-var-gas-pump: \f52f;
-$fa-var-gavel: \f0e3;
-$fa-var-gem: \f3a5;
-$fa-var-genderless: \f22d;
-$fa-var-get-pocket: \f265;
-$fa-var-gg: \f260;
-$fa-var-gg-circle: \f261;
-$fa-var-ghost: \f6e2;
-$fa-var-gift: \f06b;
-$fa-var-gifts: \f79c;
-$fa-var-git: \f1d3;
-$fa-var-git-alt: \f841;
-$fa-var-git-square: \f1d2;
-$fa-var-github: \f09b;
-$fa-var-github-alt: \f113;
-$fa-var-github-square: \f092;
-$fa-var-gitkraken: \f3a6;
-$fa-var-gitlab: \f296;
-$fa-var-gitter: \f426;
-$fa-var-glass-cheers: \f79f;
-$fa-var-glass-martini: \f000;
-$fa-var-glass-martini-alt: \f57b;
-$fa-var-glass-whiskey: \f7a0;
-$fa-var-glasses: \f530;
-$fa-var-glide: \f2a5;
-$fa-var-glide-g: \f2a6;
-$fa-var-globe: \f0ac;
-$fa-var-globe-africa: \f57c;
-$fa-var-globe-americas: \f57d;
-$fa-var-globe-asia: \f57e;
-$fa-var-globe-europe: \f7a2;
-$fa-var-gofore: \f3a7;
-$fa-var-golf-ball: \f450;
-$fa-var-goodreads: \f3a8;
-$fa-var-goodreads-g: \f3a9;
-$fa-var-google: \f1a0;
-$fa-var-google-drive: \f3aa;
-$fa-var-google-pay: \e079;
-$fa-var-google-play: \f3ab;
-$fa-var-google-plus: \f2b3;
-$fa-var-google-plus-g: \f0d5;
-$fa-var-google-plus-square: \f0d4;
-$fa-var-google-wallet: \f1ee;
-$fa-var-gopuram: \f664;
-$fa-var-graduation-cap: \f19d;
-$fa-var-gratipay: \f184;
-$fa-var-grav: \f2d6;
-$fa-var-greater-than: \f531;
-$fa-var-greater-than-equal: \f532;
-$fa-var-grimace: \f57f;
-$fa-var-grin: \f580;
-$fa-var-grin-alt: \f581;
-$fa-var-grin-beam: \f582;
-$fa-var-grin-beam-sweat: \f583;
-$fa-var-grin-hearts: \f584;
-$fa-var-grin-squint: \f585;
-$fa-var-grin-squint-tears: \f586;
-$fa-var-grin-stars: \f587;
-$fa-var-grin-tears: \f588;
-$fa-var-grin-tongue: \f589;
-$fa-var-grin-tongue-squint: \f58a;
-$fa-var-grin-tongue-wink: \f58b;
-$fa-var-grin-wink: \f58c;
-$fa-var-grip-horizontal: \f58d;
-$fa-var-grip-lines: \f7a4;
-$fa-var-grip-lines-vertical: \f7a5;
-$fa-var-grip-vertical: \f58e;
-$fa-var-gripfire: \f3ac;
-$fa-var-grunt: \f3ad;
-$fa-var-guitar: \f7a6;
-$fa-var-gulp: \f3ae;
-$fa-var-h-square: \f0fd;
-$fa-var-hacker-news: \f1d4;
-$fa-var-hacker-news-square: \f3af;
-$fa-var-hackerrank: \f5f7;
-$fa-var-hamburger: \f805;
-$fa-var-hammer: \f6e3;
-$fa-var-hamsa: \f665;
-$fa-var-hand-holding: \f4bd;
-$fa-var-hand-holding-heart: \f4be;
-$fa-var-hand-holding-medical: \e05c;
-$fa-var-hand-holding-usd: \f4c0;
-$fa-var-hand-holding-water: \f4c1;
-$fa-var-hand-lizard: \f258;
-$fa-var-hand-middle-finger: \f806;
-$fa-var-hand-paper: \f256;
-$fa-var-hand-peace: \f25b;
-$fa-var-hand-point-down: \f0a7;
-$fa-var-hand-point-left: \f0a5;
-$fa-var-hand-point-right: \f0a4;
-$fa-var-hand-point-up: \f0a6;
-$fa-var-hand-pointer: \f25a;
-$fa-var-hand-rock: \f255;
-$fa-var-hand-scissors: \f257;
-$fa-var-hand-sparkles: \e05d;
-$fa-var-hand-spock: \f259;
-$fa-var-hands: \f4c2;
-$fa-var-hands-helping: \f4c4;
-$fa-var-hands-wash: \e05e;
-$fa-var-handshake: \f2b5;
-$fa-var-handshake-alt-slash: \e05f;
-$fa-var-handshake-slash: \e060;
-$fa-var-hanukiah: \f6e6;
-$fa-var-hard-hat: \f807;
-$fa-var-hashtag: \f292;
-$fa-var-hat-cowboy: \f8c0;
-$fa-var-hat-cowboy-side: \f8c1;
-$fa-var-hat-wizard: \f6e8;
-$fa-var-hdd: \f0a0;
-$fa-var-head-side-cough: \e061;
-$fa-var-head-side-cough-slash: \e062;
-$fa-var-head-side-mask: \e063;
-$fa-var-head-side-virus: \e064;
-$fa-var-heading: \f1dc;
-$fa-var-headphones: \f025;
-$fa-var-headphones-alt: \f58f;
-$fa-var-headset: \f590;
-$fa-var-heart: \f004;
-$fa-var-heart-broken: \f7a9;
-$fa-var-heartbeat: \f21e;
-$fa-var-helicopter: \f533;
-$fa-var-highlighter: \f591;
-$fa-var-hiking: \f6ec;
-$fa-var-hippo: \f6ed;
-$fa-var-hips: \f452;
-$fa-var-hire-a-helper: \f3b0;
-$fa-var-history: \f1da;
-$fa-var-hockey-puck: \f453;
-$fa-var-holly-berry: \f7aa;
-$fa-var-home: \f015;
-$fa-var-hooli: \f427;
-$fa-var-hornbill: \f592;
-$fa-var-horse: \f6f0;
-$fa-var-horse-head: \f7ab;
-$fa-var-hospital: \f0f8;
-$fa-var-hospital-alt: \f47d;
-$fa-var-hospital-symbol: \f47e;
-$fa-var-hospital-user: \f80d;
-$fa-var-hot-tub: \f593;
-$fa-var-hotdog: \f80f;
-$fa-var-hotel: \f594;
-$fa-var-hotjar: \f3b1;
-$fa-var-hourglass: \f254;
-$fa-var-hourglass-end: \f253;
-$fa-var-hourglass-half: \f252;
-$fa-var-hourglass-start: \f251;
-$fa-var-house-damage: \f6f1;
-$fa-var-house-user: \e065;
-$fa-var-houzz: \f27c;
-$fa-var-hryvnia: \f6f2;
-$fa-var-html5: \f13b;
-$fa-var-hubspot: \f3b2;
-$fa-var-i-cursor: \f246;
-$fa-var-ice-cream: \f810;
-$fa-var-icicles: \f7ad;
-$fa-var-icons: \f86d;
-$fa-var-id-badge: \f2c1;
-$fa-var-id-card: \f2c2;
-$fa-var-id-card-alt: \f47f;
-$fa-var-ideal: \e013;
-$fa-var-igloo: \f7ae;
-$fa-var-image: \f03e;
-$fa-var-images: \f302;
-$fa-var-imdb: \f2d8;
-$fa-var-inbox: \f01c;
-$fa-var-indent: \f03c;
-$fa-var-industry: \f275;
-$fa-var-infinity: \f534;
-$fa-var-info: \f129;
-$fa-var-info-circle: \f05a;
-$fa-var-instagram: \f16d;
-$fa-var-instagram-square: \e055;
-$fa-var-intercom: \f7af;
-$fa-var-internet-explorer: \f26b;
-$fa-var-invision: \f7b0;
-$fa-var-ioxhost: \f208;
-$fa-var-italic: \f033;
-$fa-var-itch-io: \f83a;
-$fa-var-itunes: \f3b4;
-$fa-var-itunes-note: \f3b5;
-$fa-var-java: \f4e4;
-$fa-var-jedi: \f669;
-$fa-var-jedi-order: \f50e;
-$fa-var-jenkins: \f3b6;
-$fa-var-jira: \f7b1;
-$fa-var-joget: \f3b7;
-$fa-var-joint: \f595;
-$fa-var-joomla: \f1aa;
-$fa-var-journal-whills: \f66a;
-$fa-var-js: \f3b8;
-$fa-var-js-square: \f3b9;
-$fa-var-jsfiddle: \f1cc;
-$fa-var-kaaba: \f66b;
-$fa-var-kaggle: \f5fa;
-$fa-var-key: \f084;
-$fa-var-keybase: \f4f5;
-$fa-var-keyboard: \f11c;
-$fa-var-keycdn: \f3ba;
-$fa-var-khanda: \f66d;
-$fa-var-kickstarter: \f3bb;
-$fa-var-kickstarter-k: \f3bc;
-$fa-var-kiss: \f596;
-$fa-var-kiss-beam: \f597;
-$fa-var-kiss-wink-heart: \f598;
-$fa-var-kiwi-bird: \f535;
-$fa-var-korvue: \f42f;
-$fa-var-landmark: \f66f;
-$fa-var-language: \f1ab;
-$fa-var-laptop: \f109;
-$fa-var-laptop-code: \f5fc;
-$fa-var-laptop-house: \e066;
-$fa-var-laptop-medical: \f812;
-$fa-var-laravel: \f3bd;
-$fa-var-lastfm: \f202;
-$fa-var-lastfm-square: \f203;
-$fa-var-laugh: \f599;
-$fa-var-laugh-beam: \f59a;
-$fa-var-laugh-squint: \f59b;
-$fa-var-laugh-wink: \f59c;
-$fa-var-layer-group: \f5fd;
-$fa-var-leaf: \f06c;
-$fa-var-leanpub: \f212;
-$fa-var-lemon: \f094;
-$fa-var-less: \f41d;
-$fa-var-less-than: \f536;
-$fa-var-less-than-equal: \f537;
-$fa-var-level-down-alt: \f3be;
-$fa-var-level-up-alt: \f3bf;
-$fa-var-life-ring: \f1cd;
-$fa-var-lightbulb: \f0eb;
-$fa-var-line: \f3c0;
-$fa-var-link: \f0c1;
-$fa-var-linkedin: \f08c;
-$fa-var-linkedin-in: \f0e1;
-$fa-var-linode: \f2b8;
-$fa-var-linux: \f17c;
-$fa-var-lira-sign: \f195;
-$fa-var-list: \f03a;
-$fa-var-list-alt: \f022;
-$fa-var-list-ol: \f0cb;
-$fa-var-list-ul: \f0ca;
-$fa-var-location-arrow: \f124;
-$fa-var-lock: \f023;
-$fa-var-lock-open: \f3c1;
-$fa-var-long-arrow-alt-down: \f309;
-$fa-var-long-arrow-alt-left: \f30a;
-$fa-var-long-arrow-alt-right: \f30b;
-$fa-var-long-arrow-alt-up: \f30c;
-$fa-var-low-vision: \f2a8;
-$fa-var-luggage-cart: \f59d;
-$fa-var-lungs: \f604;
-$fa-var-lungs-virus: \e067;
-$fa-var-lyft: \f3c3;
-$fa-var-magento: \f3c4;
-$fa-var-magic: \f0d0;
-$fa-var-magnet: \f076;
-$fa-var-mail-bulk: \f674;
-$fa-var-mailchimp: \f59e;
-$fa-var-male: \f183;
-$fa-var-mandalorian: \f50f;
-$fa-var-map: \f279;
-$fa-var-map-marked: \f59f;
-$fa-var-map-marked-alt: \f5a0;
-$fa-var-map-marker: \f041;
-$fa-var-map-marker-alt: \f3c5;
-$fa-var-map-pin: \f276;
-$fa-var-map-signs: \f277;
-$fa-var-markdown: \f60f;
-$fa-var-marker: \f5a1;
-$fa-var-mars: \f222;
-$fa-var-mars-double: \f227;
-$fa-var-mars-stroke: \f229;
-$fa-var-mars-stroke-h: \f22b;
-$fa-var-mars-stroke-v: \f22a;
-$fa-var-mask: \f6fa;
-$fa-var-mastodon: \f4f6;
-$fa-var-maxcdn: \f136;
-$fa-var-mdb: \f8ca;
-$fa-var-medal: \f5a2;
-$fa-var-medapps: \f3c6;
-$fa-var-medium: \f23a;
-$fa-var-medium-m: \f3c7;
-$fa-var-medkit: \f0fa;
-$fa-var-medrt: \f3c8;
-$fa-var-meetup: \f2e0;
-$fa-var-megaport: \f5a3;
-$fa-var-meh: \f11a;
-$fa-var-meh-blank: \f5a4;
-$fa-var-meh-rolling-eyes: \f5a5;
-$fa-var-memory: \f538;
-$fa-var-mendeley: \f7b3;
-$fa-var-menorah: \f676;
-$fa-var-mercury: \f223;
-$fa-var-meteor: \f753;
-$fa-var-microblog: \e01a;
-$fa-var-microchip: \f2db;
-$fa-var-microphone: \f130;
-$fa-var-microphone-alt: \f3c9;
-$fa-var-microphone-alt-slash: \f539;
-$fa-var-microphone-slash: \f131;
-$fa-var-microscope: \f610;
-$fa-var-microsoft: \f3ca;
-$fa-var-minus: \f068;
-$fa-var-minus-circle: \f056;
-$fa-var-minus-square: \f146;
-$fa-var-mitten: \f7b5;
-$fa-var-mix: \f3cb;
-$fa-var-mixcloud: \f289;
-$fa-var-mixer: \e056;
-$fa-var-mizuni: \f3cc;
-$fa-var-mobile: \f10b;
-$fa-var-mobile-alt: \f3cd;
-$fa-var-modx: \f285;
-$fa-var-monero: \f3d0;
-$fa-var-money-bill: \f0d6;
-$fa-var-money-bill-alt: \f3d1;
-$fa-var-money-bill-wave: \f53a;
-$fa-var-money-bill-wave-alt: \f53b;
-$fa-var-money-check: \f53c;
-$fa-var-money-check-alt: \f53d;
-$fa-var-monument: \f5a6;
-$fa-var-moon: \f186;
-$fa-var-mortar-pestle: \f5a7;
-$fa-var-mosque: \f678;
-$fa-var-motorcycle: \f21c;
-$fa-var-mountain: \f6fc;
-$fa-var-mouse: \f8cc;
-$fa-var-mouse-pointer: \f245;
-$fa-var-mug-hot: \f7b6;
-$fa-var-music: \f001;
-$fa-var-napster: \f3d2;
-$fa-var-neos: \f612;
-$fa-var-network-wired: \f6ff;
-$fa-var-neuter: \f22c;
-$fa-var-newspaper: \f1ea;
-$fa-var-nimblr: \f5a8;
-$fa-var-node: \f419;
-$fa-var-node-js: \f3d3;
-$fa-var-not-equal: \f53e;
-$fa-var-notes-medical: \f481;
-$fa-var-npm: \f3d4;
-$fa-var-ns8: \f3d5;
-$fa-var-nutritionix: \f3d6;
-$fa-var-object-group: \f247;
-$fa-var-object-ungroup: \f248;
-$fa-var-odnoklassniki: \f263;
-$fa-var-odnoklassniki-square: \f264;
-$fa-var-oil-can: \f613;
-$fa-var-old-republic: \f510;
-$fa-var-om: \f679;
-$fa-var-opencart: \f23d;
-$fa-var-openid: \f19b;
-$fa-var-opera: \f26a;
-$fa-var-optin-monster: \f23c;
-$fa-var-orcid: \f8d2;
-$fa-var-osi: \f41a;
-$fa-var-otter: \f700;
-$fa-var-outdent: \f03b;
-$fa-var-page4: \f3d7;
-$fa-var-pagelines: \f18c;
-$fa-var-pager: \f815;
-$fa-var-paint-brush: \f1fc;
-$fa-var-paint-roller: \f5aa;
-$fa-var-palette: \f53f;
-$fa-var-palfed: \f3d8;
-$fa-var-pallet: \f482;
-$fa-var-paper-plane: \f1d8;
-$fa-var-paperclip: \f0c6;
-$fa-var-parachute-box: \f4cd;
-$fa-var-paragraph: \f1dd;
-$fa-var-parking: \f540;
-$fa-var-passport: \f5ab;
-$fa-var-pastafarianism: \f67b;
-$fa-var-paste: \f0ea;
-$fa-var-patreon: \f3d9;
-$fa-var-pause: \f04c;
-$fa-var-pause-circle: \f28b;
-$fa-var-paw: \f1b0;
-$fa-var-paypal: \f1ed;
-$fa-var-peace: \f67c;
-$fa-var-pen: \f304;
-$fa-var-pen-alt: \f305;
-$fa-var-pen-fancy: \f5ac;
-$fa-var-pen-nib: \f5ad;
-$fa-var-pen-square: \f14b;
-$fa-var-pencil-alt: \f303;
-$fa-var-pencil-ruler: \f5ae;
-$fa-var-penny-arcade: \f704;
-$fa-var-people-arrows: \e068;
-$fa-var-people-carry: \f4ce;
-$fa-var-pepper-hot: \f816;
-$fa-var-percent: \f295;
-$fa-var-percentage: \f541;
-$fa-var-periscope: \f3da;
-$fa-var-person-booth: \f756;
-$fa-var-phabricator: \f3db;
-$fa-var-phoenix-framework: \f3dc;
-$fa-var-phoenix-squadron: \f511;
-$fa-var-phone: \f095;
-$fa-var-phone-alt: \f879;
-$fa-var-phone-slash: \f3dd;
-$fa-var-phone-square: \f098;
-$fa-var-phone-square-alt: \f87b;
-$fa-var-phone-volume: \f2a0;
-$fa-var-photo-video: \f87c;
-$fa-var-php: \f457;
-$fa-var-pied-piper: \f2ae;
-$fa-var-pied-piper-alt: \f1a8;
-$fa-var-pied-piper-hat: \f4e5;
-$fa-var-pied-piper-pp: \f1a7;
-$fa-var-pied-piper-square: \e01e;
-$fa-var-piggy-bank: \f4d3;
-$fa-var-pills: \f484;
-$fa-var-pinterest: \f0d2;
-$fa-var-pinterest-p: \f231;
-$fa-var-pinterest-square: \f0d3;
-$fa-var-pizza-slice: \f818;
-$fa-var-place-of-worship: \f67f;
-$fa-var-plane: \f072;
-$fa-var-plane-arrival: \f5af;
-$fa-var-plane-departure: \f5b0;
-$fa-var-plane-slash: \e069;
-$fa-var-play: \f04b;
-$fa-var-play-circle: \f144;
-$fa-var-playstation: \f3df;
-$fa-var-plug: \f1e6;
-$fa-var-plus: \f067;
-$fa-var-plus-circle: \f055;
-$fa-var-plus-square: \f0fe;
-$fa-var-podcast: \f2ce;
-$fa-var-poll: \f681;
-$fa-var-poll-h: \f682;
-$fa-var-poo: \f2fe;
-$fa-var-poo-storm: \f75a;
-$fa-var-poop: \f619;
-$fa-var-portrait: \f3e0;
-$fa-var-pound-sign: \f154;
-$fa-var-power-off: \f011;
-$fa-var-pray: \f683;
-$fa-var-praying-hands: \f684;
-$fa-var-prescription: \f5b1;
-$fa-var-prescription-bottle: \f485;
-$fa-var-prescription-bottle-alt: \f486;
-$fa-var-print: \f02f;
-$fa-var-procedures: \f487;
-$fa-var-product-hunt: \f288;
-$fa-var-project-diagram: \f542;
-$fa-var-pump-medical: \e06a;
-$fa-var-pump-soap: \e06b;
-$fa-var-pushed: \f3e1;
-$fa-var-puzzle-piece: \f12e;
-$fa-var-python: \f3e2;
-$fa-var-qq: \f1d6;
-$fa-var-qrcode: \f029;
-$fa-var-question: \f128;
-$fa-var-question-circle: \f059;
-$fa-var-quidditch: \f458;
-$fa-var-quinscape: \f459;
-$fa-var-quora: \f2c4;
-$fa-var-quote-left: \f10d;
-$fa-var-quote-right: \f10e;
-$fa-var-quran: \f687;
-$fa-var-r-project: \f4f7;
-$fa-var-radiation: \f7b9;
-$fa-var-radiation-alt: \f7ba;
-$fa-var-rainbow: \f75b;
-$fa-var-random: \f074;
-$fa-var-raspberry-pi: \f7bb;
-$fa-var-ravelry: \f2d9;
-$fa-var-react: \f41b;
-$fa-var-reacteurope: \f75d;
-$fa-var-readme: \f4d5;
-$fa-var-rebel: \f1d0;
-$fa-var-receipt: \f543;
-$fa-var-record-vinyl: \f8d9;
-$fa-var-recycle: \f1b8;
-$fa-var-red-river: \f3e3;
-$fa-var-reddit: \f1a1;
-$fa-var-reddit-alien: \f281;
-$fa-var-reddit-square: \f1a2;
-$fa-var-redhat: \f7bc;
-$fa-var-redo: \f01e;
-$fa-var-redo-alt: \f2f9;
-$fa-var-registered: \f25d;
-$fa-var-remove-format: \f87d;
-$fa-var-renren: \f18b;
-$fa-var-reply: \f3e5;
-$fa-var-reply-all: \f122;
-$fa-var-replyd: \f3e6;
-$fa-var-republican: \f75e;
-$fa-var-researchgate: \f4f8;
-$fa-var-resolving: \f3e7;
-$fa-var-restroom: \f7bd;
-$fa-var-retweet: \f079;
-$fa-var-rev: \f5b2;
-$fa-var-ribbon: \f4d6;
-$fa-var-ring: \f70b;
-$fa-var-road: \f018;
-$fa-var-robot: \f544;
-$fa-var-rocket: \f135;
-$fa-var-rocketchat: \f3e8;
-$fa-var-rockrms: \f3e9;
-$fa-var-route: \f4d7;
-$fa-var-rss: \f09e;
-$fa-var-rss-square: \f143;
-$fa-var-ruble-sign: \f158;
-$fa-var-ruler: \f545;
-$fa-var-ruler-combined: \f546;
-$fa-var-ruler-horizontal: \f547;
-$fa-var-ruler-vertical: \f548;
-$fa-var-running: \f70c;
-$fa-var-rupee-sign: \f156;
-$fa-var-rust: \e07a;
-$fa-var-sad-cry: \f5b3;
-$fa-var-sad-tear: \f5b4;
-$fa-var-safari: \f267;
-$fa-var-salesforce: \f83b;
-$fa-var-sass: \f41e;
-$fa-var-satellite: \f7bf;
-$fa-var-satellite-dish: \f7c0;
-$fa-var-save: \f0c7;
-$fa-var-schlix: \f3ea;
-$fa-var-school: \f549;
-$fa-var-screwdriver: \f54a;
-$fa-var-scribd: \f28a;
-$fa-var-scroll: \f70e;
-$fa-var-sd-card: \f7c2;
-$fa-var-search: \f002;
-$fa-var-search-dollar: \f688;
-$fa-var-search-location: \f689;
-$fa-var-search-minus: \f010;
-$fa-var-search-plus: \f00e;
-$fa-var-searchengin: \f3eb;
-$fa-var-seedling: \f4d8;
-$fa-var-sellcast: \f2da;
-$fa-var-sellsy: \f213;
-$fa-var-server: \f233;
-$fa-var-servicestack: \f3ec;
-$fa-var-shapes: \f61f;
-$fa-var-share: \f064;
-$fa-var-share-alt: \f1e0;
-$fa-var-share-alt-square: \f1e1;
-$fa-var-share-square: \f14d;
-$fa-var-shekel-sign: \f20b;
-$fa-var-shield-alt: \f3ed;
-$fa-var-shield-virus: \e06c;
-$fa-var-ship: \f21a;
-$fa-var-shipping-fast: \f48b;
-$fa-var-shirtsinbulk: \f214;
-$fa-var-shoe-prints: \f54b;
-$fa-var-shopify: \e057;
-$fa-var-shopping-bag: \f290;
-$fa-var-shopping-basket: \f291;
-$fa-var-shopping-cart: \f07a;
-$fa-var-shopware: \f5b5;
-$fa-var-shower: \f2cc;
-$fa-var-shuttle-van: \f5b6;
-$fa-var-sign: \f4d9;
-$fa-var-sign-in-alt: \f2f6;
-$fa-var-sign-language: \f2a7;
-$fa-var-sign-out-alt: \f2f5;
-$fa-var-signal: \f012;
-$fa-var-signature: \f5b7;
-$fa-var-sim-card: \f7c4;
-$fa-var-simplybuilt: \f215;
-$fa-var-sink: \e06d;
-$fa-var-sistrix: \f3ee;
-$fa-var-sitemap: \f0e8;
-$fa-var-sith: \f512;
-$fa-var-skating: \f7c5;
-$fa-var-sketch: \f7c6;
-$fa-var-skiing: \f7c9;
-$fa-var-skiing-nordic: \f7ca;
-$fa-var-skull: \f54c;
-$fa-var-skull-crossbones: \f714;
-$fa-var-skyatlas: \f216;
-$fa-var-skype: \f17e;
-$fa-var-slack: \f198;
-$fa-var-slack-hash: \f3ef;
-$fa-var-slash: \f715;
-$fa-var-sleigh: \f7cc;
-$fa-var-sliders-h: \f1de;
-$fa-var-slideshare: \f1e7;
-$fa-var-smile: \f118;
-$fa-var-smile-beam: \f5b8;
-$fa-var-smile-wink: \f4da;
-$fa-var-smog: \f75f;
-$fa-var-smoking: \f48d;
-$fa-var-smoking-ban: \f54d;
-$fa-var-sms: \f7cd;
-$fa-var-snapchat: \f2ab;
-$fa-var-snapchat-ghost: \f2ac;
-$fa-var-snapchat-square: \f2ad;
-$fa-var-snowboarding: \f7ce;
-$fa-var-snowflake: \f2dc;
-$fa-var-snowman: \f7d0;
-$fa-var-snowplow: \f7d2;
-$fa-var-soap: \e06e;
-$fa-var-socks: \f696;
-$fa-var-solar-panel: \f5ba;
-$fa-var-sort: \f0dc;
-$fa-var-sort-alpha-down: \f15d;
-$fa-var-sort-alpha-down-alt: \f881;
-$fa-var-sort-alpha-up: \f15e;
-$fa-var-sort-alpha-up-alt: \f882;
-$fa-var-sort-amount-down: \f160;
-$fa-var-sort-amount-down-alt: \f884;
-$fa-var-sort-amount-up: \f161;
-$fa-var-sort-amount-up-alt: \f885;
-$fa-var-sort-down: \f0dd;
-$fa-var-sort-numeric-down: \f162;
-$fa-var-sort-numeric-down-alt: \f886;
-$fa-var-sort-numeric-up: \f163;
-$fa-var-sort-numeric-up-alt: \f887;
-$fa-var-sort-up: \f0de;
-$fa-var-soundcloud: \f1be;
-$fa-var-sourcetree: \f7d3;
-$fa-var-spa: \f5bb;
-$fa-var-space-shuttle: \f197;
-$fa-var-speakap: \f3f3;
-$fa-var-speaker-deck: \f83c;
-$fa-var-spell-check: \f891;
-$fa-var-spider: \f717;
-$fa-var-spinner: \f110;
-$fa-var-splotch: \f5bc;
-$fa-var-spotify: \f1bc;
-$fa-var-spray-can: \f5bd;
-$fa-var-square: \f0c8;
-$fa-var-square-full: \f45c;
-$fa-var-square-root-alt: \f698;
-$fa-var-squarespace: \f5be;
-$fa-var-stack-exchange: \f18d;
-$fa-var-stack-overflow: \f16c;
-$fa-var-stackpath: \f842;
-$fa-var-stamp: \f5bf;
-$fa-var-star: \f005;
-$fa-var-star-and-crescent: \f699;
-$fa-var-star-half: \f089;
-$fa-var-star-half-alt: \f5c0;
-$fa-var-star-of-david: \f69a;
-$fa-var-star-of-life: \f621;
-$fa-var-staylinked: \f3f5;
-$fa-var-steam: \f1b6;
-$fa-var-steam-square: \f1b7;
-$fa-var-steam-symbol: \f3f6;
-$fa-var-step-backward: \f048;
-$fa-var-step-forward: \f051;
-$fa-var-stethoscope: \f0f1;
-$fa-var-sticker-mule: \f3f7;
-$fa-var-sticky-note: \f249;
-$fa-var-stop: \f04d;
-$fa-var-stop-circle: \f28d;
-$fa-var-stopwatch: \f2f2;
-$fa-var-stopwatch-20: \e06f;
-$fa-var-store: \f54e;
-$fa-var-store-alt: \f54f;
-$fa-var-store-alt-slash: \e070;
-$fa-var-store-slash: \e071;
-$fa-var-strava: \f428;
-$fa-var-stream: \f550;
-$fa-var-street-view: \f21d;
-$fa-var-strikethrough: \f0cc;
-$fa-var-stripe: \f429;
-$fa-var-stripe-s: \f42a;
-$fa-var-stroopwafel: \f551;
-$fa-var-studiovinari: \f3f8;
-$fa-var-stumbleupon: \f1a4;
-$fa-var-stumbleupon-circle: \f1a3;
-$fa-var-subscript: \f12c;
-$fa-var-subway: \f239;
-$fa-var-suitcase: \f0f2;
-$fa-var-suitcase-rolling: \f5c1;
-$fa-var-sun: \f185;
-$fa-var-superpowers: \f2dd;
-$fa-var-superscript: \f12b;
-$fa-var-supple: \f3f9;
-$fa-var-surprise: \f5c2;
-$fa-var-suse: \f7d6;
-$fa-var-swatchbook: \f5c3;
-$fa-var-swift: \f8e1;
-$fa-var-swimmer: \f5c4;
-$fa-var-swimming-pool: \f5c5;
-$fa-var-symfony: \f83d;
-$fa-var-synagogue: \f69b;
-$fa-var-sync: \f021;
-$fa-var-sync-alt: \f2f1;
-$fa-var-syringe: \f48e;
-$fa-var-table: \f0ce;
-$fa-var-table-tennis: \f45d;
-$fa-var-tablet: \f10a;
-$fa-var-tablet-alt: \f3fa;
-$fa-var-tablets: \f490;
-$fa-var-tachometer-alt: \f3fd;
-$fa-var-tag: \f02b;
-$fa-var-tags: \f02c;
-$fa-var-tape: \f4db;
-$fa-var-tasks: \f0ae;
-$fa-var-taxi: \f1ba;
-$fa-var-teamspeak: \f4f9;
-$fa-var-teeth: \f62e;
-$fa-var-teeth-open: \f62f;
-$fa-var-telegram: \f2c6;
-$fa-var-telegram-plane: \f3fe;
-$fa-var-temperature-high: \f769;
-$fa-var-temperature-low: \f76b;
-$fa-var-tencent-weibo: \f1d5;
-$fa-var-tenge: \f7d7;
-$fa-var-terminal: \f120;
-$fa-var-text-height: \f034;
-$fa-var-text-width: \f035;
-$fa-var-th: \f00a;
-$fa-var-th-large: \f009;
-$fa-var-th-list: \f00b;
-$fa-var-the-red-yeti: \f69d;
-$fa-var-theater-masks: \f630;
-$fa-var-themeco: \f5c6;
-$fa-var-themeisle: \f2b2;
-$fa-var-thermometer: \f491;
-$fa-var-thermometer-empty: \f2cb;
-$fa-var-thermometer-full: \f2c7;
-$fa-var-thermometer-half: \f2c9;
-$fa-var-thermometer-quarter: \f2ca;
-$fa-var-thermometer-three-quarters: \f2c8;
-$fa-var-think-peaks: \f731;
-$fa-var-thumbs-down: \f165;
-$fa-var-thumbs-up: \f164;
-$fa-var-thumbtack: \f08d;
-$fa-var-ticket-alt: \f3ff;
-$fa-var-tiktok: \e07b;
-$fa-var-times: \f00d;
-$fa-var-times-circle: \f057;
-$fa-var-tint: \f043;
-$fa-var-tint-slash: \f5c7;
-$fa-var-tired: \f5c8;
-$fa-var-toggle-off: \f204;
-$fa-var-toggle-on: \f205;
-$fa-var-toilet: \f7d8;
-$fa-var-toilet-paper: \f71e;
-$fa-var-toilet-paper-slash: \e072;
-$fa-var-toolbox: \f552;
-$fa-var-tools: \f7d9;
-$fa-var-tooth: \f5c9;
-$fa-var-torah: \f6a0;
-$fa-var-torii-gate: \f6a1;
-$fa-var-tractor: \f722;
-$fa-var-trade-federation: \f513;
-$fa-var-trademark: \f25c;
-$fa-var-traffic-light: \f637;
-$fa-var-trailer: \e041;
-$fa-var-train: \f238;
-$fa-var-tram: \f7da;
-$fa-var-transgender: \f224;
-$fa-var-transgender-alt: \f225;
-$fa-var-trash: \f1f8;
-$fa-var-trash-alt: \f2ed;
-$fa-var-trash-restore: \f829;
-$fa-var-trash-restore-alt: \f82a;
-$fa-var-tree: \f1bb;
-$fa-var-trello: \f181;
-$fa-var-tripadvisor: \f262;
-$fa-var-trophy: \f091;
-$fa-var-truck: \f0d1;
-$fa-var-truck-loading: \f4de;
-$fa-var-truck-monster: \f63b;
-$fa-var-truck-moving: \f4df;
-$fa-var-truck-pickup: \f63c;
-$fa-var-tshirt: \f553;
-$fa-var-tty: \f1e4;
-$fa-var-tumblr: \f173;
-$fa-var-tumblr-square: \f174;
-$fa-var-tv: \f26c;
-$fa-var-twitch: \f1e8;
-$fa-var-twitter: \f099;
-$fa-var-twitter-square: \f081;
-$fa-var-typo3: \f42b;
-$fa-var-uber: \f402;
-$fa-var-ubuntu: \f7df;
-$fa-var-uikit: \f403;
-$fa-var-umbraco: \f8e8;
-$fa-var-umbrella: \f0e9;
-$fa-var-umbrella-beach: \f5ca;
-$fa-var-underline: \f0cd;
-$fa-var-undo: \f0e2;
-$fa-var-undo-alt: \f2ea;
-$fa-var-uniregistry: \f404;
-$fa-var-unity: \e049;
-$fa-var-universal-access: \f29a;
-$fa-var-university: \f19c;
-$fa-var-unlink: \f127;
-$fa-var-unlock: \f09c;
-$fa-var-unlock-alt: \f13e;
-$fa-var-unsplash: \e07c;
-$fa-var-untappd: \f405;
-$fa-var-upload: \f093;
-$fa-var-ups: \f7e0;
-$fa-var-usb: \f287;
-$fa-var-user: \f007;
-$fa-var-user-alt: \f406;
-$fa-var-user-alt-slash: \f4fa;
-$fa-var-user-astronaut: \f4fb;
-$fa-var-user-check: \f4fc;
-$fa-var-user-circle: \f2bd;
-$fa-var-user-clock: \f4fd;
-$fa-var-user-cog: \f4fe;
-$fa-var-user-edit: \f4ff;
-$fa-var-user-friends: \f500;
-$fa-var-user-graduate: \f501;
-$fa-var-user-injured: \f728;
-$fa-var-user-lock: \f502;
-$fa-var-user-md: \f0f0;
-$fa-var-user-minus: \f503;
-$fa-var-user-ninja: \f504;
-$fa-var-user-nurse: \f82f;
-$fa-var-user-plus: \f234;
-$fa-var-user-secret: \f21b;
-$fa-var-user-shield: \f505;
-$fa-var-user-slash: \f506;
-$fa-var-user-tag: \f507;
-$fa-var-user-tie: \f508;
-$fa-var-user-times: \f235;
-$fa-var-users: \f0c0;
-$fa-var-users-cog: \f509;
-$fa-var-users-slash: \e073;
-$fa-var-usps: \f7e1;
-$fa-var-ussunnah: \f407;
-$fa-var-utensil-spoon: \f2e5;
-$fa-var-utensils: \f2e7;
-$fa-var-vaadin: \f408;
-$fa-var-vector-square: \f5cb;
-$fa-var-venus: \f221;
-$fa-var-venus-double: \f226;
-$fa-var-venus-mars: \f228;
-$fa-var-viacoin: \f237;
-$fa-var-viadeo: \f2a9;
-$fa-var-viadeo-square: \f2aa;
-$fa-var-vial: \f492;
-$fa-var-vials: \f493;
-$fa-var-viber: \f409;
-$fa-var-video: \f03d;
-$fa-var-video-slash: \f4e2;
-$fa-var-vihara: \f6a7;
-$fa-var-vimeo: \f40a;
-$fa-var-vimeo-square: \f194;
-$fa-var-vimeo-v: \f27d;
-$fa-var-vine: \f1ca;
-$fa-var-virus: \e074;
-$fa-var-virus-slash: \e075;
-$fa-var-viruses: \e076;
-$fa-var-vk: \f189;
-$fa-var-vnv: \f40b;
-$fa-var-voicemail: \f897;
-$fa-var-volleyball-ball: \f45f;
-$fa-var-volume-down: \f027;
-$fa-var-volume-mute: \f6a9;
-$fa-var-volume-off: \f026;
-$fa-var-volume-up: \f028;
-$fa-var-vote-yea: \f772;
-$fa-var-vr-cardboard: \f729;
-$fa-var-vuejs: \f41f;
-$fa-var-walking: \f554;
-$fa-var-wallet: \f555;
-$fa-var-warehouse: \f494;
-$fa-var-water: \f773;
-$fa-var-wave-square: \f83e;
-$fa-var-waze: \f83f;
-$fa-var-weebly: \f5cc;
-$fa-var-weibo: \f18a;
-$fa-var-weight: \f496;
-$fa-var-weight-hanging: \f5cd;
-$fa-var-weixin: \f1d7;
-$fa-var-whatsapp: \f232;
-$fa-var-whatsapp-square: \f40c;
-$fa-var-wheelchair: \f193;
-$fa-var-whmcs: \f40d;
-$fa-var-wifi: \f1eb;
-$fa-var-wikipedia-w: \f266;
-$fa-var-wind: \f72e;
-$fa-var-window-close: \f410;
-$fa-var-window-maximize: \f2d0;
-$fa-var-window-minimize: \f2d1;
-$fa-var-window-restore: \f2d2;
-$fa-var-windows: \f17a;
-$fa-var-wine-bottle: \f72f;
-$fa-var-wine-glass: \f4e3;
-$fa-var-wine-glass-alt: \f5ce;
-$fa-var-wix: \f5cf;
-$fa-var-wizards-of-the-coast: \f730;
-$fa-var-wolf-pack-battalion: \f514;
-$fa-var-won-sign: \f159;
-$fa-var-wordpress: \f19a;
-$fa-var-wordpress-simple: \f411;
-$fa-var-wpbeginner: \f297;
-$fa-var-wpexplorer: \f2de;
-$fa-var-wpforms: \f298;
-$fa-var-wpressr: \f3e4;
-$fa-var-wrench: \f0ad;
-$fa-var-x-ray: \f497;
-$fa-var-xbox: \f412;
-$fa-var-xing: \f168;
-$fa-var-xing-square: \f169;
-$fa-var-y-combinator: \f23b;
-$fa-var-yahoo: \f19e;
-$fa-var-yammer: \f840;
-$fa-var-yandex: \f413;
-$fa-var-yandex-international: \f414;
-$fa-var-yarn: \f7e3;
-$fa-var-yelp: \f1e9;
-$fa-var-yen-sign: \f157;
-$fa-var-yin-yang: \f6ad;
-$fa-var-yoast: \f2b1;
-$fa-var-youtube: \f167;
-$fa-var-youtube-square: \f431;
-$fa-var-zhihu: \f63f;
diff --git a/src/assets/styles/fontawesome/brands.scss b/src/assets/styles/fontawesome/brands.scss
deleted file mode 100644
index 1cbe51b63..000000000
--- a/src/assets/styles/fontawesome/brands.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-/*!
- * Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com
- * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
- */
-@import 'variables';
-
-@font-face {
- font-family: 'Font Awesome 5 Brands';
- font-style: normal;
- font-weight: 400;
- font-display: $fa-font-display;
- src: url('#{$fa-font-path}/fa-brands-400.eot');
- src: url('#{$fa-font-path}/fa-brands-400.eot?#iefix') format('embedded-opentype'),
- url('#{$fa-font-path}/fa-brands-400.woff2') format('woff2'),
- url('#{$fa-font-path}/fa-brands-400.woff') format('woff'),
- url('#{$fa-font-path}/fa-brands-400.ttf') format('truetype'),
- url('#{$fa-font-path}/fa-brands-400.svg#fontawesome') format('svg');
-}
-
-.fab {
- font-family: 'Font Awesome 5 Brands';
- font-weight: 400;
-}
diff --git a/src/assets/styles/fontawesome/fontawesome.scss b/src/assets/styles/fontawesome/fontawesome.scss
deleted file mode 100644
index 858987570..000000000
--- a/src/assets/styles/fontawesome/fontawesome.scss
+++ /dev/null
@@ -1,16 +0,0 @@
-/*!
- * Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com
- * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
- */
-@import 'variables';
-@import 'mixins';
-@import 'core';
-@import 'larger';
-@import 'fixed-width';
-@import 'list';
-@import 'bordered-pulled';
-@import 'animated';
-@import 'rotated-flipped';
-@import 'stacked';
-@import 'icons';
-@import 'screen-reader';
diff --git a/src/assets/styles/fontawesome/regular.scss b/src/assets/styles/fontawesome/regular.scss
deleted file mode 100644
index 7e0d6373b..000000000
--- a/src/assets/styles/fontawesome/regular.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-/*!
- * Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com
- * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
- */
-@import 'variables';
-
-@font-face {
- font-family: 'Font Awesome 5 Free';
- font-style: normal;
- font-weight: 400;
- font-display: $fa-font-display;
- src: url('#{$fa-font-path}/fa-regular-400.eot');
- src: url('#{$fa-font-path}/fa-regular-400.eot?#iefix') format('embedded-opentype'),
- url('#{$fa-font-path}/fa-regular-400.woff2') format('woff2'),
- url('#{$fa-font-path}/fa-regular-400.woff') format('woff'),
- url('#{$fa-font-path}/fa-regular-400.ttf') format('truetype'),
- url('#{$fa-font-path}/fa-regular-400.svg#fontawesome') format('svg');
-}
-
-.far {
- font-family: 'Font Awesome 5 Free';
- font-weight: 400;
-}
diff --git a/src/assets/styles/fontawesome/solid.scss b/src/assets/styles/fontawesome/solid.scss
deleted file mode 100644
index 909a1eb55..000000000
--- a/src/assets/styles/fontawesome/solid.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com
- * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
- */
-@import 'variables';
-
-@font-face {
- font-family: 'Font Awesome 5 Free';
- font-style: normal;
- font-weight: 900;
- font-display: $fa-font-display;
- src: url('#{$fa-font-path}/fa-solid-900.eot');
- src: url('#{$fa-font-path}/fa-solid-900.eot?#iefix') format('embedded-opentype'),
- url('#{$fa-font-path}/fa-solid-900.woff2') format('woff2'),
- url('#{$fa-font-path}/fa-solid-900.woff') format('woff'),
- url('#{$fa-font-path}/fa-solid-900.ttf') format('truetype'),
- url('#{$fa-font-path}/fa-solid-900.svg#fontawesome') format('svg');
-}
-
-.fa,
-.fas {
- font-family: 'Font Awesome 5 Free';
- font-weight: 900;
-}
diff --git a/src/assets/styles/fontawesome/v4-shims.scss b/src/assets/styles/fontawesome/v4-shims.scss
deleted file mode 100644
index 6e348167b..000000000
--- a/src/assets/styles/fontawesome/v4-shims.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com
- * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
- */
-@import 'variables';
-@import 'shims';
diff --git a/src/assets/styles/fonts.scss b/src/assets/styles/fonts.scss
index ea9baf340..dbb7f866b 100644
--- a/src/assets/styles/fonts.scss
+++ b/src/assets/styles/fonts.scss
@@ -1,24 +1,4 @@
@font-face {
font-family: Ubuntu;
- src: url('../webfonts/Ubuntu.ttf');
-}
-
-@font-face {
- font-family: UbuntuItalics;
- src: url('../webfonts/Ubuntu-i.ttf');
-}
-
-@font-face {
- font-family: UbuntuItalicsBold;
- src: url('../webfonts/Ubuntu-ib.ttf');
-}
-
-@font-face {
- font-family: UbuntuBold;
- src: url('../webfonts/Ubuntu-b.ttf');
-}
-
-@font-face {
- font-family: UbuntuMedium;
- src: url('../webfonts/Ubuntu-m.ttf');
+ src: url('@/assets/webfonts/Ubuntu-C.ttf');
}
diff --git a/src/assets/styles/grid.scss b/src/assets/styles/grid.scss
deleted file mode 100644
index 3a23cb699..000000000
--- a/src/assets/styles/grid.scss
+++ /dev/null
@@ -1,44 +0,0 @@
-$grid-options: (
- "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"
-);
-
-.grid-items {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- justify-content: space-between;
- align-content: flex-start;
- width: 100%;
- margin-top: -3px;
- overflow: hidden;
-
- @each $option in $grid-options {
- &.grid-#{$option} {
- .grid-item {
- width: calc(1 / #{$option} * 100% - (1 - 1 / #{$option}) * 3px);
-
- &:nth-child(#{$option}n) {
- margin-right: 0;
- }
- }
- }
- }
-}
-
-.row-grid {
- margin: 0 !important;
-
- .col {
- padding: 0 !important;
- }
-}
-
-@each $option in $grid-options {
- .row-grid {
- &.row-cols-#{$option} {
- .col:nth-child(#{$option}n) {
- padding-left: 10px !important;
- }
- }
- }
-}
diff --git a/src/assets/styles/icons.scss b/src/assets/styles/icons.scss
index 112bc679d..509952b32 100644
--- a/src/assets/styles/icons.scss
+++ b/src/assets/styles/icons.scss
@@ -1,463 +1,629 @@
-.fas {
+.fa-icon {
line-height: 0 !important;
}
-i {
+.icon {
+ display: inline-block;
+ outline: 0;
+ background-color: transparent;
+ background-repeat: no-repeat;
+ background-position: center;
- &.icon {
- display: inline-block;
- outline: 0;
- background-color: transparent;
- background-repeat: no-repeat;
- background-position: center;
- background-size: contain;
+ &.icon-nitro-light {
+ background-image: url('@/assets/images/nitro/nitro-n-light.svg');
+ }
- &.icon-nitro-light {
- background-image: url('../images/nitro/nitro-n-light.svg');
- }
+ &.icon-nitro-dark {
+ background-image: url('@/assets/images/nitro/nitro-n-dark.svg');
+ }
- &.icon-nitro-dark {
- background-image: url('../images/nitro/nitro-n-dark.svg');
- }
+ &.icon-nitro-light,
+ &.icon-nitro-dark {
+ width: 100%;
+ height: 40px;
+ }
- &.icon-nitro-light,
- &.icon-nitro-dark {
- width: 100%;
- height: 40px;
- }
+ &.icon-catalog {
+ background-image: url('@/assets/images/toolbar/icons/catalog.png');
+ width: 37px;
+ height: 36px;
+ }
- &.icon-catalog {
- background-image: url('../images/toolbar/icons/catalog.png');
- width: 37px;
- height: 36px;
- }
+ &.icon-game {
+ background-image: url('@/assets/images/toolbar/icons/game.png');
+ width: 44px;
+ height: 25px;
+ }
- &.icon-rooms {
- background-image: url('../images/toolbar/icons/rooms.png');
- width: 44px;
- height: 30px;
- }
+ &.icon-rooms {
+ background-image: url('@/assets/images/toolbar/icons/rooms.png');
+ width: 44px;
+ height: 30px;
+ }
- &.icon-house {
- background-image: url('../images/toolbar/icons/house.png');
- height: 30px;
- width: 32px;
- }
+ &.icon-house {
+ background-image: url('@/assets/images/toolbar/icons/house.png');
+ height: 30px;
+ width: 32px;
+ }
- &.icon-inventory {
- background-image: url('../images/toolbar/icons/inventory.png');
- height: 41px;
- width: 44px;
- }
+ &.gray {
+ opacity: 0.5;
+ }
- &.icon-modtools {
- background-image: url('../images/toolbar/icons/modtools.png');
- height: 34px;
- width: 29px;
- }
+ &.icon-inventory {
+ background-image: url('@/assets/images/toolbar/icons/inventory.png');
+ height: 41px;
+ width: 44px;
+ }
- &.icon-friendall {
- background-image: url('../images/toolbar/icons/friend_all.png');
- height: 33px;
- width: 32px;
- }
+ &.icon-modtools {
+ background-image: url('@/assets/images/toolbar/icons/modtools.png');
+ height: 34px;
+ width: 29px;
+ }
- &.icon-friendsearch {
- background-image: url('../images/toolbar/icons/friend_search.png');
- height: 33px;
- width: 29px;
- }
+ &.icon-friendall {
+ background-image: url('@/assets/images/toolbar/icons/friend_all.png');
+ height: 33px;
+ width: 32px;
+ }
- &.icon-sendmessage {
- background-image: url('../images/toolbar/icons/sendmessage.png');
- width: 20px;
- height: 21px;
- }
+ &.icon-friendsearch {
+ background-image: url('@/assets/images/toolbar/icons/friend_search.png');
+ height: 33px;
+ width: 29px;
+ }
- &.icon-me-talents {
- background-image: url('../images/toolbar/icons/me-menu/talents.png');
- width: 32px;
- height: 30px;
- }
+ &.icon-sendmessage {
+ background-image: url('@/assets/images/toolbar/icons/sendmessage.png');
+ width: 20px;
+ height: 21px;
+ }
- &.icon-me-helper-tool {
- background-image: url('../images/toolbar/icons/me-menu/helper-tool.png');
- width: 32px;
- height: 30px;
- }
+ &.icon-me-talents {
+ background-image: url('@/assets/images/toolbar/icons/me-menu/talents.png');
+ width: 32px;
+ height: 30px;
+ }
- &.icon-me-profile {
- background-image: url('../images/toolbar/icons/me-menu/profile.png');
- width: 32px;
- height: 30px;
- }
+ &.icon-me-helper-tool {
+ background-image: url('@/assets/images/toolbar/icons/me-menu/helper-tool.png');
+ width: 32px;
+ height: 30px;
+ }
- &.icon-me-forums {
- background-image: url('../images/toolbar/icons/me-menu/forums.png');
- width: 32px;
- height: 30px;
- }
+ &.icon-me-profile {
+ background-image: url('@/assets/images/toolbar/icons/me-menu/profile.png');
+ width: 32px;
+ height: 30px;
+ }
- &.icon-me-rooms {
- background-image: url('../images/toolbar/icons/me-menu/my-rooms.png');
- width: 30px;
- height: 30px;
- }
+ &.icon-me-forums {
+ background-image: url('@/assets/images/toolbar/icons/me-menu/forums.png');
+ width: 32px;
+ height: 30px;
+ }
- &.icon-me-achievements {
- background-image: url('../images/toolbar/icons/me-menu/achievements.png');
- width: 31px;
- height: 30px;
- }
+ &.icon-me-rooms {
+ background-image: url('@/assets/images/toolbar/icons/me-menu/my-rooms.png');
+ width: 30px;
+ height: 30px;
+ }
- &.icon-me-clothing {
- background-image: url('../images/toolbar/icons/me-menu/clothing.png');
- width: 27px;
- height: 30px;
- }
+ &.icon-me-achievements {
+ background-image: url('@/assets/images/toolbar/icons/me-menu/achievements.png');
+ width: 31px;
+ height: 30px;
+ }
- &.icon-me-settings {
- background-image: url('../images/toolbar/icons/me-menu/cog.png');
- width: 28px;
- height: 34px;
- }
+ &.icon-me-clothing {
+ background-image: url('@/assets/images/toolbar/icons/me-menu/clothing.png');
+ width: 27px;
+ height: 30px;
+ }
- &.icon-joinroom {
- background-image: url('../images/toolbar/icons/joinroom.png');
- width: 21px;
- height: 21px;
- }
+ &.icon-me-settings {
+ background-image: url('@/assets/images/toolbar/icons/me-menu/cog.png');
+ width: 28px;
+ height: 34px;
+ }
- &.icon-habbo {
- background-image: url('../images/toolbar/icons/habbo.png');
- width: 28px;
- height: 28px;
- }
+ &.icon-cog {
+ background: url('@/assets/images/icons/icon_cog.png');
+ width: 14px;
+ height: 15px;
+ }
- &.icon-camera {
- background-image: url('../images/toolbar/icons/camera.png');
- width: 38px;
- height: 45px;
- }
+ &.icon-help {
+ background: url('@/assets/images/icons/help.png');
+ width: 13px;
+ height: 23px;
+ }
- &.icon-message {
- background-image: url('../images/toolbar/icons/message.png');
- width: 36px;
- height: 32px;
+ &.icon-joinroom {
+ background-image: url('@/assets/images/toolbar/icons/joinroom.png');
+ width: 21px;
+ height: 21px;
+ }
- &.is-unseen {
- background-image: url('../images/toolbar/icons/message_unsee.gif');
- }
- }
+ &.icon-habbo {
+ background-image: url('@/assets/images/toolbar/icons/habbo.png');
+ width: 28px;
+ height: 28px;
+ }
- &.icon-wired-trigger {
- background-image: url('../images/wired/icon_trigger.png');
- width: 13px;
- height: 14px;
- }
+ &.icon-camera {
+ background-image: url('@/assets/images/toolbar/icons/camera.png');
+ width: 38px;
+ height: 45px;
+ }
- &.icon-wired-condition {
- background-image: url('../images/wired/icon_condition.png');
- width: 13px;
- height: 14px;
- }
+ &.icon-message {
+ background-image: url('@/assets/images/toolbar/icons/message.png');
+ width: 36px;
+ height: 32px;
- &.icon-wired-action {
- background-image: url('../images/wired/icon_action.png');
- width: 13px;
- height: 14px;
+ &.is-unseen {
+ background-image: url('@/assets/images/toolbar/icons/message_unsee.gif');
}
+ }
- &.arrow-left-icon {
- background-image: url('../images/avatareditor/arrow-left-icon.png');
- width: 28px;
- height: 21px;
- }
+ &.icon-wired-trigger {
+ background-image: url('@/assets/images/wired/icon_trigger.png');
+ width: 13px;
+ height: 14px;
+ }
- &.arrow-right-icon {
- background-image: url('../images/avatareditor/arrow-right-icon.png');
- width: 28px;
- height: 21px;
- }
+ &.icon-wired-condition {
+ background-image: url('@/assets/images/wired/icon_condition.png');
+ width: 13px;
+ height: 14px;
+ }
- &.clear-icon {
- background-image: url('../images/avatareditor/clear-icon.png');
- width: 16px;
- height: 16px;
- }
+ &.icon-wired-action {
+ background-image: url('@/assets/images/wired/icon_action.png');
+ width: 13px;
+ height: 14px;
+ }
- &.ca-icon {
- background-image: url('../images/avatareditor/ca-icon.png');
- width: 30px;
- height: 24px;
+ &.chatstyles-icon {
+ background-image: url('@/assets/images/chat/styles-icon.png');
+ width: 17px;
+ height: 19px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/ca-selected-icon.png');
- }
- }
+ &.pencil-icon {
+ background-image: url('@/assets/images/infostand/pencil-icon.png');
+ width: 17px;
+ height: 18px;
+ }
- &.cc-icon {
- background-image: url('../images/avatareditor/cc-icon.png');
- width: 31px;
- height: 29px;
+ &.disk-icon {
+ background-image: url('@/assets/images/infostand/disk-icon.png');
+ width: 14px;
+ height: 14px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/cc-selected-icon.png');
- }
- }
+ &.disk-creator {
+ background-image: url('@/assets/images/infostand/disk-creator.png');
+ width: 14px;
+ height: 14px;
+ }
- &.ch-icon {
- background-image: url('../images/avatareditor/ch-icon.png');
- width: 29px;
- height: 24px;
+ &.trade-locked-icon {
+ background-image: url('@/assets/images/inventory/trading/locked-icon.png');
+ width: 29px;
+ height: 43px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/ch-selected-icon.png');
- }
- }
+ &.trade-unlocked-icon {
+ background-image: url('@/assets/images/inventory/trading/unlocked-icon.png');
+ width: 29px;
+ height: 43px;
+ }
- &.cp-icon {
- background-image: url('../images/avatareditor/cp-icon.png');
- width: 25px;
- height: 25px;
+ &.modtool-room-icon {
+ background-image: url('@/assets/images/modtool/room.png');
+ width: 20px;
+ height: 15px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/cp-selected-icon.png');
- }
- }
+ &.modtool-chatlog-icon {
+ background-image: url('@/assets/images/modtool/chatlog.gif');
+ width: 20px;
+ height: 15px;
+ }
- &.ea-icon {
- background-image: url('../images/avatareditor/ea-icon.png');
- width: 35px;
- height: 16px;
+ &.modtool-user-icon {
+ background-image: url('@/assets/images/modtool/user.gif');
+ width: 20px;
+ height: 15px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/ea-selected-icon.png');
- }
- }
+ &.modtool-reports-icon {
+ background-image: url('@/assets/images/modtool/reports.png');
+ width: 20px;
+ height: 15px;
+ }
- &.fa-icon {
- background-image: url('../images/avatareditor/fa-icon.png');
- width: 27px;
- height: 20px;
+ &.modtool-wrench-icon {
+ background-image: url('@/assets/images/modtool/wrench.gif');
+ width: 20px;
+ height: 15px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/fa-selected-icon.png');
- }
- }
+ &.modtool-key-icon {
+ background-image: url('@/assets/images/modtool/key.gif');
+ width: 20px;
+ height: 15px;
+ }
- &.female-icon {
- background-image: url('../images/avatareditor/female-icon.png');
- width: 18px;
- height: 27px;
+ &.icon-catalogue-hc_small {
+ background-image: url('@/assets/images/catalog/hc_small.png');
+ height: 17px;
+ width: 31px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/female-selected-icon.png');
- }
- }
+ &.icon-catalogue-hc_big {
+ background: url('@/assets/images/catalog/hc_big.png');
+ width: 68px;
+ height: 40px;
+ }
- &.ha-icon {
- background-image: url('../images/avatareditor/ha-icon.png');
- width: 25px;
- height: 22px;
+ &.icon-sign-exclamation {
+ background: url('@/assets/images/icons/sign-exclamation.png');
+ width: 7px;
+ height: 17px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/ha-selected-icon.png');
- }
- }
+ &.icon-sign-heart {
+ background: url('@/assets/images/icons/sign-heart.png');
+ width: 15px;
+ height: 13px;
+ }
- &.he-icon {
- background-image: url('../images/avatareditor/he-icon.png');
- width: 31px;
- height: 27px;
+ &.icon-sign-red {
+ background: url('@/assets/images/icons/sign-red.png');
+ width: 11px;
+ height: 19px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/he-selected-icon.png');
- }
- }
+ &.icon-sign-yellow {
+ background: url('@/assets/images/icons/sign-yellow.png');
+ width: 11px;
+ height: 19px;
+ }
- &.hr-icon {
- background-image: url('../images/avatareditor/hr-icon.png');
- width: 29px;
- height: 25px;
+ &.icon-sign-skull {
+ background: url('@/assets/images/icons/sign-skull.png');
+ width: 12px;
+ height: 12px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/hr-selected-icon.png');
- }
- }
+ &.icon-sign-smile {
+ background: url('@/assets/images/icons/sign-smile.png');
+ width: 7px;
+ height: 14px;
+ }
- &.lg-icon {
- background-image: url('../images/avatareditor/lg-icon.png');
- width: 19px;
- height: 20px;
+ &.icon-sign-soccer {
+ background: url('@/assets/images/icons/sign-soccer.png');
+ width: 20px;
+ height: 20px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/lg-selected-icon.png');
- }
- }
+ &.icon-house-small {
+ background: url('@/assets/images/icons/house-small.png');
+ width: 19px;
+ height: 14px;
+ }
- &.loading-icon {
- background-image: url('../images/avatareditor/loading-icon.png');
- width: 21px;
- height: 25px;
- }
+ &.icon-camera-small {
+ background: url('@/assets/images/icons/camera-small.png');
+ width: 17px;
+ height: 15px;
+ }
- &.male-icon {
- background-image: url('../images/avatareditor/male-icon.png');
- width: 21px;
- height: 21px;
+ &.icon-small-room {
+ background: url('@/assets/images/icons/small-room.png');
+ width: 17px;
+ height: 16px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/male-selected-icon.png');
- }
- }
+ &.icon-cog {
+ background: url('@/assets/images/icons/cog.png');
+ width: 21px;
+ height: 21px;
+ }
- &.sh-icon {
- background-image: url('../images/avatareditor/sh-icon.png');
- width: 37px;
- height: 10px;
+ &.icon-chat-history {
+ background: url('@/assets/images/icons/chat-history.png');
+ width: 17px;
+ height: 21px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/sh-selected-icon.png');
- }
- }
+ &.icon-room-link {
+ background: url('@/assets/images/icons/room-link.png');
+ width: 17px;
+ height: 15px;
+ }
- &.wa-icon {
- background-image: url('../images/avatareditor/wa-icon.png');
- width: 36px;
- height: 18px;
+ &.icon-zoom-more {
+ background: url('@/assets/images/icons/zoom-more.png');
+ width: 12px;
+ height: 22px;
+ }
- &.selected {
- background-image: url('../images/avatareditor/wa-selected-icon.png');
- }
- }
+ &.icon-zoom-less {
+ background: url('@/assets/images/icons/zoom-less.png');
+ width: 12px;
+ height: 22px;
+ }
- &.chatstyles-icon {
- background-image: url('../images/chat/styles-icon.png');
- width: 17px;
- height: 19px;
- }
+ &.icon-like-room {
+ background: url('@/assets/images/icons/like-room.png');
+ width: 20px;
+ height: 22px;
+ }
- &.pencil-icon {
- background-image: url('../images/infostand/pencil-icon.png');
- width: 17px;
- height: 18px;
- }
+ &.icon-arrows {
+ background: url('@/assets/images/icons/arrows.png');
+ width: 17px;
+ height: 15px;
+ }
- &.trade-locked-icon {
- background-image: url('../images/inventory/trading/locked-icon.png');
- width: 29px;
- height: 43px;
- }
+ &.icon-camera-colormatrix {
+ background: url('@/assets/images/icons/camera-colormatrix.png');
+ width: 32px;
+ height: 21px;
+ }
- &.trade-unlocked-icon {
- background-image: url('../images/inventory/trading/unlocked-icon.png');
- width: 29px;
- height: 43px;
- }
+ &.icon-camera-composite {
+ background: url('@/assets/images/icons/camera-composite.png');
+ width: 32px;
+ height: 21px;
+ }
- &.modtool-room-icon {
- background-image: url('../images/modtool/room.png');
- width: 20px;
- height: 15px;
- }
-
- &.modtool-chatlog-icon {
- background-image: url('../images/modtool/chatlog.gif');
- width: 20px;
- height: 15px;
- }
-
- &.modtool-user-icon{
- background-image: url('../images/modtool/user.gif');
- width: 20px;
- height: 15px;
- }
-
- &.modtool-reports-icon {
- background-image: url('../images/modtool/reports.png');
- width: 20px;
- height: 15px;
- }
-
- &.modtool-wrench-icon {
- background-image: url('../images/modtool/wrench.gif');
- width: 20px;
- height: 15px;
- }
+ &.icon-pf-online {
+ background: url('@/assets/images/profile/icons/online.gif');
+ width: 40px;
+ height: 16px;
+ }
- &.modtool-key-icon {
- background-image: url('../images/modtool/key.gif');
- width: 20px;
- height: 15px;
- }
+ &.icon-pf-offline {
+ background: url('@/assets/images/profile/icons/offline.png');
+ width: 39px;
+ height: 16px;
+ }
- &.icon-catalogue-hc_small {
- background-image: url('../images/catalog/hc_small.png');
- height: 17px;
- width: 31px;
- }
+ &.icon-pf-tick {
+ background: url('@/assets/images/profile/icons/tick.png');
+ width: 11px;
+ height: 10px;
+ }
- &.icon-catalogue-hc_big {
- background: url('../images/catalog/hc_big.png');
- width: 68px;
- height: 40px;
- }
+ &.icon-group-type-0 {
+ background: url('@/assets/images/groups/icons/grouptype_icon_0.png');
+ width: 16px;
+ height: 16px;
+ }
- &.icon-sign-exclamation {
- background: url('../images/icons/sign-exclamation.png');
- width: 7px;
- height: 17px;
- }
+ &.icon-group-type-1 {
+ background: url('@/assets/images/groups/icons/grouptype_icon_1.png');
+ width: 16px;
+ height: 16px;
+ }
- &.icon-sign-heart {
- background: url('../images/icons/sign-heart.png');
- width: 15px;
- height: 13px;
- }
+ &.icon-group-type-2 {
+ background: url('@/assets/images/groups/icons/grouptype_icon_2.png');
+ width: 16px;
+ height: 16px;
+ }
- &.icon-sign-red {
- background: url('../images/icons/sign-red.png');
- width: 11px;
- height: 19px;
- }
+ &.icon-group-decorate {
+ background: url('@/assets/images/groups/icons/group_decorate_icon.png');
+ width: 15px;
+ height: 15px;
+ }
- &.icon-sign-yellow {
- background: url('../images/icons/sign-yellow.png');
- width: 11px;
- height: 19px;
- }
+ &.icon-group-member {
+ background: url('@/assets/images/groups/icons/group_icon_big_member.png');
+ width: 20px;
+ height: 20px;
+ }
- &.icon-sign-skull {
- background: url('../images/icons/sign-skull.png');
- width: 12px;
- height: 12px;
- }
+ &.icon-group-admin {
+ background: url('@/assets/images/groups/icons/group_icon_big_admin.png');
+ width: 20px;
+ height: 20px;
+ }
- &.icon-sign-smile {
- background: url('../images/icons/sign-smile.png');
- width: 7px;
- height: 14px;
- }
+ &.icon-group-owner {
+ background: url('@/assets/images/groups/icons/group_icon_big_owner.png');
+ width: 20px;
+ height: 20px;
+ }
- &.icon-sign-soccer {
- background: url('../images/icons/sign-soccer.png');
- width: 20px;
- height: 20px;
- }
+ &.icon-group-favorite {
+ background: url('@/assets/images/groups/icons/group_favorite.png');
+ width: 14px;
+ height: 14px;
+ }
- &.spin {
- animation: rotating 1s linear infinite;
- }
+ &.icon-group-not-favorite {
+ background: url('@/assets/images/groups/icons/group_notfavorite.png');
+ width: 14px;
+ height: 14px;
+ }
+
+ &.icon-group-small-admin {
+ background: url('@/assets/images/groups/icons/group_icon_admin.png');
+ width: 11px;
+ height: 13px;
+ }
+
+ &.icon-group-small-not-admin {
+ background: url('@/assets/images/groups/icons/group_icon_not_admin.png');
+ width: 11px;
+ height: 13px;
+ }
+
+ &.icon-group-small-owner {
+ background: url('@/assets/images/groups/icons/group_icon_small_owner.png');
+ width: 13px;
+ height: 13px;
+ }
+
+ &.icon-navigator-info {
+ background: url('@/assets/images/navigator/icons/info.png');
+ width: 18px;
+ height: 18px;
+ }
- @keyframes rotating {
- from {
- transform: rotate(0);
- }
+ &.icon-navigator-room-locked {
+ background: url('@/assets/images/navigator/icons/room_locked.png');
+ width: 13px;
+ height: 16px;
+ }
+
+ &.icon-navigator-room-password {
+ background: url('@/assets/images/navigator/icons/room_password.png');
+ width: 13px;
+ height: 16px;
+ }
+
+ &.icon-navigator-room-invisible {
+ background: url('@/assets/images/navigator/icons/room_invisible.png');
+ width: 13px;
+ height: 16px;
+ }
+
+ &.icon-navigator-room-group {
+ background: url('@/assets/images/navigator/icons/room_group.png');
+ width: 13px;
+ height: 11px;
+ }
+
+ &.icon-youtube-next {
+ background: url('@/assets/images/room-widgets/youtube-widget/next.png');
+ width: 21px;
+ height: 16px;
+ }
+
+ &.icon-youtube-prev {
+ background: url('@/assets/images/room-widgets/youtube-widget/prev.png');
+ width: 21px;
+ height: 16px;
+ }
+
+ &.icon-hc-banner {
+ background: url('@/assets/images/catalog/hc_big.png');
+ width: 68px;
+ height: 40px;
+ }
+
+ &.icon-set-tile {
+ background-image: url('@/assets/images/floorplaneditor/icon-tile-set.png');
+ width: 40px;
+ height: 40px;
+ }
+
+ &.icon-unset-tile {
+ background-image: url('@/assets/images/floorplaneditor/icon-tile-unset.png');
+ width: 40px;
+ height: 40px;
+ }
+
+ &.icon-increase-height {
+ background-image: url('@/assets/images/floorplaneditor/icon-tile-up.png');
+ width: 40px;
+ height: 40px;
+ }
+
+ &.icon-decrease-height {
+ background-image: url('@/assets/images/floorplaneditor/icon-tile-down.png');
+ width: 40px;
+ height: 40px;
+ }
+
+ &.icon-set-door {
+ background-image: url('@/assets/images/floorplaneditor/icon-door.png');
+ width: 40px;
+ height: 40px;
+ }
+
+ &.icon-door-direction-0 {
+ background-image: url('@/assets/images/floorplaneditor/door-direction-0.png');
+ width: 80px;
+ height: 45px;
+ }
+
+ &.icon-door-direction-1 {
+ background-image: url('@/assets/images/floorplaneditor/door-direction-1.png');
+ width: 80px;
+ height: 45px;
+ }
+
+ &.icon-door-direction-2 {
+ background-image: url('@/assets/images/floorplaneditor/door-direction-2.png');
+ width: 80px;
+ height: 45px;
+ }
+
+ &.icon-door-direction-3 {
+ background-image: url('@/assets/images/floorplaneditor/door-direction-3.png');
+ width: 80px;
+ height: 45px;
+ }
+
+ &.icon-door-direction-4 {
+ background-image: url('@/assets/images/floorplaneditor/door-direction-4.png');
+ width: 80px;
+ height: 45px;
+ }
+
+ &.icon-door-direction-5 {
+ background-image: url('@/assets/images/floorplaneditor/door-direction-5.png');
+ width: 80px;
+ height: 45px;
+ }
+
+ &.icon-door-direction-6 {
+ background-image: url('@/assets/images/floorplaneditor/door-direction-6.png');
+ width: 80px;
+ height: 45px;
+ }
+
+ &.icon-door-direction-7 {
+ background-image: url('@/assets/images/floorplaneditor/door-direction-7.png');
+ width: 80px;
+ height: 45px;
+ }
+
+ &.icon-tickets {
+ background-image: url('@/assets/images/icons/tickets.png');
+ width: 17px;
+ height: 17px;
+ }
+
+ &.icon-user {
+ background-image: url('@/assets/images/icons/user.png');
+ width: 18px;
+ height: 19px;
+ }
+
+ &.spin {
+ animation: rotating 1s linear infinite;
+ }
+
+ @keyframes rotating {
+ from {
+ transform: rotate(0);
+ }
- to {
- transform: rotate(360deg);
- }
+ to {
+ transform: rotate(360deg);
}
}
}
diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss
index ccfaba625..dc1c5dadc 100644
--- a/src/assets/styles/index.scss
+++ b/src/assets/styles/index.scss
@@ -1,16 +1,16 @@
@import './fonts';
@import './bootstrap/bootstrap';
-@import './fontawesome/fontawesome';
-@import './fontawesome/solid';
-@import './fontawesome/brands';
-@import './fontawesome/regular';
@import './scrollbars';
-@import './grid';
+@import './slider';
@import './icons';
@import './utils';
.btn-sm {
- min-height: 28px;
+ min-height: 28px;
+}
+
+textarea {
+ resize: none;
}
/* Chrome, Safari, Edge, Opera */
diff --git a/src/assets/styles/scrollbars.scss b/src/assets/styles/scrollbars.scss
index d59a0063a..b2d976db2 100644
--- a/src/assets/styles/scrollbars.scss
+++ b/src/assets/styles/scrollbars.scss
@@ -1,20 +1,53 @@
::-webkit-scrollbar {
- width: 5px;
- height: 5px;
+ width: 0.5rem;
+
+ &:horizontal {
+ height: 0.5rem;
+ }
+
+ &:not(:horizontal) {
+ width: 0.5rem;
+ }
}
::-webkit-scrollbar-track {
- border-radius: $border-radius;
- background: rgba(transparent, 0.1);
+
+ &:horizontal {
+ border-bottom: 0.25rem solid rgba($black, .1);
+ }
+
+ &:not(:horizontal) {
+ border-right: 0.25rem solid rgba($black, .1);
+ }
}
::-webkit-scrollbar-thumb {
- border-radius: $border-radius;
- background: rgba($white, 0.7);
- width: 4px;
- border-left: 1px solid transparent;
+
+ &:horizontal {
+ border-bottom: 0.25rem solid rgba($primary, .4);
+
+ &:hover {
+ border-bottom: 0.25rem solid rgba($primary, .8);
+ }
+
+ &:active {
+ border-bottom: 0.25rem solid $secondary;
+ }
+ }
+
+ &:not(:horizontal) {
+ border-right: 0.25rem solid rgba($primary, .4);
+
+ &:hover {
+ border-right: 0.25rem solid rgba($primary, .8);
+ }
+
+ &:active {
+ border-right: 0.25rem solid $secondary;
+ }
+ }
}
-::-webkit-scrollbar-thumb:hover {
- background: rgba($white, 1);
+::-webkit-scrollbar-corner {
+ background: rgba($black, .1);
}
diff --git a/src/assets/styles/slider.scss b/src/assets/styles/slider.scss
new file mode 100644
index 000000000..199c30ea8
--- /dev/null
+++ b/src/assets/styles/slider.scss
@@ -0,0 +1,54 @@
+.nitro-slider {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ height: 25px;
+
+ .track {
+ height: 3px;
+ border-radius: $border-radius;
+ overflow: hidden;
+
+ &.track-0 {
+ background-color: $primary;
+ }
+
+ &.track-1 {
+ background-color: $muted;
+ }
+ }
+
+ .thumb {
+ border-radius: 50%;
+ width: 25px;
+ height: 25px;
+ background-color: gray;
+ font-size: 10px;
+ text-align: center;
+ line-height: 25px;
+ padding: 0 3px;
+
+ &:hover,
+ .active {
+ cursor: pointer;
+ }
+
+ &.active {
+ outline: none;
+ }
+
+ &.degree {
+
+ &:after {
+ content: '\00b0'
+ }
+ }
+
+ &.percent {
+
+ &:after {
+ content: '\0025'
+ }
+ }
+ }
+}
diff --git a/src/assets/styles/utils.scss b/src/assets/styles/utils.scss
index 69ce07fcd..ee9c64594 100644
--- a/src/assets/styles/utils.scss
+++ b/src/assets/styles/utils.scss
@@ -7,11 +7,23 @@
}
.scale-1 {
- transform: scale(1) translateZ(0);
+ transform: scale(1);
+}
+
+.scale-1-25 {
+ transform: scale(1.25) translateZ(0);
+}
+
+.scale-1-50 {
+ transform: scale(1.5) translateZ(0);
}
.scale-2 {
- transform: scale(2) translateZ(0);
+ transform: scale(2);
+}
+
+.opacity-0-5 {
+ opacity: 0.5;
}
.text-shadow {
@@ -23,7 +35,6 @@
}
ul {
-
&.columns-3 {
display: block;
columns: 3;
@@ -31,30 +42,93 @@ ul {
}
}
+.cursor-default {
+ cursor: default !important;
+}
+
.cursor-pointer {
cursor: pointer;
}
+.cursor-not-allowed {
+ cursor: not-allowed;
+}
+
.pointer-events-none {
pointer-events: none;
}
-.t-0 {
- top: 0 !important;
+.filter-none {
+ filter: unset !important;
}
-.b-0 {
- bottom: 0 !important;
+.w-unset {
+ width: unset;
}
-.l-0 {
- left: 0 !important;
+.w-12 {
+ width: 12px;
}
-.r-0 {
- right: 0 !important;
+.h-12 {
+ height: 12px;
}
-.filter-none {
- filter: unset !important;
+.no-select {
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -o-user-select: none;
+ user-select: none;
+}
+
+.grayscale {
+ filter: grayscale(1);
+}
+
+.flex-none {
+ flex: none;
+}
+
+.z-index-1 {
+ z-index: 1;
+}
+
+.flex-basis-fit-content {
+ flex-basis: fit-content;
+}
+
+.flex-basis-max-content {
+ flex-basis: max-content;
+}
+
+.striped-children {
+ > :nth-child(1) {
+ background-color: $table-striped-bg;
+ }
+}
+
+@keyframes bounceIn {
+ 0% {
+ opacity: 0;
+ transform: scale(0.3);
+ }
+ 50% {
+ opacity: 1;
+ transform: scale(1.1);
+ }
+ 70% {
+ transform: scale(0.9);
+ }
+ 100% {
+ transform: scale(1);
+ }
+}
+
+.btn {
+ pointer-events: all;
+}
+
+.no-resize {
+ resize: none !important;
}
diff --git a/src/assets/webfonts/Ubuntu-C.ttf b/src/assets/webfonts/Ubuntu-C.ttf
new file mode 100644
index 000000000..8e2c4bc27
Binary files /dev/null and b/src/assets/webfonts/Ubuntu-C.ttf differ
diff --git a/src/assets/webfonts/fa-brands-400.eot b/src/assets/webfonts/fa-brands-400.eot
deleted file mode 100644
index 54ad8d72d..000000000
Binary files a/src/assets/webfonts/fa-brands-400.eot and /dev/null differ
diff --git a/src/assets/webfonts/fa-brands-400.svg b/src/assets/webfonts/fa-brands-400.svg
deleted file mode 100644
index 2c8659c12..000000000
--- a/src/assets/webfonts/fa-brands-400.svg
+++ /dev/null
@@ -1,3637 +0,0 @@
-
-
-
-
-
-Created by FontForge 20200314 at Wed Jul 15 11:59:41 2020
- By Robert Madole
-Copyright (c) Font Awesome
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/assets/webfonts/fa-brands-400.ttf b/src/assets/webfonts/fa-brands-400.ttf
deleted file mode 100644
index 16852bfd0..000000000
Binary files a/src/assets/webfonts/fa-brands-400.ttf and /dev/null differ
diff --git a/src/assets/webfonts/fa-brands-400.woff b/src/assets/webfonts/fa-brands-400.woff
deleted file mode 100644
index 6cf6fb387..000000000
Binary files a/src/assets/webfonts/fa-brands-400.woff and /dev/null differ
diff --git a/src/assets/webfonts/fa-brands-400.woff2 b/src/assets/webfonts/fa-brands-400.woff2
deleted file mode 100644
index f2a4e36f1..000000000
Binary files a/src/assets/webfonts/fa-brands-400.woff2 and /dev/null differ
diff --git a/src/assets/webfonts/fa-regular-400.eot b/src/assets/webfonts/fa-regular-400.eot
deleted file mode 100644
index 479b32cec..000000000
Binary files a/src/assets/webfonts/fa-regular-400.eot and /dev/null differ
diff --git a/src/assets/webfonts/fa-regular-400.svg b/src/assets/webfonts/fa-regular-400.svg
deleted file mode 100644
index 7947ca8fc..000000000
--- a/src/assets/webfonts/fa-regular-400.svg
+++ /dev/null
@@ -1,805 +0,0 @@
-
-
-
-
-
-Created by FontForge 20200314 at Wed Jul 15 11:59:40 2020
- By Robert Madole
-Copyright (c) Font Awesome
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/assets/webfonts/fa-regular-400.ttf b/src/assets/webfonts/fa-regular-400.ttf
deleted file mode 100644
index 42a04fde4..000000000
Binary files a/src/assets/webfonts/fa-regular-400.ttf and /dev/null differ
diff --git a/src/assets/webfonts/fa-regular-400.woff b/src/assets/webfonts/fa-regular-400.woff
deleted file mode 100644
index c390c60e2..000000000
Binary files a/src/assets/webfonts/fa-regular-400.woff and /dev/null differ
diff --git a/src/assets/webfonts/fa-regular-400.woff2 b/src/assets/webfonts/fa-regular-400.woff2
deleted file mode 100644
index 11c71d28c..000000000
Binary files a/src/assets/webfonts/fa-regular-400.woff2 and /dev/null differ
diff --git a/src/assets/webfonts/fa-solid-900.eot b/src/assets/webfonts/fa-solid-900.eot
deleted file mode 100644
index 52883b93c..000000000
Binary files a/src/assets/webfonts/fa-solid-900.eot and /dev/null differ
diff --git a/src/assets/webfonts/fa-solid-900.svg b/src/assets/webfonts/fa-solid-900.svg
deleted file mode 100644
index d5e4d521c..000000000
--- a/src/assets/webfonts/fa-solid-900.svg
+++ /dev/null
@@ -1,5015 +0,0 @@
-
-
-
-
-
-Created by FontForge 20200314 at Wed Jul 15 11:59:41 2020
- By Robert Madole
-Copyright (c) Font Awesome
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/assets/webfonts/fa-solid-900.ttf b/src/assets/webfonts/fa-solid-900.ttf
deleted file mode 100644
index 7c59512f3..000000000
Binary files a/src/assets/webfonts/fa-solid-900.ttf and /dev/null differ
diff --git a/src/assets/webfonts/fa-solid-900.woff b/src/assets/webfonts/fa-solid-900.woff
deleted file mode 100644
index aff125d65..000000000
Binary files a/src/assets/webfonts/fa-solid-900.woff and /dev/null differ
diff --git a/src/assets/webfonts/fa-solid-900.woff2 b/src/assets/webfonts/fa-solid-900.woff2
deleted file mode 100644
index aa2b79109..000000000
Binary files a/src/assets/webfonts/fa-solid-900.woff2 and /dev/null differ
diff --git a/src/common/AutoGrid.tsx b/src/common/AutoGrid.tsx
new file mode 100644
index 000000000..c387892ad
--- /dev/null
+++ b/src/common/AutoGrid.tsx
@@ -0,0 +1,28 @@
+import { CSSProperties, FC, useMemo } from 'react';
+import { Grid, GridProps } from './Grid';
+
+export interface AutoGridProps extends GridProps
+{
+ columnMinWidth?: number;
+ columnMinHeight?: number;
+}
+
+export const AutoGrid: FC = props =>
+{
+ const { columnMinWidth = 40, columnMinHeight = 40, columnCount = 0, fullHeight = false, maxContent = true, overflow = 'auto', style = {}, ...rest } = props;
+
+ const getStyle = useMemo(() =>
+ {
+ let newStyle: CSSProperties = {};
+
+ newStyle['--nitro-grid-column-min-height'] = (columnMinHeight + 'px');
+
+ if(columnCount > 1) newStyle.gridTemplateColumns = `repeat(auto-fill, minmax(${ columnMinWidth }px, 1fr))`;
+
+ if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
+
+ return newStyle;
+ }, [ columnMinWidth, columnMinHeight, columnCount, style ]);
+
+ return ;
+}
diff --git a/src/common/Base.tsx b/src/common/Base.tsx
new file mode 100644
index 000000000..c77bd9c45
--- /dev/null
+++ b/src/common/Base.tsx
@@ -0,0 +1,84 @@
+import { CSSProperties, DetailedHTMLProps, FC, HTMLAttributes, MutableRefObject, ReactNode, useMemo } from 'react';
+import { ColorVariantType, DisplayType, FloatType, OverflowType, PositionType } from './types';
+
+export interface BaseProps extends DetailedHTMLProps, T>
+{
+ innerRef?: MutableRefObject;
+ display?: DisplayType;
+ fit?: boolean;
+ fitV?: boolean;
+ grow?: boolean;
+ shrink?: boolean;
+ fullWidth?: boolean;
+ fullHeight?: boolean;
+ overflow?: OverflowType;
+ position?: PositionType;
+ float?: FloatType;
+ pointer?: boolean;
+ visible?: boolean;
+ textColor?: ColorVariantType;
+ classNames?: string[];
+ children?: ReactNode;
+}
+
+export const Base: FC> = props =>
+{
+ const { ref = null, innerRef = null, display = null, fit = false, fitV = false, grow = false, shrink = false, fullWidth = false, fullHeight = false, overflow = null, position = null, float = null, pointer = false, visible = null, textColor = null, classNames = [], className = '', style = {}, children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [];
+
+ if(display && display.length) newClassNames.push('d-' + display);
+
+ if(fit || fullWidth) newClassNames.push('w-100');
+
+ if(fit || fullHeight) newClassNames.push('h-100');
+
+ if(fitV) newClassNames.push('vw-100', 'vh-100');
+
+ if(grow) newClassNames.push('flex-grow-1');
+
+ if(shrink) newClassNames.push('flex-shrink-0');
+
+ if(overflow) newClassNames.push('overflow-' + overflow);
+
+ if(position) newClassNames.push('position-' + position);
+
+ if(float) newClassNames.push('float-' + float);
+
+ if(pointer) newClassNames.push('cursor-pointer');
+
+ if(visible !== null) newClassNames.push(visible ? 'visible' : 'invisible');
+
+ if(textColor) newClassNames.push('text-' + textColor);
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ display, fit, fitV, grow, shrink, fullWidth, fullHeight, overflow, position, float, pointer, visible, textColor, classNames ]);
+
+ const getClassName = useMemo(() =>
+ {
+ let newClassName = getClassNames.join(' ');
+
+ if(className.length) newClassName += (' ' + className);
+
+ return newClassName.trim();
+ }, [ getClassNames, className ]);
+
+ const getStyle = useMemo(() =>
+ {
+ let newStyle: CSSProperties = {};
+
+ if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
+
+ return newStyle;
+ }, [ style ]);
+
+ return (
+
+ { children }
+
+ );
+}
diff --git a/src/common/Button.tsx b/src/common/Button.tsx
new file mode 100644
index 000000000..e93039d2f
--- /dev/null
+++ b/src/common/Button.tsx
@@ -0,0 +1,35 @@
+import { FC, useMemo } from 'react';
+import { Flex, FlexProps } from './Flex';
+import { ButtonSizeType, ColorVariantType } from './types';
+
+export interface ButtonProps extends FlexProps
+{
+ variant?: ColorVariantType;
+ size?: ButtonSizeType;
+ active?: boolean;
+ disabled?: boolean;
+}
+
+export const Button: FC = props =>
+{
+ const { variant = 'primary', size = 'sm', active = false, disabled = false, classNames = [], ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'btn' ];
+
+ if(variant) newClassNames.push('btn-' + variant);
+
+ if(size) newClassNames.push('btn-' + size);
+
+ if(active) newClassNames.push('active');
+
+ if(disabled) newClassNames.push('disabled');
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ variant, size, active, disabled, classNames ]);
+
+ return ;
+}
diff --git a/src/common/ButtonGroup.tsx b/src/common/ButtonGroup.tsx
new file mode 100644
index 000000000..033bb1fc2
--- /dev/null
+++ b/src/common/ButtonGroup.tsx
@@ -0,0 +1,22 @@
+import { FC, useMemo } from 'react';
+import { Base, BaseProps } from './Base';
+
+export interface ButtonGroupProps extends BaseProps
+{
+}
+
+export const ButtonGroup: FC = props =>
+{
+ const { classNames = [], ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'btn-group' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ return ;
+}
diff --git a/src/common/Column.tsx b/src/common/Column.tsx
new file mode 100644
index 000000000..3055a98d8
--- /dev/null
+++ b/src/common/Column.tsx
@@ -0,0 +1,46 @@
+import { FC, useMemo } from 'react';
+import { Flex, FlexProps } from './Flex';
+import { useGridContext } from './GridContext';
+import { ColumnSizesType } from './types';
+
+export interface ColumnProps extends FlexProps
+{
+ size?: ColumnSizesType;
+ offset?: ColumnSizesType;
+ column?: boolean;
+}
+
+export const Column: FC = props =>
+{
+ const { size = 0, offset = 0, column = true, gap = 2, classNames = [], ...rest } = props;
+ const { isCssGrid = false } = useGridContext();
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [];
+
+ if(size)
+ {
+ let colClassName = `col-${ size }`;
+
+ if(isCssGrid) colClassName = `g-${ colClassName }`;
+
+ newClassNames.push(colClassName);
+ }
+
+ if(offset)
+ {
+ let colClassName = `offset-${ offset }`;
+
+ if(isCssGrid) colClassName = `g-start-${ offset }`;
+
+ newClassNames.push(colClassName);
+ }
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ size, offset, isCssGrid, classNames ]);
+
+ return ;
+}
diff --git a/src/common/Flex.tsx b/src/common/Flex.tsx
new file mode 100644
index 000000000..ce69731c0
--- /dev/null
+++ b/src/common/Flex.tsx
@@ -0,0 +1,50 @@
+import { FC, useMemo } from 'react';
+import { Base, BaseProps } from './Base';
+import { AlignItemType, AlignSelfType, JustifyContentType, SpacingType } from './types';
+
+export interface FlexProps extends BaseProps
+{
+ column?: boolean;
+ reverse?: boolean;
+ gap?: SpacingType;
+ center?: boolean;
+ alignSelf?: AlignSelfType;
+ alignItems?: AlignItemType;
+ justifyContent?: JustifyContentType;
+}
+
+export const Flex: FC = props =>
+{
+ const { display = 'flex', column = undefined, reverse = false, gap = null, center = false, alignSelf = null, alignItems = null, justifyContent = null, classNames = [], ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [];
+
+ if(column)
+ {
+ if(reverse) newClassNames.push('flex-column-reverse');
+ else newClassNames.push('flex-column');
+ }
+ else
+ {
+ if(reverse) newClassNames.push('flex-row-reverse');
+ }
+
+ if(gap) newClassNames.push('gap-' + gap);
+
+ if(alignSelf) newClassNames.push('align-self-' + alignSelf);
+
+ if(alignItems) newClassNames.push('align-items-' + alignItems);
+
+ if(justifyContent) newClassNames.push('justify-content-' + justifyContent);
+
+ if(!alignItems && !justifyContent && center) newClassNames.push('align-items-center', 'justify-content-center');
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ column, reverse, gap, center, alignSelf, alignItems, justifyContent, classNames ]);
+
+ return ;
+}
diff --git a/src/common/FormGroup.tsx b/src/common/FormGroup.tsx
new file mode 100644
index 000000000..8eb183a2e
--- /dev/null
+++ b/src/common/FormGroup.tsx
@@ -0,0 +1,22 @@
+import { FC, useMemo } from 'react';
+import { Flex, FlexProps } from './Flex';
+
+export interface FormGroupProps extends FlexProps
+{
+}
+
+export const FormGroup: FC = props =>
+{
+ const { classNames = [], ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'form-group' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ return ;
+}
diff --git a/src/common/Grid.tsx b/src/common/Grid.tsx
new file mode 100644
index 000000000..860a89ca3
--- /dev/null
+++ b/src/common/Grid.tsx
@@ -0,0 +1,63 @@
+import { CSSProperties, FC, useMemo } from 'react';
+import { Base, BaseProps } from './Base';
+import { GridContextProvider } from './GridContext';
+import { AlignItemType, AlignSelfType, JustifyContentType, SpacingType } from './types';
+
+export interface GridProps extends BaseProps
+{
+ inline?: boolean;
+ gap?: SpacingType;
+ maxContent?: boolean;
+ columnCount?: number;
+ center?: boolean;
+ alignSelf?: AlignSelfType;
+ alignItems?: AlignItemType;
+ justifyContent?: JustifyContentType;
+}
+
+export const Grid: FC = props =>
+{
+ const { inline = false, gap = 2, maxContent = false, columnCount = 0, center = false, alignSelf = null, alignItems = null, justifyContent = null, fullHeight = true, classNames = [], style = {}, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [];
+
+ if(inline) newClassNames.push('inline-grid');
+ else newClassNames.push('grid');
+
+ if(gap) newClassNames.push('gap-' + gap);
+ else if(gap === 0) newClassNames.push('gap-0');
+
+ if(maxContent) newClassNames.push('flex-basis-max-content');
+
+ if(alignSelf) newClassNames.push('align-self-' + alignSelf);
+
+ if(alignItems) newClassNames.push('align-items-' + alignItems);
+
+ if(justifyContent) newClassNames.push('justify-content-' + justifyContent);
+
+ if(!alignItems && !justifyContent && center) newClassNames.push('align-items-center', 'justify-content-center');
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ inline, gap, maxContent, alignSelf, alignItems, justifyContent, center, classNames ]);
+
+ const getStyle = useMemo(() =>
+ {
+ let newStyle: CSSProperties = {};
+
+ if(columnCount) newStyle['--bs-columns'] = columnCount.toString();
+
+ if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
+
+ return newStyle;
+ }, [ columnCount, style ]);
+
+ return (
+
+
+
+ );
+}
diff --git a/src/common/GridContext.tsx b/src/common/GridContext.tsx
new file mode 100644
index 000000000..821e01b72
--- /dev/null
+++ b/src/common/GridContext.tsx
@@ -0,0 +1,17 @@
+import { createContext, FC, ProviderProps, useContext } from 'react';
+
+export interface IGridContext
+{
+ isCssGrid: boolean;
+}
+
+const GridContext = createContext({
+ isCssGrid: false
+});
+
+export const GridContextProvider: FC> = props =>
+{
+ return { props.children }
+}
+
+export const useGridContext = () => useContext(GridContext);
diff --git a/src/common/HorizontalRule.tsx b/src/common/HorizontalRule.tsx
new file mode 100644
index 000000000..25aeaf996
--- /dev/null
+++ b/src/common/HorizontalRule.tsx
@@ -0,0 +1,38 @@
+import { CSSProperties, FC, useMemo } from 'react';
+import { Base, BaseProps } from './Base';
+import { ColorVariantType } from './types';
+
+export interface HorizontalRuleProps extends BaseProps
+{
+ variant?: ColorVariantType;
+ height?: number;
+}
+
+export const HorizontalRule: FC = props =>
+{
+ const { variant = 'black', height = 1, classNames = [], style = {}, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [];
+
+ if(variant) newClassNames.push('bg-' + variant);
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ variant, classNames ]);
+
+ const getStyle = useMemo(() =>
+ {
+ let newStyle: CSSProperties = { display: 'list-item' };
+
+ if(height > 0) newStyle.height = height;
+
+ if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
+
+ return newStyle;
+ }, [ height, style ]);
+
+ return ;
+}
diff --git a/src/common/InfiniteScroll.tsx b/src/common/InfiniteScroll.tsx
new file mode 100644
index 000000000..f679da0ba
--- /dev/null
+++ b/src/common/InfiniteScroll.tsx
@@ -0,0 +1,63 @@
+import { useVirtual } from '@tanstack/react-virtual';
+import { FC, Fragment, ReactElement, useEffect, useRef, useState } from 'react';
+import { Base } from './Base';
+
+interface InfiniteScrollProps
+{
+ rows: T[];
+ overscan?: number;
+ scrollToBottom?: boolean;
+ rowRender: (row: T) => ReactElement;
+}
+
+export const InfiniteScroll: FC = props =>
+{
+ const { rows = [], overscan = 5, scrollToBottom = false, rowRender = null } = props;
+ const [ scrollIndex, setScrollIndex ] = useState(rows.length - 1);
+ const elementRef = useRef(null);
+
+ const { virtualItems = [], totalSize = 0, scrollToIndex = null } = useVirtual({
+ parentRef: elementRef,
+ size: rows.length,
+ overscan
+ });
+
+ const paddingTop = (virtualItems.length > 0) ? (virtualItems?.[0]?.start || 0) : 0
+ const paddingBottom = (virtualItems.length > 0) ? (totalSize - (virtualItems?.[virtualItems.length - 1]?.end || 0)) : 0;
+
+ useEffect(() =>
+ {
+ if(!scrollToBottom) return;
+
+ scrollToIndex(scrollIndex);
+ }, [ scrollToBottom, scrollIndex, scrollToIndex ]);
+
+ return (
+
+ { (paddingTop > 0) &&
+
}
+ { virtualItems.map(item =>
+ {
+ const row = rows[item.index];
+
+ if (!row) return (
+
+ );
+
+ return (
+
+ { rowRender(row) }
+
+ )
+ }) }
+ { (paddingBottom > 0) &&
+
}
+
+ );
+}
diff --git a/src/common/Text.tsx b/src/common/Text.tsx
new file mode 100644
index 000000000..62cd91ce2
--- /dev/null
+++ b/src/common/Text.tsx
@@ -0,0 +1,63 @@
+import { FC, useMemo } from 'react';
+import { Base, BaseProps } from './Base';
+import { ColorVariantType, FontSizeType, FontWeightType, TextAlignType } from './types';
+
+export interface TextProps extends BaseProps
+{
+ variant?: ColorVariantType;
+ fontWeight?: FontWeightType;
+ fontSize?: FontSizeType;
+ align?: TextAlignType;
+ bold?: boolean;
+ underline?: boolean;
+ italics?: boolean;
+ truncate?: boolean;
+ center?: boolean;
+ textEnd?: boolean;
+ small?: boolean;
+ wrap?: boolean;
+ noWrap?: boolean;
+ textBreak?: boolean;
+}
+
+export const Text: FC = props =>
+{
+ const { variant = 'black', fontWeight = null, fontSize = 0, align = null, bold = false, underline = false, italics = false, truncate = false, center = false, textEnd = false, small = false, wrap = false, noWrap = false, textBreak = false, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'd-inline' ];
+
+ if(variant) newClassNames.push('text-' + variant);
+
+ if(bold) newClassNames.push('fw-bold');
+
+ if(fontWeight) newClassNames.push('fw-' + fontWeight);
+
+ if(fontSize) newClassNames.push('fs-' + fontSize);
+
+ if(align) newClassNames.push('text-' + align);
+
+ if(underline) newClassNames.push('text-decoration-underline');
+
+ if(italics) newClassNames.push('fst-italic');
+
+ if(truncate) newClassNames.push('text-truncate');
+
+ if(center) newClassNames.push('text-center');
+
+ if(textEnd) newClassNames.push('text-end');
+
+ if(small) newClassNames.push('small');
+
+ if(wrap) newClassNames.push('text-wrap');
+
+ if(noWrap) newClassNames.push('text-nowrap');
+
+ if(textBreak) newClassNames.push('text-break');
+
+ return newClassNames;
+ }, [ variant, fontWeight, fontSize, align, bold, underline, italics, truncate, center, textEnd, small, wrap, noWrap, textBreak ]);
+
+ return ;
+}
diff --git a/src/common/card/NitroCardContentView.tsx b/src/common/card/NitroCardContentView.tsx
new file mode 100644
index 000000000..903b4c5c0
--- /dev/null
+++ b/src/common/card/NitroCardContentView.tsx
@@ -0,0 +1,18 @@
+import { FC, useMemo } from 'react';
+import { Column, ColumnProps } from '..';
+
+export const NitroCardContentView: FC = props =>
+{
+ const { overflow = 'auto', classNames = [], ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'container-fluid', 'content-area' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ return ;
+}
diff --git a/src/common/card/NitroCardContext.tsx b/src/common/card/NitroCardContext.tsx
new file mode 100644
index 000000000..517b435bc
--- /dev/null
+++ b/src/common/card/NitroCardContext.tsx
@@ -0,0 +1,17 @@
+import { createContext, FC, ProviderProps, useContext } from 'react';
+
+interface INitroCardContext
+{
+ theme: string;
+}
+
+const NitroCardContext = createContext({
+ theme: null
+});
+
+export const NitroCardContextProvider: FC> = props =>
+{
+ return { props.children }
+}
+
+export const useNitroCardContext = () => useContext(NitroCardContext);
diff --git a/src/common/card/NitroCardHeaderView.tsx b/src/common/card/NitroCardHeaderView.tsx
new file mode 100644
index 000000000..98837c763
--- /dev/null
+++ b/src/common/card/NitroCardHeaderView.tsx
@@ -0,0 +1,48 @@
+import { FC, MouseEvent, useMemo } from 'react';
+import { FaFlag, FaTimes } from 'react-icons/fa';
+import { Base, Column, ColumnProps, Flex } from '..';
+
+interface NitroCardHeaderViewProps extends ColumnProps
+{
+ headerText: string;
+ isGalleryPhoto?: boolean;
+ noCloseButton?: boolean;
+ onReportPhoto?: (event: MouseEvent) => void;
+ onCloseClick: (event: MouseEvent) => void;
+}
+
+export const NitroCardHeaderView: FC = props =>
+{
+ const { headerText = null, isGalleryPhoto = false, noCloseButton = false, onReportPhoto = null, onCloseClick = null, justifyContent = 'center', alignItems = 'center', classNames = [], children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'drag-handler', 'container-fluid', 'nitro-card-header' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ const onMouseDown = (event: MouseEvent) =>
+ {
+ event.stopPropagation();
+ event.nativeEvent.stopImmediatePropagation();
+ }
+
+ return (
+
+
+ { headerText }
+ { isGalleryPhoto &&
+
+
+
+ }
+
+
+
+
+
+ );
+}
diff --git a/src/common/card/NitroCardSubHeaderView.tsx b/src/common/card/NitroCardSubHeaderView.tsx
new file mode 100644
index 000000000..a37d0bd45
--- /dev/null
+++ b/src/common/card/NitroCardSubHeaderView.tsx
@@ -0,0 +1,23 @@
+import { FC, useMemo } from 'react';
+import { Flex, FlexProps } from '..';
+
+interface NitroCardSubHeaderProps extends FlexProps {
+ variant?: string;
+}
+export const NitroCardSubHeaderView: FC = props =>
+{
+ const { justifyContent = 'center', classNames = [], variant = 'muted', ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'container-fluid', 'p-1' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ newClassNames.push('bg-' + variant);
+
+ return newClassNames;
+ }, [ classNames, variant ]);
+
+ return ;
+}
diff --git a/src/common/card/NitroCardView.scss b/src/common/card/NitroCardView.scss
new file mode 100644
index 000000000..a552182e3
--- /dev/null
+++ b/src/common/card/NitroCardView.scss
@@ -0,0 +1,248 @@
+$nitro-card-header-height: 33px;
+$nitro-card-tabs-height: 33px;
+
+.nitro-card {
+ resize: both;
+
+ @include media-breakpoint-down(lg) {
+ max-width: 100vw !important;
+ max-height: 100vh !important;
+ }
+
+ &.theme-primary {
+ border: $border-width solid $border-color;
+
+ .nitro-card-header {
+ min-height: 33px;
+ max-height: 33px;
+ background: $primary;
+
+ .nitro-card-header-text {
+ color: $white;
+ text-shadow: 0px 4px 4px rgba($black, 0.25);
+ @include font-size($h4-font-size);
+ }
+
+ .nitro-card-header-close {
+ cursor: pointer;
+ padding: 2px 2px;
+ line-height: 1;
+ border-radius: $border-radius;
+ box-shadow: 0 0 0 1.6px $white;
+ border: 2px solid #921911;
+ background: repeating-linear-gradient(
+ rgba(245, 80, 65, 1),
+ rgba(245, 80, 65, 1) 50%,
+ rgba(194, 48, 39, 1) 50%,
+ rgba(194, 48, 39, 1) 100%
+ );
+
+ &:hover {
+ filter: brightness(1.2);
+ }
+
+ &:active {
+ filter: brightness(0.8);
+ }
+ }
+
+ .nitro-card-header-report-camera {
+ cursor: pointer;
+ padding: 1px 3px;
+ line-height: 1;
+ border-radius: $border-radius;
+ box-shadow: 0 0 0 1.6px $white;
+ border: 2px solid #921911;
+ background: repeating-linear-gradient(
+ rgba(245, 80, 65, 1),
+ rgba(245, 80, 65, 1) 50%,
+ rgba(194, 48, 39, 1) 50%,
+ rgba(194, 48, 39, 1) 100%
+ );
+
+ &:hover {
+ filter: brightness(1.2);
+ }
+
+ &:active {
+ filter: brightness(0.8);
+ }
+ }
+ }
+
+ .nitro-card-tabs {
+ background-color: $secondary;
+
+ .nav-item {
+ padding: $nav-link-padding-y $nav-link-padding-x;
+ background-color: $muted;
+ color: $black;
+ z-index: 1;
+ margin-bottom: -1px;
+
+ &.active {
+ background-color: $light;
+ border-color: $border-color $border-color $light !important;
+ border-bottom: 1px solid black;
+
+ &:before {
+ background: $white;
+ }
+ }
+
+ &:before {
+ content: '';
+ position: absolute;
+ width: 93%;
+ height: 3px;
+ border-radius: 0.25rem;
+ top: 1.5px;
+ left: 0;
+ right: 0;
+ margin: auto;
+ background: #c2c9d1;
+ z-index: 1;
+ }
+ }
+ }
+
+ .content-area {
+ background-color: $light;
+ }
+ }
+
+ &.theme-primary-slim {
+ border: $border-width solid $border-color;
+
+ .nitro-card-header {
+ position: relative;
+ min-height: 28px;
+ max-height: 28px;
+ background: repeating-linear-gradient($tertiary, $tertiary 50%, $quaternary 50%, $quaternary 100%);
+ border-bottom: 2px solid darken($quaternary, 5);
+ box-shadow: 0 2px white;
+ width: 100%;
+ margin: 0;
+ padding-top:2px;
+
+ &:before {
+ position: absolute;
+ content: ' ';
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 2px;
+ background-color: rgba($white, 0.3);
+ }
+
+ .nitro-card-header-text {
+ color: $white;
+ text-shadow: 0px 4px 4px rgba($black, 0.25);
+ @include font-size($h5-font-size);
+ min-height: 21px;
+ }
+
+ .nitro-card-header-close {
+ cursor: pointer;
+ padding: 0px 2px;
+ line-height: 1;
+ @include font-size($h7-font-size);
+ border-radius: $border-radius;
+ box-shadow: 0 0 0 1.6px $white;
+ border: 2px solid #921911;
+ background: repeating-linear-gradient(
+ rgba(245, 80, 65, 1),
+ rgba(245, 80, 65, 1) 50%,
+ rgba(194, 48, 39, 1) 50%,
+ rgba(194, 48, 39, 1) 100%
+ );
+
+ &:hover {
+ filter: brightness(1.2);
+ }
+
+ &:active {
+ filter: brightness(0.8);
+ }
+ }
+
+ .nitro-card-header-report-camera {
+ cursor: pointer;
+ padding: 0px 2px;
+ margin-right: 4px;
+ line-height: 1;
+ @include font-size($h7-font-size);
+ border-radius: $border-radius;
+ box-shadow: 0 0 0 1.6px $white;
+ border: 2px solid #921911;
+ background: repeating-linear-gradient(
+ rgba(245, 80, 65, 1),
+ rgba(245, 80, 65, 1) 50%,
+ rgba(194, 48, 39, 1) 50%,
+ rgba(194, 48, 39, 1) 100%
+ );
+
+ &:hover {
+ filter: brightness(1.2);
+ }
+
+ &:active {
+ filter: brightness(0.8);
+ }
+ }
+ }
+
+ .nitro-card-tabs {
+ background-color: $secondary;
+ }
+
+ .content-area {
+ background-color: $light;
+ }
+ }
+}
+
+.content-area {
+ height: 100%;
+ padding-top: $container-padding-x;
+ padding-bottom: $container-padding-x;
+ overflow: auto;
+
+ &.theme-dark {
+ background-color: #1C323F !important;
+ }
+}
+
+@include media-breakpoint-down(lg) {
+ .content-area {
+ height: 100% !important;
+ min-height: auto !important;
+ max-height: 100% !important;
+ }
+}
+
+.nitro-card-header {
+ position: relative;
+ height: 100%;
+}
+
+.nitro-card-tabs {
+ height: 100%;
+ min-height: $nitro-card-tabs-height;
+ max-height: $nitro-card-tabs-height;
+ border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
+}
+
+.nitro-card-accordion-set {
+
+ &.active {
+ height: 100%;
+ overflow: hidden;
+ background: rgba($white, 0.5);
+ border-bottom: 1px solid rgba($black, 0.2);
+ }
+
+ .nitro-card-accordion-set-header {
+ border-bottom: 1px solid rgba($black, 0.2);
+ }
+}
diff --git a/src/common/card/NitroCardView.tsx b/src/common/card/NitroCardView.tsx
new file mode 100644
index 000000000..3caa6bfdc
--- /dev/null
+++ b/src/common/card/NitroCardView.tsx
@@ -0,0 +1,34 @@
+import { FC, useMemo, useRef } from 'react';
+import { Column, ColumnProps } from '..';
+import { DraggableWindow, DraggableWindowPosition, DraggableWindowProps } from '../draggable-window';
+import { NitroCardContextProvider } from './NitroCardContext';
+
+export interface NitroCardViewProps extends DraggableWindowProps, ColumnProps
+{
+ theme?: string;
+}
+
+export const NitroCardView: FC = props =>
+{
+ const { theme = 'primary', uniqueKey = null, handleSelector = '.drag-handler', windowPosition = DraggableWindowPosition.CENTER, disableDrag = false, overflow = 'hidden', position = 'relative', gap = 0, classNames = [], ...rest } = props;
+ const elementRef = useRef();
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'nitro-card', 'rounded', 'shadow', ];
+
+ newClassNames.push(`theme-${ theme || 'primary' }`);
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ theme, classNames ]);
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/common/card/accordion/NitroCardAccordionContext.tsx b/src/common/card/accordion/NitroCardAccordionContext.tsx
new file mode 100644
index 000000000..61377d541
--- /dev/null
+++ b/src/common/card/accordion/NitroCardAccordionContext.tsx
@@ -0,0 +1,21 @@
+import { createContext, Dispatch, FC, ProviderProps, SetStateAction, useContext } from 'react';
+
+export interface INitroCardAccordionContext
+{
+ closers: Function[];
+ setClosers: Dispatch>;
+ closeAll: () => void;
+}
+
+const NitroCardAccordionContext = createContext({
+ closers: null,
+ setClosers: null,
+ closeAll: null
+});
+
+export const NitroCardAccordionContextProvider: FC> = props =>
+{
+ return ;
+}
+
+export const useNitroCardAccordionContext = () => useContext(NitroCardAccordionContext);
diff --git a/src/common/card/accordion/NitroCardAccordionItemView.tsx b/src/common/card/accordion/NitroCardAccordionItemView.tsx
new file mode 100644
index 000000000..dbd89cc28
--- /dev/null
+++ b/src/common/card/accordion/NitroCardAccordionItemView.tsx
@@ -0,0 +1,18 @@
+import { FC } from 'react';
+import { Flex, FlexProps } from '../..';
+
+export interface NitroCardAccordionItemViewProps extends FlexProps
+{
+
+}
+
+export const NitroCardAccordionItemView: FC = props =>
+{
+ const { alignItems = 'center', gap = 1, children = null, ...rest } = props;
+
+ return (
+
+ { children }
+
+ );
+}
diff --git a/src/common/card/accordion/NitroCardAccordionSetView.tsx b/src/common/card/accordion/NitroCardAccordionSetView.tsx
new file mode 100644
index 000000000..d9e0656e9
--- /dev/null
+++ b/src/common/card/accordion/NitroCardAccordionSetView.tsx
@@ -0,0 +1,84 @@
+import { FC, useCallback, useEffect, useMemo, useState } from 'react';
+import { FaCaretDown, FaCaretUp } from 'react-icons/fa';
+import { Column, ColumnProps, Flex, Text } from '../..';
+import { useNitroCardAccordionContext } from './NitroCardAccordionContext';
+
+export interface NitroCardAccordionSetViewProps extends ColumnProps
+{
+ headerText: string;
+ isExpanded?: boolean;
+}
+
+export const NitroCardAccordionSetView: FC = props =>
+{
+ const { headerText = '', isExpanded = false, gap = 0, classNames = [], children = null, ...rest } = props;
+ const [ isOpen, setIsOpen ] = useState(false);
+ const { setClosers = null, closeAll = null } = useNitroCardAccordionContext();
+
+ const onClick = () =>
+ {
+ closeAll();
+
+ setIsOpen(prevValue => !prevValue);
+ }
+
+ const onClose = useCallback(() => setIsOpen(false), []);
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames = [ 'nitro-card-accordion-set' ];
+
+ if(isOpen) newClassNames.push('active');
+
+ if(classNames && classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ isOpen, classNames ]);
+
+ useEffect(() =>
+ {
+ setIsOpen(isExpanded);
+ }, [ isExpanded ]);
+
+ useEffect(() =>
+ {
+ const closeFunction = onClose;
+
+ setClosers(prevValue =>
+ {
+ const newClosers = [ ...prevValue ];
+
+ newClosers.push(closeFunction);
+
+ return newClosers;
+ });
+
+ return () =>
+ {
+ setClosers(prevValue =>
+ {
+ const newClosers = [ ...prevValue ];
+
+ const index = newClosers.indexOf(closeFunction);
+
+ if(index >= 0) newClosers.splice(index, 1);
+
+ return newClosers;
+ });
+ }
+ }, [ onClose, setClosers ]);
+
+ return (
+
+
+ { headerText }
+ { isOpen && }
+ { !isOpen && }
+
+ { isOpen &&
+
+ { children }
+ }
+
+ );
+}
diff --git a/src/common/card/accordion/NitroCardAccordionView.tsx b/src/common/card/accordion/NitroCardAccordionView.tsx
new file mode 100644
index 000000000..648a2e7d2
--- /dev/null
+++ b/src/common/card/accordion/NitroCardAccordionView.tsx
@@ -0,0 +1,25 @@
+import { FC, useCallback, useState } from 'react';
+import { Column, ColumnProps } from '../..';
+import { NitroCardAccordionContextProvider } from './NitroCardAccordionContext';
+
+interface NitroCardAccordionViewProps extends ColumnProps
+{
+
+}
+
+export const NitroCardAccordionView: FC = props =>
+{
+ const { ...rest } = props;
+ const [ closers, setClosers ] = useState([]);
+
+ const closeAll = useCallback(() =>
+ {
+ for(const closer of closers) closer();
+ }, [ closers ]);
+
+ return (
+
+
+
+ );
+}
diff --git a/src/common/card/accordion/index.ts b/src/common/card/accordion/index.ts
new file mode 100644
index 000000000..d585b3362
--- /dev/null
+++ b/src/common/card/accordion/index.ts
@@ -0,0 +1,4 @@
+export * from './NitroCardAccordionContext';
+export * from './NitroCardAccordionItemView';
+export * from './NitroCardAccordionSetView';
+export * from './NitroCardAccordionView';
diff --git a/src/common/card/index.ts b/src/common/card/index.ts
new file mode 100644
index 000000000..3619d4377
--- /dev/null
+++ b/src/common/card/index.ts
@@ -0,0 +1,7 @@
+export * from './accordion';
+export * from './NitroCardContentView';
+export * from './NitroCardContext';
+export * from './NitroCardHeaderView';
+export * from './NitroCardSubHeaderView';
+export * from './NitroCardView';
+export * from './tabs';
diff --git a/src/common/card/tabs/NitroCardTabsItemView.tsx b/src/common/card/tabs/NitroCardTabsItemView.tsx
new file mode 100644
index 000000000..1c74f8b18
--- /dev/null
+++ b/src/common/card/tabs/NitroCardTabsItemView.tsx
@@ -0,0 +1,35 @@
+import { FC, useMemo } from 'react';
+import { Flex, FlexProps } from '../../Flex';
+import { LayoutItemCountView } from '../../layout';
+
+interface NitroCardTabsItemViewProps extends FlexProps
+{
+ isActive?: boolean;
+ count?: number;
+}
+
+export const NitroCardTabsItemView: FC = props =>
+{
+ const { isActive = false, count = 0, overflow = 'hidden', position = 'relative', pointer = true, classNames = [], children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'nav-item', 'rounded-top', 'border' ];
+
+ if(isActive) newClassNames.push('active');
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ isActive, classNames ]);
+
+ return (
+
+
+ { children }
+
+ { (count > 0) &&
+ }
+
+ );
+}
diff --git a/src/common/card/tabs/NitroCardTabsView.tsx b/src/common/card/tabs/NitroCardTabsView.tsx
new file mode 100644
index 000000000..1a64a1261
--- /dev/null
+++ b/src/common/card/tabs/NitroCardTabsView.tsx
@@ -0,0 +1,22 @@
+import { FC, useMemo } from 'react';
+import { Flex, FlexProps } from '../..';
+
+export const NitroCardTabsView: FC = props =>
+{
+ const { justifyContent = 'center', gap = 1, classNames = [], children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'container-fluid', 'nitro-card-tabs', 'pt-1' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ return (
+
+ { children }
+
+ );
+}
diff --git a/src/common/card/tabs/index.ts b/src/common/card/tabs/index.ts
new file mode 100644
index 000000000..517db1146
--- /dev/null
+++ b/src/common/card/tabs/index.ts
@@ -0,0 +1,2 @@
+export * from './NitroCardTabsItemView';
+export * from './NitroCardTabsView';
diff --git a/src/common/classNames.ts b/src/common/classNames.ts
new file mode 100644
index 000000000..2127d85ef
--- /dev/null
+++ b/src/common/classNames.ts
@@ -0,0 +1 @@
+export const classNames = (...classes: string[]) => classes.filter(Boolean).join(' ');
diff --git a/src/common/draggable-window/DraggableWindow.tsx b/src/common/draggable-window/DraggableWindow.tsx
new file mode 100644
index 000000000..286d51d18
--- /dev/null
+++ b/src/common/draggable-window/DraggableWindow.tsx
@@ -0,0 +1,270 @@
+import { MouseEventType, TouchEventType } from '@nitrots/nitro-renderer';
+import { CSSProperties, FC, Key, MouseEvent as ReactMouseEvent, ReactNode, TouchEvent as ReactTouchEvent, useCallback, useEffect, useRef, useState } from 'react';
+import { createPortal } from 'react-dom';
+import { Base } from '..';
+import { GetLocalStorage, SetLocalStorage, WindowSaveOptions } from '../../api';
+import { DraggableWindowPosition } from './DraggableWindowPosition';
+
+const CURRENT_WINDOWS: HTMLElement[] = [];
+const BOUNDS_THRESHOLD_TOP: number = 0;
+const BOUNDS_THRESHOLD_LEFT: number = 0;
+
+export interface DraggableWindowProps
+{
+ uniqueKey?: Key;
+ handleSelector?: string;
+ windowPosition?: string;
+ disableDrag?: boolean;
+ dragStyle?: CSSProperties;
+ offsetLeft?: number;
+ offsetTop?: number;
+ children?: ReactNode;
+}
+
+export const DraggableWindow: FC = props =>
+{
+ const { uniqueKey = null, handleSelector = '.drag-handler', windowPosition = DraggableWindowPosition.CENTER, disableDrag = false, dragStyle = {}, children = null, offsetLeft = 0, offsetTop = 0 } = props;
+ const [ delta, setDelta ] = useState<{ x: number, y: number }>(null);
+ const [ offset, setOffset ] = useState<{ x: number, y: number }>(null);
+ const [ start, setStart ] = useState<{ x: number, y: number }>({ x: 0, y: 0 });
+ const [ isDragging, setIsDragging ] = useState(false);
+ const [ dragHandler, setDragHandler ] = useState(null);
+ const elementRef = useRef();
+
+ const bringToTop = useCallback(() =>
+ {
+ let zIndex = 400;
+
+ for(const existingWindow of CURRENT_WINDOWS)
+ {
+ zIndex += 1;
+
+ existingWindow.style.zIndex = zIndex.toString();
+ }
+ }, []);
+
+ const moveCurrentWindow = useCallback(() =>
+ {
+ const index = CURRENT_WINDOWS.indexOf(elementRef.current);
+
+ if(index === -1)
+ {
+ CURRENT_WINDOWS.push(elementRef.current);
+ }
+
+ else if(index === (CURRENT_WINDOWS.length - 1)) return;
+
+ else if(index >= 0)
+ {
+ CURRENT_WINDOWS.splice(index, 1);
+
+ CURRENT_WINDOWS.push(elementRef.current);
+ }
+
+ bringToTop();
+ }, [ bringToTop ]);
+
+ const onMouseDown = useCallback((event: ReactMouseEvent) =>
+ {
+ moveCurrentWindow();
+ }, [ moveCurrentWindow ]);
+
+ const onTouchStart = useCallback((event: ReactTouchEvent) =>
+ {
+ moveCurrentWindow();
+ }, [ moveCurrentWindow ]);
+
+ const startDragging = useCallback((startX: number, startY: number) =>
+ {
+ setStart({ x: startX, y: startY });
+ setIsDragging(true);
+ }, []);
+
+ const onDragMouseDown = useCallback((event: MouseEvent) =>
+ {
+ startDragging(event.clientX, event.clientY);
+ }, [ startDragging ]);
+
+ const onTouchDown = useCallback((event: TouchEvent) =>
+ {
+ const touch = event.touches[0];
+
+ startDragging(touch.clientX, touch.clientY);
+ }, [ startDragging ]);
+
+ const onDragMouseMove = useCallback((event: MouseEvent) =>
+ {
+ setDelta({ x: (event.clientX - start.x), y: (event.clientY - start.y) });
+ }, [ start ]);
+
+ const onDragTouchMove = useCallback((event: TouchEvent) =>
+ {
+ const touch = event.touches[0];
+
+ setDelta({ x: (touch.clientX - start.x), y: (touch.clientY - start.y) });
+ }, [ start ]);
+
+ const completeDrag = useCallback(() =>
+ {
+ if(!elementRef.current || !dragHandler) return;
+
+ let offsetX = (offset.x + delta.x);
+ let offsetY = (offset.y + delta.y);
+
+ const left = elementRef.current.offsetLeft + offsetX;
+ const top = elementRef.current.offsetTop + offsetY;
+
+ if(top < BOUNDS_THRESHOLD_TOP)
+ {
+ offsetY = -elementRef.current.offsetTop;
+ }
+
+ else if((top + dragHandler.offsetHeight) >= (document.body.offsetHeight - BOUNDS_THRESHOLD_TOP))
+ {
+ offsetY = (document.body.offsetHeight - elementRef.current.offsetHeight) - elementRef.current.offsetTop;
+ }
+
+ if((left + elementRef.current.offsetWidth) < BOUNDS_THRESHOLD_LEFT)
+ {
+ offsetX = -elementRef.current.offsetLeft;
+ }
+
+ else if(left >= (document.body.offsetWidth - BOUNDS_THRESHOLD_LEFT))
+ {
+ offsetX = (document.body.offsetWidth - elementRef.current.offsetWidth) - elementRef.current.offsetLeft;
+ }
+
+ setDelta({ x: 0, y: 0 });
+ setOffset({ x: offsetX, y: offsetY });
+ setIsDragging(false);
+
+ if(uniqueKey !== null)
+ {
+ const newStorage = { ...GetLocalStorage(`nitro.windows.${ uniqueKey }`) } as WindowSaveOptions;
+
+ newStorage.offset = { x: offsetX, y: offsetY };
+
+ SetLocalStorage(`nitro.windows.${ uniqueKey }`, newStorage);
+ }
+ }, [ dragHandler, delta, offset, uniqueKey ]);
+
+ const onDragMouseUp = useCallback((event: MouseEvent) =>
+ {
+ completeDrag();
+ }, [ completeDrag ]);
+
+ const onDragTouchUp = useCallback((event: TouchEvent) =>
+ {
+ completeDrag();
+ }, [ completeDrag ]);
+
+ useEffect(() =>
+ {
+ const element = (elementRef.current as HTMLElement);
+
+ if(!element) return;
+
+ CURRENT_WINDOWS.push(element);
+
+ bringToTop();
+
+ if(!disableDrag)
+ {
+ const handle = (element.querySelector(handleSelector) as HTMLElement);
+
+ if(handle) setDragHandler(handle);
+ }
+
+ let offsetX = 0;
+ let offsetY = 0;
+
+ switch(windowPosition)
+ {
+ case DraggableWindowPosition.TOP_CENTER:
+ element.style.top = 50 + offsetTop + 'px';
+ element.style.left = `calc(50vw - ${ (element.offsetWidth / 2 + offsetLeft) }px)`;
+ break;
+ case DraggableWindowPosition.CENTER:
+ element.style.top = `calc(50vh - ${ (element.offsetHeight / 2) + offsetTop }px)`;
+ element.style.left = `calc(50vw - ${ (element.offsetWidth / 2) + offsetLeft }px)`;
+ break;
+ case DraggableWindowPosition.TOP_LEFT:
+ element.style.top = 50 + offsetTop + 'px';
+ element.style.left = 50 + offsetLeft + 'px';
+ break;
+ }
+
+ setDelta({ x: 0, y: 0 });
+ setOffset({ x: offsetX, y: offsetY });
+
+ return () =>
+ {
+ const index = CURRENT_WINDOWS.indexOf(element);
+
+ if(index >= 0) CURRENT_WINDOWS.splice(index, 1);
+ }
+ }, [ handleSelector, windowPosition, uniqueKey, disableDrag, offsetLeft, offsetTop, bringToTop ]);
+
+ useEffect(() =>
+ {
+ if(!offset && !delta) return;
+
+ const element = (elementRef.current as HTMLElement);
+
+ if(!element) return;
+
+ element.style.transform = `translate(${ offset.x + delta.x }px, ${ offset.y + delta.y }px)`;
+ element.style.visibility = 'visible';
+ }, [ offset, delta ]);
+
+ useEffect(() =>
+ {
+ if(!dragHandler) return;
+
+ dragHandler.addEventListener(MouseEventType.MOUSE_DOWN, onDragMouseDown);
+ dragHandler.addEventListener(TouchEventType.TOUCH_START, onTouchDown);
+
+ return () =>
+ {
+ dragHandler.removeEventListener(MouseEventType.MOUSE_DOWN, onDragMouseDown);
+ dragHandler.removeEventListener(TouchEventType.TOUCH_START, onTouchDown);
+ }
+ }, [ dragHandler, onDragMouseDown, onTouchDown ]);
+
+ useEffect(() =>
+ {
+ if(!isDragging) return;
+
+ document.addEventListener(MouseEventType.MOUSE_UP, onDragMouseUp);
+ document.addEventListener(TouchEventType.TOUCH_END, onDragTouchUp);
+ document.addEventListener(MouseEventType.MOUSE_MOVE, onDragMouseMove);
+ document.addEventListener(TouchEventType.TOUCH_MOVE, onDragTouchMove);
+
+ return () =>
+ {
+ document.removeEventListener(MouseEventType.MOUSE_UP, onDragMouseUp);
+ document.removeEventListener(TouchEventType.TOUCH_END, onDragTouchUp);
+ document.removeEventListener(MouseEventType.MOUSE_MOVE, onDragMouseMove);
+ document.removeEventListener(TouchEventType.TOUCH_MOVE, onDragTouchMove);
+ }
+ }, [ isDragging, onDragMouseUp, onDragMouseMove, onDragTouchUp, onDragTouchMove ]);
+
+ useEffect(() =>
+ {
+ if(!uniqueKey) return;
+
+ const localStorage = GetLocalStorage(`nitro.windows.${ uniqueKey }`);
+
+ if(!localStorage || !localStorage.offset) return;
+
+ setDelta({ x: 0, y: 0 });
+ if(localStorage.offset) setOffset(localStorage.offset);
+ }, [ uniqueKey ]);
+
+ return (
+ createPortal(
+
+ { children }
+ , document.getElementById('draggable-windows-container'))
+ );
+}
diff --git a/src/common/draggable-window/DraggableWindowPosition.ts b/src/common/draggable-window/DraggableWindowPosition.ts
new file mode 100644
index 000000000..476a37ec9
--- /dev/null
+++ b/src/common/draggable-window/DraggableWindowPosition.ts
@@ -0,0 +1,7 @@
+export class DraggableWindowPosition
+{
+ public static CENTER: string = 'DWP_CENTER';
+ public static TOP_CENTER: string = 'DWP_TOP_CENTER';
+ public static TOP_LEFT: string = 'DWP_TOP_LEFT';
+ public static NOTHING: string = 'DWP_NOTHING';
+}
diff --git a/src/common/draggable-window/index.ts b/src/common/draggable-window/index.ts
new file mode 100644
index 000000000..7672f5270
--- /dev/null
+++ b/src/common/draggable-window/index.ts
@@ -0,0 +1,2 @@
+export * from './DraggableWindow';
+export * from './DraggableWindowPosition';
diff --git a/src/common/index.scss b/src/common/index.scss
new file mode 100644
index 000000000..8539aa535
--- /dev/null
+++ b/src/common/index.scss
@@ -0,0 +1,562 @@
+.layout-grid-item {
+ height: var(--nitro-grid-column-min-height, unset);
+ background-position: center;
+ background-repeat: no-repeat;
+ background-color: $grid-bg-color;
+
+ &.active {
+ border-color: $grid-active-border-color !important;
+
+ &:not(.clear-bg) {
+ background-color: $grid-active-bg-color !important;
+ }
+ }
+
+ &.disabled {
+ cursor: not-allowed;
+
+ img {
+ opacity: 0.5;
+ filter: grayscale(1);
+ }
+ }
+
+ &.unseen {
+ background-color: rgba($success, 0.4);
+ }
+
+ .avatar-image {
+ background-position-y: -35px;
+ }
+
+ &.has-highlight {
+ &:after {
+ content: '';
+ z-index: 2;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 50%;
+ background-color: $white;
+ opacity: 0.1;
+ }
+ }
+}
+
+.nitro-room-thumbnail-camera {
+ width: 132px;
+ height: 192px;
+ background-image: url('@/assets/images/room-widgets/thumbnail-widget/thumbnail-camera-spritesheet.png');
+
+ .camera-frame {
+ position: absolute;
+ width: 110px;
+ height: 110px;
+ margin-top: 30px;
+ margin-left: 3px;
+ }
+}
+
+.nitro-layout-trophy {
+ position: relative;
+ width: 340px;
+ height: 173px;
+ color: black;
+ pointer-events: all;
+
+ background-position: 0px 0px;
+ background-image: url('@/assets/images/room-widgets/trophy-widget/trophy-spritesheet.png');
+
+ &.trophy-2 {
+ background-position: 0px 173px;
+ }
+
+ &.trophy-3 {
+ background-position: 0px 346px;
+ }
+
+ .trophy-header {
+ height: 22px;
+
+ .trophy-close {
+ width: 15px;
+ height: 15px;
+ right: 5.5px;
+ top: 5px;
+ }
+ }
+
+ .trophy-content {
+ width: 297px;
+ height: 116px;
+ white-space: pre-wrap;
+ overflow: auto;
+ }
+
+ .trophy-footer {
+ width: 297px;
+ }
+}
+
+.nitro-gift-card {
+ width: 306px;
+ height: 159px;
+ background: url('@/assets/images/gift/gift_tag.png') center no-repeat;
+
+ .gift-face {
+ width: 65px;
+
+ .gift-incognito {
+ width: 37px;
+ height: 48px;
+ background: url('@/assets/images/gift/incognito.png') center no-repeat;
+ }
+
+ .gift-avatar {
+ position: relative;
+ overflow: hidden;
+ width: 40px;
+ height: 50px;
+
+ .avatar-image {
+ position: absolute;
+ left: -25px;
+ top: -20px;
+ }
+ }
+ }
+
+ .gift-message {
+ width: 100%;
+ min-width: 100%;
+ max-width: 100%;
+ border: none;
+ resize: none;
+ outline: none;
+ line-height: 17px;
+ }
+}
+
+.spinner-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ .spinner {
+ margin: 2px;
+ width: 10px;
+ height: 10px;
+ border: $border-width solid $white;
+ background-color: rgba($white, 0.8);
+ border-radius: 100%;
+ display: inline-block;
+ -webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both;
+ animation: sk-bouncedelay 1.4s infinite ease-in-out both;
+
+ &:nth-child(1) {
+ -webkit-animation-delay: -0.32s;
+ animation-delay: -0.32s;
+ }
+
+ &:nth-child(2) {
+ -webkit-animation-delay: -0.16s;
+ animation-delay: -0.16s;
+ }
+ }
+}
+
+@-webkit-keyframes sk-bouncedelay {
+
+ 0%,
+ 80%,
+ 100% {
+ -webkit-transform: scale(0);
+ }
+
+ 40% {
+ -webkit-transform: scale(1);
+ }
+}
+
+@keyframes sk-bouncedelay {
+
+ 0%,
+ 80%,
+ 100% {
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+
+ 40% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+
+.room-thumbnail {
+ position: relative;
+ width: 110px;
+ height: 110px;
+ background: url('@/assets/images/navigator/thumbnail_placeholder.png') no-repeat center;
+ background-color: rgba($black, 0.125);
+}
+
+#draggable-windows-container {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ pointer-events: none;
+ overflow: hidden;
+
+ @include media-breakpoint-down(lg) {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .draggable-window {
+ display: inline-block;
+ visibility: hidden;
+ pointer-events: all;
+ }
+}
+
+.nitro-currency-icon {
+ background-position: center;
+ background-repeat: no-repeat;
+ width: 15px;
+ height: 15px;
+}
+
+.nitro-item-count {
+ top: 2px;
+ right: 2px;
+ font-size: 9.5px;
+ padding: 2px 3px;
+ z-index: 1;
+}
+
+.badge-image {
+ position: relative;
+ width: 40px;
+ height: 40px;
+ background-repeat: no-repeat;
+ background-position: center;
+
+ .badge-information {
+ display: none;
+ }
+
+ &:hover {
+ .badge-information {
+ display: block;
+ }
+ }
+
+ .badge-information {
+ position: absolute;
+ pointer-events: none;
+ user-select: none;
+ width: 210px;
+ border-radius: $border-radius;
+ background: $white;
+ left: -220px;
+ z-index: 100;
+
+ &:before {
+ position: absolute;
+ content: ' ';
+ width: 0;
+ height: 0;
+ border-left: 10px solid $white;
+ border-bottom: 10px solid transparent;
+ border-top: 10px solid transparent;
+ top: 10px;
+ right: -10px;
+ }
+ }
+}
+
+.furni-image,
+.room-object-image {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+}
+
+.nitro-rarity-level {
+ width: 36px;
+ height: 28px;
+ background: url('@/assets/images/infostand/rarity-level.png');
+
+ div {
+ line-height: 28px;
+ text-align: center;
+ color: $black;
+ font-weight: bold;
+ }
+}
+
+.nitro-counter-time {
+ width: 36px;
+ height: 28px;
+ background: url('@/assets/images/infostand/countown-timer.png');
+
+ div {
+ line-height: 28px;
+ text-align: center;
+ color: $white;
+ font-weight: bold;
+ }
+}
+
+.avatar-image {
+ position: relative;
+ width: 90px;
+ height: 130px;
+ background-repeat: no-repeat;
+ background-position: center -8px;
+ pointer-events: none;
+}
+
+.pet-image {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ background-repeat: no-repeat;
+ background-position: center;
+}
+
+.room-preview-container {
+ position: relative;
+ width: 100%;
+
+ .room-preview-image {
+ position: relative;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ border-radius: $border-radius;
+ background-color: $light;
+ background-repeat: no-repeat;
+ background-position: center;
+ overflow: hidden;
+
+ &.border-0 {
+ &::after {
+ content: none;
+ }
+ }
+
+ &::after {
+ position: absolute;
+ content: '';
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ border-radius: $border-radius;
+ border-bottom: 2px solid white;
+ border-right: 2px solid white;
+ box-shadow: -2px -2px rgba(0, 0, 0, 0.4),
+ inset 3px 3px rgba(0, 0, 0, 0.2);
+ }
+ }
+}
+
+.unique-item {
+ .unique-bg-override {
+ background-position: center;
+ background-repeat: no-repeat;
+ z-index: 2;
+ }
+
+ &:before {
+ position: absolute;
+ content: '';
+ width: 100%;
+ height: 100%;
+ background: url('@/assets/images/unique/grid-bg.png') center no-repeat;
+ z-index: 1;
+ }
+
+ &:after {
+ position: absolute;
+ content: '';
+ width: 100%;
+ height: 100%;
+ background: url('@/assets/images/unique/grid-bg-glass.png') center no-repeat;
+ bottom: 0;
+ z-index: 4;
+ }
+
+ &.sold-out:after {
+ background: url('@/assets/images/unique/grid-bg-sold-out.png') center no-repeat,
+ url('@/assets/images/unique/grid-bg-glass.png') center no-repeat;
+ }
+
+ .unique-item-counter {
+ margin: 0 auto;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ bottom: 1px;
+ width: 100%;
+ height: 9px;
+ background: url('@/assets/images/unique/grid-count-bg.png') center no-repeat;
+ z-index: 3;
+ }
+}
+
+.unique-sold-out-blocker {
+ width: 364px;
+ height: 30px;
+ background: url('@/assets/images/unique/catalog-info-sold-out.png');
+
+ div {
+ float: right;
+ width: 140px;
+ text-align: center;
+ font-weight: bold;
+ margin-top: 5px;
+ margin-right: 17px;
+ color: #000;
+ }
+}
+
+.unique-compact-plate {
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-end;
+ align-items: center;
+ right: 16px;
+ width: 34px;
+ height: 37px;
+ background: url('@/assets/images/unique/inventory-info-amount-bg.png');
+
+ div {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 9.5px;
+ }
+}
+
+.unique-complete-plate {
+ width: 170px;
+ height: 29px;
+ background: url('@/assets/images/unique/catalog-info-amount-bg.png') no-repeat center;
+ z-index: 1;
+ padding-top: 3px;
+
+ .plate-container {
+ margin-left: 45px;
+ width: 100px;
+ font-size: 10px;
+ color: black;
+
+ > :first-child {
+ margin-bottom: 2px;
+ }
+ }
+}
+
+.limited-edition-number {
+ display: inline-block;
+ outline: 0;
+ height: 5px;
+ margin-right: 1px;
+ background-image: url('@/assets/images/unique/numbers.png');
+ background-repeat: no-repeat;
+
+ &:last-child {
+ margin-right: 0px;
+ }
+
+ &.n-0 {
+ width: 4px;
+ background-position: -1px 0px;
+ }
+
+ &.n-1 {
+ width: 2px;
+ background-position: -6px 0px;
+ }
+
+ &.n-2 {
+ width: 4px;
+ background-position: -9px 0px;
+ }
+
+ &.n-3 {
+ width: 4px;
+ background-position: -14px 0px;
+ }
+
+ &.n-4 {
+ width: 4px;
+ background-position: -19px 0px;
+ }
+
+ &.n-5 {
+ width: 4px;
+ background-position: -24px 0px;
+ }
+
+ &.n-6 {
+ width: 4px;
+ background-position: -29px 0px;
+ }
+
+ &.n-7 {
+ width: 4px;
+ background-position: -34px 0px;
+ }
+
+ &.n-8 {
+ width: 4px;
+ background-position: -39px 0px;
+ }
+
+ &.n-9 {
+ width: 4px;
+ background-position: -44px 0px;
+ }
+}
+
+.nitro-progress-bar {
+ border: 1px solid $white;
+ padding: 2px;
+ height: 20px;
+ border-radius: $border-radius;
+ overflow: hidden;
+ background: $primary;
+
+ &.large {
+ height: 30px;
+ }
+
+ .nitro-progress-bar-inner {
+ height: 100%;
+ z-index: 1;
+ transition: all 1s;
+ border-radius: calc(#{$border-radius} / 2);
+ background: repeating-linear-gradient($tertiary,
+ $tertiary 50%,
+ $quaternary 50%,
+ $quaternary 100%);
+ }
+
+ .nitro-progress-bar-text {
+ text-shadow: 0px 4px 4px rgba($black, 0.25);
+ z-index: 2;
+ }
+}
+
+@import './card/NitroCardView';
diff --git a/src/common/index.ts b/src/common/index.ts
new file mode 100644
index 000000000..3722c52f4
--- /dev/null
+++ b/src/common/index.ts
@@ -0,0 +1,22 @@
+export * from './AutoGrid';
+export * from './Base';
+export * from './Button';
+export * from './ButtonGroup';
+export * from './card';
+export * from './card/accordion';
+export * from './card/tabs';
+export * from './classNames';
+export * from './Column';
+export * from './draggable-window';
+export * from './Flex';
+export * from './FormGroup';
+export * from './Grid';
+export * from './GridContext';
+export * from './HorizontalRule';
+export * from './InfiniteScroll';
+export * from './layout';
+export * from './layout/limited-edition';
+export * from './Text';
+export * from './transitions';
+export * from './types';
+export * from './utils';
diff --git a/src/common/layout/LayoutAvatarImageView.tsx b/src/common/layout/LayoutAvatarImageView.tsx
new file mode 100644
index 000000000..3dd498221
--- /dev/null
+++ b/src/common/layout/LayoutAvatarImageView.tsx
@@ -0,0 +1,92 @@
+import { AvatarScaleType, AvatarSetType } from '@nitrots/nitro-renderer';
+import { CSSProperties, FC, useEffect, useMemo, useRef, useState } from 'react';
+import { GetAvatarRenderManager } from '../../api';
+import { Base, BaseProps } from '../Base';
+
+export interface LayoutAvatarImageViewProps extends BaseProps
+{
+ figure: string;
+ gender?: string;
+ headOnly?: boolean;
+ direction?: number;
+ scale?: number;
+}
+
+export const LayoutAvatarImageView: FC = props =>
+{
+ const { figure = '', gender = 'M', headOnly = false, direction = 0, scale = 1, classNames = [], style = {}, ...rest } = props;
+ const [ avatarUrl, setAvatarUrl ] = useState(null);
+ const [ randomValue, setRandomValue ] = useState(-1);
+ const isDisposed = useRef(false);
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'avatar-image' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ const getStyle = useMemo(() =>
+ {
+ let newStyle: CSSProperties = {};
+
+ if(avatarUrl && avatarUrl.length) newStyle.backgroundImage = `url('${ avatarUrl }')`;
+
+ if(scale !== 1)
+ {
+ newStyle.transform = `scale(${ scale })`;
+
+ if(!(scale % 1)) newStyle.imageRendering = 'pixelated';
+ }
+
+ if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
+
+ return newStyle;
+ }, [ avatarUrl, scale, style ]);
+
+ useEffect(() =>
+ {
+ const avatarImage = GetAvatarRenderManager().createAvatarImage(figure, AvatarScaleType.LARGE, gender, {
+ resetFigure: figure =>
+ {
+ if(isDisposed.current) return;
+
+ setRandomValue(Math.random());
+ },
+ dispose: () =>
+ {},
+ disposed: false
+ }, null);
+
+ if(!avatarImage) return;
+
+ let setType = AvatarSetType.FULL;
+
+ if(headOnly) setType = AvatarSetType.HEAD;
+
+ avatarImage.setDirection(setType, direction);
+
+ (async () =>
+ {
+ const image = await avatarImage.getCroppedImage(setType);
+
+ if(image) setAvatarUrl(image.src);
+
+ avatarImage.dispose();
+ })();
+ }, [ figure, gender, direction, headOnly, randomValue ]);
+
+ useEffect(() =>
+ {
+ isDisposed.current = false;
+
+ return () =>
+ {
+ isDisposed.current = true;
+ }
+ }, []);
+
+ return ;
+}
diff --git a/src/common/layout/LayoutBackgroundImage.tsx b/src/common/layout/LayoutBackgroundImage.tsx
new file mode 100644
index 000000000..0900a2600
--- /dev/null
+++ b/src/common/layout/LayoutBackgroundImage.tsx
@@ -0,0 +1,23 @@
+import { FC, useMemo } from 'react';
+import { Base, BaseProps } from '../Base';
+
+export interface LayoutBackgroundImageProps extends BaseProps
+{
+ imageUrl?: string;
+}
+
+export const LayoutBackgroundImage: FC = props =>
+{
+ const { imageUrl = null, fit = true, style = null, ...rest } = props;
+
+ const getStyle = useMemo(() =>
+ {
+ const newStyle = { ...style };
+
+ if(imageUrl) newStyle.background = `url(${ imageUrl }) center no-repeat`;
+
+ return newStyle;
+ }, [ style, imageUrl ]);
+
+ return ;
+}
diff --git a/src/common/layout/LayoutBadgeImageView.tsx b/src/common/layout/LayoutBadgeImageView.tsx
new file mode 100644
index 000000000..caee47a70
--- /dev/null
+++ b/src/common/layout/LayoutBadgeImageView.tsx
@@ -0,0 +1,106 @@
+import { BadgeImageReadyEvent, NitroEventDispatcher, NitroSprite, TextureUtils } from '@nitrots/nitro-renderer';
+import { CSSProperties, FC, useEffect, useMemo, useState } from 'react';
+import { GetConfiguration, GetSessionDataManager, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../api';
+import { Base, BaseProps } from '../Base';
+
+export interface LayoutBadgeImageViewProps extends BaseProps
+{
+ badgeCode: string;
+ isGroup?: boolean;
+ showInfo?: boolean;
+ customTitle?: string;
+ isGrayscale?: boolean;
+ scale?: number;
+}
+
+export const LayoutBadgeImageView: FC = props =>
+{
+ const { badgeCode = null, isGroup = false, showInfo = false, customTitle = null, isGrayscale = false, scale = 1, classNames = [], style = {}, children = null, ...rest } = props;
+ const [ imageElement, setImageElement ] = useState(null);
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'badge-image' ];
+
+ if(isGroup) newClassNames.push('group-badge');
+
+ if(isGrayscale) newClassNames.push('grayscale');
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames, isGroup, isGrayscale ]);
+
+ const getStyle = useMemo(() =>
+ {
+ let newStyle: CSSProperties = {};
+
+ if(imageElement)
+ {
+ newStyle.backgroundImage = `url(${ (isGroup) ? imageElement.src : GetConfiguration('badge.asset.url').replace('%badgename%', badgeCode.toString()) })`;
+ newStyle.width = imageElement.width;
+ newStyle.height = imageElement.height;
+
+ if(scale !== 1)
+ {
+ newStyle.transform = `scale(${ scale })`;
+
+ if(!(scale % 1)) newStyle.imageRendering = 'pixelated';
+
+ newStyle.width = (imageElement.width * scale);
+ newStyle.height = (imageElement.height * scale);
+ }
+ }
+
+ if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
+
+ return newStyle;
+ }, [ badgeCode, isGroup, imageElement, scale, style ]);
+
+ useEffect(() =>
+ {
+ if(!badgeCode || !badgeCode.length) return;
+
+ let didSetBadge = false;
+
+ const onBadgeImageReadyEvent = async (event: BadgeImageReadyEvent) =>
+ {
+ if(event.badgeId !== badgeCode) return;
+
+ const element = await TextureUtils.generateImage(new NitroSprite(event.image));
+
+ element.onload = () => setImageElement(element);
+
+ didSetBadge = true;
+
+ NitroEventDispatcher.removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent);
+ }
+
+ NitroEventDispatcher.addEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent);
+
+ const texture = isGroup ? GetSessionDataManager().getGroupBadgeImage(badgeCode) : GetSessionDataManager().getBadgeImage(badgeCode);
+
+ if(texture && !didSetBadge)
+ {
+ (async () =>
+ {
+ const element = await TextureUtils.generateImage(new NitroSprite(texture));
+
+ element.onload = () => setImageElement(element);
+ })();
+ }
+
+ return () => NitroEventDispatcher.removeEventListener(BadgeImageReadyEvent.IMAGE_READY, onBadgeImageReadyEvent);
+ }, [ badgeCode, isGroup ]);
+
+ return (
+
+ { (showInfo && GetConfiguration('badge.descriptions.enabled', true)) &&
+
+ { isGroup ? customTitle : LocalizeBadgeName(badgeCode) }
+ { isGroup ? LocalizeText('group.badgepopup.body') : LocalizeBadgeDescription(badgeCode) }
+ }
+ { children }
+
+ );
+}
diff --git a/src/common/layout/LayoutCounterTimeView.tsx b/src/common/layout/LayoutCounterTimeView.tsx
new file mode 100644
index 000000000..7460b054e
--- /dev/null
+++ b/src/common/layout/LayoutCounterTimeView.tsx
@@ -0,0 +1,43 @@
+import { FC, useMemo } from 'react';
+import { LocalizeText } from '../../api';
+import { Base, BaseProps } from '../Base';
+import { Flex } from '../Flex';
+
+interface LayoutCounterTimeViewProps extends BaseProps
+{
+ day: string;
+ hour: string;
+ minutes: string;
+ seconds: string;
+}
+
+export const LayoutCounterTimeView: FC = props =>
+{
+ const { day = '00', hour = '00', minutes = '00', seconds = '00', classNames = [], children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'nitro-counter-time' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ return (
+
+
+ { day != '00' ? day : hour }{ day != '00' ? LocalizeText('countdown_clock_unit_days') : LocalizeText('countdown_clock_unit_hours') }
+
+ :
+
+ { minutes }{ LocalizeText('countdown_clock_unit_minutes') }
+
+ :
+
+ { seconds }{ LocalizeText('countdown_clock_unit_seconds') }
+
+ { children }
+
+ );
+}
diff --git a/src/common/layout/LayoutCurrencyIcon.tsx b/src/common/layout/LayoutCurrencyIcon.tsx
new file mode 100644
index 000000000..e12695269
--- /dev/null
+++ b/src/common/layout/LayoutCurrencyIcon.tsx
@@ -0,0 +1,44 @@
+import { CSSProperties, FC, useMemo } from 'react';
+import { GetConfiguration } from '../../api';
+import { Base, BaseProps } from '../Base';
+
+export interface CurrencyIconProps extends BaseProps
+{
+ type: number | string;
+}
+
+export const LayoutCurrencyIcon: FC = props =>
+{
+ const { type = '', classNames = [], style = {}, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'nitro-currency-icon' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ const urlString = useMemo(() =>
+ {
+ let url = GetConfiguration('currency.asset.icon.url', '');
+
+ url = url.replace('%type%', type.toString());
+
+ return `url(${ url })`;
+ }, [ type ]);
+
+ const getStyle = useMemo(() =>
+ {
+ let newStyle: CSSProperties = {};
+
+ newStyle.backgroundImage = urlString;
+
+ if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
+
+ return newStyle;
+ }, [ style, urlString ]);
+
+ return
+}
diff --git a/src/common/layout/LayoutFurniIconImageView.tsx b/src/common/layout/LayoutFurniIconImageView.tsx
new file mode 100644
index 000000000..b1191dbdc
--- /dev/null
+++ b/src/common/layout/LayoutFurniIconImageView.tsx
@@ -0,0 +1,17 @@
+import { FC } from 'react';
+import { LayoutImage, LayoutImageProps } from '.';
+import { GetImageIconUrlForProduct } from '../../api';
+
+interface LayoutFurniIconImageViewProps extends LayoutImageProps
+{
+ productType: string;
+ productClassId: number;
+ extraData?: string;
+}
+
+export const LayoutFurniIconImageView: FC = props =>
+{
+ const { productType = 's', productClassId = -1, extraData = '', ...rest } = props;
+
+ return ;
+}
diff --git a/src/common/layout/LayoutFurniImageView.tsx b/src/common/layout/LayoutFurniImageView.tsx
new file mode 100644
index 000000000..708d6d676
--- /dev/null
+++ b/src/common/layout/LayoutFurniImageView.tsx
@@ -0,0 +1,71 @@
+import { IGetImageListener, ImageResult, TextureUtils, Vector3d } from '@nitrots/nitro-renderer';
+import { CSSProperties, FC, useEffect, useMemo, useState } from 'react';
+import { BaseProps } from '..';
+import { GetRoomEngine, ProductTypeEnum } from '../../api';
+import { Base } from '../Base';
+
+interface LayoutFurniImageViewProps extends BaseProps
+{
+ productType: string;
+ productClassId: number;
+ direction?: number;
+ extraData?: string;
+ scale?: number;
+}
+
+export const LayoutFurniImageView: FC = props =>
+{
+ const { productType = 's', productClassId = -1, direction = 2, extraData = '', scale = 1, style = {}, ...rest } = props;
+ const [ imageElement, setImageElement ] = useState(null);
+
+ const getStyle = useMemo(() =>
+ {
+ let newStyle: CSSProperties = {};
+
+ if(imageElement?.src?.length)
+ {
+ newStyle.backgroundImage = `url('${ imageElement.src }')`;
+ newStyle.width = imageElement.width;
+ newStyle.height = imageElement.height;
+ }
+
+ if(scale !== 1)
+ {
+ newStyle.transform = `scale(${ scale })`;
+
+ if(!(scale % 1)) newStyle.imageRendering = 'pixelated';
+ }
+
+ if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
+
+ return newStyle;
+ }, [ imageElement, scale, style ]);
+
+ useEffect(() =>
+ {
+ let imageResult: ImageResult = null;
+
+ const listener: IGetImageListener = {
+ imageReady: async (id, texture, image) => setImageElement(await TextureUtils.generateImage(texture)),
+ imageFailed: null
+ };
+
+ switch(productType.toLocaleLowerCase())
+ {
+ case ProductTypeEnum.FLOOR:
+ imageResult = GetRoomEngine().getFurnitureFloorImage(productClassId, new Vector3d(direction), 64, listener, 0, extraData);
+ break;
+ case ProductTypeEnum.WALL:
+ imageResult = GetRoomEngine().getFurnitureWallImage(productClassId, new Vector3d(direction), 64, listener, 0, extraData);
+ break;
+ }
+
+ if(!imageResult) return;
+
+ (async () => setImageElement(await TextureUtils.generateImage(imageResult.data)))();
+ }, [ productType, productClassId, direction, extraData ]);
+
+ if(!imageElement) return null;
+
+ return ;
+}
diff --git a/src/common/layout/LayoutGiftTagView.tsx b/src/common/layout/LayoutGiftTagView.tsx
new file mode 100644
index 000000000..8fcc405f8
--- /dev/null
+++ b/src/common/layout/LayoutGiftTagView.tsx
@@ -0,0 +1,39 @@
+import { FC } from 'react';
+import { Column, Flex, Text } from '..';
+import { LocalizeText } from '../../api';
+import { LayoutAvatarImageView } from './LayoutAvatarImageView';
+
+interface LayoutGiftTagViewProps
+{
+ figure?: string;
+ userName?: string;
+ message?: string;
+ editable?: boolean;
+ onChange?: (value: string) => void;
+}
+
+export const LayoutGiftTagView: FC = props =>
+{
+ const { figure = null, userName = null, message = null, editable = false, onChange = null } = props;
+
+ return (
+
+
+ { !userName &&
}
+ { figure &&
+
+
}
+
+
+
+ { !editable &&
+ { message } }
+ { editable && (onChange !== null) &&
+ }
+ { userName &&
+ { LocalizeText('catalog.gift_wrapping_new.message_from', [ 'name' ], [ userName ]) } }
+
+
+
+ );
+};
diff --git a/src/common/layout/LayoutGridItem.tsx b/src/common/layout/LayoutGridItem.tsx
new file mode 100644
index 000000000..e1a32e5a1
--- /dev/null
+++ b/src/common/layout/LayoutGridItem.tsx
@@ -0,0 +1,75 @@
+import { FC, useMemo } from 'react';
+import { Base } from '../Base';
+import { Column, ColumnProps } from '../Column';
+import { LayoutItemCountView } from './LayoutItemCountView';
+import { LayoutLimitedEditionStyledNumberView } from './limited-edition';
+
+export interface LayoutGridItemProps extends ColumnProps
+{
+ itemImage?: string;
+ itemColor?: string;
+ itemActive?: boolean;
+ itemCount?: number;
+ itemCountMinimum?: number;
+ itemUniqueSoldout?: boolean;
+ itemUniqueNumber?: number;
+ itemUnseen?: boolean;
+ itemHighlight?: boolean;
+ disabled?: boolean;
+}
+
+export const LayoutGridItem: FC = props =>
+{
+ const { itemImage = undefined, itemColor = undefined, itemActive = false, itemCount = 1, itemCountMinimum = 1, itemUniqueSoldout = false, itemUniqueNumber = -2, itemUnseen = false, itemHighlight = false, disabled = false, center = true, column = true, style = {}, classNames = [], position = 'relative', overflow = 'hidden', children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'layout-grid-item', 'border', 'border-2', 'border-muted', 'rounded' ];
+
+ if(itemActive) newClassNames.push('active');
+
+ if(itemUniqueSoldout || (itemUniqueNumber > 0)) newClassNames.push('unique-item');
+
+ if(itemUniqueSoldout) newClassNames.push('sold-out');
+
+ if(itemUnseen) newClassNames.push('unseen');
+
+ if(itemHighlight) newClassNames.push('has-highlight');
+
+ if(disabled) newClassNames.push('disabled')
+
+ if(itemImage === null) newClassNames.push('icon', 'loading-icon');
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ itemActive, itemUniqueSoldout, itemUniqueNumber, itemUnseen, itemHighlight, disabled, itemImage, classNames ]);
+
+ const getStyle = useMemo(() =>
+ {
+ let newStyle = { ...style };
+
+ if(itemImage && !(itemUniqueSoldout || (itemUniqueNumber > 0))) newStyle.backgroundImage = `url(${ itemImage })`;
+
+ if(itemColor) newStyle.backgroundColor = itemColor;
+
+ if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
+
+ return newStyle;
+ }, [ style, itemImage, itemColor, itemUniqueSoldout, itemUniqueNumber ]);
+
+ return (
+
+ { (itemCount > itemCountMinimum) &&
+ }
+ { (itemUniqueNumber > 0) &&
+ <>
+
+
+
+
+ > }
+ { children }
+
+ );
+}
diff --git a/src/common/layout/LayoutImage.tsx b/src/common/layout/LayoutImage.tsx
new file mode 100644
index 000000000..e6c6228e1
--- /dev/null
+++ b/src/common/layout/LayoutImage.tsx
@@ -0,0 +1,13 @@
+import { DetailedHTMLProps, FC, HTMLAttributes } from 'react';
+
+export interface LayoutImageProps extends DetailedHTMLProps, HTMLImageElement>
+{
+ imageUrl?: string;
+}
+
+export const LayoutImage: FC = props =>
+{
+ const { imageUrl = null, className = '', ...rest } = props;
+
+ return ;
+}
diff --git a/src/common/layout/LayoutItemCountView.tsx b/src/common/layout/LayoutItemCountView.tsx
new file mode 100644
index 000000000..66bc9a220
--- /dev/null
+++ b/src/common/layout/LayoutItemCountView.tsx
@@ -0,0 +1,28 @@
+import { FC, useMemo } from 'react';
+import { Base, BaseProps } from '..';
+
+interface LayoutItemCountViewProps extends BaseProps
+{
+ count: number;
+}
+
+export const LayoutItemCountView: FC = props =>
+{
+ const { count = 0, position = 'absolute', classNames = [], children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'badge', 'border', 'border-black', 'bg-danger', 'px-1', 'nitro-item-count' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ return (
+
+ { count }
+ { children }
+
+ );
+}
diff --git a/src/common/layout/LayoutLoadingSpinnerView.tsx b/src/common/layout/LayoutLoadingSpinnerView.tsx
new file mode 100644
index 000000000..308e0caad
--- /dev/null
+++ b/src/common/layout/LayoutLoadingSpinnerView.tsx
@@ -0,0 +1,15 @@
+import { FC } from 'react';
+import { Base, BaseProps } from '../Base';
+
+export const LayoutLoadingSpinnerView: FC> = props =>
+{
+ const { ...rest } = props;
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/common/layout/LayoutMiniCameraView.tsx b/src/common/layout/LayoutMiniCameraView.tsx
new file mode 100644
index 000000000..8dfbd7b82
--- /dev/null
+++ b/src/common/layout/LayoutMiniCameraView.tsx
@@ -0,0 +1,44 @@
+import { NitroRectangle, NitroRenderTexture } from '@nitrots/nitro-renderer';
+import { FC, useRef } from 'react';
+import { GetRoomEngine, LocalizeText, PlaySound, SoundNames } from '../../api';
+import { DraggableWindow } from '../draggable-window';
+
+interface LayoutMiniCameraViewProps
+{
+ roomId: number;
+ textureReceiver: (texture: NitroRenderTexture) => Promise;
+ onClose: () => void;
+}
+
+export const LayoutMiniCameraView: FC = props =>
+{
+ const { roomId = -1, textureReceiver = null, onClose = null } = props;
+ const elementRef = useRef();
+
+ const getCameraBounds = () =>
+ {
+ if(!elementRef || !elementRef.current) return null;
+
+ const frameBounds = elementRef.current.getBoundingClientRect();
+
+ return new NitroRectangle(Math.floor(frameBounds.x), Math.floor(frameBounds.y), Math.floor(frameBounds.width), Math.floor(frameBounds.height));
+ }
+
+ const takePicture = () =>
+ {
+ PlaySound(SoundNames.CAMERA_SHUTTER);
+ textureReceiver(GetRoomEngine().createTextureFromRoom(roomId, 1, getCameraBounds()));
+ }
+
+ return (
+
+
+
+
+ { LocalizeText('cancel') }
+ { LocalizeText('navigator.thumbeditor.save') }
+
+
+
+ );
+};
diff --git a/src/common/layout/LayoutNotificationAlertView.tsx b/src/common/layout/LayoutNotificationAlertView.tsx
new file mode 100644
index 000000000..8db771af8
--- /dev/null
+++ b/src/common/layout/LayoutNotificationAlertView.tsx
@@ -0,0 +1,35 @@
+import { FC, useMemo } from 'react';
+import { NotificationAlertType } from '../../api';
+import { NitroCardContentView, NitroCardHeaderView, NitroCardView, NitroCardViewProps } from '../card';
+
+export interface LayoutNotificationAlertViewProps extends NitroCardViewProps
+{
+ title?: string;
+ type?: string;
+ onClose: () => void;
+}
+
+export const LayoutNotificationAlertView: FC = props =>
+{
+ const { title = '', onClose = null, classNames = [], children = null,type = NotificationAlertType.DEFAULT, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'nitro-alert' ];
+
+ newClassNames.push('nitro-alert-' + type);
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames, type ]);
+
+ return (
+
+
+
+ { children }
+
+
+ );
+}
diff --git a/src/common/layout/LayoutNotificationBubbleView.tsx b/src/common/layout/LayoutNotificationBubbleView.tsx
new file mode 100644
index 000000000..a48216644
--- /dev/null
+++ b/src/common/layout/LayoutNotificationBubbleView.tsx
@@ -0,0 +1,52 @@
+import { FC, useEffect, useMemo, useState } from 'react';
+import { Flex, FlexProps } from '..';
+import { TransitionAnimation, TransitionAnimationTypes } from '../transitions';
+
+export interface LayoutNotificationBubbleViewProps extends FlexProps
+{
+ fadesOut?: boolean;
+ timeoutMs?: number;
+ onClose: () => void;
+}
+
+export const LayoutNotificationBubbleView: FC = props =>
+{
+ const { fadesOut = true, timeoutMs = 8000, onClose = null, overflow = 'hidden', classNames = [], ...rest } = props;
+ const [ isVisible, setIsVisible ] = useState(false);
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'nitro-notification-bubble', 'rounded' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ useEffect(() =>
+ {
+ setIsVisible(true);
+
+ return () => setIsVisible(false);
+ }, []);
+
+ useEffect(() =>
+ {
+ if(!fadesOut) return;
+
+ const timeout = setTimeout(() =>
+ {
+ setIsVisible(false);
+
+ setTimeout(() => onClose(), 300);
+ }, timeoutMs);
+
+ return () => clearTimeout(timeout);
+ }, [ fadesOut, timeoutMs, onClose ]);
+
+ return (
+
+
+
+ );
+}
diff --git a/src/common/layout/LayoutPetImageView.tsx b/src/common/layout/LayoutPetImageView.tsx
new file mode 100644
index 000000000..69fe6afd8
--- /dev/null
+++ b/src/common/layout/LayoutPetImageView.tsx
@@ -0,0 +1,124 @@
+import { IPetCustomPart, PetFigureData, TextureUtils, Vector3d } from '@nitrots/nitro-renderer';
+import { CSSProperties, FC, useEffect, useMemo, useRef, useState } from 'react';
+import { GetRoomEngine } from '../../api';
+import { Base, BaseProps } from '../Base';
+
+interface LayoutPetImageViewProps extends BaseProps
+{
+ figure?: string;
+ typeId?: number;
+ paletteId?: number;
+ petColor?: number;
+ customParts?: IPetCustomPart[];
+ posture?: string;
+ headOnly?: boolean;
+ direction?: number;
+ scale?: number;
+}
+
+export const LayoutPetImageView: FC = props =>
+{
+ const { figure = '', typeId = -1, paletteId = -1, petColor = 0xFFFFFF, customParts = [], posture = 'std', headOnly = false, direction = 0, scale = 1, style = {}, ...rest } = props;
+ const [ petUrl, setPetUrl ] = useState(null);
+ const [ width, setWidth ] = useState(0);
+ const [ height, setHeight ] = useState(0);
+ const isDisposed = useRef(false);
+
+ const getStyle = useMemo(() =>
+ {
+ let newStyle: CSSProperties = {};
+
+ if(petUrl && petUrl.length) newStyle.backgroundImage = `url(${ petUrl })`;
+
+ if(scale !== 1)
+ {
+ newStyle.transform = `scale(${ scale })`;
+
+ if(!(scale % 1)) newStyle.imageRendering = 'pixelated';
+ }
+
+ newStyle.width = width;
+ newStyle.height = height;
+
+ if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
+
+ return newStyle;
+ }, [ petUrl, scale, style, width, height ]);
+
+ useEffect(() =>
+ {
+ let url = null;
+
+ let petTypeId = typeId;
+ let petPaletteId = paletteId;
+ let petColor1 = petColor;
+ let petCustomParts: IPetCustomPart[] = customParts;
+ let petHeadOnly = headOnly;
+
+ if(figure && figure.length)
+ {
+ const petFigureData = new PetFigureData(figure);
+
+ petTypeId = petFigureData.typeId;
+ petPaletteId = petFigureData.paletteId;
+ petColor1 = petFigureData.color;
+ petCustomParts = petFigureData.customParts;
+ }
+
+ if(petTypeId === 16) petHeadOnly = false;
+
+ const imageResult = GetRoomEngine().getRoomObjectPetImage(petTypeId, petPaletteId, petColor1, new Vector3d((direction * 45)), 64, {
+ imageReady: async (id, texture, image) =>
+ {
+ if(isDisposed.current) return;
+
+ if(image)
+ {
+ setPetUrl(image.src);
+ setWidth(image.width);
+ setHeight(image.height);
+ }
+
+ else if(texture)
+ {
+ setPetUrl(await TextureUtils.generateImageUrl(texture));
+ setWidth(texture.width);
+ setHeight(texture.height);
+ }
+ },
+ imageFailed: (id) =>
+ {
+
+ }
+ }, petHeadOnly, 0, petCustomParts, posture);
+
+ if(imageResult)
+ {
+ (async () =>
+ {
+ const image = await imageResult.getImage();
+
+ if(image)
+ {
+ setPetUrl(image.src);
+ setWidth(image.width);
+ setHeight(image.height);
+ }
+ })();
+ }
+ }, [ figure, typeId, paletteId, petColor, customParts, posture, headOnly, direction ]);
+
+ useEffect(() =>
+ {
+ isDisposed.current = false;
+
+ return () =>
+ {
+ isDisposed.current = true;
+ }
+ }, []);
+
+ const url = `url('${ petUrl }')`;
+
+ return ;
+}
diff --git a/src/common/layout/LayoutPrizeProductImageView.tsx b/src/common/layout/LayoutPrizeProductImageView.tsx
new file mode 100644
index 000000000..206c7a801
--- /dev/null
+++ b/src/common/layout/LayoutPrizeProductImageView.tsx
@@ -0,0 +1,30 @@
+import { FC } from 'react';
+import { ProductTypeEnum } from '../../api';
+import { LayoutBadgeImageView } from './LayoutBadgeImageView';
+import { LayoutCurrencyIcon } from './LayoutCurrencyIcon';
+import { LayoutFurniImageView } from './LayoutFurniImageView';
+
+interface LayoutPrizeProductImageViewProps
+{
+ productType: string;
+ classId: number;
+ extraParam?: string;
+}
+
+export const LayoutPrizeProductImageView: FC = props =>
+{
+ const { productType = ProductTypeEnum.FLOOR, classId = -1, extraParam = undefined } = props;
+
+ switch(productType)
+ {
+ case ProductTypeEnum.WALL:
+ case ProductTypeEnum.FLOOR:
+ return
+ case ProductTypeEnum.BADGE:
+ return
+ case ProductTypeEnum.HABBO_CLUB:
+ return
+ }
+
+ return null;
+}
diff --git a/src/common/layout/LayoutProgressBar.tsx b/src/common/layout/LayoutProgressBar.tsx
new file mode 100644
index 000000000..8f821717c
--- /dev/null
+++ b/src/common/layout/LayoutProgressBar.tsx
@@ -0,0 +1,32 @@
+import { FC, useMemo } from 'react';
+import { Base, Column, ColumnProps, Flex } from '..';
+
+interface LayoutProgressBarProps extends ColumnProps
+{
+ text?: string;
+ progress: number;
+ maxProgress?: number;
+}
+
+export const LayoutProgressBar: FC = props =>
+{
+ const { text = '', progress = 0, maxProgress = 100, position = 'relative', justifyContent = 'center', classNames = [], children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'nitro-progress-bar', 'text-white' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ return (
+
+ { text && (text.length > 0) &&
+ { text } }
+
+ { children }
+
+ );
+}
diff --git a/src/common/layout/LayoutRarityLevelView.tsx b/src/common/layout/LayoutRarityLevelView.tsx
new file mode 100644
index 000000000..283137475
--- /dev/null
+++ b/src/common/layout/LayoutRarityLevelView.tsx
@@ -0,0 +1,28 @@
+import { FC, useMemo } from 'react';
+import { Base, BaseProps } from '..';
+
+interface LayoutRarityLevelViewProps extends BaseProps
+{
+ level: number;
+}
+
+export const LayoutRarityLevelView: FC = props =>
+{
+ const { level = 0, classNames = [], children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'nitro-rarity-level' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ return (
+
+ { level }
+ { children }
+
+ );
+}
diff --git a/src/common/layout/LayoutRoomObjectImageView.tsx b/src/common/layout/LayoutRoomObjectImageView.tsx
new file mode 100644
index 000000000..083a9efc1
--- /dev/null
+++ b/src/common/layout/LayoutRoomObjectImageView.tsx
@@ -0,0 +1,61 @@
+import { TextureUtils, Vector3d } from '@nitrots/nitro-renderer';
+import { CSSProperties, FC, useEffect, useMemo, useState } from 'react';
+import { BaseProps } from '..';
+import { GetRoomEngine } from '../../api';
+import { Base } from '../Base';
+
+interface LayoutRoomObjectImageViewProps extends BaseProps
+{
+ roomId: number;
+ objectId: number;
+ category: number;
+ direction?: number;
+ scale?: number;
+}
+
+export const LayoutRoomObjectImageView: FC = props =>
+{
+ const { roomId = -1, objectId = 1, category = -1, direction = 2, scale = 1, style = {}, ...rest } = props;
+ const [ imageElement, setImageElement ] = useState(null);
+
+ const getStyle = useMemo(() =>
+ {
+ let newStyle: CSSProperties = {};
+
+ if(imageElement?.src?.length)
+ {
+ newStyle.backgroundImage = `url('${ imageElement.src }')`;
+ newStyle.width = imageElement.width;
+ newStyle.height = imageElement.height;
+ }
+
+ if(scale !== 1)
+ {
+ newStyle.transform = `scale(${ scale })`;
+
+ if(!(scale % 1)) newStyle.imageRendering = 'pixelated';
+ }
+
+ if(Object.keys(style).length) newStyle = { ...newStyle, ...style };
+
+ return newStyle;
+ }, [ imageElement, scale, style ]);
+
+ useEffect(() =>
+ {
+ const imageResult = GetRoomEngine().getRoomObjectImage(roomId, objectId, category, new Vector3d(direction * 45), 64, {
+ imageReady: async (id, texture, image) => setImageElement(await TextureUtils.generateImage(texture)),
+ imageFailed: null
+ });
+
+ // needs (roomObjectImage.data.width > 140) || (roomObjectImage.data.height > 200) scale 1
+
+ if(!imageResult) return;
+
+ (async () => setImageElement(await TextureUtils.generateImage(imageResult.data)))();
+ }, [ roomId, objectId, category, direction, scale ]);
+
+ if(!imageElement) return null;
+
+ return ;
+}
diff --git a/src/common/layout/LayoutRoomPreviewerView.tsx b/src/common/layout/LayoutRoomPreviewerView.tsx
new file mode 100644
index 000000000..023e53aab
--- /dev/null
+++ b/src/common/layout/LayoutRoomPreviewerView.tsx
@@ -0,0 +1,97 @@
+import { ColorConverter, GetTicker, IRoomRenderingCanvas, RoomPreviewer, TextureUtils } from '@nitrots/nitro-renderer';
+import { FC, MouseEvent, ReactNode, useEffect, useRef, useState } from 'react';
+
+export interface LayoutRoomPreviewerViewProps
+{
+ roomPreviewer: RoomPreviewer;
+ height?: number;
+ children?: ReactNode;
+}
+
+export const LayoutRoomPreviewerView: FC = props =>
+{
+ const { roomPreviewer = null, height = 0, children = null } = props;
+ const [ renderingCanvas, setRenderingCanvas ] = useState(null);
+ const elementRef = useRef();
+
+ const onClick = (event: MouseEvent) =>
+ {
+ if(!roomPreviewer) return;
+
+ if(event.shiftKey) roomPreviewer.changeRoomObjectDirection();
+ else roomPreviewer.changeRoomObjectState();
+ }
+
+ useEffect(() =>
+ {
+ if(!roomPreviewer) return;
+
+ const update = async (time: number) =>
+ {
+ if(!roomPreviewer || !renderingCanvas || !elementRef.current) return;
+
+ roomPreviewer.updatePreviewRoomView();
+
+ if(!renderingCanvas.canvasUpdated) return;
+
+ elementRef.current.style.backgroundImage = `url(${ await TextureUtils.generateImageUrl(renderingCanvas.master) })`;
+ }
+
+ if(!renderingCanvas)
+ {
+ if(elementRef.current && roomPreviewer)
+ {
+ const computed = document.defaultView.getComputedStyle(elementRef.current, null);
+
+ let backgroundColor = computed.backgroundColor;
+
+ backgroundColor = ColorConverter.rgbStringToHex(backgroundColor);
+ backgroundColor = backgroundColor.replace('#', '0x');
+
+ roomPreviewer.backgroundColor = parseInt(backgroundColor, 16);
+
+ const width = elementRef.current.parentElement.clientWidth;
+
+ roomPreviewer.getRoomCanvas(width, height);
+
+ const canvas = roomPreviewer.getRenderingCanvas();
+
+ setRenderingCanvas(canvas);
+
+ canvas.canvasUpdated = true;
+
+ update(-1);
+ }
+ }
+
+ GetTicker().add(update);
+
+ const resizeObserver = new ResizeObserver(() =>
+ {
+ if(!roomPreviewer || !elementRef.current) return;
+
+ const width = elementRef.current.parentElement.offsetWidth;
+
+ roomPreviewer.modifyRoomCanvas(width, height);
+
+ update(-1);
+ });
+
+ resizeObserver.observe(elementRef.current);
+
+ return () =>
+ {
+ resizeObserver.disconnect();
+
+ GetTicker().remove(update);
+ }
+
+ }, [ renderingCanvas, roomPreviewer, elementRef, height ]);
+
+ return (
+
+ );
+}
diff --git a/src/common/layout/LayoutRoomThumbnailView.tsx b/src/common/layout/LayoutRoomThumbnailView.tsx
new file mode 100644
index 000000000..46d884f32
--- /dev/null
+++ b/src/common/layout/LayoutRoomThumbnailView.tsx
@@ -0,0 +1,37 @@
+import { FC, useMemo } from 'react';
+import { GetConfiguration } from '../../api';
+import { Base, BaseProps } from '../Base';
+
+export interface LayoutRoomThumbnailViewProps extends BaseProps
+{
+ roomId?: number;
+ customUrl?: string;
+}
+
+export const LayoutRoomThumbnailView: FC = props =>
+{
+ const { roomId = -1, customUrl = null, shrink = true, overflow = 'hidden', classNames = [], children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'room-thumbnail', 'rounded', 'border' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ const getImageUrl = useMemo(() =>
+ {
+ if(customUrl && customUrl.length) return (GetConfiguration('image.library.url') + customUrl);
+
+ return (GetConfiguration('thumbnails.url').replace('%thumbnail%', roomId.toString()));
+ }, [ customUrl, roomId ]);
+
+ return (
+
+ { getImageUrl && }
+ { children }
+
+ );
+}
diff --git a/src/common/layout/LayoutTrophyView.tsx b/src/common/layout/LayoutTrophyView.tsx
new file mode 100644
index 000000000..1320625ec
--- /dev/null
+++ b/src/common/layout/LayoutTrophyView.tsx
@@ -0,0 +1,39 @@
+import { FC } from 'react';
+import { Base, Column, Flex, Text } from '..';
+import { LocalizeText } from '../../api';
+import { DraggableWindow } from '../draggable-window';
+
+interface LayoutTrophyViewProps
+{
+ color: string;
+ message: string;
+ date: string;
+ senderName: string;
+ customTitle?: string;
+ onCloseClick: () => void;
+}
+
+export const LayoutTrophyView: FC = props =>
+{
+ const { color = '', message = '', date = '', senderName = '', customTitle = null, onCloseClick = null } = props;
+
+ return (
+
+
+
+
+ { LocalizeText('widget.furni.trophy.title') }
+
+
+ { customTitle &&
+ { customTitle } }
+ { message }
+
+
+ { date }
+ { senderName }
+
+
+
+ );
+}
diff --git a/src/common/layout/UserProfileIconView.tsx b/src/common/layout/UserProfileIconView.tsx
new file mode 100644
index 000000000..d31fa66b4
--- /dev/null
+++ b/src/common/layout/UserProfileIconView.tsx
@@ -0,0 +1,29 @@
+import { FC, useMemo } from 'react';
+import { GetUserProfile } from '../../api';
+import { Base, BaseProps } from '../Base';
+
+export interface UserProfileIconViewProps extends BaseProps
+{
+ userId?: number;
+ userName?: string;
+}
+
+export const UserProfileIconView: FC = props =>
+{
+ const { userId = 0, userName = null, classNames = [], pointer = true, children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'nitro-friends-spritesheet', 'icon-profile-sm' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ return (
+ GetUserProfile(userId) } { ... rest }>
+ { children }
+
+ );
+}
diff --git a/src/common/layout/index.ts b/src/common/layout/index.ts
new file mode 100644
index 000000000..cbb056854
--- /dev/null
+++ b/src/common/layout/index.ts
@@ -0,0 +1,24 @@
+export * from './LayoutAvatarImageView';
+export * from './LayoutBackgroundImage';
+export * from './LayoutBadgeImageView';
+export * from './LayoutCounterTimeView';
+export * from './LayoutCurrencyIcon';
+export * from './LayoutFurniIconImageView';
+export * from './LayoutFurniImageView';
+export * from './LayoutGiftTagView';
+export * from './LayoutGridItem';
+export * from './LayoutImage';
+export * from './LayoutItemCountView';
+export * from './LayoutLoadingSpinnerView';
+export * from './LayoutMiniCameraView';
+export * from './LayoutNotificationAlertView';
+export * from './LayoutNotificationBubbleView';
+export * from './LayoutPetImageView';
+export * from './LayoutProgressBar';
+export * from './LayoutRarityLevelView';
+export * from './LayoutRoomObjectImageView';
+export * from './LayoutRoomPreviewerView';
+export * from './LayoutRoomThumbnailView';
+export * from './LayoutTrophyView';
+export * from './UserProfileIconView';
+export * from './limited-edition';
diff --git a/src/common/layout/limited-edition/LayoutLimitedEditionCompactPlateView.tsx b/src/common/layout/limited-edition/LayoutLimitedEditionCompactPlateView.tsx
new file mode 100644
index 000000000..ee41c6c96
--- /dev/null
+++ b/src/common/layout/limited-edition/LayoutLimitedEditionCompactPlateView.tsx
@@ -0,0 +1,35 @@
+import { FC, useMemo } from 'react';
+import { Base, BaseProps } from '../../Base';
+import { LayoutLimitedEditionStyledNumberView } from './LayoutLimitedEditionStyledNumberView';
+
+interface LayoutLimitedEditionCompactPlateViewProps extends BaseProps
+{
+ uniqueNumber: number;
+ uniqueSeries: number;
+}
+
+export const LayoutLimitedEditionCompactPlateView: FC = props =>
+{
+ const { uniqueNumber = 0, uniqueSeries = 0, classNames = [], children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'unique-compact-plate', 'z-index-1' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ return (
+
+
+
+
+
+
+
+ { children }
+
+ );
+}
diff --git a/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx b/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx
new file mode 100644
index 000000000..c83e2307d
--- /dev/null
+++ b/src/common/layout/limited-edition/LayoutLimitedEditionCompletePlateView.tsx
@@ -0,0 +1,41 @@
+import { FC, useMemo } from 'react';
+import { LocalizeText } from '../../../api';
+import { Base, BaseProps } from '../../Base';
+import { Column } from '../../Column';
+import { Flex } from '../../Flex';
+import { LayoutLimitedEditionStyledNumberView } from './LayoutLimitedEditionStyledNumberView';
+
+interface LayoutLimitedEditionCompletePlateViewProps extends BaseProps
+{
+ uniqueLimitedItemsLeft: number;
+ uniqueLimitedSeriesSize: number;
+}
+
+export const LayoutLimitedEditionCompletePlateView: FC = props =>
+{
+ const { uniqueLimitedItemsLeft = 0, uniqueLimitedSeriesSize = 0, classNames = [], ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'unique-complete-plate' ];
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ classNames ]);
+
+ return (
+
+
+
+ { LocalizeText('unique.items.left') }
+
+
+
+ { LocalizeText('unique.items.number.sold') }
+
+
+
+
+ );
+}
diff --git a/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx b/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx
new file mode 100644
index 000000000..fe34ba412
--- /dev/null
+++ b/src/common/layout/limited-edition/LayoutLimitedEditionStyledNumberView.tsx
@@ -0,0 +1,18 @@
+import { FC } from 'react';
+
+interface LayoutLimitedEditionStyledNumberViewProps
+{
+ value: number;
+}
+
+export const LayoutLimitedEditionStyledNumberView: FC = props =>
+{
+ const { value = 0 } = props;
+ const numbers = value.toString().split('');
+
+ return (
+ <>
+ { numbers.map((number, index) => ) }
+ >
+ );
+}
diff --git a/src/common/layout/limited-edition/index.ts b/src/common/layout/limited-edition/index.ts
new file mode 100644
index 000000000..ee41cf9f9
--- /dev/null
+++ b/src/common/layout/limited-edition/index.ts
@@ -0,0 +1,3 @@
+export * from './LayoutLimitedEditionCompactPlateView';
+export * from './LayoutLimitedEditionCompletePlateView';
+export * from './LayoutLimitedEditionStyledNumberView';
diff --git a/src/common/transitions/TransitionAnimation.tsx b/src/common/transitions/TransitionAnimation.tsx
new file mode 100644
index 000000000..6eefd2df4
--- /dev/null
+++ b/src/common/transitions/TransitionAnimation.tsx
@@ -0,0 +1,52 @@
+import { FC, ReactNode, useEffect, useState } from 'react';
+import { Transition } from 'react-transition-group';
+import { getTransitionAnimationStyle } from './TransitionAnimationStyles';
+
+interface TransitionAnimationProps
+{
+ type: string;
+ inProp: boolean;
+ timeout?: number;
+ className?: string;
+ children?: ReactNode;
+}
+
+export const TransitionAnimation: FC = props =>
+{
+ const { type = null, inProp = false, timeout = 300, className = null, children = null } = props;
+
+ const [ isChildrenVisible, setChildrenVisible ] = useState(false);
+
+ useEffect(() =>
+ {
+ let timeoutData: ReturnType = null;
+
+ if(inProp)
+ {
+ setChildrenVisible(true);
+ }
+ else
+ {
+ timeoutData = setTimeout(() =>
+ {
+ setChildrenVisible(false);
+ clearTimeout(timeout);
+ }, timeout);
+ }
+
+ return () =>
+ {
+ if(timeoutData) clearTimeout(timeoutData);
+ }
+ }, [ inProp, timeout ]);
+
+ return (
+
+ { state => (
+
+ { isChildrenVisible && children }
+
+ ) }
+
+ );
+}
diff --git a/src/common/transitions/TransitionAnimationStyles.ts b/src/common/transitions/TransitionAnimationStyles.ts
new file mode 100644
index 000000000..0d512d0e1
--- /dev/null
+++ b/src/common/transitions/TransitionAnimationStyles.ts
@@ -0,0 +1,136 @@
+import { CSSProperties } from 'react';
+import { TransitionStatus } from 'react-transition-group';
+import { ENTERING, EXITING } from 'react-transition-group/Transition';
+import { TransitionAnimationTypes } from './TransitionAnimationTypes';
+
+export function getTransitionAnimationStyle(type: string, transition: TransitionStatus, timeout: number = 300): Partial
+{
+ switch(type)
+ {
+ case TransitionAnimationTypes.BOUNCE:
+ switch(transition)
+ {
+ default:
+ return {}
+ case ENTERING:
+ return {
+ animationName: 'bounceIn',
+ animationDuration: `${ timeout }ms`
+ }
+ case EXITING:
+ return {
+ animationName: 'bounceOut',
+ animationDuration: `${ timeout }ms`
+ }
+ }
+ case TransitionAnimationTypes.SLIDE_LEFT:
+ switch(transition)
+ {
+ default:
+ return {}
+ case ENTERING:
+ return {
+ animationName: 'slideInLeft',
+ animationDuration: `${ timeout }ms`
+ }
+ case EXITING:
+ return {
+ animationName: 'slideOutLeft',
+ animationDuration: `${ timeout }ms`
+ }
+ }
+ case TransitionAnimationTypes.SLIDE_RIGHT:
+ switch(transition)
+ {
+ default:
+ return {}
+ case ENTERING:
+ return {
+ animationName: 'slideInRight',
+ animationDuration: `${ timeout }ms`
+ }
+ case EXITING:
+ return {
+ animationName: 'slideOutRight',
+ animationDuration: `${ timeout }ms`
+ }
+ }
+ case TransitionAnimationTypes.FLIP_X:
+ switch(transition)
+ {
+ default:
+ return {}
+ case ENTERING:
+ return {
+ animationName: 'flipInX',
+ animationDuration: `${ timeout }ms`
+ }
+ case EXITING:
+ return {
+ animationName: 'flipOutX',
+ animationDuration: `${ timeout }ms`
+ }
+ }
+ case TransitionAnimationTypes.FADE_UP:
+ switch(transition)
+ {
+ default:
+ return {}
+ case ENTERING:
+ return {
+ animationName: 'fadeInUp',
+ animationDuration: `${ timeout }ms`
+ }
+ case EXITING:
+ return {
+ animationName: 'fadeOutDown',
+ animationDuration: `${ timeout }ms`
+ }
+ }
+ case TransitionAnimationTypes.FADE_IN:
+ switch(transition)
+ {
+ default:
+ return {}
+ case ENTERING:
+ return {
+ animationName: 'fadeIn',
+ animationDuration: `${ timeout }ms`
+ }
+ case EXITING:
+ return {
+ animationName: 'fadeOut',
+ animationDuration: `${ timeout }ms`
+ }
+ }
+ case TransitionAnimationTypes.FADE_DOWN:
+ switch(transition)
+ {
+ default:
+ return {}
+ case ENTERING:
+ return {
+ animationName: 'fadeInDown',
+ animationDuration: `${ timeout }ms`
+ }
+ case EXITING:
+ return {
+ animationName: 'fadeOutUp',
+ animationDuration: `${ timeout }ms`
+ }
+ }
+ case TransitionAnimationTypes.HEAD_SHAKE:
+ switch(transition)
+ {
+ default:
+ return {}
+ case ENTERING:
+ return {
+ animationName: 'headShake',
+ animationDuration: `${ timeout }ms`
+ }
+ }
+ }
+
+ return null;
+}
diff --git a/src/common/transitions/TransitionAnimationTypes.ts b/src/common/transitions/TransitionAnimationTypes.ts
new file mode 100644
index 000000000..4ecc23be1
--- /dev/null
+++ b/src/common/transitions/TransitionAnimationTypes.ts
@@ -0,0 +1,11 @@
+export class TransitionAnimationTypes
+{
+ public static BOUNCE: string = 'bounce';
+ public static SLIDE_LEFT: string = 'slideLeft';
+ public static SLIDE_RIGHT: string = 'slideRight';
+ public static FLIP_X: string = 'flipX';
+ public static FADE_IN: string = 'fadeIn';
+ public static FADE_DOWN: string = 'fadeDown';
+ public static FADE_UP: string = 'fadeUp';
+ public static HEAD_SHAKE: string = 'headShake';
+}
diff --git a/src/common/transitions/index.ts b/src/common/transitions/index.ts
new file mode 100644
index 000000000..283a00587
--- /dev/null
+++ b/src/common/transitions/index.ts
@@ -0,0 +1,3 @@
+export * from './TransitionAnimation';
+export * from './TransitionAnimationStyles';
+export * from './TransitionAnimationTypes';
diff --git a/src/common/types/AlignItemType.ts b/src/common/types/AlignItemType.ts
new file mode 100644
index 000000000..5a61476df
--- /dev/null
+++ b/src/common/types/AlignItemType.ts
@@ -0,0 +1 @@
+export type AlignItemType = 'start' | 'end' | 'center' | 'baseline' | 'stretch';
diff --git a/src/common/types/AlignSelfType.ts b/src/common/types/AlignSelfType.ts
new file mode 100644
index 000000000..8e26378bd
--- /dev/null
+++ b/src/common/types/AlignSelfType.ts
@@ -0,0 +1 @@
+export type AlignSelfType = 'start' | 'end' | 'center' | 'baseline' | 'stretch';
diff --git a/src/common/types/ButtonSizeType.ts b/src/common/types/ButtonSizeType.ts
new file mode 100644
index 000000000..0f9dd4a0d
--- /dev/null
+++ b/src/common/types/ButtonSizeType.ts
@@ -0,0 +1 @@
+export type ButtonSizeType = 'lg' | 'sm';
diff --git a/src/common/types/ColorVariantType.ts b/src/common/types/ColorVariantType.ts
new file mode 100644
index 000000000..1ff6f60b4
--- /dev/null
+++ b/src/common/types/ColorVariantType.ts
@@ -0,0 +1 @@
+export type ColorVariantType = 'primary' | 'success' | 'danger' | 'secondary' | 'link' | 'black' | 'white' | 'dark' | 'warning' | 'muted' | 'light';
diff --git a/src/common/types/ColumnSizesType.ts b/src/common/types/ColumnSizesType.ts
new file mode 100644
index 000000000..2b130d85e
--- /dev/null
+++ b/src/common/types/ColumnSizesType.ts
@@ -0,0 +1 @@
+export type ColumnSizesType = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
diff --git a/src/common/types/DisplayType.ts b/src/common/types/DisplayType.ts
new file mode 100644
index 000000000..7551d7215
--- /dev/null
+++ b/src/common/types/DisplayType.ts
@@ -0,0 +1 @@
+export type DisplayType = 'none' | 'inline' | 'inline-block' | 'block' | 'grid' | 'table' | 'table-cell' | 'table-row' | 'flex' | 'inline-flex';
diff --git a/src/common/types/FloatType.ts b/src/common/types/FloatType.ts
new file mode 100644
index 000000000..63e495fe5
--- /dev/null
+++ b/src/common/types/FloatType.ts
@@ -0,0 +1 @@
+export type FloatType = 'start' | 'end' | 'none';
diff --git a/src/common/types/FontSizeType.ts b/src/common/types/FontSizeType.ts
new file mode 100644
index 000000000..120c11c96
--- /dev/null
+++ b/src/common/types/FontSizeType.ts
@@ -0,0 +1 @@
+export type FontSizeType = 1 | 2 | 3 | 4 | 5 | 6;
diff --git a/src/common/types/FontWeightType.ts b/src/common/types/FontWeightType.ts
new file mode 100644
index 000000000..c7c92866c
--- /dev/null
+++ b/src/common/types/FontWeightType.ts
@@ -0,0 +1 @@
+export type FontWeightType = 'bold' | 'bolder' | 'normal' | 'light' | 'lighter';
diff --git a/src/common/types/JustifyContentType.ts b/src/common/types/JustifyContentType.ts
new file mode 100644
index 000000000..73a318d2d
--- /dev/null
+++ b/src/common/types/JustifyContentType.ts
@@ -0,0 +1 @@
+export type JustifyContentType = 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly';
diff --git a/src/common/types/OverflowType.ts b/src/common/types/OverflowType.ts
new file mode 100644
index 000000000..9231ff9f4
--- /dev/null
+++ b/src/common/types/OverflowType.ts
@@ -0,0 +1 @@
+export type OverflowType = 'auto' | 'hidden' | 'visible' | 'scroll' | 'y-scroll' | 'unset';
diff --git a/src/common/types/PositionType.ts b/src/common/types/PositionType.ts
new file mode 100644
index 000000000..4e20b2fbd
--- /dev/null
+++ b/src/common/types/PositionType.ts
@@ -0,0 +1 @@
+export type PositionType = 'static' | 'relative' | 'fixed' | 'absolute' | 'sticky';
diff --git a/src/common/types/SpacingType.ts b/src/common/types/SpacingType.ts
new file mode 100644
index 000000000..91c2bb573
--- /dev/null
+++ b/src/common/types/SpacingType.ts
@@ -0,0 +1 @@
+export type SpacingType = 0 | 1 | 2 | 3 | 4 | 5;
diff --git a/src/common/types/TextAlignType.ts b/src/common/types/TextAlignType.ts
new file mode 100644
index 000000000..cb8264806
--- /dev/null
+++ b/src/common/types/TextAlignType.ts
@@ -0,0 +1 @@
+export type TextAlignType = 'start' | 'center' | 'end';
diff --git a/src/common/types/index.ts b/src/common/types/index.ts
new file mode 100644
index 000000000..333177e28
--- /dev/null
+++ b/src/common/types/index.ts
@@ -0,0 +1,14 @@
+export * from './AlignItemType';
+export * from './AlignSelfType';
+export * from './ButtonSizeType';
+export * from './ColorVariantType';
+export * from './ColumnSizesType';
+export * from './DisplayType';
+export * from './FloatType';
+export * from './FontSizeType';
+export * from './FontWeightType';
+export * from './JustifyContentType';
+export * from './OverflowType';
+export * from './PositionType';
+export * from './SpacingType';
+export * from './TextAlignType';
diff --git a/src/common/utils/CreateTransitionToIcon.ts b/src/common/utils/CreateTransitionToIcon.ts
new file mode 100644
index 000000000..5359dad23
--- /dev/null
+++ b/src/common/utils/CreateTransitionToIcon.ts
@@ -0,0 +1,13 @@
+import { NitroEventDispatcher, NitroToolbarAnimateIconEvent } from '@nitrots/nitro-renderer';
+
+export const CreateTransitionToIcon = (image: HTMLImageElement, fromElement: HTMLElement, icon: string) =>
+{
+ const bounds = fromElement.getBoundingClientRect();
+ const x = (bounds.x + (bounds.width / 2));
+ const y = (bounds.y + (bounds.height / 2));
+ const event = new NitroToolbarAnimateIconEvent(image, x, y);
+
+ event.iconName = icon;
+
+ NitroEventDispatcher.dispatchEvent(event);
+}
diff --git a/src/common/utils/FriendlyTimeView.tsx b/src/common/utils/FriendlyTimeView.tsx
new file mode 100644
index 000000000..95af3a3fc
--- /dev/null
+++ b/src/common/utils/FriendlyTimeView.tsx
@@ -0,0 +1,28 @@
+import { FriendlyTime } from '@nitrots/nitro-renderer';
+import { FC, useEffect, useMemo, useState } from 'react';
+import { Base, BaseProps } from '..';
+
+interface FriendlyTimeViewProps extends BaseProps
+{
+ seconds: number;
+ isShort?: boolean;
+}
+
+export const FriendlyTimeView: FC = props =>
+{
+ const { seconds = 0, isShort = false, children = null, ...rest } = props;
+ const [ updateId, setUpdateId ] = useState(-1);
+
+ const getStartSeconds = useMemo(() => (Math.round(new Date().getSeconds()) - seconds), [ seconds ]);
+
+ useEffect(() =>
+ {
+ const interval = setInterval(() => setUpdateId(prevValue => (prevValue + 1)), 10000);
+
+ return () => clearInterval(interval);
+ }, []);
+
+ const value = (Math.round(new Date().getSeconds()) - getStartSeconds);
+
+ return { isShort ? FriendlyTime.shortFormat(value) : FriendlyTime.format(value) };
+}
diff --git a/src/common/utils/index.ts b/src/common/utils/index.ts
new file mode 100644
index 000000000..11d60a343
--- /dev/null
+++ b/src/common/utils/index.ts
@@ -0,0 +1,2 @@
+export * from './CreateTransitionToIcon';
+export * from './FriendlyTimeView';
diff --git a/src/components/achievements/AchievementsView.scss b/src/components/achievements/AchievementsView.scss
new file mode 100644
index 000000000..3fa61ac01
--- /dev/null
+++ b/src/components/achievements/AchievementsView.scss
@@ -0,0 +1,15 @@
+.nitro-achievements {
+ width: $achievement-width;
+ height: $achievement-height;
+}
+
+.nitro-achievements-back-arrow {
+ background: url('@/assets/images/achievements/back-arrow.png') no-repeat center;
+ width: 33px;
+ height: 34px;
+}
+
+.nitro-achievements-badge-image {
+ width: 80px !important;
+ height: 80px !important;
+}
diff --git a/src/components/achievements/AchievementsView.tsx b/src/components/achievements/AchievementsView.tsx
new file mode 100644
index 000000000..6c7940a77
--- /dev/null
+++ b/src/components/achievements/AchievementsView.tsx
@@ -0,0 +1,72 @@
+import { ILinkEventTracker } from '@nitrots/nitro-renderer';
+import { FC, useEffect, useState } from 'react';
+import { AchievementUtilities, AddEventLinkTracker, LocalizeText, RemoveLinkEventTracker } from '../../api';
+import { Base, Column, LayoutImage, LayoutProgressBar, NitroCardContentView, NitroCardHeaderView, NitroCardSubHeaderView, NitroCardView, Text } from '../../common';
+import { useAchievements } from '../../hooks';
+import { AchievementCategoryView } from './views/AchievementCategoryView';
+import { AchievementsCategoryListView } from './views/category-list/AchievementsCategoryListView';
+
+export const AchievementsView: FC<{}> = props =>
+{
+ const [ isVisible, setIsVisible ] = useState(false);
+ const { achievementCategories = [], selectedCategoryCode = null, setSelectedCategoryCode = null, achievementScore = 0, getProgress = 0, getMaxProgress = 0, selectedCategory = null } = useAchievements();
+
+ useEffect(() =>
+ {
+ const linkTracker: ILinkEventTracker = {
+ linkReceived: (url: string) =>
+ {
+ const parts = url.split('/');
+
+ if(parts.length < 2) return;
+
+ switch(parts[1])
+ {
+ case 'show':
+ setIsVisible(true);
+ return;
+ case 'hide':
+ setIsVisible(false);
+ return;
+ case 'toggle':
+ setIsVisible(prevValue => !prevValue);
+ return;
+ }
+ },
+ eventUrlPrefix: 'achievements/'
+ };
+
+ AddEventLinkTracker(linkTracker);
+
+ return () => RemoveLinkEventTracker(linkTracker);
+ }, []);
+
+ if(!isVisible) return null;
+
+ return (
+
+ setIsVisible(false) } />
+ { selectedCategory &&
+
+ setSelectedCategoryCode(null) } className="nitro-achievements-back-arrow" />
+
+ { LocalizeText(`quests.${ selectedCategory.code }.name`) }
+ { LocalizeText('achievements.details.categoryprogress', [ 'progress', 'limit' ], [ selectedCategory.getProgress().toString(), selectedCategory.getMaxProgress().toString() ]) }
+
+
+ }
+
+ { !selectedCategory &&
+ <>
+
+
+ { LocalizeText('achievements.categories.score', [ 'score' ], [ achievementScore.toString() ]) }
+
+
+ > }
+ { selectedCategory &&
+ }
+
+
+ );
+};
diff --git a/src/components/achievements/views/AchievementBadgeView.tsx b/src/components/achievements/views/AchievementBadgeView.tsx
new file mode 100644
index 000000000..5b0d4f93d
--- /dev/null
+++ b/src/components/achievements/views/AchievementBadgeView.tsx
@@ -0,0 +1,19 @@
+import { AchievementData } from '@nitrots/nitro-renderer';
+import { FC } from 'react';
+import { AchievementUtilities } from '../../../api';
+import { BaseProps, LayoutBadgeImageView } from '../../../common';
+
+interface AchievementBadgeViewProps extends BaseProps
+{
+ achievement: AchievementData;
+ scale?: number;
+}
+
+export const AchievementBadgeView: FC = props =>
+{
+ const { achievement = null, scale = 1, ...rest } = props;
+
+ if(!achievement) return null;
+
+ return ;
+}
diff --git a/src/components/achievements/views/AchievementCategoryView.tsx b/src/components/achievements/views/AchievementCategoryView.tsx
new file mode 100644
index 000000000..8774d2088
--- /dev/null
+++ b/src/components/achievements/views/AchievementCategoryView.tsx
@@ -0,0 +1,37 @@
+import { FC, useEffect } from 'react';
+import { AchievementCategory } from '../../../api';
+import { Column } from '../../../common';
+import { useAchievements } from '../../../hooks';
+import { AchievementListView } from './achievement-list';
+import { AchievementDetailsView } from './AchievementDetailsView';
+
+interface AchievementCategoryViewProps
+{
+ category: AchievementCategory;
+}
+
+export const AchievementCategoryView: FC = props =>
+{
+ const { category = null } = props;
+ const { selectedAchievement = null, setSelectedAchievementId = null } = useAchievements();
+
+ useEffect(() =>
+ {
+ if(!category) return;
+
+ if(!selectedAchievement)
+ {
+ setSelectedAchievementId(category?.achievements?.[0]?.achievementId);
+ }
+ }, [ category, selectedAchievement, setSelectedAchievementId ]);
+
+ if(!category) return null;
+
+ return (
+
+
+ { !!selectedAchievement &&
+ }
+
+ );
+}
diff --git a/src/components/achievements/views/AchievementDetailsView.tsx b/src/components/achievements/views/AchievementDetailsView.tsx
new file mode 100644
index 000000000..b04fa183f
--- /dev/null
+++ b/src/components/achievements/views/AchievementDetailsView.tsx
@@ -0,0 +1,53 @@
+import { AchievementData } from '@nitrots/nitro-renderer';
+import { FC } from 'react';
+import { AchievementUtilities, LocalizeBadgeDescription, LocalizeBadgeName, LocalizeText } from '../../../api';
+import { Column, Flex, LayoutCurrencyIcon, LayoutProgressBar, Text } from '../../../common';
+import { AchievementBadgeView } from './AchievementBadgeView';
+
+interface AchievementDetailsViewProps
+{
+ achievement: AchievementData;
+}
+
+export const AchievementDetailsView: FC = props =>
+{
+ const { achievement = null } = props;
+
+ if(!achievement) return null;
+
+ return (
+
+
+
+
+ { LocalizeText('achievements.details.level', [ 'level', 'limit' ], [ AchievementUtilities.getAchievementLevel(achievement).toString(), achievement.levelCount.toString() ]) }
+
+
+
+
+
+ { LocalizeBadgeName(AchievementUtilities.getAchievementBadgeCode(achievement)) }
+
+
+ { LocalizeBadgeDescription(AchievementUtilities.getAchievementBadgeCode(achievement)) }
+
+
+ { ((achievement.levelRewardPoints > 0) || (achievement.scoreLimit > 0)) &&
+
+ { (achievement.levelRewardPoints > 0) &&
+
+
+ { LocalizeText('achievements.details.reward') }
+
+
+ { achievement.levelRewardPoints }
+
+
+ }
+ { (achievement.scoreLimit > 0) &&
+ }
+ }
+
+
+ )
+}
diff --git a/src/components/achievements/views/achievement-list/AchievementListItemView.tsx b/src/components/achievements/views/achievement-list/AchievementListItemView.tsx
new file mode 100644
index 000000000..9da632bd2
--- /dev/null
+++ b/src/components/achievements/views/achievement-list/AchievementListItemView.tsx
@@ -0,0 +1,24 @@
+import { AchievementData } from '@nitrots/nitro-renderer';
+import { FC } from 'react';
+import { LayoutGridItem } from '../../../../common';
+import { useAchievements } from '../../../../hooks';
+import { AchievementBadgeView } from '../AchievementBadgeView';
+
+interface AchievementListItemViewProps
+{
+ achievement: AchievementData;
+}
+
+export const AchievementListItemView: FC = props =>
+{
+ const { achievement = null } = props;
+ const { selectedAchievement = null, setSelectedAchievementId = null } = useAchievements();
+
+ if(!achievement) return null;
+
+ return (
+ 0) } onClick={ event => setSelectedAchievementId(achievement.achievementId) }>
+
+
+ );
+}
diff --git a/src/components/achievements/views/achievement-list/AchievementListView.tsx b/src/components/achievements/views/achievement-list/AchievementListView.tsx
new file mode 100644
index 000000000..f0095817c
--- /dev/null
+++ b/src/components/achievements/views/achievement-list/AchievementListView.tsx
@@ -0,0 +1,20 @@
+import { AchievementData } from '@nitrots/nitro-renderer';
+import { FC } from 'react';
+import { AutoGrid } from '../../../../common';
+import { AchievementListItemView } from './AchievementListItemView';
+
+interface AchievementListViewProps
+{
+ achievements: AchievementData[];
+}
+
+export const AchievementListView: FC = props =>
+{
+ const { achievements = null } = props;
+
+ return (
+
+ { achievements && (achievements.length > 0) && achievements.map((achievement, index) => ) }
+
+ );
+}
diff --git a/src/components/achievements/views/achievement-list/index.ts b/src/components/achievements/views/achievement-list/index.ts
new file mode 100644
index 000000000..87ccb432e
--- /dev/null
+++ b/src/components/achievements/views/achievement-list/index.ts
@@ -0,0 +1,2 @@
+export * from './AchievementListItemView';
+export * from './AchievementListView';
diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx
new file mode 100644
index 000000000..91b96c6ed
--- /dev/null
+++ b/src/components/achievements/views/category-list/AchievementsCategoryListItemView.tsx
@@ -0,0 +1,31 @@
+import { Dispatch, FC, SetStateAction } from 'react';
+import { AchievementUtilities, IAchievementCategory, LocalizeText } from '../../../../api';
+import { LayoutBackgroundImage, LayoutGridItem, Text } from '../../../../common';
+
+interface AchievementCategoryListItemViewProps
+{
+ category: IAchievementCategory;
+ selectedCategoryCode: string;
+ setSelectedCategoryCode: Dispatch>;
+}
+
+export const AchievementsCategoryListItemView: FC = props =>
+{
+ const { category = null, selectedCategoryCode = null, setSelectedCategoryCode = null } = props;
+
+ if(!category) return null;
+
+ const progress = AchievementUtilities.getAchievementCategoryProgress(category);
+ const maxProgress = AchievementUtilities.getAchievementCategoryMaxProgress(category);
+ const getCategoryImage = AchievementUtilities.getAchievementCategoryImageUrl(category, progress);
+ const getTotalUnseen = AchievementUtilities.getAchievementCategoryTotalUnseen(category);
+
+ return (
+ setSelectedCategoryCode(category.code) }>
+ { LocalizeText(`quests.${ category.code }.name`) }
+
+ { progress } / { maxProgress }
+
+
+ );
+}
diff --git a/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx b/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx
new file mode 100644
index 000000000..ca362968e
--- /dev/null
+++ b/src/components/achievements/views/category-list/AchievementsCategoryListView.tsx
@@ -0,0 +1,22 @@
+import { Dispatch, FC, SetStateAction } from 'react';
+import { IAchievementCategory } from '../../../../api';
+import { AutoGrid } from '../../../../common';
+import { AchievementsCategoryListItemView } from './AchievementsCategoryListItemView';
+
+interface AchievementsCategoryListViewProps
+{
+ categories: IAchievementCategory[];
+ selectedCategoryCode: string;
+ setSelectedCategoryCode: Dispatch>;
+}
+
+export const AchievementsCategoryListView: FC = props =>
+{
+ const { categories = null, selectedCategoryCode = null, setSelectedCategoryCode = null } = props;
+
+ return (
+
+ { categories && (categories.length > 0) && categories.map((category, index) => ) }
+
+ );
+};
diff --git a/src/components/achievements/views/category-list/index.ts b/src/components/achievements/views/category-list/index.ts
new file mode 100644
index 000000000..5a367f857
--- /dev/null
+++ b/src/components/achievements/views/category-list/index.ts
@@ -0,0 +1,2 @@
+export * from './AchievementsCategoryListItemView';
+export * from './AchievementsCategoryListView';
diff --git a/src/components/achievements/views/index.ts b/src/components/achievements/views/index.ts
new file mode 100644
index 000000000..576c6357b
--- /dev/null
+++ b/src/components/achievements/views/index.ts
@@ -0,0 +1,5 @@
+export * from './achievement-list';
+export * from './AchievementBadgeView';
+export * from './AchievementCategoryView';
+export * from './AchievementDetailsView';
+export * from './category-list';
diff --git a/src/components/avatar-editor/AvatarEditorView.scss b/src/components/avatar-editor/AvatarEditorView.scss
new file mode 100644
index 000000000..22b873d40
--- /dev/null
+++ b/src/components/avatar-editor/AvatarEditorView.scss
@@ -0,0 +1,336 @@
+.nitro-avatar-editor-spritesheet {
+ background: url('@/assets/images/avatareditor/avatar-editor-spritesheet.png') transparent no-repeat;
+
+ &.arrow-left-icon {
+ width: 28px;
+ height: 21px;
+ background-position: -226px -131px;
+ }
+
+ &.arrow-right-icon {
+ width: 28px;
+ height: 21px;
+ background-position: -226px -162px;
+ }
+
+ &.ca-icon {
+ width: 25px;
+ height: 25px;
+ background-position: -226px -61px;
+
+ &.selected {
+ width: 25px;
+ height: 25px;
+ background-position: -226px -96px;
+ }
+ }
+
+ &.cc-icon {
+ width: 31px;
+ height: 29px;
+ background-position: -145px -5px;
+
+ &.selected {
+ width: 31px;
+ height: 29px;
+ background-position: -145px -44px;
+ }
+ }
+
+ &.ch-icon {
+ width: 29px;
+ height: 24px;
+ background-position: -186px -39px;
+
+ &.selected {
+ width: 29px;
+ height: 24px;
+ background-position: -186px -73px;
+ }
+ }
+
+ &.clear-icon {
+ width: 27px;
+ height: 27px;
+ background-position: -145px -157px;
+ }
+
+ &.cp-icon {
+ width: 30px;
+ height: 24px;
+ background-position: -145px -264px;
+
+ &.selected {
+ width: 30px;
+ height: 24px;
+ background-position: -186px -5px;
+ }
+ }
+
+
+ &.ea-icon {
+ width: 35px;
+ height: 16px;
+ background-position: -226px -193px;
+
+ &.selected {
+ width: 35px;
+ height: 16px;
+ background-position: -226px -219px;
+ }
+ }
+
+ &.fa-icon {
+ width: 27px;
+ height: 20px;
+ background-position: -186px -137px;
+
+ &.selected {
+ width: 27px;
+ height: 20px;
+ background-position: -186px -107px;
+ }
+ }
+
+ &.female-icon {
+ width: 18px;
+ height: 27px;
+ background-position: -186px -202px;
+
+ &.selected {
+ width: 18px;
+ height: 27px;
+ background-position: -186px -239px;
+ }
+ }
+
+ &.ha-icon {
+ width: 25px;
+ height: 22px;
+ background-position: -226px -245px;
+
+ &.selected {
+ width: 25px;
+ height: 22px;
+ background-position: -226px -277px;
+ }
+ }
+
+ &.he-icon {
+ width: 31px;
+ height: 27px;
+ background-position: -145px -83px;
+
+ &.selected {
+ width: 31px;
+ height: 27px;
+ background-position: -145px -120px;
+ }
+ }
+
+ &.hr-icon {
+ width: 29px;
+ height: 25px;
+ background-position: -145px -194px;
+
+ &.selected {
+ width: 29px;
+ height: 25px;
+ background-position: -145px -229px;
+ }
+ }
+
+ &.lg-icon {
+ width: 19px;
+ height: 20px;
+ background-position: -303px -45px;
+
+ &.selected {
+ width: 19px;
+ height: 20px;
+ background-position: -303px -75px;
+ }
+ }
+
+ &.loading-icon {
+ width: 21px;
+ height: 25px;
+ background-position: -186px -167px;
+ }
+
+
+ &.male-icon {
+ width: 21px;
+ height: 21px;
+ background-position: -186px -276px;
+
+ &.selected {
+ width: 21px;
+ height: 21px;
+ background-position: -272px -5px;
+ }
+ }
+
+
+ &.sellable-icon {
+ width: 17px;
+ height: 15px;
+ background-position: -303px -105px;
+ }
+
+
+ &.sh-icon {
+ width: 37px;
+ height: 10px;
+ background-position: -303px -5px;
+
+ &.selected {
+ width: 37px;
+ height: 10px;
+ background-position: -303px -25px;
+ }
+ }
+
+
+ &.spotlight-icon {
+ width: 130px;
+ height: 305px;
+ background-position: -5px -5px;
+ }
+
+
+ &.wa-icon {
+ width: 36px;
+ height: 18px;
+ background-position: -226px -5px;
+
+ &.selected {
+ width: 36px;
+ height: 18px;
+ background-position: -226px -33px;
+ }
+ }
+}
+
+.nitro-avatar-editor-wardrobe-figure-preview {
+ background-color: $pale-sky;
+ overflow: hidden;
+ z-index: 1;
+
+ .avatar-image {
+ position: absolute;
+ bottom: -15px;
+ margin: 0 auto;
+ z-index: 4;
+ }
+
+ .avatar-shadow {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 25px;
+ width: 40px;
+ height: 20px;
+ margin: 0 auto;
+ border-radius: 100%;
+ background-color: rgba(0, 0, 0, 0.20);
+ z-index: 2;
+ }
+
+ &:after {
+ position: absolute;
+ content: '';
+ top: 75%;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ border-radius: 50%;
+ background-color: $pale-sky;
+ box-shadow: 0 0 8px 2px rgba($white,.6);
+ transform: scale(2);
+ }
+
+ .button-container {
+ position: absolute;
+ bottom: 0;
+ z-index: 5;
+ }
+}
+
+.nitro-avatar-editor {
+ width: $avatar-editor-width;
+ height: $avatar-editor-height;
+
+ .category-item {
+ height: 40px;
+ }
+
+ .figure-preview-container {
+ position: relative;
+ height: 100%;
+ background-color: $pale-sky;
+ overflow: hidden;
+ z-index: 1;
+
+ .arrow-container {
+ position: absolute;
+ width: 100%;
+ margin: 0 auto;
+ padding: 0 10px;
+ display: flex;
+ justify-content: space-between;
+ bottom: 12px;
+ z-index: 5;
+
+ .icon {
+ cursor: pointer;
+ }
+ }
+
+ .avatar-image {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 50px;
+ margin: 0 auto;
+ z-index: 4;
+ }
+
+ .avatar-spotlight {
+ position: absolute;
+ top: -10px;
+ left: 0;
+ right: 0;
+ margin: 0 auto;
+ opacity: 0.3;
+ pointer-events: none;
+ z-index: 3;
+ }
+
+ .avatar-shadow {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 15px;
+ width: 70px;
+ height: 30px;
+ margin: 0 auto;
+ border-radius: 100%;
+ background-color: rgba(0, 0, 0, 0.20);
+ z-index: 2;
+ }
+
+ &:after {
+ position: absolute;
+ content: '';
+ top: 75%;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ border-radius: 50%;
+ background-color: $pale-sky;
+ box-shadow: 0 0 8px 2px rgba($white,.6);
+ transform: scale(2);
+ }
+ }
+}
diff --git a/src/components/avatar-editor/AvatarEditorView.tsx b/src/components/avatar-editor/AvatarEditorView.tsx
new file mode 100644
index 000000000..6b3766e23
--- /dev/null
+++ b/src/components/avatar-editor/AvatarEditorView.tsx
@@ -0,0 +1,316 @@
+import { AvatarEditorFigureCategory, FigureSetIdsMessageEvent, GetWardrobeMessageComposer, IAvatarFigureContainer, ILinkEventTracker, UserFigureComposer, UserWardrobePageEvent } from '@nitrots/nitro-renderer';
+import { FC, useCallback, useEffect, useMemo, useState } from 'react';
+import { FaDice, FaTrash, FaUndo } from 'react-icons/fa';
+import { AddEventLinkTracker, AvatarEditorAction, AvatarEditorUtilities, BodyModel, FigureData, generateRandomFigure, GetAvatarRenderManager, GetClubMemberLevel, GetConfiguration, GetSessionDataManager, HeadModel, IAvatarEditorCategoryModel, LegModel, LocalizeText, RemoveLinkEventTracker, SendMessageComposer, TorsoModel } from '../../api';
+import { Button, ButtonGroup, Column, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../common';
+import { useMessageEvent } from '../../hooks';
+import { AvatarEditorFigurePreviewView } from './views/AvatarEditorFigurePreviewView';
+import { AvatarEditorModelView } from './views/AvatarEditorModelView';
+import { AvatarEditorWardrobeView } from './views/AvatarEditorWardrobeView';
+
+const DEFAULT_MALE_FIGURE: string = 'hr-100.hd-180-7.ch-215-66.lg-270-79.sh-305-62.ha-1002-70.wa-2007';
+const DEFAULT_FEMALE_FIGURE: string = 'hr-515-33.hd-600-1.ch-635-70.lg-716-66-62.sh-735-68';
+
+export const AvatarEditorView: FC<{}> = props =>
+{
+ const [ isVisible, setIsVisible ] = useState(false);
+ const [ figures, setFigures ] = useState>(null);
+ const [ figureData, setFigureData ] = useState(null);
+ const [ categories, setCategories ] = useState>(null);
+ const [ activeCategory, setActiveCategory ] = useState(null);
+ const [ figureSetIds, setFigureSetIds ] = useState([]);
+ const [ boundFurnitureNames, setBoundFurnitureNames ] = useState([]);
+ const [ savedFigures, setSavedFigures ] = useState<[ IAvatarFigureContainer, string ][]>([]);
+ const [ isWardrobeVisible, setIsWardrobeVisible ] = useState(false);
+ const [ lastFigure, setLastFigure ] = useState(null);
+ const [ lastGender, setLastGender ] = useState(null);
+ const [ needsReset, setNeedsReset ] = useState(true);
+ const [ isInitalized, setIsInitalized ] = useState(false);
+
+ const maxWardrobeSlots = useMemo(() => GetConfiguration('avatar.wardrobe.max.slots', 10), []);
+
+ useMessageEvent(FigureSetIdsMessageEvent, event =>
+ {
+ const parser = event.getParser();
+
+ setFigureSetIds(parser.figureSetIds);
+ setBoundFurnitureNames(parser.boundsFurnitureNames);
+ });
+
+ useMessageEvent(UserWardrobePageEvent, event =>
+ {
+ const parser = event.getParser();
+ const savedFigures: [ IAvatarFigureContainer, string ][] = [];
+
+ let i = 0;
+
+ while(i < maxWardrobeSlots)
+ {
+ savedFigures.push([ null, null ]);
+
+ i++;
+ }
+
+ for(let [ index, [ look, gender ] ] of parser.looks.entries())
+ {
+ const container = GetAvatarRenderManager().createFigureContainer(look);
+
+ savedFigures[(index - 1)] = [ container, gender ];
+ }
+
+ setSavedFigures(savedFigures);
+ });
+
+ const selectCategory = useCallback((name: string) =>
+ {
+ if(!categories) return;
+
+ setActiveCategory(categories.get(name));
+ }, [ categories ]);
+
+ const resetCategories = useCallback(() =>
+ {
+ const categories = new Map();
+
+ categories.set(AvatarEditorFigureCategory.GENERIC, new BodyModel());
+ categories.set(AvatarEditorFigureCategory.HEAD, new HeadModel());
+ categories.set(AvatarEditorFigureCategory.TORSO, new TorsoModel());
+ categories.set(AvatarEditorFigureCategory.LEGS, new LegModel());
+
+ setCategories(categories);
+ }, []);
+
+ const setupFigures = useCallback(() =>
+ {
+ const figures: Map = new Map();
+
+ const maleFigure = new FigureData();
+ const femaleFigure = new FigureData();
+
+ maleFigure.loadAvatarData(DEFAULT_MALE_FIGURE, FigureData.MALE);
+ femaleFigure.loadAvatarData(DEFAULT_FEMALE_FIGURE, FigureData.FEMALE);
+
+ figures.set(FigureData.MALE, maleFigure);
+ figures.set(FigureData.FEMALE, femaleFigure);
+
+ setFigures(figures);
+ setFigureData(figures.get(FigureData.MALE));
+ }, []);
+
+ const loadAvatarInEditor = useCallback((figure: string, gender: string, reset: boolean = true) =>
+ {
+ gender = AvatarEditorUtilities.getGender(gender);
+
+ let newFigureData = figureData;
+
+ if(gender !== newFigureData.gender) newFigureData = figures.get(gender);
+
+ if(figure !== newFigureData.getFigureString()) newFigureData.loadAvatarData(figure, gender);
+
+ if(newFigureData !== figureData) setFigureData(newFigureData);
+
+ if(reset)
+ {
+ setLastFigure(figureData.getFigureString());
+ setLastGender(figureData.gender);
+ }
+ }, [ figures, figureData ]);
+
+ const processAction = useCallback((action: string) =>
+ {
+ switch(action)
+ {
+ case AvatarEditorAction.ACTION_CLEAR:
+ loadAvatarInEditor(figureData.getFigureStringWithFace(0, false), figureData.gender, false);
+ resetCategories();
+ return;
+ case AvatarEditorAction.ACTION_RESET:
+ loadAvatarInEditor(lastFigure, lastGender);
+ resetCategories();
+ return;
+ case AvatarEditorAction.ACTION_RANDOMIZE:
+ const figure = generateRandomFigure(figureData, figureData.gender, GetClubMemberLevel(), figureSetIds, [ FigureData.FACE ]);
+
+ loadAvatarInEditor(figure, figureData.gender, false);
+ resetCategories();
+ return;
+ case AvatarEditorAction.ACTION_SAVE:
+ SendMessageComposer(new UserFigureComposer(figureData.gender, figureData.getFigureString()));
+ setIsVisible(false);
+ return;
+ }
+ }, [ figureData, lastFigure, lastGender, figureSetIds, loadAvatarInEditor, resetCategories ])
+
+ const setGender = useCallback((gender: string) =>
+ {
+ gender = AvatarEditorUtilities.getGender(gender);
+
+ setFigureData(figures.get(gender));
+ }, [ figures ]);
+
+ useEffect(() =>
+ {
+ const linkTracker: ILinkEventTracker = {
+ linkReceived: (url: string) =>
+ {
+ const parts = url.split('/');
+
+ if(parts.length < 2) return;
+
+ switch(parts[1])
+ {
+ case 'show':
+ setIsVisible(true);
+ return;
+ case 'hide':
+ setIsVisible(false);
+ return;
+ case 'toggle':
+ setIsVisible(prevValue => !prevValue);
+ return;
+ }
+ },
+ eventUrlPrefix: 'avatar-editor/'
+ };
+
+ AddEventLinkTracker(linkTracker);
+
+ return () => RemoveLinkEventTracker(linkTracker);
+ }, []);
+
+ useEffect(() =>
+ {
+ setSavedFigures(new Array(maxWardrobeSlots));
+ }, [ maxWardrobeSlots ]);
+
+ useEffect(() =>
+ {
+ if(!isWardrobeVisible) return;
+
+ setActiveCategory(null);
+ SendMessageComposer(new GetWardrobeMessageComposer());
+ }, [ isWardrobeVisible ]);
+
+ useEffect(() =>
+ {
+ if(!activeCategory) return;
+
+ setIsWardrobeVisible(false);
+ }, [ activeCategory ]);
+
+ useEffect(() =>
+ {
+ if(!categories) return;
+
+ selectCategory(AvatarEditorFigureCategory.GENERIC);
+ }, [ categories, selectCategory ]);
+
+ useEffect(() =>
+ {
+ if(!figureData) return;
+
+ AvatarEditorUtilities.CURRENT_FIGURE = figureData;
+
+ resetCategories();
+
+ return () => AvatarEditorUtilities.CURRENT_FIGURE = null;
+ }, [ figureData, resetCategories ]);
+
+ useEffect(() =>
+ {
+ AvatarEditorUtilities.FIGURE_SET_IDS = figureSetIds;
+ AvatarEditorUtilities.BOUND_FURNITURE_NAMES = boundFurnitureNames;
+
+ resetCategories();
+
+ return () =>
+ {
+ AvatarEditorUtilities.FIGURE_SET_IDS = null;
+ AvatarEditorUtilities.BOUND_FURNITURE_NAMES = null;
+ }
+ }, [ figureSetIds, boundFurnitureNames, resetCategories ]);
+
+ useEffect(() =>
+ {
+ if(!isVisible) return;
+
+ if(!figures)
+ {
+ setupFigures();
+
+ setIsInitalized(true);
+
+ return;
+ }
+ }, [ isVisible, figures, setupFigures ]);
+
+ useEffect(() =>
+ {
+ if(!isVisible || !isInitalized || !needsReset) return;
+
+ loadAvatarInEditor(GetSessionDataManager().figure, GetSessionDataManager().gender);
+ setNeedsReset(false);
+ }, [ isVisible, isInitalized, needsReset, loadAvatarInEditor ]);
+
+ useEffect(() =>
+ {
+ if(isVisible) return;
+
+ return () =>
+ {
+ setNeedsReset(true);
+ }
+ }, [ isVisible ]);
+
+ if(!isVisible || !figureData) return null;
+
+ return (
+
+ setIsVisible(false) } />
+
+ { categories && (categories.size > 0) && Array.from(categories.keys()).map(category =>
+ {
+ const isActive = (activeCategory && (activeCategory.name === category));
+
+ return (
+ selectCategory(category) }>
+ { LocalizeText(`avatareditor.category.${ category }`) }
+
+ );
+ }) }
+ setIsWardrobeVisible(true) }>
+ { LocalizeText('avatareditor.category.wardrobe') }
+
+
+
+
+
+ { (activeCategory && !isWardrobeVisible) &&
+ }
+ { isWardrobeVisible &&
+ }
+
+
+
+
+
+ processAction(AvatarEditorAction.ACTION_RESET) }>
+
+
+ processAction(AvatarEditorAction.ACTION_CLEAR) }>
+
+
+ processAction(AvatarEditorAction.ACTION_RANDOMIZE) }>
+
+
+
+ processAction(AvatarEditorAction.ACTION_SAVE) }>
+ { LocalizeText('avatareditor.save') }
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx b/src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx
new file mode 100644
index 000000000..d5715acf0
--- /dev/null
+++ b/src/components/avatar-editor/views/AvatarEditorFigurePreviewView.tsx
@@ -0,0 +1,55 @@
+import { AvatarDirectionAngle } from '@nitrots/nitro-renderer';
+import { FC, useEffect, useState } from 'react';
+import { FigureData } from '../../../api';
+import { Base, Column, LayoutAvatarImageView } from '../../../common';
+import { AvatarEditorIcon } from './AvatarEditorIcon';
+
+export interface AvatarEditorFigurePreviewViewProps
+{
+ figureData: FigureData;
+}
+
+export const AvatarEditorFigurePreviewView: FC = props =>
+{
+ const { figureData = null } = props;
+ const [ updateId, setUpdateId ] = useState(-1);
+
+ const rotateFigure = (direction: number) =>
+ {
+ if(direction < AvatarDirectionAngle.MIN_DIRECTION)
+ {
+ direction = (AvatarDirectionAngle.MAX_DIRECTION + (direction + 1));
+ }
+
+ if(direction > AvatarDirectionAngle.MAX_DIRECTION)
+ {
+ direction = (direction - (AvatarDirectionAngle.MAX_DIRECTION + 1));
+ }
+
+ figureData.direction = direction;
+ }
+
+ useEffect(() =>
+ {
+ if(!figureData) return;
+
+ figureData.notify = () => setUpdateId(prevValue => (prevValue + 1));
+
+ return () =>
+ {
+ figureData.notify = null;
+ }
+ }, [ figureData ] );
+
+ return (
+
+
+
+
+
+ rotateFigure(figureData.direction + 1) } />
+ rotateFigure(figureData.direction - 1) } />
+
+
+ );
+}
diff --git a/src/components/avatar-editor/views/AvatarEditorIcon.tsx b/src/components/avatar-editor/views/AvatarEditorIcon.tsx
new file mode 100644
index 000000000..a05baa1da
--- /dev/null
+++ b/src/components/avatar-editor/views/AvatarEditorIcon.tsx
@@ -0,0 +1,30 @@
+import { FC, useMemo } from 'react';
+import { Base, BaseProps } from '../../../common';
+
+type AvatarIconType = 'male' | 'female' | 'clear' | 'sellable' | string;
+
+export interface AvatarEditorIconProps extends BaseProps
+{
+ icon: AvatarIconType;
+ selected?: boolean;
+}
+
+export const AvatarEditorIcon: FC = props =>
+{
+ const { icon = null, selected = false, classNames = [], children = null, ...rest } = props;
+
+ const getClassNames = useMemo(() =>
+ {
+ const newClassNames: string[] = [ 'nitro-avatar-editor-spritesheet' ];
+
+ if(icon && icon.length) newClassNames.push(icon + '-icon');
+
+ if(selected) newClassNames.push('selected');
+
+ if(classNames.length) newClassNames.push(...classNames);
+
+ return newClassNames;
+ }, [ icon, selected, classNames ]);
+
+ return
+}
diff --git a/src/components/avatar-editor/views/AvatarEditorModelView.tsx b/src/components/avatar-editor/views/AvatarEditorModelView.tsx
new file mode 100644
index 000000000..6eb8fe3ed
--- /dev/null
+++ b/src/components/avatar-editor/views/AvatarEditorModelView.tsx
@@ -0,0 +1,88 @@
+import { Dispatch, FC, SetStateAction, useCallback, useEffect, useState } from 'react';
+import { CategoryData, FigureData, IAvatarEditorCategoryModel } from '../../../api';
+import { Column, Flex, Grid } from '../../../common';
+import { AvatarEditorIcon } from './AvatarEditorIcon';
+import { AvatarEditorFigureSetView } from './figure-set/AvatarEditorFigureSetView';
+import { AvatarEditorPaletteSetView } from './palette-set/AvatarEditorPaletteSetView';
+export interface AvatarEditorModelViewProps
+{
+ model: IAvatarEditorCategoryModel;
+ gender: string;
+ setGender: Dispatch>;
+}
+
+export const AvatarEditorModelView: FC = props =>
+{
+ const { model = null, gender = null, setGender = null } = props;
+ const [ activeCategory, setActiveCategory ] = useState(null);
+ const [ maxPaletteCount, setMaxPaletteCount ] = useState(1);
+
+ const selectCategory = useCallback((name: string) =>
+ {
+ const category = model.categories.get(name);
+
+ if(!category) return;
+
+ category.init();
+
+ setActiveCategory(category);
+
+ for(const part of category.parts)
+ {
+ if(!part || !part.isSelected) continue;
+
+ setMaxPaletteCount(part.maxColorIndex || 1);
+
+ break;
+ }
+ }, [ model ]);
+
+ useEffect(() =>
+ {
+ model.init();
+
+ for(const name of model.categories.keys())
+ {
+ selectCategory(name);
+
+ break;
+ }
+ }, [ model, selectCategory ]);
+
+ if(!model || !activeCategory) return null;
+
+ return (
+
+
+ { model.canSetGender &&
+ <>
+ setGender(FigureData.MALE) }>
+
+
+ setGender(FigureData.FEMALE) }>
+
+
+ > }
+ { !model.canSetGender && model.categories && (model.categories.size > 0) && Array.from(model.categories.keys()).map(name =>
+ {
+ const category = model.categories.get(name);
+
+ return (
+ selectCategory(name) }>
+
+
+ );
+ }) }
+
+
+
+
+
+ { (maxPaletteCount >= 1) &&
+ }
+ { (maxPaletteCount === 2) &&
+ }
+
+
+ );
+}
diff --git a/src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx b/src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx
new file mode 100644
index 000000000..830835291
--- /dev/null
+++ b/src/components/avatar-editor/views/AvatarEditorWardrobeView.tsx
@@ -0,0 +1,79 @@
+import { IAvatarFigureContainer, SaveWardrobeOutfitMessageComposer } from '@nitrots/nitro-renderer';
+import { Dispatch, FC, SetStateAction, useCallback, useMemo } from 'react';
+import { FigureData, GetAvatarRenderManager, GetClubMemberLevel, GetConfiguration, LocalizeText, SendMessageComposer } from '../../../api';
+import { AutoGrid, Base, Button, Flex, LayoutAvatarImageView, LayoutCurrencyIcon, LayoutGridItem } from '../../../common';
+
+export interface AvatarEditorWardrobeViewProps
+{
+ figureData: FigureData;
+ savedFigures: [ IAvatarFigureContainer, string ][];
+ setSavedFigures: Dispatch>;
+ loadAvatarInEditor: (figure: string, gender: string, reset?: boolean) => void;
+}
+
+export const AvatarEditorWardrobeView: FC = props =>
+{
+ const { figureData = null, savedFigures = [], setSavedFigures = null, loadAvatarInEditor = null } = props;
+
+ const hcDisabled = GetConfiguration('hc.disabled', false);
+
+ const wearFigureAtIndex = useCallback((index: number) =>
+ {
+ if((index >= savedFigures.length) || (index < 0)) return;
+
+ const [ figure, gender ] = savedFigures[index];
+
+ loadAvatarInEditor(figure.getFigureString(), gender);
+ }, [ savedFigures, loadAvatarInEditor ]);
+
+ const saveFigureAtWardrobeIndex = useCallback((index: number) =>
+ {
+ if(!figureData || (index >= savedFigures.length) || (index < 0)) return;
+
+ const newFigures = [ ...savedFigures ];
+
+ const figure = figureData.getFigureString();
+ const gender = figureData.gender;
+
+ newFigures[index] = [ GetAvatarRenderManager().createFigureContainer(figure), gender ];
+
+ setSavedFigures(newFigures);
+ SendMessageComposer(new SaveWardrobeOutfitMessageComposer((index + 1), figure, gender));
+ }, [ figureData, savedFigures, setSavedFigures ]);
+
+ const figures = useMemo(() =>
+ {
+ if(!savedFigures || !savedFigures.length) return [];
+
+ const items: JSX.Element[] = [];
+
+ savedFigures.forEach(([ figureContainer, gender ], index) =>
+ {
+ let clubLevel = 0;
+
+ if(figureContainer) clubLevel = GetAvatarRenderManager().getFigureClubLevel(figureContainer, gender);
+
+ items.push(
+
+ { figureContainer &&
+ }
+
+ { !hcDisabled && (clubLevel > 0) && }
+
+ saveFigureAtWardrobeIndex(index) }>{ LocalizeText('avatareditor.wardrobe.save') }
+ { figureContainer &&
+ wearFigureAtIndex(index) } disabled={ (clubLevel > GetClubMemberLevel()) }>{ LocalizeText('widget.generic_usable.button.use') } }
+
+
+ );
+ });
+
+ return items;
+ }, [ savedFigures, hcDisabled, saveFigureAtWardrobeIndex, wearFigureAtIndex ]);
+
+ return (
+
+ { figures }
+
+ );
+}
diff --git a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx
new file mode 100644
index 000000000..fd28dc55d
--- /dev/null
+++ b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetItemView.tsx
@@ -0,0 +1,35 @@
+import { FC, useEffect, useState } from 'react';
+import { AvatarEditorGridPartItem, GetConfiguration } from '../../../../api';
+import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common';
+import { AvatarEditorIcon } from '../AvatarEditorIcon';
+
+export interface AvatarEditorFigureSetItemViewProps extends LayoutGridItemProps
+{
+ partItem: AvatarEditorGridPartItem;
+}
+
+export const AvatarEditorFigureSetItemView: FC = props =>
+{
+ const { partItem = null, children = null, ...rest } = props;
+ const [ updateId, setUpdateId ] = useState(-1);
+
+ const hcDisabled = GetConfiguration('hc.disabled', false);
+
+ useEffect(() =>
+ {
+ const rerender = () => setUpdateId(prevValue => (prevValue + 1));
+
+ partItem.notify = rerender;
+
+ return () => partItem.notify = null;
+ }, [ partItem ]);
+
+ return (
+
+ { !hcDisabled && partItem.isHC && }
+ { partItem.isClear && }
+ { partItem.isSellable && }
+ { children }
+
+ );
+}
diff --git a/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetView.tsx b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetView.tsx
new file mode 100644
index 000000000..3755731c2
--- /dev/null
+++ b/src/components/avatar-editor/views/figure-set/AvatarEditorFigureSetView.tsx
@@ -0,0 +1,44 @@
+import { Dispatch, FC, SetStateAction, useCallback, useEffect, useRef } from 'react';
+import { AvatarEditorGridPartItem, CategoryData, IAvatarEditorCategoryModel } from '../../../../api';
+import { AutoGrid } from '../../../../common';
+import { AvatarEditorFigureSetItemView } from './AvatarEditorFigureSetItemView';
+
+export interface AvatarEditorFigureSetViewProps
+{
+ model: IAvatarEditorCategoryModel;
+ category: CategoryData;
+ setMaxPaletteCount: Dispatch>;
+}
+
+export const AvatarEditorFigureSetView: FC = props =>
+{
+ const { model = null, category = null, setMaxPaletteCount = null } = props;
+ const elementRef = useRef(null);
+
+ const selectPart = useCallback((item: AvatarEditorGridPartItem) =>
+ {
+ const index = category.parts.indexOf(item);
+
+ if(index === -1) return;
+
+ model.selectPart(category.name, index);
+
+ const partItem = category.getCurrentPart();
+
+ setMaxPaletteCount(partItem.maxColorIndex || 1);
+ }, [ model, category, setMaxPaletteCount ]);
+
+ useEffect(() =>
+ {
+ if(!model || !category || !elementRef || !elementRef.current) return;
+
+ elementRef.current.scrollTop = 0;
+ }, [ model, category ]);
+
+ return (
+
+ { (category.parts.length > 0) && category.parts.map((item, index) =>
+ selectPart(item) } />) }
+
+ );
+}
diff --git a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx
new file mode 100644
index 000000000..638a9d18b
--- /dev/null
+++ b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetItemView.tsx
@@ -0,0 +1,32 @@
+import { FC, useEffect, useState } from 'react';
+import { AvatarEditorGridColorItem, GetConfiguration } from '../../../../api';
+import { LayoutCurrencyIcon, LayoutGridItem, LayoutGridItemProps } from '../../../../common';
+
+export interface AvatarEditorPaletteSetItemProps extends LayoutGridItemProps
+{
+ colorItem: AvatarEditorGridColorItem;
+}
+
+export const AvatarEditorPaletteSetItem: FC = props =>
+{
+ const { colorItem = null, children = null, ...rest } = props;
+ const [ updateId, setUpdateId ] = useState(-1);
+
+ const hcDisabled = GetConfiguration('hc.disabled', false);
+
+ useEffect(() =>
+ {
+ const rerender = () => setUpdateId(prevValue => (prevValue + 1));
+
+ colorItem.notify = rerender;
+
+ return () => colorItem.notify = null;
+ }, [ colorItem ]);
+
+ return (
+
+ { !hcDisabled && colorItem.isHC && }
+ { children }
+
+ );
+}
diff --git a/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetView.tsx b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetView.tsx
new file mode 100644
index 000000000..c55dcb47d
--- /dev/null
+++ b/src/components/avatar-editor/views/palette-set/AvatarEditorPaletteSetView.tsx
@@ -0,0 +1,41 @@
+import { FC, useCallback, useEffect, useRef } from 'react';
+import { AvatarEditorGridColorItem, CategoryData, IAvatarEditorCategoryModel } from '../../../../api';
+import { AutoGrid } from '../../../../common';
+import { AvatarEditorPaletteSetItem } from './AvatarEditorPaletteSetItemView';
+
+export interface AvatarEditorPaletteSetViewProps
+{
+ model: IAvatarEditorCategoryModel;
+ category: CategoryData;
+ paletteSet: AvatarEditorGridColorItem[];
+ paletteIndex: number;
+}
+
+export const AvatarEditorPaletteSetView: FC = props =>
+{
+ const { model = null, category = null, paletteSet = [], paletteIndex = -1 } = props;
+ const elementRef = useRef(null);
+
+ const selectColor = useCallback((item: AvatarEditorGridColorItem) =>
+ {
+ const index = paletteSet.indexOf(item);
+
+ if(index === -1) return;
+
+ model.selectColor(category.name, index, paletteIndex);
+ }, [ model, category, paletteSet, paletteIndex ]);
+
+ useEffect(() =>
+ {
+ if(!model || !category || !elementRef || !elementRef.current) return;
+
+ elementRef.current.scrollTop = 0;
+ }, [ model, category ]);
+
+ return (
+
+ { (paletteSet.length > 0) && paletteSet.map((item, index) =>
+ selectColor(item) } />) }
+
+ );
+}
diff --git a/src/components/camera/CameraWidgetView.scss b/src/components/camera/CameraWidgetView.scss
new file mode 100644
index 000000000..aecd0b170
--- /dev/null
+++ b/src/components/camera/CameraWidgetView.scss
@@ -0,0 +1,133 @@
+.nitro-camera-capture {
+ position: relative;
+
+ .header-close {
+ top: 8px;
+ right: 8px;
+ border-radius: $border-radius;
+ box-shadow: 0 0 0 1.5px $white;
+ border: 2px solid #921911;
+ background: repeating-linear-gradient(
+ rgba(245, 80, 65, 1),
+ rgba(245, 80, 65, 1) 50%,
+ rgba(194, 48, 39, 1) 50%,
+ rgba(194, 48, 39, 1) 100%
+ );
+ cursor: pointer;
+ line-height: 1;
+ padding: 1px 3px;
+
+ &:hover {
+ filter: brightness(1.2);
+ }
+
+ &:active {
+ filter: brightness(0.8);
+ }
+ }
+
+ .camera-area {
+ position: absolute;
+ top: 37px;
+ left: 10px;
+ width: 320px;
+ height: 320px;
+ }
+
+ .camera-canvas {
+ position: relative;
+ width: 340px;
+ height: 462px;
+ background-image: url('@/assets/images/room-widgets/camera-widget/camera-spritesheet.png');
+ background-position: -1px -1px;
+ z-index: 2;
+
+ .camera-button {
+ width: 94px;
+ height: 94px;
+ cursor: pointer;
+ margin-top: 362px;
+
+ background-image: url('@/assets/images/room-widgets/camera-widget/camera-spritesheet.png');
+ background-position: -343px -321px;
+
+ &:hover {
+ background-position: -535px -321px;
+ }
+
+ &:active {
+ background-position: -439px -321px;
+ }
+ }
+
+ .camera-view-finder {
+ background-image: url('@/assets/images/room-widgets/camera-widget/camera-spritesheet.png');
+ background-position: -343px -1px;
+ }
+
+ .camera-frame {
+ .camera-frame-preview-actions {
+ background: rgba(0, 0, 0, 0.5);
+ }
+ }
+ }
+
+ .camera-roll {
+ width: 330px;
+ background: #bab8b4;
+ border-bottom-left-radius: 10px;
+ border-bottom-right-radius: 10px;
+ border: 1px solid black;
+ box-shadow: inset 1px 0px white, inset -1px -1px white;
+
+ img {
+ width: 56px;
+ height: 56px;
+ border: 1px solid black;
+ object-fit: contain;
+ image-rendering: initial;
+ }
+ }
+}
+
+.nitro-camera-editor {
+ width: $camera-editor-width;
+ height: $camera-editor-height;
+
+ .picture-preview {
+ width: 320px;
+ height: 320px;
+ }
+
+ .layout-grid-item {
+ height: 60px !important;
+ max-height: 60px !important;
+ }
+
+ .effect-thumbnail-image {
+ img {
+ width: 50px;
+ height: 50px;
+ image-rendering: auto;
+ object-fit: contain;
+ }
+ }
+
+ .remove-effect {
+ position: absolute;
+ top: 1px;
+ right: 1px;
+ padding: 2px;
+ font-size: 10px;
+ min-height: unset;
+ }
+}
+
+.nitro-camera-checkout {
+ width: $camera-checkout-width;
+
+ .picture-preview {
+ width: 320px;
+ height: 320px;
+ }
+}
diff --git a/src/components/camera/CameraWidgetView.tsx b/src/components/camera/CameraWidgetView.tsx
new file mode 100644
index 000000000..930ccea43
--- /dev/null
+++ b/src/components/camera/CameraWidgetView.tsx
@@ -0,0 +1,97 @@
+import { ILinkEventTracker, RoomSessionEvent } from '@nitrots/nitro-renderer';
+import { FC, useEffect, useState } from 'react';
+import { AddEventLinkTracker, RemoveLinkEventTracker } from '../../api';
+import { useCamera, useNitroEvent } from '../../hooks';
+import { CameraWidgetCaptureView } from './views/CameraWidgetCaptureView';
+import { CameraWidgetCheckoutView } from './views/CameraWidgetCheckoutView';
+import { CameraWidgetEditorView } from './views/editor/CameraWidgetEditorView';
+
+const MODE_NONE: number = 0;
+const MODE_CAPTURE: number = 1;
+const MODE_EDITOR: number = 2;
+const MODE_CHECKOUT: number = 3;
+
+export const CameraWidgetView: FC<{}> = props =>
+{
+ const [ mode, setMode ] = useState(MODE_NONE);
+ const [ base64Url, setSavedPictureUrl ] = useState(null);
+ const { availableEffects = [], selectedPictureIndex = -1, cameraRoll = [], setCameraRoll = null, myLevel = 0, price = { credits: 0, duckets: 0, publishDucketPrice: 0 }} = useCamera();
+
+ const processAction = (type: string) =>
+ {
+ switch(type)
+ {
+ case 'close':
+ setMode(MODE_NONE);
+ return;
+ case 'edit':
+ setMode(MODE_EDITOR);
+ return;
+ case 'delete':
+ setCameraRoll(prevValue =>
+ {
+ const clone = [ ...prevValue ];
+
+ clone.splice(selectedPictureIndex, 1);
+
+ return clone;
+ });
+ return;
+ case 'editor_cancel':
+ setMode(MODE_CAPTURE);
+ return;
+ }
+ }
+
+ const checkoutPictureUrl = (pictureUrl: string) =>
+ {
+ setSavedPictureUrl(pictureUrl);
+ setMode(MODE_CHECKOUT);
+ }
+
+ useNitroEvent(RoomSessionEvent.ENDED, event => setMode(MODE_NONE));
+
+ useEffect(() =>
+ {
+ const linkTracker: ILinkEventTracker = {
+ linkReceived: (url: string) =>
+ {
+ const parts = url.split('/');
+
+ if(parts.length < 2) return;
+
+ switch(parts[1])
+ {
+ case 'show':
+ setMode(MODE_CAPTURE);
+ return;
+ case 'hide':
+ setMode(MODE_NONE);
+ return;
+ case 'toggle':
+ setMode(prevValue =>
+ {
+ if(!prevValue) return MODE_CAPTURE;
+ else return MODE_NONE;
+ });
+ return;
+ }
+ },
+ eventUrlPrefix: 'camera/'
+ };
+
+ AddEventLinkTracker(linkTracker);
+
+ return () => RemoveLinkEventTracker(linkTracker);
+ }, []);
+
+ if(mode === MODE_NONE) return null;
+
+ return (
+ <>
+ { (mode === MODE_CAPTURE) && processAction('close') } onEdit={ () => processAction('edit') } onDelete={ () => processAction('delete') } /> }
+ { (mode === MODE_EDITOR) && processAction('close') } onCancel={ () => processAction('editor_cancel') } onCheckout={ checkoutPictureUrl } availableEffects={ availableEffects } /> }
+ { (mode === MODE_CHECKOUT) && processAction('close') } onCancelClick={ () => processAction('editor_cancel') } price={ price }> }
+ >
+ );
+}
diff --git a/src/components/camera/views/CameraWidgetCaptureView.tsx b/src/components/camera/views/CameraWidgetCaptureView.tsx
new file mode 100644
index 000000000..75aeaae6d
--- /dev/null
+++ b/src/components/camera/views/CameraWidgetCaptureView.tsx
@@ -0,0 +1,90 @@
+import { NitroRectangle, TextureUtils } from '@nitrots/nitro-renderer';
+import { FC, useRef } from 'react';
+import { FaTimes } from 'react-icons/fa';
+import { CameraPicture, GetRoomEngine, GetRoomSession, LocalizeText, PlaySound, SoundNames } from '../../../api';
+import { Column, DraggableWindow, Flex } from '../../../common';
+import { useCamera, useNotification } from '../../../hooks';
+
+export interface CameraWidgetCaptureViewProps
+{
+ onClose: () => void;
+ onEdit: () => void;
+ onDelete: () => void;
+}
+
+const CAMERA_ROLL_LIMIT: number = 5;
+
+export const CameraWidgetCaptureView: FC = props =>
+{
+ const { onClose = null, onEdit = null, onDelete = null } = props;
+ const { cameraRoll = null, setCameraRoll = null, selectedPictureIndex = -1, setSelectedPictureIndex = null } = useCamera();
+ const { simpleAlert = null } = useNotification();
+ const elementRef = useRef();
+
+ const selectedPicture = ((selectedPictureIndex > -1) ? cameraRoll[selectedPictureIndex] : null);
+
+ const getCameraBounds = () =>
+ {
+ if(!elementRef || !elementRef.current) return null;
+
+ const frameBounds = elementRef.current.getBoundingClientRect();
+
+ return new NitroRectangle(Math.floor(frameBounds.x), Math.floor(frameBounds.y), Math.floor(frameBounds.width), Math.floor(frameBounds.height));
+ }
+
+ const takePicture = async () =>
+ {
+ if(selectedPictureIndex > -1)
+ {
+ setSelectedPictureIndex(-1);
+ return;
+ }
+
+ const texture = GetRoomEngine().createTextureFromRoom(GetRoomSession().roomId, 1, getCameraBounds());
+
+ const clone = [ ...cameraRoll ];
+
+ if(clone.length >= CAMERA_ROLL_LIMIT)
+ {
+ simpleAlert(LocalizeText('camera.full.body'));
+
+ clone.pop();
+ }
+
+ PlaySound(SoundNames.CAMERA_SHUTTER);
+ clone.push(new CameraPicture(texture, await TextureUtils.generateImageUrl(texture)));
+
+ setCameraRoll(clone);
+ }
+
+ return (
+
+
+ { selectedPicture && }
+
+
+
+
+ { !selectedPicture &&
}
+ { selectedPicture &&
+
+
+ { LocalizeText('camera.editor.button.text') }
+ { LocalizeText('camera.delete.button.text') }
+
+
}
+
+
+ { (cameraRoll.length > 0) &&
+
+ { cameraRoll.map((picture, index) =>
+ {
+ return setSelectedPictureIndex(index) } />;
+ }) }
+ }
+
+
+ );
+}
diff --git a/src/components/camera/views/CameraWidgetCheckoutView.tsx b/src/components/camera/views/CameraWidgetCheckoutView.tsx
new file mode 100644
index 000000000..6ee92f5ad
--- /dev/null
+++ b/src/components/camera/views/CameraWidgetCheckoutView.tsx
@@ -0,0 +1,159 @@
+import { CameraPublishStatusMessageEvent, CameraPurchaseOKMessageEvent, CameraStorageUrlMessageEvent, PublishPhotoMessageComposer, PurchasePhotoMessageComposer } from '@nitrots/nitro-renderer';
+import { FC, useEffect, useMemo, useState } from 'react';
+import { CreateLinkEvent, GetConfiguration, GetRoomEngine, LocalizeText, SendMessageComposer } from '../../../api';
+import { Button, Column, Flex, LayoutCurrencyIcon, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../../common';
+import { useMessageEvent } from '../../../hooks';
+
+export interface CameraWidgetCheckoutViewProps
+{
+ base64Url: string;
+ onCloseClick: () => void;
+ onCancelClick: () => void;
+ price: { credits: number, duckets: number, publishDucketPrice: number };
+}
+
+export const CameraWidgetCheckoutView: FC = props =>
+{
+ const { base64Url = null, onCloseClick = null, onCancelClick = null, price = null } = props;
+ const [ pictureUrl, setPictureUrl ] = useState(null);
+ const [ publishUrl, setPublishUrl ] = useState(null);
+ const [ picturesBought, setPicturesBought ] = useState(0);
+ const [ wasPicturePublished, setWasPicturePublished ] = useState(false);
+ const [ isWaiting, setIsWaiting ] = useState(false);
+ const [ publishCooldown, setPublishCooldown ] = useState(0);
+
+ const publishDisabled = useMemo(() => GetConfiguration('camera.publish.disabled', false), []);
+
+ useMessageEvent(CameraPurchaseOKMessageEvent, event =>
+ {
+ setPicturesBought(value => (value + 1));
+ setIsWaiting(false);
+ });
+
+ useMessageEvent(CameraPublishStatusMessageEvent, event =>
+ {
+ const parser = event.getParser();
+
+ setPublishUrl(parser.extraDataId);
+ setPublishCooldown(parser.secondsToWait);
+ setWasPicturePublished(parser.ok);
+ setIsWaiting(false);
+ });
+
+ useMessageEvent(CameraStorageUrlMessageEvent, event =>
+ {
+ const parser = event.getParser();
+
+ setPictureUrl(GetConfiguration('camera.url') + '/' + parser.url);
+ });
+
+ const processAction = (type: string, value: string | number = null) =>
+ {
+ switch(type)
+ {
+ case 'close':
+ onCloseClick();
+ return;
+ case 'buy':
+ if(isWaiting) return;
+
+ setIsWaiting(true);
+ SendMessageComposer(new PurchasePhotoMessageComposer(''));
+ return;
+ case 'publish':
+ if(isWaiting) return;
+
+ setIsWaiting(true);
+ SendMessageComposer(new PublishPhotoMessageComposer());
+ return;
+ case 'cancel':
+ onCancelClick();
+ return;
+ }
+ }
+
+ useEffect(() =>
+ {
+ if(!base64Url) return;
+
+ GetRoomEngine().saveBase64AsScreenshot(base64Url);
+ }, [ base64Url ]);
+
+ if(!price) return null;
+
+ return (
+
+ processAction('close') } />
+
+
+ { (pictureUrl && pictureUrl.length) &&
+ }
+ { (!pictureUrl || !pictureUrl.length) &&
+
+ { LocalizeText('camera.loading') }
+ }
+
+
+
+
+ { LocalizeText('camera.purchase.header') }
+
+ { ((price.credits > 0) || (price.duckets > 0)) &&
+
+ { LocalizeText('catalog.purchase.confirmation.dialog.cost') }
+ { (price.credits > 0) &&
+
+ { price.credits }
+
+ }
+ { (price.duckets > 0) &&
+
+ { price.duckets }
+
+ }
+ }
+ { (picturesBought > 0) &&
+
+ { LocalizeText('camera.purchase.count.info') } { picturesBought }
+ CreateLinkEvent('inventory/toggle') }>{ LocalizeText('camera.open.inventory') }
+ }
+
+
+ processAction('buy') }>{ LocalizeText(!picturesBought ? 'buy' : 'camera.buy.another.button.text') }
+
+
+ { !publishDisabled &&
+
+
+
+ { LocalizeText(wasPicturePublished ? 'camera.publish.successful' : 'camera.publish.explanation') }
+
+
+ { LocalizeText(wasPicturePublished ? 'camera.publish.success.short.info' : 'camera.publish.detailed.explanation') }
+
+ { wasPicturePublished && { LocalizeText('camera.link.to.published') } }
+ { !wasPicturePublished && (price.publishDucketPrice > 0) &&
+
+ { LocalizeText('catalog.purchase.confirmation.dialog.cost') }
+
+ { price.publishDucketPrice }
+
+
+ }
+ { (publishCooldown > 0) && { LocalizeText('camera.publish.wait', [ 'minutes' ], [ Math.ceil( publishCooldown / 60).toString() ]) }
}
+
+ { !wasPicturePublished &&
+
+ 0)) } onClick={ event => processAction('publish') }>
+ { LocalizeText('camera.publish.button.text') }
+
+ }
+ }
+ { LocalizeText('camera.warning.disclaimer') }
+
+ processAction('cancel') }>{ LocalizeText('generic.cancel') }
+
+
+
+ );
+}
diff --git a/src/components/camera/views/CameraWidgetShowPhotoView.tsx b/src/components/camera/views/CameraWidgetShowPhotoView.tsx
new file mode 100644
index 000000000..8614695df
--- /dev/null
+++ b/src/components/camera/views/CameraWidgetShowPhotoView.tsx
@@ -0,0 +1,71 @@
+import { FC, useEffect, useState } from 'react';
+import { FaArrowLeft, FaArrowRight } from 'react-icons/fa';
+import { GetUserProfile, IPhotoData, LocalizeText } from '../../../api';
+import { Flex, Grid, Text } from '../../../common';
+
+export interface CameraWidgetShowPhotoViewProps
+{
+ currentIndex: number;
+ currentPhotos: IPhotoData[];
+}
+
+export const CameraWidgetShowPhotoView: FC = props =>
+{
+ const { currentIndex = -1, currentPhotos = null } = props;
+ const [ imageIndex, setImageIndex ] = useState(0);
+
+ const currentImage = (currentPhotos && currentPhotos.length) ? currentPhotos[imageIndex] : null;
+
+ const next = () =>
+ {
+ setImageIndex(prevValue =>
+ {
+ let newIndex = (prevValue + 1);
+
+ if(newIndex >= currentPhotos.length) newIndex = 0;
+
+ return newIndex;
+ });
+ }
+
+ const previous = () =>
+ {
+ setImageIndex(prevValue =>
+ {
+ let newIndex = (prevValue - 1);
+
+ if(newIndex < 0) newIndex = (currentPhotos.length - 1);
+
+ return newIndex;
+ });
+ }
+
+ useEffect(() =>
+ {
+ setImageIndex(currentIndex);
+ }, [ currentIndex ]);
+
+ if(!currentImage) return null;
+
+ return (
+
+
+ { !currentImage.w &&
+ { LocalizeText('camera.loading') } }
+
+ { currentImage.m && currentImage.m.length &&
+ { currentImage.m } }
+
+ { (currentImage.n || '') }
+ { new Date(currentImage.t * 1000).toLocaleDateString() }
+
+ { (currentPhotos.length > 1) &&
+
+
+ GetUserProfile(currentImage.oi) }>{ currentImage.o }
+
+
+ }
+
+ );
+}
diff --git a/src/components/camera/views/editor/CameraWidgetEditorView.tsx b/src/components/camera/views/editor/CameraWidgetEditorView.tsx
new file mode 100644
index 000000000..fd085b77f
--- /dev/null
+++ b/src/components/camera/views/editor/CameraWidgetEditorView.tsx
@@ -0,0 +1,243 @@
+import { IRoomCameraWidgetEffect, IRoomCameraWidgetSelectedEffect, RoomCameraWidgetSelectedEffect } from '@nitrots/nitro-renderer';
+import { FC, useCallback, useEffect, useMemo, useState } from 'react';
+import { FaSave, FaSearchMinus, FaSearchPlus, FaTrash } from 'react-icons/fa';
+import ReactSlider from 'react-slider';
+import { CameraEditorTabs, CameraPicture, CameraPictureThumbnail, GetRoomCameraWidgetManager, LocalizeText } from '../../../../api';
+import { Button, ButtonGroup, Column, Flex, Grid, LayoutImage, NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView, Text } from '../../../../common';
+import { CameraWidgetEffectListView } from './effect-list/CameraWidgetEffectListView';
+
+export interface CameraWidgetEditorViewProps
+{
+ picture: CameraPicture;
+ availableEffects: IRoomCameraWidgetEffect[];
+ myLevel: number;
+ onClose: () => void;
+ onCancel: () => void;
+ onCheckout: (pictureUrl: string) => void;
+}
+
+const TABS: string[] = [ CameraEditorTabs.COLORMATRIX, CameraEditorTabs.COMPOSITE ];
+
+export const CameraWidgetEditorView: FC = props =>
+{
+ const { picture = null, availableEffects = null, myLevel = 1, onClose = null, onCancel = null, onCheckout = null } = props;
+ const [ currentTab, setCurrentTab ] = useState(TABS[0]);
+ const [ selectedEffectName, setSelectedEffectName ] = useState(null);
+ const [ selectedEffects, setSelectedEffects ] = useState([]);
+ const [ effectsThumbnails, setEffectsThumbnails ] = useState([]);
+ const [ isZoomed, setIsZoomed ] = useState(false);
+ const [ currentPictureUrl, setCurrentPictureUrl ] = useState('');
+
+ const getColorMatrixEffects = useMemo(() =>
+ {
+ return availableEffects.filter(effect => effect.colorMatrix);
+ }, [ availableEffects ]);
+
+ const getCompositeEffects = useMemo(() =>
+ {
+ return availableEffects.filter(effect => effect.texture);
+ }, [ availableEffects ]);
+
+ const getEffectList = useCallback(() =>
+ {
+ if(currentTab === CameraEditorTabs.COLORMATRIX)
+ {
+ return getColorMatrixEffects;
+ }
+
+ return getCompositeEffects;
+ }, [ currentTab, getColorMatrixEffects, getCompositeEffects ]);
+
+ const getSelectedEffectIndex = useCallback((name: string) =>
+ {
+ if(!name || !name.length || !selectedEffects || !selectedEffects.length) return -1;
+
+ return selectedEffects.findIndex(effect => (effect.effect.name === name));
+ }, [ selectedEffects ])
+
+ const getCurrentEffectIndex = useMemo(() =>
+ {
+ return getSelectedEffectIndex(selectedEffectName)
+ }, [ selectedEffectName, getSelectedEffectIndex ])
+
+ const getCurrentEffect = useMemo(() =>
+ {
+ if(!selectedEffectName) return null;
+
+ return (selectedEffects[getCurrentEffectIndex] || null);
+ }, [ selectedEffectName, getCurrentEffectIndex, selectedEffects ]);
+
+ const setSelectedEffectAlpha = useCallback((alpha: number) =>
+ {
+ const index = getCurrentEffectIndex;
+
+ if(index === -1) return;
+
+ setSelectedEffects(prevValue =>
+ {
+ const clone = [ ...prevValue ];
+ const currentEffect = clone[index];
+
+ clone[getCurrentEffectIndex] = new RoomCameraWidgetSelectedEffect(currentEffect.effect, alpha);
+
+ return clone;
+ });
+ }, [ getCurrentEffectIndex, setSelectedEffects ]);
+
+ const processAction = useCallback((type: string, effectName: string = null) =>
+ {
+ switch(type)
+ {
+ case 'close':
+ onClose();
+ return;
+ case 'cancel':
+ onCancel();
+ return;
+ case 'checkout':
+ onCheckout(currentPictureUrl);
+ return;
+ case 'change_tab':
+ setCurrentTab(String(effectName));
+ return;
+ case 'select_effect': {
+ let existingIndex = getSelectedEffectIndex(effectName);
+
+ if(existingIndex >= 0) return;
+
+ const effect = availableEffects.find(effect => (effect.name === effectName));
+
+ if(!effect) return;
+
+ setSelectedEffects(prevValue =>
+ {
+ return [ ...prevValue, new RoomCameraWidgetSelectedEffect(effect, 1) ];
+ });
+
+ setSelectedEffectName(effect.name);
+ return;
+ }
+ case 'remove_effect': {
+ let existingIndex = getSelectedEffectIndex(effectName);
+
+ if(existingIndex === -1) return;
+
+ setSelectedEffects(prevValue =>
+ {
+ const clone = [ ...prevValue ];
+
+ clone.splice(existingIndex, 1);
+
+ return clone;
+ });
+
+ if(selectedEffectName === effectName) setSelectedEffectName(null);
+ return;
+ }
+ case 'clear_effects':
+ setSelectedEffectName(null);
+ setSelectedEffects([]);
+ return;
+ case 'download': {
+ (async () =>
+ {
+ const image = new Image();
+
+ image.src = currentPictureUrl
+
+ const newWindow = window.open('');
+ newWindow.document.write(image.outerHTML);
+ })();
+ return;
+ }
+ case 'zoom':
+ setIsZoomed(!isZoomed);
+ return;
+ }
+ }, [ isZoomed, availableEffects, selectedEffectName, currentPictureUrl, getSelectedEffectIndex, onCancel, onCheckout, onClose, setIsZoomed, setSelectedEffects ]);
+
+ useEffect(() =>
+ {
+ (async () =>
+ {
+ const thumbnails: CameraPictureThumbnail[] = [];
+
+ for await (const effect of availableEffects)
+ {
+ const image = await GetRoomCameraWidgetManager().applyEffects(picture.texture, [ new RoomCameraWidgetSelectedEffect(effect, 1) ], false);
+
+ thumbnails.push(new CameraPictureThumbnail(effect.name, image.src));
+ }
+
+ setEffectsThumbnails(thumbnails);
+ })();
+ }, [ picture, availableEffects ]);
+
+ useEffect(() =>
+ {
+ (async () =>
+ {
+ const imageUrl = await GetRoomCameraWidgetManager().applyEffects(picture.texture, selectedEffects, isZoomed);
+
+ setCurrentPictureUrl(imageUrl.src);
+ })();
+ }, [ picture, selectedEffects, isZoomed ]);
+
+ return (
+
+ processAction('close') } />
+
+ { TABS.map(tab =>
+ {
+ return processAction('change_tab', tab) }>
+ }) }
+
+
+
+
+
+
+
+
+
+ { selectedEffectName &&
+
+ { LocalizeText('camera.effect.name.' + selectedEffectName) }
+ setSelectedEffectAlpha(event) }
+ renderThumb={ (props, state) => { state.valueNow }
} />
+ }
+
+
+
+ processAction('clear_effects') }>
+
+
+ processAction('download') }>
+
+
+ processAction('zoom') }>
+ { isZoomed && }
+ { !isZoomed && }
+
+
+
+ processAction('cancel') }>
+ { LocalizeText('generic.cancel') }
+
+ processAction('checkout') }>
+ { LocalizeText('camera.preview.button.text') }
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx
new file mode 100644
index 000000000..cac3a34ba
--- /dev/null
+++ b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListItemView.tsx
@@ -0,0 +1,40 @@
+import { IRoomCameraWidgetEffect } from '@nitrots/nitro-renderer';
+import { FC } from 'react';
+import { FaLock, FaTimes } from 'react-icons/fa';
+import { LocalizeText } from '../../../../../api';
+import { Button, LayoutGridItem, Text } from '../../../../../common';
+
+export interface CameraWidgetEffectListItemViewProps
+{
+ effect: IRoomCameraWidgetEffect;
+ thumbnailUrl: string;
+ isActive: boolean;
+ isLocked: boolean;
+ selectEffect: () => void;
+ removeEffect: () => void;
+}
+
+export const CameraWidgetEffectListItemView: FC = props =>
+{
+ const { effect = null, thumbnailUrl = null, isActive = false, isLocked = false, selectEffect = null, removeEffect = null } = props;
+
+ return (
+ (!isActive && selectEffect()) }>
+ { isActive &&
+
+
+ }
+ { !isLocked && (thumbnailUrl && thumbnailUrl.length > 0) &&
+
+
+
}
+ { isLocked &&
+
+
+
+
+ { effect.minLevel }
+ }
+
+ );
+}
diff --git a/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx
new file mode 100644
index 000000000..3f67cea77
--- /dev/null
+++ b/src/components/camera/views/editor/effect-list/CameraWidgetEffectListView.tsx
@@ -0,0 +1,31 @@
+import { IRoomCameraWidgetEffect, IRoomCameraWidgetSelectedEffect } from '@nitrots/nitro-renderer';
+import { FC } from 'react';
+import { CameraPictureThumbnail } from '../../../../../api';
+import { Grid } from '../../../../../common';
+import { CameraWidgetEffectListItemView } from './CameraWidgetEffectListItemView';
+
+export interface CameraWidgetEffectListViewProps
+{
+ myLevel: number;
+ selectedEffects: IRoomCameraWidgetSelectedEffect[];
+ effects: IRoomCameraWidgetEffect[];
+ thumbnails: CameraPictureThumbnail[];
+ processAction: (type: string, name: string) => void;
+}
+
+export const CameraWidgetEffectListView: FC = props =>
+{
+ const { myLevel = 0, selectedEffects = [], effects = [], thumbnails = [], processAction = null } = props;
+
+ return (
+
+ { effects && (effects.length > 0) && effects.map((effect, index) =>
+ {
+ const thumbnailUrl = (thumbnails.find(thumbnail => (thumbnail.effectName === effect.name)));
+ const isActive = (selectedEffects.findIndex(selectedEffect => (selectedEffect.effect.name === effect.name)) > -1);
+
+ return myLevel) } selectEffect={ () => processAction('select_effect', effect.name) } removeEffect={ () => processAction('remove_effect', effect.name) } />
+ }) }
+
+ );
+}
diff --git a/src/components/campaign/CalendarItemView.tsx b/src/components/campaign/CalendarItemView.tsx
new file mode 100644
index 000000000..816fa75b5
--- /dev/null
+++ b/src/components/campaign/CalendarItemView.tsx
@@ -0,0 +1,52 @@
+import { FC } from 'react';
+import { CalendarItemState, GetConfiguration, GetRoomEngine, GetSessionDataManager, ICalendarItem } from '../../api';
+import { Base, Column, Flex, LayoutImage } from '../../common';
+
+interface CalendarItemViewProps
+{
+ itemId: number;
+ state: number;
+ active?: boolean;
+ product?: ICalendarItem;
+ onClick: (itemId: number) => void;
+}
+
+export const CalendarItemView: FC = props =>
+{
+ const { itemId = -1, state = null, product = null, active = false, onClick = null } = props;
+
+ const getFurnitureIcon = (name: string) =>
+ {
+ let furniData = GetSessionDataManager().getFloorItemDataByName(name);
+ let url = null;
+
+ if(furniData) url = GetRoomEngine().getFurnitureFloorIconUrl(furniData.id);
+ else
+ {
+ furniData = GetSessionDataManager().getWallItemDataByName(name);
+
+ if(furniData) url = GetRoomEngine().getFurnitureWallIconUrl(furniData.id);
+ }
+
+ return url;
+ }
+
+ return (
+ onClick(itemId) }>
+ { (state === CalendarItemState.STATE_UNLOCKED) &&
+
+
+ { product &&
+ ('image.library.url') + product.customImage : getFurnitureIcon(product.productName) } /> }
+
+ }
+ { (state !== CalendarItemState.STATE_UNLOCKED) &&
+
+ { (state === CalendarItemState.STATE_LOCKED_AVAILABLE) &&
+ }
+ { ((state === CalendarItemState.STATE_LOCKED_EXPIRED) || (state === CalendarItemState.STATE_LOCKED_FUTURE)) &&
+ }
+ }
+
+ );
+}
diff --git a/src/components/campaign/CalendarView.tsx b/src/components/campaign/CalendarView.tsx
new file mode 100644
index 000000000..e29612945
--- /dev/null
+++ b/src/components/campaign/CalendarView.tsx
@@ -0,0 +1,143 @@
+import { FC, useState } from 'react';
+import { CalendarItemState, GetSessionDataManager, ICalendarItem, LocalizeText } from '../../api';
+import { Base, Button, Column, Flex, Grid, NitroCardContentView, NitroCardHeaderView, NitroCardView, Text } from '../../common';
+import { CalendarItemView } from './CalendarItemView';
+
+interface CalendarViewProps
+{
+ onClose(): void;
+ openPackage(id: number, asStaff: boolean): void;
+ receivedProducts: Map;
+ campaignName: string;
+ currentDay: number;
+ numDays: number;
+ openedDays: number[];
+ missedDays: number[];
+}
+
+const TOTAL_SHOWN_ITEMS = 5;
+
+export const CalendarView: FC = props =>
+{
+ const { onClose = null, campaignName = null, currentDay = null, numDays = null, missedDays = null, openedDays = null, openPackage = null, receivedProducts = null } = props;
+ const [ selectedDay, setSelectedDay ] = useState(currentDay);
+ const [ index, setIndex ] = useState(Math.max(0, (selectedDay - 1)));
+
+ const getDayState = (day: number) =>
+ {
+ if(openedDays.includes(day)) return CalendarItemState.STATE_UNLOCKED;
+
+ if(day > currentDay) return CalendarItemState.STATE_LOCKED_FUTURE;
+
+ if(missedDays.includes(day)) return CalendarItemState.STATE_LOCKED_EXPIRED;
+
+ return CalendarItemState.STATE_LOCKED_AVAILABLE;
+ }
+
+ const dayMessage = (day: number) =>
+ {
+ const state = getDayState(day);
+
+ switch(state)
+ {
+ case CalendarItemState.STATE_UNLOCKED:
+ return LocalizeText('campaign.calendar.info.unlocked');
+ case CalendarItemState.STATE_LOCKED_FUTURE:
+ return LocalizeText('campaign.calendar.info.future');
+ case CalendarItemState.STATE_LOCKED_EXPIRED:
+ return LocalizeText('campaign.calendar.info.expired');
+ default:
+ return LocalizeText('campaign.calendar.info.available.desktop');
+ }
+ }
+
+ const onClickNext = () =>
+ {
+ const nextDay = (selectedDay + 1);
+
+ if(nextDay === numDays) return;
+
+ setSelectedDay(nextDay);
+
+ if((index + TOTAL_SHOWN_ITEMS) < (nextDay + 1)) setIndex(index + 1);
+ }
+
+ const onClickPrev = () =>
+ {
+ const prevDay = (selectedDay - 1);
+
+ if(prevDay < 0) return;
+
+ setSelectedDay(prevDay);
+
+ if(index > prevDay) setIndex(index - 1);
+ }
+
+ const onClickItem = (item: number) =>
+ {
+ if(selectedDay === item)
+ {
+ const state = getDayState(item);
+
+ if(state === CalendarItemState.STATE_LOCKED_AVAILABLE) openPackage(item, false);
+
+ return;
+ }
+
+ setSelectedDay(item);
+ }
+
+ const forceOpen = () =>
+ {
+ const id = selectedDay;
+ const state = getDayState(id);
+
+ if(state !== CalendarItemState.STATE_UNLOCKED) openPackage(id, true);
+ }
+
+ return (
+
+
+
+
+
+
+