`s.
+
+.nav {
+ 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 hover-focus {
+ text-decoration: none;
+ }
+
+ // Disabled state lightens text
+ &.disabled {
+ color: $nav-disabled-link-color;
+ }
+}
+
+//
+// Tabs
+//
+
+.nav-tabs {
+ border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
+
+ .nav-item {
+ margin-bottom: -$nav-tabs-border-width;
+ }
+
+ .nav-link {
+ border: $nav-tabs-border-width solid transparent;
+ @include border-top-radius($nav-tabs-border-radius);
+
+ @include hover-focus {
+ border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;
+ }
+
+ &.disabled {
+ color: $nav-disabled-link-color;
+ background-color: transparent;
+ border-color: transparent;
+ }
+ }
+
+ .nav-link.active,
+ .nav-item.show .nav-link {
+ color: $nav-tabs-active-link-color;
+ background-color: $nav-tabs-active-link-bg;
+ border-color: $nav-tabs-active-link-border-color $nav-tabs-active-link-border-color $nav-tabs-active-link-bg;
+ }
+
+ .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 {
+ @include border-radius($nav-pills-border-radius);
+
+ &.active,
+ .show & {
+ color: $nav-pills-active-link-color;
+ background-color: $nav-pills-active-link-bg;
+ }
+ }
+}
+
+
+//
+// Justified variants
+//
+
+.nav-fill {
+ .nav-item {
+ flex: 1 1 auto;
+ text-align: center;
+ }
+}
+
+.nav-justified {
+ .nav-item {
+ flex-basis: 0;
+ flex-grow: 1;
+ text-align: center;
+ }
+}
+
+
+// Tabbable tabs
+//
+// Hide tabbable panes to start, show them when `.active`
+
+.tab-content {
+ > .tab-pane {
+ display: none;
+ }
+ > .active {
+ display: block;
+ }
+}
diff --git a/src/scss/bootstrap/_navbar.scss b/src/scss/bootstrap/_navbar.scss
new file mode 100644
index 0000000..c73fc01
--- /dev/null
+++ b/src/scss/bootstrap/_navbar.scss
@@ -0,0 +1,284 @@
+// Contents
+//
+// Navbar
+// Navbar brand
+// Navbar nav
+// Navbar text
+// Navbar divider
+// Responsive navbar
+// Navbar position
+// Navbar themes
+
+
+// Navbar
+//
+// Provide a static navbar from which we expand to create full-width, fixed, and
+// other navbar variations.
+
+.navbar {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap; // allow us to do the line break for collapsing content
+ align-items: center;
+ justify-content: space-between; // space out brand from logo
+ padding: $navbar-padding-y $navbar-padding-x;
+
+ // Because flex properties aren't inherited, we need to redeclare these first
+ // few properities so that content nested within behave properly.
+ > .container,
+ > .container-fluid {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+
+ @include media-breakpoint-down(nth(map-keys($grid-breakpoints), 1)) {
+ width: 100%; // prevent flex parent container from collapsing
+ margin-right: 0;
+ margin-left: 0;
+ }
+ }
+}
+
+
+// Navbar brand
+//
+// Used for brand, project, or site names.
+
+.navbar-brand {
+ display: inline-block;
+ padding-top: $navbar-brand-padding-y;
+ padding-bottom: $navbar-brand-padding-y;
+ margin-right: $navbar-padding-x;
+ font-size: $navbar-brand-font-size;
+ line-height: inherit;
+ white-space: nowrap;
+
+ @include hover-focus {
+ text-decoration: none;
+ }
+}
+
+
+// Navbar nav
+//
+// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
+
+.navbar-nav {
+ display: flex;
+ flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
+ padding-left: 0;
+ margin-bottom: 0;
+ list-style: none;
+
+ .nav-link {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+
+
+// Navbar text
+//
+//
+
+.navbar-text {
+ display: inline-block;
+ padding-top: $nav-link-padding-y;
+ padding-bottom: $nav-link-padding-y;
+}
+
+
+// Responsive navbar
+//
+// Custom styles for responsive collapsing and toggling of navbar contents.
+// Powered by the collapse Bootstrap JavaScript plugin.
+
+// When collapsed, prevent the toggleable navbar contents from appearing in
+// the default flexbox row orienation. Requires the use of `flex-wrap: wrap`
+// on the `.navbar` parent.
+.navbar-collapse {
+ flex-basis: 100%;
+}
+
+// Button for toggling the navbar when in its collapsed state
+.navbar-toggler {
+ padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;
+ font-size: $navbar-toggler-font-size;
+ line-height: 1;
+ background: transparent; // remove default button style
+ border: $border-width solid transparent; // remove default button style
+ @include border-radius($navbar-toggler-border-radius);
+
+ @include hover-focus {
+ text-decoration: none;
+ }
+}
+
+// Keep as a separate element so folks can easily override it with another icon
+// or image file as needed.
+.navbar-toggler-icon {
+ display: inline-block;
+ width: 1.5em;
+ height: 1.5em;
+ vertical-align: middle;
+ content: "";
+ background: no-repeat center center;
+ background-size: 100% 100%;
+}
+
+// Generate series of `.navbar-expand-*` responsive classes for configuring
+// where your navbar collapses.
+.navbar-expand {
+ @each $breakpoint in map-keys($grid-breakpoints) {
+ $next: breakpoint-next($breakpoint, $grid-breakpoints);
+ $infix: breakpoint-infix($next, $grid-breakpoints);
+
+ {$infix} {
+ @include media-breakpoint-down($breakpoint) {
+ .navbar-nav {
+ .dropdown-menu {
+ position: static;
+ float: none;
+ }
+ }
+
+ > .container,
+ > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+ }
+
+ @include media-breakpoint-up($next) {
+ flex-direction: row;
+ flex-wrap: nowrap;
+ justify-content: flex-start;
+
+ .navbar-nav {
+ flex-direction: row;
+
+ .dropdown-menu {
+ position: absolute;
+ }
+
+ .nav-link {
+ padding-right: .5rem;
+ padding-left: .5rem;
+ }
+ }
+
+ // For nesting containers, have to redeclare for alignment purposes
+ > .container,
+ > .container-fluid {
+ flex-wrap: nowrap;
+ }
+
+ // scss-lint:disable ImportantRule
+ .navbar-collapse {
+ display: flex !important;
+ }
+ // scss-lint:enable ImportantRule
+
+ .navbar-toggler {
+ display: none;
+ }
+ }
+ }
+ }
+}
+
+
+// Navbar themes
+//
+// Styles for switching between navbars with light or dark background.
+
+// Dark links against a light background
+.navbar-light {
+ .navbar-brand {
+ color: $navbar-light-active-color;
+
+ @include hover-focus {
+ color: $navbar-light-active-color;
+ }
+ }
+
+ .navbar-nav {
+ .nav-link {
+ color: $navbar-light-color;
+
+ @include hover-focus {
+ color: $navbar-light-hover-color;
+ }
+
+ &.disabled {
+ color: $navbar-light-disabled-color;
+ }
+ }
+
+ .show > .nav-link,
+ .active > .nav-link,
+ .nav-link.show,
+ .nav-link.active {
+ color: $navbar-light-active-color;
+ }
+ }
+
+ .navbar-toggler {
+ color: $navbar-light-color;
+ border-color: $navbar-light-toggler-border-color;
+ }
+
+ .navbar-toggler-icon {
+ background-image: $navbar-light-toggler-bg;
+ }
+
+ .navbar-text {
+ color: $navbar-light-color;
+ }
+}
+
+// White links against a dark background
+.navbar-inverse {
+ .navbar-brand {
+ color: $navbar-inverse-active-color;
+
+ @include hover-focus {
+ color: $navbar-inverse-active-color;
+ }
+ }
+
+ .navbar-nav {
+ .nav-link {
+ color: $navbar-inverse-color;
+
+ @include hover-focus {
+ color: $navbar-inverse-hover-color;
+ }
+
+ &.disabled {
+ color: $navbar-inverse-disabled-color;
+ }
+ }
+
+ .show > .nav-link,
+ .active > .nav-link,
+ .nav-link.show,
+ .nav-link.active {
+ color: $navbar-inverse-active-color;
+ }
+ }
+
+ .navbar-toggler {
+ color: $navbar-inverse-color;
+ border-color: $navbar-inverse-toggler-border-color;
+ }
+
+ .navbar-toggler-icon {
+ background-image: $navbar-inverse-toggler-bg;
+ }
+
+ .navbar-text {
+ color: $navbar-inverse-color;
+ }
+}
diff --git a/src/scss/bootstrap/_normalize.scss b/src/scss/bootstrap/_normalize.scss
new file mode 100644
index 0000000..6bafd53
--- /dev/null
+++ b/src/scss/bootstrap/_normalize.scss
@@ -0,0 +1,461 @@
+/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */
+
+//
+// 1. Change the default font family in all browsers (opinionated).
+// 2. Correct the line height in all browsers.
+// 3. Prevent adjustments of font size after orientation changes in
+// IE on Windows Phone and in iOS.
+//
+
+// Document
+// ==========================================================================
+
+html {
+ font-family: sans-serif; // 1
+ line-height: 1.15; // 2
+ -ms-text-size-adjust: 100%; // 3
+ -webkit-text-size-adjust: 100%; // 3
+}
+
+// Sections
+// ==========================================================================
+
+//
+// Remove the margin in all browsers (opinionated).
+//
+
+body {
+ margin: 0;
+}
+
+//
+// Add the correct display in IE 9-.
+//
+
+article,
+aside,
+footer,
+header,
+nav,
+section {
+ display: block;
+}
+
+//
+// Correct the font size and margin on `h1` elements within `section` and
+// `article` contexts in Chrome, Firefox, and Safari.
+//
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+// Grouping content
+// ==========================================================================
+
+//
+// Add the correct display in IE 9-.
+// 1. Add the correct display in IE.
+//
+
+figcaption,
+figure,
+main { // 1
+ display: block;
+}
+
+//
+// Add the correct margin in IE 8.
+//
+
+figure {
+ margin: 1em 40px;
+}
+
+//
+// 1. Add the correct box sizing in Firefox.
+// 2. Show the overflow in Edge and IE.
+//
+
+hr {
+ box-sizing: content-box; // 1
+ height: 0; // 1
+ overflow: visible; // 2
+}
+
+//
+// 1. Correct the inheritance and scaling of font size in all browsers.
+// 2. Correct the odd `em` font sizing in all browsers.
+//
+
+pre {
+ font-family: monospace, monospace; // 1
+ font-size: 1em; // 2
+}
+
+// Text-level semantics
+// ==========================================================================
+
+//
+// 1. Remove the gray background on active links in IE 10.
+// 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
+//
+
+a {
+ background-color: transparent; // 1
+ -webkit-text-decoration-skip: objects; // 2
+}
+
+//
+// Remove the outline on focused links when they are also active or hovered
+// in all browsers (opinionated).
+//
+
+a:active,
+a:hover {
+ outline-width: 0;
+}
+
+//
+// 1. Remove the bottom border in Firefox 39-.
+// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+//
+
+abbr[title] {
+ border-bottom: none; // 1
+ text-decoration: underline; // 2
+ text-decoration: underline dotted; // 2
+}
+
+//
+// Prevent the duplicate application of `bolder` by the next rule in Safari 6.
+//
+
+b,
+strong {
+ font-weight: inherit;
+}
+
+//
+// Add the correct font weight in Chrome, Edge, and Safari.
+//
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+//
+// 1. Correct the inheritance and scaling of font size in all browsers.
+// 2. Correct the odd `em` font sizing in all browsers.
+//
+
+code,
+kbd,
+samp {
+ font-family: monospace, monospace; // 1
+ font-size: 1em; // 2
+}
+
+//
+// Add the correct font style in Android 4.3-.
+//
+
+dfn {
+ font-style: italic;
+}
+
+//
+// Add the correct background and color in IE 9-.
+//
+
+mark {
+ background-color: #ff0;
+ color: #000;
+}
+
+//
+// Add the correct font size in all browsers.
+//
+
+small {
+ font-size: 80%;
+}
+
+//
+// Prevent `sub` and `sup` elements from affecting the line height in
+// all browsers.
+//
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+// Embedded content
+// ==========================================================================
+
+//
+// Add the correct display in IE 9-.
+//
+
+audio,
+video {
+ display: inline-block;
+}
+
+//
+// Add the correct display in iOS 4-7.
+//
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+//
+// Remove the border on images inside links in IE 10-.
+//
+
+img {
+ border-style: none;
+}
+
+//
+// Hide the overflow in IE.
+//
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+// Forms
+// ==========================================================================
+
+//
+// 1. Change the font styles in all browsers (opinionated).
+// 2. Remove the margin in Firefox and Safari.
+//
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: sans-serif; // 1
+ font-size: 100%; // 1
+ line-height: 1.15; // 1
+ margin: 0; // 2
+}
+
+//
+// Show the overflow in IE.
+// 1. Show the overflow in Edge.
+//
+
+button,
+input { // 1
+ overflow: visible;
+}
+
+//
+// Remove the inheritance of text transform in Edge, Firefox, and IE.
+// 1. Remove the inheritance of text transform in Firefox.
+//
+
+button,
+select { // 1
+ text-transform: none;
+}
+
+//
+// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
+// controls in Android 4.
+// 2. Correct the inability to style clickable types in iOS and Safari.
+//
+
+button,
+html [type="button"], // 1
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button; // 2
+}
+
+//
+// Remove the inner border and padding in Firefox.
+//
+
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+}
+
+//
+// Restore the focus styles unset by the previous rule.
+//
+
+button:-moz-focusring,
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring {
+ outline: 1px dotted ButtonText;
+}
+
+//
+// Change the border, margin, and padding in all browsers (opinionated).
+//
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+//
+// 1. Correct the text wrapping in Edge and IE.
+// 2. Correct the color inheritance from `fieldset` elements in IE.
+// 3. Remove the padding so developers are not caught out when they zero out
+// `fieldset` elements in all browsers.
+//
+
+legend {
+ box-sizing: border-box; // 1
+ color: inherit; // 2
+ display: table; // 1
+ max-width: 100%; // 1
+ padding: 0; // 3
+ white-space: normal; // 1
+}
+
+//
+// 1. Add the correct display in IE 9-.
+// 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
+//
+
+progress {
+ display: inline-block; // 1
+ vertical-align: baseline; // 2
+}
+
+//
+// Remove the default vertical scrollbar in IE.
+//
+
+textarea {
+ overflow: auto;
+}
+
+//
+// 1. Add the correct box sizing in IE 10-.
+// 2. Remove the padding in IE 10-.
+//
+
+[type="checkbox"],
+[type="radio"] {
+ box-sizing: border-box; // 1
+ padding: 0; // 2
+}
+
+//
+// Correct the cursor style of increment and decrement buttons in Chrome.
+//
+
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+//
+// 1. Correct the odd appearance in Chrome and Safari.
+// 2. Correct the outline style in Safari.
+//
+
+[type="search"] {
+ -webkit-appearance: textfield; // 1
+ outline-offset: -2px; // 2
+}
+
+//
+// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
+//
+
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+//
+// 1. Correct the inability to style clickable types in iOS and Safari.
+// 2. Change font properties to `inherit` in Safari.
+//
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button; // 1
+ font: inherit; // 2
+}
+
+// Interactive
+// ==========================================================================
+
+//
+// Add the correct display in IE 9-.
+// 1. Add the correct display in Edge, IE, and Firefox.
+//
+
+details, // 1
+menu {
+ display: block;
+}
+
+//
+// Add the correct display in all browsers.
+//
+
+summary {
+ display: list-item;
+}
+
+// Scripting
+// ==========================================================================
+
+//
+// Add the correct display in IE 9-.
+//
+
+canvas {
+ display: inline-block;
+}
+
+//
+// Add the correct display in IE.
+//
+
+template {
+ display: none;
+}
+
+// Hidden
+// ==========================================================================
+
+//
+// Add the correct display in IE 10-.
+//
+
+[hidden] {
+ display: none;
+}
diff --git a/src/scss/bootstrap/_pagination.scss b/src/scss/bootstrap/_pagination.scss
new file mode 100644
index 0000000..a049299
--- /dev/null
+++ b/src/scss/bootstrap/_pagination.scss
@@ -0,0 +1,66 @@
+.pagination {
+ display: flex;
+ // 1-2: Disable browser default list styles
+ padding-left: 0; // 1
+ list-style: none; // 2
+ @include border-radius();
+}
+
+.page-item {
+ &:first-child {
+ .page-link {
+ margin-left: 0;
+ @include border-left-radius($border-radius);
+ }
+ }
+ &:last-child {
+ .page-link {
+ @include border-right-radius($border-radius);
+ }
+ }
+
+ &.active .page-link {
+ z-index: 2;
+ color: $pagination-active-color;
+ background-color: $pagination-active-bg;
+ border-color: $pagination-active-border-color;
+ }
+
+ &.disabled .page-link {
+ color: $pagination-disabled-color;
+ pointer-events: none;
+ background-color: $pagination-disabled-bg;
+ border-color: $pagination-disabled-border-color;
+ }
+}
+
+.page-link {
+ position: relative;
+ display: block;
+ padding: $pagination-padding-y $pagination-padding-x;
+ margin-left: -1px;
+ line-height: $pagination-line-height;
+ color: $pagination-color;
+ background-color: $pagination-bg;
+ border: $pagination-border-width solid $pagination-border-color;
+
+ @include hover-focus {
+ color: $pagination-hover-color;
+ text-decoration: none;
+ background-color: $pagination-hover-bg;
+ border-color: $pagination-hover-border-color;
+ }
+}
+
+
+//
+// Sizing
+//
+
+.pagination-lg {
+ @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);
+}
+
+.pagination-sm {
+ @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);
+}
diff --git a/src/scss/bootstrap/_popover.scss b/src/scss/bootstrap/_popover.scss
new file mode 100644
index 0000000..c259916
--- /dev/null
+++ b/src/scss/bootstrap/_popover.scss
@@ -0,0 +1,173 @@
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: $zindex-popover;
+ display: block;
+ max-width: $popover-max-width;
+ padding: $popover-inner-padding;
+ // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
+ // So reset our font and text properties to avoid inheriting weird values.
+ @include reset-text();
+ font-size: $font-size-sm;
+ // Allow breaking very long words so they don't overflow the popover's bounds
+ word-wrap: break-word;
+ background-color: $popover-bg;
+ background-clip: padding-box;
+ border: $popover-border-width solid $popover-border-color;
+ @include border-radius($border-radius-lg);
+ @include box-shadow($popover-box-shadow);
+
+
+ // Popover directions
+
+ &.popover-top,
+ &.bs-tether-element-attached-bottom {
+ margin-top: -$popover-arrow-width;
+
+ &::before,
+ &::after {
+ left: 50%;
+ border-bottom-width: 0;
+ }
+
+ &::before {
+ bottom: -$popover-arrow-outer-width;
+ margin-left: -$popover-arrow-outer-width;
+ border-top-color: $popover-arrow-outer-color;
+ }
+
+ &::after {
+ bottom: -($popover-arrow-outer-width - 1);
+ margin-left: -$popover-arrow-width;
+ border-top-color: $popover-arrow-color;
+ }
+ }
+
+ &.popover-right,
+ &.bs-tether-element-attached-left {
+ margin-left: $popover-arrow-width;
+
+ &::before,
+ &::after {
+ top: 50%;
+ border-left-width: 0;
+ }
+
+ &::before {
+ left: -$popover-arrow-outer-width;
+ margin-top: -$popover-arrow-outer-width;
+ border-right-color: $popover-arrow-outer-color;
+ }
+
+ &::after {
+ left: -($popover-arrow-outer-width - 1);
+ margin-top: -($popover-arrow-outer-width - 1);
+ border-right-color: $popover-arrow-color;
+ }
+ }
+
+ &.popover-bottom,
+ &.bs-tether-element-attached-top {
+ margin-top: $popover-arrow-width;
+
+ &::before,
+ &::after {
+ left: 50%;
+ border-top-width: 0;
+ }
+
+ &::before {
+ top: -$popover-arrow-outer-width;
+ margin-left: -$popover-arrow-outer-width;
+ border-bottom-color: $popover-arrow-outer-color;
+ }
+
+ &::after {
+ top: -($popover-arrow-outer-width - 1);
+ margin-left: -$popover-arrow-width;
+ border-bottom-color: $popover-arrow-color;
+ }
+
+ // This will remove the popover-title's border just below the arrow
+ .popover-title::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: 20px;
+ margin-left: -10px;
+ content: "";
+ border-bottom: 1px solid $popover-title-bg;
+ }
+ }
+
+ &.popover-left,
+ &.bs-tether-element-attached-right {
+ margin-left: -$popover-arrow-width;
+
+ &::before,
+ &::after {
+ top: 50%;
+ border-right-width: 0;
+ }
+
+ &::before {
+ right: -$popover-arrow-outer-width;
+ margin-top: -$popover-arrow-outer-width;
+ border-left-color: $popover-arrow-outer-color;
+ }
+
+ &::after {
+ right: -($popover-arrow-outer-width - 1);
+ margin-top: -($popover-arrow-outer-width - 1);
+ border-left-color: $popover-arrow-color;
+ }
+ }
+}
+
+
+// Offset the popover to account for the popover arrow
+.popover-title {
+ padding: $popover-title-padding-y $popover-title-padding-x;
+ margin-bottom: 0; // Reset the default from Reboot
+ font-size: $font-size-base;
+ color: $popover-title-color;
+ background-color: $popover-title-bg;
+ border-bottom: $popover-border-width solid darken($popover-title-bg, 5%);
+ $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});
+ @include border-top-radius($offset-border-width);
+
+ &:empty {
+ display: none;
+ }
+}
+
+.popover-content {
+ padding: $popover-content-padding-y $popover-content-padding-x;
+ color: $popover-content-color;
+}
+
+
+// Arrows
+//
+// .popover-arrow is outer, .popover-arrow::after is inner
+
+.popover::before,
+.popover::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.popover::before {
+ content: "";
+ border-width: $popover-arrow-outer-width;
+}
+.popover::after {
+ content: "";
+ border-width: $popover-arrow-width;
+}
diff --git a/src/scss/bootstrap/_print.scss b/src/scss/bootstrap/_print.scss
new file mode 100644
index 0000000..e20219a
--- /dev/null
+++ b/src/scss/bootstrap/_print.scss
@@ -0,0 +1,119 @@
+// scss-lint:disable QualifyingElement
+
+// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css
+
+// ==========================================================================
+// Print styles.
+// Inlined to avoid the additional HTTP request:
+// http://www.phpied.com/delay-loading-your-print-css/
+// ==========================================================================
+
+@if $enable-print-styles {
+ @media print {
+ *,
+ *::before,
+ *::after,
+ p::first-letter,
+ div::first-letter,
+ blockquote::first-letter,
+ li::first-letter,
+ p::first-line,
+ div::first-line,
+ blockquote::first-line,
+ li::first-line {
+ // Bootstrap specific; comment out `color` and `background`
+ //color: #000 !important; // Black prints faster:
+ // http://www.sanbeiji.com/archives/953
+ text-shadow: none !important;
+ //background: transparent !important;
+ box-shadow: none !important;
+ }
+
+ a,
+ a:visited {
+ text-decoration: underline;
+ }
+
+ // Bootstrap specific; comment the following selector out
+ //a[href]::after {
+ // content: " (" attr(href) ")";
+ //}
+
+ abbr[title]::after {
+ content: " (" attr(title) ")";
+ }
+
+ // Bootstrap specific; comment the following selector out
+ //
+ // Don't show links that are fragment identifiers,
+ // or use the `javascript:` pseudo protocol
+ //
+
+ //a[href^="#"]::after,
+ //a[href^="javascript:"]::after {
+ // content: "";
+ //}
+
+ pre {
+ white-space: pre-wrap !important;
+ }
+ pre,
+ blockquote {
+ border: $border-width solid #999; // Bootstrap custom code; using `$border-width` instead of 1px
+ page-break-inside: avoid;
+ }
+
+ //
+ // Printing Tables:
+ // http://css-discuss.incutio.com/wiki/Printing_Tables
+ //
+
+ thead {
+ display: table-header-group;
+ }
+
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+
+ // Bootstrap specific changes start
+
+ // Bootstrap components
+ .navbar {
+ display: none;
+ }
+ .badge {
+ border: $border-width solid #000;
+ }
+
+ .table {
+ border-collapse: collapse !important;
+
+ td,
+ th {
+ background-color: #fff !important;
+ }
+ }
+ .table-bordered {
+ th,
+ td {
+ border: 1px solid #ddd !important;
+ }
+ }
+
+ // Bootstrap specific changes end
+ }
+}
diff --git a/src/scss/bootstrap/_progress.scss b/src/scss/bootstrap/_progress.scss
new file mode 100644
index 0000000..6657184
--- /dev/null
+++ b/src/scss/bootstrap/_progress.scss
@@ -0,0 +1,31 @@
+@keyframes progress-bar-stripes {
+ from { background-position: $progress-height 0; }
+ to { background-position: 0 0; }
+}
+
+.progress {
+ display: flex;
+ overflow: hidden; // force rounded corners by cropping it
+ font-size: $progress-font-size;
+ line-height: $progress-height;
+ text-align: center;
+ background-color: $progress-bg;
+ @include border-radius($progress-border-radius);
+}
+
+.progress-bar {
+ height: $progress-height;
+ line-height: $progress-height;
+ color: $progress-bar-color;
+ background-color: $progress-bar-bg;
+ @include transition($progress-bar-transition);
+}
+
+.progress-bar-striped {
+ @include gradient-striped();
+ background-size: $progress-height $progress-height;
+}
+
+.progress-bar-animated {
+ animation: progress-bar-stripes $progress-bar-animation-timing;
+}
diff --git a/src/scss/bootstrap/_reboot.scss b/src/scss/bootstrap/_reboot.scss
new file mode 100644
index 0000000..6a8c6ab
--- /dev/null
+++ b/src/scss/bootstrap/_reboot.scss
@@ -0,0 +1,477 @@
+// scss-lint:disable QualifyingElement, DuplicateProperty, VendorPrefix
+
+// Reboot
+//
+// Normalization of HTML elements, manually forked from Normalize.css to remove
+// styles targeting irrelevant browsers while applying new styles.
+//
+// Normalize is licensed MIT. https://github.com/necolas/normalize.css
+
+
+// Document
+//
+// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
+// 2. Change the default font family in all browsers.
+// 3. Correct the line height in all browsers.
+// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.
+// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so
+// we force a non-overlapping, non-auto-hiding scrollbar to counteract.
+// 6. Change the default tap highlight to be completely transparent in iOS.
+
+html {
+ box-sizing: border-box; // 1
+ font-family: sans-serif; // 2
+ line-height: 1.15; // 3
+ -webkit-text-size-adjust: 100%; // 4
+ -ms-text-size-adjust: 100%; // 4
+ -ms-overflow-style: scrollbar; // 5
+ -webkit-tap-highlight-color: rgba(0,0,0,0); // 6
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: inherit; // 1
+}
+
+// IE10+ doesn't honor `` in some cases.
+@at-root {
+ @-ms-viewport { width: device-width; }
+}
+
+
+// Body
+//
+// 1. Remove the margin in all browsers.
+// 2. As a best practice, apply a default `background-color`.
+
+body {
+ margin: 0; // 1
+ font-family: $font-family-base;
+ font-size: $font-size-base;
+ font-weight: $font-weight-base;
+ line-height: $line-height-base;
+ color: $body-color;
+ background-color: $body-bg; // 2
+}
+
+// Suppress the focus outline on elements that cannot be accessed via keyboard.
+// This prevents an unwanted focus outline from appearing around elements that
+// might still respond to pointer events.
+//
+// Credit: https://github.com/suitcss/base
+[tabindex="-1"]:focus {
+ outline: none !important;
+}
+
+
+// Content grouping
+//
+// 1. Add the correct box sizing in Firefox.
+// 2. Show the overflow in Edge and IE.
+
+hr {
+ box-sizing: content-box; // 1
+ height: 0; // 1
+ overflow: visible; // 2
+}
+
+
+//
+// Typography
+//
+
+// Remove top margins from headings
+//
+// By default, ``-`` all receive top and bottom margins. We nuke the top
+// margin for easier control within type scales as it avoids margin collapsing.
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: .5rem;
+}
+
+// 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: 1rem;
+}
+
+// Abbreviations
+//
+// 1. Remove the bottom border in Firefox 39-.
+// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+// 3. Add explicit cursor to indicate changed behavior.
+// 4. Duplicate behavior to the data-* attribute for our tooltip plugin
+
+abbr[title],
+abbr[data-original-title] { // 4
+ text-decoration: underline; // 2
+ text-decoration: underline dotted; // 2
+ cursor: help; // 3
+ border-bottom: 0; // 1
+}
+
+address {
+ margin-bottom: 1rem;
+ font-style: normal;
+ line-height: inherit;
+}
+
+ol,
+ul,
+dl {
+ margin-top: 0;
+ margin-bottom: 1rem;
+}
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+ margin-bottom: 0;
+}
+
+dt {
+ font-weight: $dt-font-weight;
+}
+
+dd {
+ margin-bottom: .5rem;
+ margin-left: 0; // Undo browser default
+}
+
+blockquote {
+ margin: 0 0 1rem;
+}
+
+dfn {
+ font-style: italic; // Add the correct font style in Android 4.3-
+}
+
+b,
+strong {
+ font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari
+}
+
+small {
+ font-size: 80%; // Add the correct font size in all browsers
+}
+
+//
+// Prevent `sub` and `sup` elements from affecting the line height in
+// all browsers.
+//
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+
+sub { bottom: -.25em; }
+sup { top: -.5em; }
+
+
+//
+// Links
+//
+
+a {
+ color: $link-color;
+ text-decoration: $link-decoration;
+ background-color: transparent; // Remove the gray background on active links in IE 10.
+ -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.
+
+ @include hover {
+ color: $link-hover-color;
+ text-decoration: $link-hover-decoration;
+ }
+}
+
+// And undo these styles for placeholder links/named anchors (without href)
+// which have not been made explicitly keyboard-focusable (without tabindex).
+// It would be more straightforward to just use a[href] in previous block, but that
+// causes specificity issues in many other styles that are too complex to fix.
+// See https://github.com/twbs/bootstrap/issues/19402
+
+a:not([href]):not([tabindex]) {
+ color: inherit;
+ text-decoration: none;
+
+ @include hover-focus {
+ color: inherit;
+ text-decoration: none;
+ }
+
+ &:focus {
+ outline: 0;
+ }
+}
+
+
+//
+// Code
+//
+
+pre,
+code,
+kbd,
+samp {
+ font-family: monospace, monospace; // Correct the inheritance and scaling of font size in all browsers.
+ font-size: 1em; // Correct the odd `em` font sizing in all browsers.
+}
+
+pre {
+ // Remove browser default top margin
+ margin-top: 0;
+ // Reset browser default of `1em` to use `rem`s
+ margin-bottom: 1rem;
+ // Don't allow content to break outside
+ overflow: auto;
+}
+
+
+//
+// Figures
+//
+
+figure {
+ // Apply a consistent margin strategy (matches our type styles).
+ margin: 0 0 1rem;
+}
+
+
+//
+// Images and content
+//
+
+img {
+ vertical-align: middle;
+ border-style: none; // Remove the border on images inside links in IE 10-.
+}
+
+svg:not(:root) {
+ overflow: hidden; // Hide the overflow in IE
+}
+
+
+// Avoid 300ms click delay on touch devices that support the `touch-action` CSS property.
+//
+// In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11
+// DON'T remove the click delay when `` is present.
+// However, they DO support removing the click delay via `touch-action: manipulation`.
+// See:
+// * https://v4-alpha.getbootstrap.com/content/reboot/#click-delay-optimization-for-touch
+// * http://caniuse.com/#feat=css-touch-action
+// * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay
+
+a,
+area,
+button,
+[role="button"],
+input,
+label,
+select,
+summary,
+textarea {
+ touch-action: manipulation;
+}
+
+
+//
+// Tables
+//
+
+table {
+ border-collapse: collapse; // Prevent double borders
+}
+
+caption {
+ padding-top: $table-cell-padding;
+ padding-bottom: $table-cell-padding;
+ color: $text-muted;
+ text-align: left;
+ caption-side: bottom;
+}
+
+th {
+ // Matches default `
` alignment
+ text-align: left;
+}
+
+
+//
+// Forms
+//
+
+label {
+ // Allow labels to use `margin` for spacing.
+ display: inline-block;
+ margin-bottom: .5rem;
+}
+
+// Work around a Firefox/IE bug where the transparent `button` background
+// results in a loss of the default `button` focus styles.
+//
+// Credit: https://github.com/suitcss/base/
+button:focus {
+ outline: 1px dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+}
+
+input,
+button,
+select,
+optgroup,
+textarea {
+ margin: 0; // Remove the margin in Firefox and Safari
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+button,
+input {
+ overflow: visible; // Show the overflow in Edge
+}
+
+button,
+select {
+ text-transform: none; // Remove the inheritance of text transform in Firefox
+}
+
+// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
+// controls in Android 4.
+// 2. Correct the inability to style clickable types in iOS and Safari.
+button,
+html [type="button"], // 1
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button; // 2
+}
+
+// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ padding: 0;
+ border-style: none;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ box-sizing: border-box; // 1. Add the correct box sizing in IE 10-
+ padding: 0; // 2. Remove the padding in IE 10-
+}
+
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+ // Remove the default appearance of temporal inputs to avoid a Mobile Safari
+ // bug where setting a custom line-height prevents text from being vertically
+ // centered within the input.
+ // See https://bugs.webkit.org/show_bug.cgi?id=139848
+ // and https://github.com/twbs/bootstrap/issues/11266
+ -webkit-appearance: listbox;
+}
+
+textarea {
+ overflow: auto; // Remove the default vertical scrollbar in IE.
+ // Textareas should really only resize vertically so they don't break their (horizontal) containers.
+ resize: vertical;
+}
+
+fieldset {
+ // Browsers set a default `min-width: min-content;` on fieldsets,
+ // unlike e.g. ` `s, which have `min-width: 0;` by default.
+ // So we reset that to ensure fieldsets behave more like a standard block element.
+ // See https://github.com/twbs/bootstrap/issues/12359
+ // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements
+ min-width: 0;
+ // Reset the default outline behavior of fieldsets so they don't affect page layout.
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+// 1. Correct the text wrapping in Edge and IE.
+// 2. Correct the color inheritance from `fieldset` elements in IE.
+legend {
+ display: block;
+ width: 100%;
+ max-width: 100%; // 1
+ padding: 0;
+ margin-bottom: .5rem;
+ font-size: 1.5rem;
+ line-height: inherit;
+ color: inherit; // 2
+ white-space: normal; // 1
+}
+
+progress {
+ vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.
+}
+
+// Correct the cursor style of increment and decrement buttons in Chrome.
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+[type="search"] {
+ // This overrides the extra rounded corners on search inputs in iOS so that our
+ // `.form-control` class can properly style them. Note that this cannot simply
+ // be added to `.form-control` as it's not specific enough. For details, see
+ // https://github.com/twbs/bootstrap/issues/11586.
+ outline-offset: -2px; // 2. Correct the outline style in Safari.
+ -webkit-appearance: none;
+}
+
+//
+// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
+//
+
+[type="search"]::-webkit-search-cancel-button,
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+//
+// 1. Correct the inability to style clickable types in iOS and Safari.
+// 2. Change font properties to `inherit` in Safari.
+//
+
+::-webkit-file-upload-button {
+ font: inherit; // 2
+ -webkit-appearance: button; // 1
+}
+
+//
+// Correct element displays
+//
+
+output {
+ display: inline-block;
+}
+
+summary {
+ display: list-item; // Add the correct display in all browsers
+}
+
+template {
+ display: none; // Add the correct display in IE
+}
+
+// Always hide an element with the `hidden` HTML attribute (from PureCSS).
+// Needed for proper display in IE 10-.
+[hidden] {
+ display: none !important;
+}
diff --git a/src/scss/bootstrap/_responsive-embed.scss b/src/scss/bootstrap/_responsive-embed.scss
new file mode 100644
index 0000000..d3362b6
--- /dev/null
+++ b/src/scss/bootstrap/_responsive-embed.scss
@@ -0,0 +1,52 @@
+// Credit: Nicolas Gallagher and SUIT CSS.
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 0;
+ overflow: hidden;
+
+ &::before {
+ display: block;
+ content: "";
+ }
+
+ .embed-responsive-item,
+ iframe,
+ embed,
+ object,
+ video {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border: 0;
+ }
+}
+
+.embed-responsive-21by9 {
+ &::before {
+ padding-top: percentage(9 / 21);
+ }
+}
+
+.embed-responsive-16by9 {
+ &::before {
+ padding-top: percentage(9 / 16);
+ }
+}
+
+.embed-responsive-4by3 {
+ &::before {
+ padding-top: percentage(3 / 4);
+ }
+}
+
+.embed-responsive-1by1 {
+ &::before {
+ padding-top: percentage(1 / 1);
+ }
+}
diff --git a/src/scss/bootstrap/_tables.scss b/src/scss/bootstrap/_tables.scss
new file mode 100644
index 0000000..36c3dab
--- /dev/null
+++ b/src/scss/bootstrap/_tables.scss
@@ -0,0 +1,169 @@
+//
+// Basic Bootstrap table
+//
+
+.table {
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: $spacer;
+ background-color: $table-bg; // Reset for nesting within parents with `background-color`.
+
+ th,
+ td {
+ padding: $table-cell-padding;
+ vertical-align: top;
+ border-top: $table-border-width solid $table-border-color;
+ }
+
+ thead th {
+ vertical-align: bottom;
+ border-bottom: (2 * $table-border-width) solid $table-border-color;
+ }
+
+ tbody + tbody {
+ border-top: (2 * $table-border-width) solid $table-border-color;
+ }
+
+ .table {
+ background-color: $body-bg;
+ }
+}
+
+
+//
+// Condensed table w/ half padding
+//
+
+.table-sm {
+ th,
+ td {
+ padding: $table-sm-cell-padding;
+ }
+}
+
+
+// Bordered version
+//
+// Add borders all around the table and between all the columns.
+
+.table-bordered {
+ border: $table-border-width solid $table-border-color;
+
+ th,
+ td {
+ border: $table-border-width solid $table-border-color;
+ }
+
+ thead {
+ th,
+ td {
+ border-bottom-width: (2 * $table-border-width);
+ }
+ }
+}
+
+
+// Zebra-striping
+//
+// Default zebra-stripe styles (alternating gray and transparent backgrounds)
+
+.table-striped {
+ tbody tr:nth-of-type(odd) {
+ background-color: $table-bg-accent;
+ }
+}
+
+
+// Hover effect
+//
+// Placed here since it has to come after the potential zebra striping
+
+.table-hover {
+ tbody tr {
+ @include hover {
+ background-color: $table-bg-hover;
+ }
+ }
+}
+
+
+// Table backgrounds
+//
+// Exact selectors below required to override `.table-striped` and prevent
+// inheritance to nested tables.
+
+// Generate the contextual variants
+@include table-row-variant(active, $table-bg-active);
+@include table-row-variant(success, $state-success-bg);
+@include table-row-variant(info, $state-info-bg);
+@include table-row-variant(warning, $state-warning-bg);
+@include table-row-variant(danger, $state-danger-bg);
+
+
+// Inverse styles
+//
+// Same table markup, but inverted color scheme: dark background and light text.
+
+.thead-inverse {
+ th {
+ color: $table-inverse-color;
+ background-color: $table-inverse-bg;
+ }
+}
+
+.thead-default {
+ th {
+ color: $table-head-color;
+ background-color: $table-head-bg;
+ }
+}
+
+.table-inverse {
+ color: $table-inverse-color;
+ background-color: $table-inverse-bg;
+
+ th,
+ td,
+ thead th {
+ border-color: $table-inverse-border-color;
+ }
+
+ &.table-bordered {
+ border: 0;
+ }
+
+ &.table-striped {
+ tbody tr:nth-of-type(odd) {
+ background-color: $table-inverse-bg-accent;
+ }
+ }
+
+ &.table-hover {
+ tbody tr {
+ @include hover {
+ background-color: $table-inverse-bg-hover;
+ }
+ }
+ }
+}
+
+
+// Responsive tables
+//
+// Add `.table-responsive` to `.table`s and we'll make them mobile friendly by
+// enabling horizontal scrolling. Only applies <768px. Everything above that
+// will display normally.
+
+.table-responsive {
+ @include media-breakpoint-down(md) {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -ms-overflow-style: -ms-autohiding-scrollbar; // See https://github.com/twbs/bootstrap/pull/10057
+
+ // Prevent double border on horizontal scroll due to use of `display: block;`
+ &.table-bordered {
+ border: 0;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/_tooltip.scss b/src/scss/bootstrap/_tooltip.scss
new file mode 100644
index 0000000..24e198d
--- /dev/null
+++ b/src/scss/bootstrap/_tooltip.scss
@@ -0,0 +1,90 @@
+// Base class
+.tooltip {
+ position: absolute;
+ z-index: $zindex-tooltip;
+ display: block;
+ // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
+ // So reset our font and text properties to avoid inheriting weird values.
+ @include reset-text();
+ font-size: $font-size-sm;
+ // Allow breaking very long words so they don't overflow the tooltip's bounds
+ word-wrap: break-word;
+ opacity: 0;
+
+ &.show { opacity: $tooltip-opacity; }
+
+ &.tooltip-top,
+ &.bs-tether-element-attached-bottom {
+ padding: $tooltip-arrow-width 0;
+ margin-top: -$tooltip-margin;
+
+ .tooltip-inner::before {
+ bottom: 0;
+ left: 50%;
+ margin-left: -$tooltip-arrow-width;
+ content: "";
+ border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
+ border-top-color: $tooltip-arrow-color;
+ }
+ }
+ &.tooltip-right,
+ &.bs-tether-element-attached-left {
+ padding: 0 $tooltip-arrow-width;
+ margin-left: $tooltip-margin;
+
+ .tooltip-inner::before {
+ top: 50%;
+ left: 0;
+ margin-top: -$tooltip-arrow-width;
+ content: "";
+ border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;
+ border-right-color: $tooltip-arrow-color;
+ }
+ }
+ &.tooltip-bottom,
+ &.bs-tether-element-attached-top {
+ padding: $tooltip-arrow-width 0;
+ margin-top: $tooltip-margin;
+
+ .tooltip-inner::before {
+ top: 0;
+ left: 50%;
+ margin-left: -$tooltip-arrow-width;
+ content: "";
+ border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
+ border-bottom-color: $tooltip-arrow-color;
+ }
+ }
+ &.tooltip-left,
+ &.bs-tether-element-attached-right {
+ padding: 0 $tooltip-arrow-width;
+ margin-left: -$tooltip-margin;
+
+ .tooltip-inner::before {
+ top: 50%;
+ right: 0;
+ margin-top: -$tooltip-arrow-width;
+ content: "";
+ border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;
+ border-left-color: $tooltip-arrow-color;
+ }
+ }
+}
+
+// Wrapper for the tooltip content
+.tooltip-inner {
+ max-width: $tooltip-max-width;
+ padding: $tooltip-padding-y $tooltip-padding-x;
+ color: $tooltip-color;
+ text-align: center;
+ background-color: $tooltip-bg;
+ @include border-radius($border-radius);
+
+ &::before {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+ }
+}
diff --git a/src/scss/bootstrap/_transitions.scss b/src/scss/bootstrap/_transitions.scss
new file mode 100644
index 0000000..86c04a5
--- /dev/null
+++ b/src/scss/bootstrap/_transitions.scss
@@ -0,0 +1,34 @@
+.fade {
+ opacity: 0;
+ @include transition($transition-fade);
+
+ &.show {
+ opacity: 1;
+ }
+}
+
+.collapse {
+ display: none;
+ &.show {
+ display: block;
+ }
+}
+
+tr {
+ &.collapse.show {
+ display: table-row;
+ }
+}
+
+tbody {
+ &.collapse.show {
+ display: table-row-group;
+ }
+}
+
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ @include transition($transition-collapse);
+}
diff --git a/src/scss/bootstrap/_type.scss b/src/scss/bootstrap/_type.scss
new file mode 100644
index 0000000..fc9c791
--- /dev/null
+++ b/src/scss/bootstrap/_type.scss
@@ -0,0 +1,143 @@
+//
+// Headings
+//
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ margin-bottom: $headings-margin-bottom;
+ font-family: $headings-font-family;
+ font-weight: $headings-font-weight;
+ line-height: $headings-line-height;
+ color: $headings-color;
+}
+
+h1, .h1 { font-size: $font-size-h1; }
+h2, .h2 { font-size: $font-size-h2; }
+h3, .h3 { font-size: $font-size-h3; }
+h4, .h4 { font-size: $font-size-h4; }
+h5, .h5 { font-size: $font-size-h5; }
+h6, .h6 { font-size: $font-size-h6; }
+
+.lead {
+ font-size: $lead-font-size;
+ font-weight: $lead-font-weight;
+}
+
+// Type display classes
+.display-1 {
+ font-size: $display1-size;
+ font-weight: $display1-weight;
+ line-height: $display-line-height;
+}
+.display-2 {
+ font-size: $display2-size;
+ font-weight: $display2-weight;
+ line-height: $display-line-height;
+}
+.display-3 {
+ font-size: $display3-size;
+ font-weight: $display3-weight;
+ line-height: $display-line-height;
+}
+.display-4 {
+ font-size: $display4-size;
+ font-weight: $display4-weight;
+ line-height: $display-line-height;
+}
+
+
+//
+// Horizontal rules
+//
+
+hr {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: 0;
+ border-top: $hr-border-width solid $hr-border-color;
+}
+
+
+//
+// Emphasis
+//
+
+small,
+.small {
+ font-size: $small-font-size;
+ font-weight: $font-weight-normal;
+}
+
+mark,
+.mark {
+ padding: $mark-padding;
+ background-color: $mark-bg;
+}
+
+
+//
+// Lists
+//
+
+.list-unstyled {
+ @include list-unstyled;
+}
+
+// Inline turns list items into inline-block
+.list-inline {
+ @include list-unstyled;
+}
+.list-inline-item {
+ display: inline-block;
+
+ &:not(:last-child) {
+ margin-right: $list-inline-padding;
+ }
+}
+
+
+//
+// Misc
+//
+
+// Builds on `abbr`
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+
+// Blockquotes
+.blockquote {
+ padding: ($spacer / 2) $spacer;
+ margin-bottom: $spacer;
+ font-size: $blockquote-font-size;
+ border-left: $blockquote-border-width solid $blockquote-border-color;
+}
+
+.blockquote-footer {
+ display: block;
+ font-size: 80%; // back to default font-size
+ color: $blockquote-small-color;
+
+ &::before {
+ content: "\2014 \00A0"; // em dash, nbsp
+ }
+}
+
+// Opposite alignment of blockquote
+.blockquote-reverse {
+ padding-right: $spacer;
+ padding-left: 0;
+ text-align: right;
+ border-right: $blockquote-border-width solid $blockquote-border-color;
+ border-left: 0;
+}
+
+.blockquote-reverse .blockquote-footer {
+ &::before {
+ content: "";
+ }
+ &::after {
+ content: "\00A0 \2014"; // nbsp, em dash
+ }
+}
diff --git a/src/scss/bootstrap/_utilities.scss b/src/scss/bootstrap/_utilities.scss
new file mode 100644
index 0000000..7d08ff2
--- /dev/null
+++ b/src/scss/bootstrap/_utilities.scss
@@ -0,0 +1,13 @@
+@import "utilities/align";
+@import "utilities/background";
+@import "utilities/borders";
+@import "utilities/clearfix";
+@import "utilities/display";
+@import "utilities/flex";
+@import "utilities/float";
+@import "utilities/position";
+@import "utilities/screenreaders";
+@import "utilities/sizing";
+@import "utilities/spacing";
+@import "utilities/text";
+@import "utilities/visibility";
diff --git a/src/scss/bootstrap/_variables.scss b/src/scss/bootstrap/_variables.scss
new file mode 100644
index 0000000..6b00d9b
--- /dev/null
+++ b/src/scss/bootstrap/_variables.scss
@@ -0,0 +1,925 @@
+// Variables
+//
+// Copy settings from this file into the provided `_custom.scss` to override
+// the Bootstrap defaults without modifying key, versioned files.
+
+
+// Table of Contents
+//
+// Colors
+// Options
+// Spacing
+// Body
+// Links
+// Grid breakpoints
+// Grid containers
+// Grid columns
+// Fonts
+// Components
+// Tables
+// Buttons
+// Forms
+// Dropdowns
+// Z-index master list
+// Navs
+// Navbar
+// Pagination
+// Jumbotron
+// Form states and alerts
+// Cards
+// Tooltips
+// Popovers
+// Badges
+// Modals
+// Alerts
+// Progress bars
+// List group
+// Image thumbnails
+// Figures
+// Breadcrumbs
+// Carousel
+// Close
+// Code
+
+@mixin _assert-ascending($map, $map-name) {
+ $prev-key: null;
+ $prev-num: null;
+ @each $key, $num in $map {
+ @if $prev-num == null {
+ // Do nothing
+ } @else if not comparable($prev-num, $num) {
+ @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
+ } @else if $prev-num >= $num {
+ @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
+ }
+ $prev-key: $key;
+ $prev-num: $num;
+ }
+}
+
+// Replace `$search` with `$replace` in `$string`
+// @author Hugo Giraudel
+// @param {String} $string - Initial string
+// @param {String} $search - Substring to replace
+// @param {String} $replace ('') - New value
+// @return {String} - Updated string
+@function str-replace($string, $search, $replace: "") {
+ $index: str-index($string, $search);
+
+ @if $index {
+ @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
+ }
+
+ @return $string;
+}
+
+@mixin _assert-starts-at-zero($map) {
+ $values: map-values($map);
+ $first-value: nth($values, 1);
+ @if $first-value != 0 {
+ @warn "First breakpoint in `$grid-breakpoints` must start at 0, but starts at #{$first-value}.";
+ }
+}
+
+
+// General variable structure
+//
+// Variable format should follow the `$component-modifier-state-property` order.
+
+
+// Colors
+//
+// Grayscale and brand colors for use across Bootstrap.
+
+// Start with assigning color names to specific hex values.
+$white: #fff !default;
+$black: #000 !default;
+$red: #d9534f !default;
+$orange: #f0ad4e !default;
+$yellow: #ffd500 !default;
+$green: #5cb85c !default;
+$blue: #0275d8 !default;
+$teal: #5bc0de !default;
+$pink: #ff5b77 !default;
+$purple: #613d7c !default;
+
+// Create grayscale
+$gray-dark: #292b2c !default;
+$gray: #464a4c !default;
+$gray-light: #636c72 !default;
+$gray-lighter: #eceeef !default;
+$gray-lightest: #f7f7f9 !default;
+
+// Reassign color vars to semantic color scheme
+$brand-primary: $blue !default;
+$brand-success: $green !default;
+$brand-info: $teal !default;
+$brand-warning: $orange !default;
+$brand-danger: $red !default;
+$brand-inverse: $gray-dark !default;
+
+
+// Options
+//
+// Quickly modify global styling by enabling or disabling optional features.
+
+$enable-rounded: true !default;
+$enable-shadows: false !default;
+$enable-gradients: false !default;
+$enable-transitions: true !default;
+$enable-hover-media-query: false !default;
+$enable-grid-classes: true !default;
+$enable-print-styles: true !default;
+
+
+// Spacing
+//
+// Control the default styling of most Bootstrap elements by modifying these
+// variables. Mostly focused on spacing.
+// You can add more entries to the $spacers map, should you need more variation.
+
+$spacer: 1rem !default;
+$spacers: (
+ 0: 0,
+ 1: ($spacer * .25),
+ 2: ($spacer * .5),
+ 3: $spacer,
+ 4: ($spacer * 1.5),
+ 5: ($spacer * 3)
+) !default;
+
+// This variable affects the `.h-*` and `.w-*` classes.
+$sizes: (
+ 25: 25%,
+ 50: 50%,
+ 75: 75%,
+ 100: 100%
+) !default;
+
+// Body
+//
+// Settings for the `` element.
+
+$body-bg: $white !default;
+$body-color: $gray-dark !default;
+
+// Links
+//
+// Style anchor elements.
+
+$link-color: $brand-primary !default;
+$link-decoration: none !default;
+$link-hover-color: darken($link-color, 15%) !default;
+$link-hover-decoration: underline !default;
+
+
+// Grid breakpoints
+//
+// Define the minimum dimensions at which your layout will change,
+// adapting to different screen sizes, for use in media queries.
+
+$grid-breakpoints: (
+ xs: 0,
+ sm: 576px,
+ md: 768px,
+ lg: 992px,
+ xl: 1200px
+) !default;
+@include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
+@include _assert-starts-at-zero($grid-breakpoints);
+
+
+// Grid containers
+//
+// Define the maximum width of `.container` for different screen sizes.
+
+$container-max-widths: (
+ sm: 540px,
+ md: 720px,
+ lg: 960px,
+ xl: 1140px
+) !default;
+@include _assert-ascending($container-max-widths, "$container-max-widths");
+
+
+// Grid columns
+//
+// Set the number of columns and specify the width of the gutters.
+
+$grid-columns: 12 !default;
+$grid-gutter-width-base: 30px !default;
+$grid-gutter-widths: (
+ xs: $grid-gutter-width-base,
+ sm: $grid-gutter-width-base,
+ md: $grid-gutter-width-base,
+ lg: $grid-gutter-width-base,
+ xl: $grid-gutter-width-base
+) !default;
+
+
+// Components
+//
+// Define common padding and border radius sizes and more.
+
+$line-height-lg: 1.5 !default;
+$line-height-sm: 1.5 !default;
+
+$border-width: 1px !default;
+
+$border-radius: .25rem !default;
+$border-radius-lg: .3rem !default;
+$border-radius-sm: .2rem !default;
+
+$component-active-color: $white !default;
+$component-active-bg: $brand-primary !default;
+
+$caret-width: .3em !default;
+
+$transition-base: all .2s ease-in-out !default;
+$transition-fade: opacity .15s linear !default;
+$transition-collapse: height .35s ease !default;
+
+
+// Fonts
+//
+// Font, line-height, and color for body text, headings, and more.
+
+$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !default;
+$font-family-monospace: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
+$font-family-base: $font-family-sans-serif !default;
+
+$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`
+$font-size-lg: 1.25rem !default;
+$font-size-sm: .875rem !default;
+$font-size-xs: .75rem !default;
+
+$font-weight-normal: normal !default;
+$font-weight-bold: bold !default;
+
+$font-weight-base: $font-weight-normal !default;
+$line-height-base: 1.5 !default;
+
+$font-size-h1: 2.5rem !default;
+$font-size-h2: 2rem !default;
+$font-size-h3: 1.75rem !default;
+$font-size-h4: 1.5rem !default;
+$font-size-h5: 1.25rem !default;
+$font-size-h6: 1rem !default;
+
+$headings-margin-bottom: ($spacer / 2) !default;
+$headings-font-family: inherit !default;
+$headings-font-weight: 500 !default;
+$headings-line-height: 1.1 !default;
+$headings-color: inherit !default;
+
+$display1-size: 6rem !default;
+$display2-size: 5.5rem !default;
+$display3-size: 4.5rem !default;
+$display4-size: 3.5rem !default;
+
+$display1-weight: 300 !default;
+$display2-weight: 300 !default;
+$display3-weight: 300 !default;
+$display4-weight: 300 !default;
+$display-line-height: $headings-line-height !default;
+
+$lead-font-size: 1.25rem !default;
+$lead-font-weight: 300 !default;
+
+$small-font-size: 80% !default;
+
+$text-muted: $gray-light !default;
+
+$blockquote-small-color: $gray-light !default;
+$blockquote-font-size: ($font-size-base * 1.25) !default;
+$blockquote-border-color: $gray-lighter !default;
+$blockquote-border-width: .25rem !default;
+
+$hr-border-color: rgba($black,.1) !default;
+$hr-border-width: $border-width !default;
+
+$mark-padding: .2em !default;
+
+$dt-font-weight: $font-weight-bold !default;
+
+$kbd-box-shadow: inset 0 -.1rem 0 rgba($black,.25) !default;
+$nested-kbd-font-weight: $font-weight-bold !default;
+
+$list-inline-padding: 5px !default;
+
+
+// Tables
+//
+// Customizes the `.table` component with basic values, each used across all table variations.
+
+$table-cell-padding: .75rem !default;
+$table-sm-cell-padding: .3rem !default;
+
+$table-bg: transparent !default;
+$table-bg-accent: rgba($black,.05) !default;
+$table-bg-hover: rgba($black,.075) !default;
+$table-bg-active: $table-bg-hover !default;
+
+$table-border-width: $border-width !default;
+$table-border-color: $gray-lighter !default;
+
+$table-head-bg: $gray-lighter !default;
+$table-head-color: $gray !default;
+
+$table-inverse-bg: $gray-dark !default;
+$table-inverse-bg-accent: rgba($white, .05) !default;
+$table-inverse-bg-hover: rgba($white, .075) !default;
+$table-inverse-bg-active: $table-inverse-bg-hover !default;
+$table-inverse-border-color: lighten($gray-dark, 7.5%) !default;
+$table-inverse-color: $body-bg !default;
+
+
+// Buttons
+//
+// For each of Bootstrap's buttons, define text, background and border color.
+
+$input-btn-padding-y: .5rem !default;
+$input-btn-padding-x: 1rem !default;
+$input-btn-line-height: 1.25 !default;
+
+$input-btn-padding-y-sm: .25rem !default;
+$input-btn-padding-x-sm: .5rem !default;
+$input-btn-line-height-sm: 1.5 !default;
+
+$input-btn-padding-y-lg: .5rem !default;
+$input-btn-padding-x-lg: 1rem !default;
+$input-btn-line-height-lg: 1.5 !default;
+
+$btn-font-weight: $font-weight-normal !default;
+$btn-box-shadow: inset 0 1px 0 rgba($white,.15), 0 1px 1px rgba($black,.075) !default;
+$btn-focus-box-shadow: 0 0 0 2px rgba($brand-primary, .25) !default;
+$btn-active-box-shadow: inset 0 3px 5px rgba($black,.125) !default;
+
+$btn-primary-color: $white !default;
+$btn-primary-bg: $brand-primary !default;
+$btn-primary-border-color: $btn-primary-bg !default;
+
+$btn-secondary-color: $gray-dark !default;
+$btn-secondary-bg: $white !default;
+$btn-secondary-border-color: #ccc !default;
+
+$btn-info-color: $white !default;
+$btn-info-bg: $brand-info !default;
+$btn-info-border-color: $btn-info-bg !default;
+
+$btn-success-color: $white !default;
+$btn-success-bg: $brand-success !default;
+$btn-success-border-color: $btn-success-bg !default;
+
+$btn-warning-color: $white !default;
+$btn-warning-bg: $brand-warning !default;
+$btn-warning-border-color: $btn-warning-bg !default;
+
+$btn-danger-color: $white !default;
+$btn-danger-bg: $brand-danger !default;
+$btn-danger-border-color: $btn-danger-bg !default;
+
+$btn-link-disabled-color: $gray-light !default;
+
+$btn-block-spacing-y: .5rem !default;
+
+// Allows for customizing button radius independently from global border radius
+$btn-border-radius: $border-radius !default;
+$btn-border-radius-lg: $border-radius-lg !default;
+$btn-border-radius-sm: $border-radius-sm !default;
+
+$btn-transition: all .2s ease-in-out !default;
+
+
+// Forms
+
+$input-bg: $white !default;
+$input-bg-disabled: $gray-lighter !default;
+
+$input-color: $gray !default;
+$input-border-color: rgba($black,.15) !default;
+$input-btn-border-width: $border-width !default; // For form controls and buttons
+$input-box-shadow: inset 0 1px 1px rgba($black,.075) !default;
+
+$input-border-radius: $border-radius !default;
+$input-border-radius-lg: $border-radius-lg !default;
+$input-border-radius-sm: $border-radius-sm !default;
+
+$input-bg-focus: $input-bg !default;
+$input-border-color-focus: lighten($brand-primary, 25%) !default;
+$input-box-shadow-focus: $input-box-shadow, rgba($input-border-color-focus, .6) !default;
+$input-color-focus: $input-color !default;
+
+$input-color-placeholder: $gray-light !default;
+
+$input-height: (($font-size-base * $input-btn-line-height) + ($input-btn-padding-y * 2)) !default;
+$input-height-lg: (($font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2)) !default;
+$input-height-sm: (($font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2)) !default;
+
+$input-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s !default;
+
+$form-text-margin-top: .25rem !default;
+$form-feedback-margin-top: $form-text-margin-top !default;
+
+$form-check-margin-bottom: .5rem !default;
+$form-check-input-gutter: 1.25rem !default;
+$form-check-input-margin-y: .25rem !default;
+$form-check-input-margin-x: .25rem !default;
+
+$form-check-inline-margin-x: .75rem !default;
+
+$form-group-margin-bottom: 1rem !default;
+
+$input-group-addon-bg: $gray-lighter !default;
+$input-group-addon-border-color: $input-border-color !default;
+
+$custom-control-gutter: 1.5rem !default;
+$custom-control-spacer-y: .25rem !default;
+$custom-control-spacer-x: 1rem !default;
+
+$custom-control-indicator-size: 1rem !default;
+$custom-control-indicator-bg: #ddd !default;
+$custom-control-indicator-bg-size: 50% 50% !default;
+$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba($black,.1) !default;
+
+$custom-control-disabled-indicator-bg: $gray-lighter !default;
+$custom-control-disabled-description-color: $gray-light !default;
+
+$custom-control-checked-indicator-color: $white !default;
+$custom-control-checked-indicator-bg: $brand-primary !default;
+$custom-control-checked-indicator-box-shadow: none !default;
+
+$custom-control-focus-indicator-box-shadow: 0 0 0 1px $body-bg, 0 0 0 3px $brand-primary !default;
+
+$custom-control-active-indicator-color: $white !default;
+$custom-control-active-indicator-bg: lighten($brand-primary, 35%) !default;
+$custom-control-active-indicator-box-shadow: none !default;
+
+$custom-checkbox-radius: $border-radius !default;
+$custom-checkbox-checked-icon: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-checked-indicator-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E"), "#", "%23") !default;
+
+$custom-checkbox-indeterminate-bg: $brand-primary !default;
+$custom-checkbox-indeterminate-indicator-color: $custom-control-checked-indicator-color !default;
+$custom-checkbox-indeterminate-icon: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indeterminate-indicator-color}' d='M0 2h4'/%3E%3C/svg%3E"), "#", "%23") !default;
+$custom-checkbox-indeterminate-box-shadow: none !default;
+
+$custom-radio-radius: 50% !default;
+$custom-radio-checked-icon: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-checked-indicator-color}'/%3E%3C/svg%3E"), "#", "%23") !default;
+
+$custom-select-padding-y: .375rem !default;
+$custom-select-padding-x: .75rem !default;
+$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator
+$custom-select-line-height: $input-btn-line-height !default;
+$custom-select-color: $input-color !default;
+$custom-select-disabled-color: $gray-light !default;
+$custom-select-bg: $white !default;
+$custom-select-disabled-bg: $gray-lighter !default;
+$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions
+$custom-select-indicator-color: #333 !default;
+$custom-select-indicator: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E"), "#", "%23") !default;
+$custom-select-border-width: $input-btn-border-width !default;
+$custom-select-border-color: $input-border-color !default;
+$custom-select-border-radius: $border-radius !default;
+
+$custom-select-focus-border-color: lighten($brand-primary, 25%) !default;
+$custom-select-focus-box-shadow: inset 0 1px 2px rgba($black, .075), 0 0 5px rgba($custom-select-focus-border-color, .5) !default;
+
+$custom-select-sm-font-size: 75% !default;
+
+$custom-file-height: 2.5rem !default;
+$custom-file-width: 14rem !default;
+$custom-file-focus-box-shadow: 0 0 0 .075rem $white, 0 0 0 .2rem $brand-primary !default;
+
+$custom-file-padding-y: 1rem !default;
+$custom-file-padding-x: .5rem !default;
+$custom-file-line-height: 1.5 !default;
+$custom-file-color: $gray !default;
+$custom-file-bg: $white !default;
+$custom-file-border-width: $border-width !default;
+$custom-file-border-color: $input-border-color !default;
+$custom-file-border-radius: $border-radius !default;
+$custom-file-box-shadow: inset 0 .2rem .4rem rgba($black,.05) !default;
+$custom-file-button-color: $custom-file-color !default;
+$custom-file-button-bg: $gray-lighter !default;
+$custom-file-text: (
+ placeholder: (
+ en: "Choose file..."
+ ),
+ button-label: (
+ en: "Browse"
+ )
+) !default;
+
+
+// Form validation icons
+$form-icon-success-color: $brand-success !default;
+$form-icon-success: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$form-icon-success-color}' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E"), "#", "%23") !default;
+
+$form-icon-warning-color: $brand-warning !default;
+$form-icon-warning: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$form-icon-warning-color}' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E"), "#", "%23") !default;
+
+$form-icon-danger-color: $brand-danger !default;
+$form-icon-danger: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-icon-danger-color}' viewBox='-2 -2 7 7'%3E%3Cpath stroke='#{$form-icon-danger-color}' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E"), "#", "%23") !default;
+
+
+// Dropdowns
+//
+// Dropdown menu container and contents.
+
+$dropdown-min-width: 10rem !default;
+$dropdown-padding-y: .5rem !default;
+$dropdown-margin-top: .125rem !default;
+$dropdown-bg: $white !default;
+$dropdown-border-color: rgba($black,.15) !default;
+$dropdown-border-width: $border-width !default;
+$dropdown-divider-bg: $gray-lighter !default;
+$dropdown-box-shadow: 0 .5rem 1rem rgba($black,.175) !default;
+
+$dropdown-link-color: $gray-dark !default;
+$dropdown-link-hover-color: darken($gray-dark, 5%) !default;
+$dropdown-link-hover-bg: $gray-lightest !default;
+
+$dropdown-link-active-color: $component-active-color !default;
+$dropdown-link-active-bg: $component-active-bg !default;
+
+$dropdown-link-disabled-color: $gray-light !default;
+
+$dropdown-item-padding-y: .25rem !default;
+$dropdown-item-padding-x: 1.5rem !default;
+
+$dropdown-header-color: $gray-light !default;
+
+
+// Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+
+$zindex-dropdown: 1000 !default;
+$zindex-sticky: 1020 !default;
+$zindex-fixed: 1030 !default;
+$zindex-modal-backdrop: 1040 !default;
+$zindex-modal: 1050 !default;
+$zindex-popover: 1060 !default;
+$zindex-tooltip: 1070 !default;
+
+// Navs
+
+$nav-item-margin: .2rem !default;
+$nav-item-inline-spacer: 1rem !default;
+$nav-link-padding-y: .5rem !default;
+$nav-link-padding-x: 1rem !default;
+$nav-link-hover-bg: $gray-lighter !default;
+$nav-disabled-link-color: $gray-light !default;
+
+$nav-tabs-border-color: #ddd !default;
+$nav-tabs-border-width: $border-width !default;
+$nav-tabs-border-radius: $border-radius !default;
+$nav-tabs-link-hover-border-color: $gray-lighter !default;
+$nav-tabs-active-link-color: $gray !default;
+$nav-tabs-active-link-bg: $body-bg !default;
+$nav-tabs-active-link-border-color: #ddd !default;
+$nav-tabs-justified-link-border-color: #ddd !default;
+$nav-tabs-justified-active-link-border-color: $body-bg !default;
+
+$nav-pills-border-radius: $border-radius !default;
+$nav-pills-active-link-color: $component-active-color !default;
+$nav-pills-active-link-bg: $component-active-bg !default;
+
+// Navbar
+
+$navbar-padding-y: ($spacer / 2) !default;
+$navbar-padding-x: $spacer !default;
+
+$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: $navbar-brand-font-size * $line-height-base !default;
+$navbar-brand-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;
+$navbar-brand-padding-y: ($navbar-brand-height - $nav-link-height) / 2 !default;
+
+$navbar-toggler-padding-y: .25rem !default;
+$navbar-toggler-padding-x: .75rem !default;
+$navbar-toggler-font-size: $font-size-lg !default;
+$navbar-toggler-border-radius: $btn-border-radius !default;
+
+$navbar-inverse-color: rgba($white,.5) !default;
+$navbar-inverse-hover-color: rgba($white,.75) !default;
+$navbar-inverse-active-color: rgba($white,1) !default;
+$navbar-inverse-disabled-color: rgba($white,.25) !default;
+$navbar-inverse-toggler-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-inverse-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
+$navbar-inverse-toggler-border-color: rgba($white,.1) !default;
+
+$navbar-light-color: rgba($black,.5) !default;
+$navbar-light-hover-color: rgba($black,.7) !default;
+$navbar-light-active-color: rgba($black,.9) !default;
+$navbar-light-disabled-color: rgba($black,.3) !default;
+$navbar-light-toggler-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
+$navbar-light-toggler-border-color: rgba($black,.1) !default;
+
+// Pagination
+
+$pagination-padding-y: .5rem !default;
+$pagination-padding-x: .75rem !default;
+$pagination-padding-y-sm: .25rem !default;
+$pagination-padding-x-sm: .5rem !default;
+$pagination-padding-y-lg: .75rem !default;
+$pagination-padding-x-lg: 1.5rem !default;
+$pagination-line-height: 1.25 !default;
+
+$pagination-color: $link-color !default;
+$pagination-bg: $white !default;
+$pagination-border-width: $border-width !default;
+$pagination-border-color: #ddd !default;
+
+$pagination-hover-color: $link-hover-color !default;
+$pagination-hover-bg: $gray-lighter !default;
+$pagination-hover-border-color: #ddd !default;
+
+$pagination-active-color: $white !default;
+$pagination-active-bg: $brand-primary !default;
+$pagination-active-border-color: $brand-primary !default;
+
+$pagination-disabled-color: $gray-light !default;
+$pagination-disabled-bg: $white !default;
+$pagination-disabled-border-color: #ddd !default;
+
+
+// Jumbotron
+
+$jumbotron-padding: 2rem !default;
+$jumbotron-bg: $gray-lighter !default;
+
+
+// Form states and alerts
+//
+// Define colors for form feedback states and, by default, alerts.
+
+$state-success-text: #3c763d !default;
+$state-success-bg: #dff0d8 !default;
+$state-success-border-color: darken($state-success-bg, 5%) !default;
+
+$state-info-text: #31708f !default;
+$state-info-bg: #d9edf7 !default;
+$state-info-border-color: darken($state-info-bg, 7%) !default;
+
+$state-warning-text: #8a6d3b !default;
+$state-warning-bg: #fcf8e3 !default;
+$mark-bg: $state-warning-bg !default;
+$state-warning-border-color: darken($state-warning-bg, 5%) !default;
+
+$state-danger-text: #a94442 !default;
+$state-danger-bg: #f2dede !default;
+$state-danger-border-color: darken($state-danger-bg, 5%) !default;
+
+
+// Cards
+
+$card-spacer-y: .75rem !default;
+$card-spacer-x: 1.25rem !default;
+$card-border-width: 1px !default;
+$card-border-radius: $border-radius !default;
+$card-border-color: rgba($black,.125) !default;
+$card-border-radius-inner: calc(#{$card-border-radius} - #{$card-border-width}) !default;
+$card-cap-bg: $gray-lightest !default;
+$card-bg: $white !default;
+
+$card-link-hover-color: $white !default;
+
+$card-img-overlay-padding: 1.25rem !default;
+
+$card-deck-margin: ($grid-gutter-width-base / 2) !default;
+
+$card-columns-count: 3 !default;
+$card-columns-gap: 1.25rem !default;
+$card-columns-margin: $card-spacer-y !default;
+
+
+// Tooltips
+
+$tooltip-max-width: 200px !default;
+$tooltip-color: $white !default;
+$tooltip-bg: $black !default;
+$tooltip-opacity: .9 !default;
+$tooltip-padding-y: 3px !default;
+$tooltip-padding-x: 8px !default;
+$tooltip-margin: 3px !default;
+
+$tooltip-arrow-width: 5px !default;
+$tooltip-arrow-color: $tooltip-bg !default;
+
+
+// Popovers
+
+$popover-inner-padding: 1px !default;
+$popover-bg: $white !default;
+$popover-max-width: 276px !default;
+$popover-border-width: $border-width !default;
+$popover-border-color: rgba($black,.2) !default;
+$popover-box-shadow: 0 5px 10px rgba($black,.2) !default;
+
+$popover-title-bg: darken($popover-bg, 3%) !default;
+$popover-title-color: $headings-color !default;
+$popover-title-padding-y: 8px !default;
+$popover-title-padding-x: 14px !default;
+
+$popover-content-color: $body-color !default;
+$popover-content-padding-y: 9px !default;
+$popover-content-padding-x: 14px !default;
+
+$popover-arrow-width: 10px !default;
+$popover-arrow-color: $popover-bg !default;
+
+$popover-arrow-outer-width: ($popover-arrow-width + 1px) !default;
+$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;
+
+
+// Badges
+
+$badge-default-bg: $gray-light !default;
+$badge-primary-bg: $brand-primary !default;
+$badge-success-bg: $brand-success !default;
+$badge-info-bg: $brand-info !default;
+$badge-warning-bg: $brand-warning !default;
+$badge-danger-bg: $brand-danger !default;
+
+$badge-color: $white !default;
+$badge-link-hover-color: $white !default;
+$badge-font-size: 75% !default;
+$badge-font-weight: $font-weight-bold !default;
+$badge-padding-y: .25em !default;
+$badge-padding-x: .4em !default;
+
+$badge-pill-padding-x: .6em !default;
+// Use a higher than normal value to ensure completely rounded edges when
+// customizing padding or font-size on labels.
+$badge-pill-border-radius: 10rem !default;
+
+
+// Modals
+
+// Padding applied to the modal body
+$modal-inner-padding: 15px !default;
+
+$modal-dialog-margin: 10px !default;
+$modal-dialog-sm-up-margin-y: 30px !default;
+
+$modal-title-line-height: $line-height-base !default;
+
+$modal-content-bg: $white !default;
+$modal-content-border-color: rgba($black,.2) !default;
+$modal-content-border-width: $border-width !default;
+$modal-content-xs-box-shadow: 0 3px 9px rgba($black,.5) !default;
+$modal-content-sm-up-box-shadow: 0 5px 15px rgba($black,.5) !default;
+
+$modal-backdrop-bg: $black !default;
+$modal-backdrop-opacity: .5 !default;
+$modal-header-border-color: $gray-lighter !default;
+$modal-footer-border-color: $modal-header-border-color !default;
+$modal-header-border-width: $modal-content-border-width !default;
+$modal-footer-border-width: $modal-header-border-width !default;
+$modal-header-padding: 15px !default;
+
+$modal-lg: 800px !default;
+$modal-md: 500px !default;
+$modal-sm: 300px !default;
+
+$modal-transition: transform .3s ease-out !default;
+
+
+// Alerts
+//
+// Define alert colors, border radius, and padding.
+
+$alert-padding-y: .75rem !default;
+$alert-padding-x: 1.25rem !default;
+$alert-margin-bottom: 1rem !default;
+$alert-border-radius: $border-radius !default;
+$alert-link-font-weight: $font-weight-bold !default;
+$alert-border-width: $border-width !default;
+
+$alert-success-bg: $state-success-bg !default;
+$alert-success-text: $state-success-text !default;
+$alert-success-border-color: $state-success-border-color !default;
+
+$alert-info-bg: $state-info-bg !default;
+$alert-info-text: $state-info-text !default;
+$alert-info-border-color: $state-info-border-color !default;
+
+$alert-warning-bg: $state-warning-bg !default;
+$alert-warning-text: $state-warning-text !default;
+$alert-warning-border-color: $state-warning-border-color !default;
+
+$alert-danger-bg: $state-danger-bg !default;
+$alert-danger-text: $state-danger-text !default;
+$alert-danger-border-color: $state-danger-border-color !default;
+
+
+// Progress bars
+
+$progress-height: 1rem !default;
+$progress-font-size: .75rem !default;
+$progress-bg: $gray-lighter !default;
+$progress-border-radius: $border-radius !default;
+$progress-box-shadow: inset 0 .1rem .1rem rgba($black,.1) !default;
+$progress-bar-color: $white !default;
+$progress-bar-bg: $brand-primary !default;
+$progress-bar-animation-timing: 1s linear infinite !default;
+$progress-bar-transition: width .6s ease !default;
+
+// List group
+
+$list-group-color: $body-color !default;
+$list-group-bg: $white !default;
+$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: .75rem !default;
+$list-group-item-padding-x: 1.25rem !default;
+
+$list-group-hover-bg: $gray-lightest !default;
+$list-group-active-color: $component-active-color !default;
+$list-group-active-bg: $component-active-bg !default;
+$list-group-active-border-color: $list-group-active-bg !default;
+
+$list-group-disabled-color: $gray-light !default;
+$list-group-disabled-bg: $list-group-bg !default;
+
+$list-group-link-color: $gray !default;
+$list-group-link-hover-color: $list-group-link-color !default;
+
+$list-group-link-active-color: $list-group-color !default;
+$list-group-link-active-bg: $gray-lighter !default;
+
+
+// Image thumbnails
+
+$thumbnail-padding: .25rem !default;
+$thumbnail-bg: $body-bg !default;
+$thumbnail-border-width: $border-width !default;
+$thumbnail-border-color: #ddd !default;
+$thumbnail-border-radius: $border-radius !default;
+$thumbnail-box-shadow: 0 1px 2px rgba($black,.075) !default;
+$thumbnail-transition: all .2s ease-in-out !default;
+
+
+// Figures
+
+$figure-caption-font-size: 90% !default;
+$figure-caption-color: $gray-light !default;
+
+
+// Breadcrumbs
+
+$breadcrumb-padding-y: .75rem !default;
+$breadcrumb-padding-x: 1rem !default;
+$breadcrumb-item-padding: .5rem !default;
+
+$breadcrumb-bg: $gray-lighter !default;
+$breadcrumb-divider-color: $gray-light !default;
+$breadcrumb-active-color: $gray-light !default;
+$breadcrumb-divider: "/" !default;
+
+
+// Carousel
+
+$carousel-control-color: $white !default;
+$carousel-control-width: 15% !default;
+$carousel-control-opacity: .5 !default;
+
+$carousel-indicator-width: 30px !default;
+$carousel-indicator-height: 3px !default;
+$carousel-indicator-spacer: 3px !default;
+$carousel-indicator-active-bg: $white !default;
+
+$carousel-caption-width: 70% !default;
+$carousel-caption-color: $white !default;
+
+$carousel-control-icon-width: 20px !default;
+
+$carousel-control-prev-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E"), "#", "%23") !default;
+$carousel-control-next-icon-bg: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E"), "#", "%23") !default;
+
+$carousel-transition: transform .6s ease !default;
+
+
+// Close
+
+$close-font-size: $font-size-base * 1.5 !default;
+$close-font-weight: $font-weight-bold !default;
+$close-color: $black !default;
+$close-text-shadow: 0 1px 0 $white !default;
+
+// Code
+
+$code-font-size: 90% !default;
+$code-padding-y: .2rem !default;
+$code-padding-x: .4rem !default;
+$code-color: #bd4147 !default;
+$code-bg: $gray-lightest !default;
+
+$kbd-color: $white !default;
+$kbd-bg: $gray-dark !default;
+
+$pre-color: $gray-dark !default;
+$pre-scrollable-max-height: 340px !default;
diff --git a/src/scss/bootstrap/bootstrap-grid.scss b/src/scss/bootstrap/bootstrap-grid.scss
new file mode 100644
index 0000000..2ba6858
--- /dev/null
+++ b/src/scss/bootstrap/bootstrap-grid.scss
@@ -0,0 +1,37 @@
+// Bootstrap Grid only
+//
+// Includes relevant variables and mixins for the flexbox grid
+// system, as well as the generated predefined classes (e.g., `.col-sm-4`).
+
+//
+// Box sizing, responsive, and more
+//
+
+@at-root {
+ @-ms-viewport { width: device-width; }
+}
+
+html {
+ box-sizing: border-box;
+ -ms-overflow-style: scrollbar;
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: inherit;
+}
+
+@import "custom";
+@import "variables";
+
+//
+// Grid mixins
+//
+
+@import "mixins/breakpoints";
+@import "mixins/grid-framework";
+@import "mixins/grid";
+
+@import "grid";
+@import "utilities/flex";
diff --git a/src/scss/bootstrap/bootstrap-reboot.scss b/src/scss/bootstrap/bootstrap-reboot.scss
new file mode 100644
index 0000000..5867f08
--- /dev/null
+++ b/src/scss/bootstrap/bootstrap-reboot.scss
@@ -0,0 +1,9 @@
+// Bootstrap Reboot only
+//
+// Includes only Normalize and our custom Reboot reset.
+
+@import "custom";
+@import "variables";
+@import "mixins";
+
+@import "reboot";
diff --git a/src/scss/bootstrap/bootstrap.scss b/src/scss/bootstrap/bootstrap.scss
new file mode 100644
index 0000000..f7577f5
--- /dev/null
+++ b/src/scss/bootstrap/bootstrap.scss
@@ -0,0 +1,52 @@
+/*!
+ * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors
+ * Copyright 2011-2017 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+// Core variables and mixins
+@import "custom";
+@import "variables";
+@import "mixins";
+
+@import "print";
+
+// Core CSS
+@import "reboot";
+@import "type";
+@import "images";
+@import "code";
+@import "grid";
+@import "tables";
+@import "forms";
+@import "buttons";
+
+// Components
+@import "transitions";
+@import "dropdown";
+@import "button-group";
+@import "input-group";
+@import "custom-forms";
+@import "nav";
+@import "navbar";
+@import "card";
+@import "breadcrumb";
+@import "pagination";
+@import "badge";
+@import "jumbotron";
+@import "alert";
+@import "progress";
+@import "media";
+@import "list-group";
+@import "responsive-embed";
+@import "close";
+
+// Components w/ JavaScript
+@import "modal";
+@import "tooltip";
+@import "popover";
+@import "carousel";
+
+// Utility classes
+@import "utilities";
diff --git a/src/scss/bootstrap/mixins/_alert.scss b/src/scss/bootstrap/mixins/_alert.scss
new file mode 100644
index 0000000..1e9307e
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_alert.scss
@@ -0,0 +1,14 @@
+// Alerts
+
+@mixin alert-variant($background, $border, $body-color) {
+ color: $body-color;
+ background-color: $background;
+ border-color: $border;
+
+ hr {
+ border-top-color: darken($border, 5%);
+ }
+ .alert-link {
+ color: darken($body-color, 10%);
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_background-variant.scss b/src/scss/bootstrap/mixins/_background-variant.scss
new file mode 100644
index 0000000..54a734d
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_background-variant.scss
@@ -0,0 +1,12 @@
+// Contextual backgrounds
+
+@mixin bg-variant($parent, $color) {
+ #{$parent} {
+ background-color: $color !important;
+ }
+ a#{$parent} {
+ @include hover-focus {
+ background-color: darken($color, 10%) !important;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_badge.scss b/src/scss/bootstrap/mixins/_badge.scss
new file mode 100644
index 0000000..9fa44b6
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_badge.scss
@@ -0,0 +1,11 @@
+// Badges
+
+@mixin badge-variant($color) {
+ background-color: $color;
+
+ &[href] {
+ @include hover-focus {
+ background-color: darken($color, 10%);
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_border-radius.scss b/src/scss/bootstrap/mixins/_border-radius.scss
new file mode 100644
index 0000000..2024feb
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_border-radius.scss
@@ -0,0 +1,35 @@
+// Single side border-radius
+
+@mixin border-radius($radius: $border-radius) {
+ @if $enable-rounded {
+ border-radius: $radius;
+ }
+}
+
+@mixin border-top-radius($radius) {
+ @if $enable-rounded {
+ border-top-left-radius: $radius;
+ border-top-right-radius: $radius;
+ }
+}
+
+@mixin border-right-radius($radius) {
+ @if $enable-rounded {
+ border-top-right-radius: $radius;
+ border-bottom-right-radius: $radius;
+ }
+}
+
+@mixin border-bottom-radius($radius) {
+ @if $enable-rounded {
+ border-bottom-right-radius: $radius;
+ border-bottom-left-radius: $radius;
+ }
+}
+
+@mixin border-left-radius($radius) {
+ @if $enable-rounded {
+ border-top-left-radius: $radius;
+ border-bottom-left-radius: $radius;
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_box-shadow.scss b/src/scss/bootstrap/mixins/_box-shadow.scss
new file mode 100644
index 0000000..b2410e5
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_box-shadow.scss
@@ -0,0 +1,5 @@
+@mixin box-shadow($shadow...) {
+ @if $enable-shadows {
+ box-shadow: $shadow;
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_breakpoints.scss b/src/scss/bootstrap/mixins/_breakpoints.scss
new file mode 100644
index 0000000..be1d034
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_breakpoints.scss
@@ -0,0 +1,99 @@
+// Breakpoint viewport sizes and media queries.
+//
+// Breakpoints are defined as a map of (name: minimum width), order from small to large:
+//
+// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)
+//
+// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.
+
+// Name of the next breakpoint, or null for the last breakpoint.
+//
+// >> breakpoint-next(sm)
+// md
+// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
+// md
+// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))
+// md
+@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {
+ $n: index($breakpoint-names, $name);
+ @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);
+}
+
+// Minimum breakpoint width. Null for the smallest (first) breakpoint.
+//
+// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
+// 576px
+@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {
+ $min: map-get($breakpoints, $name);
+ @return if($min != 0, $min, null);
+}
+
+// Maximum breakpoint width. Null for the largest (last) breakpoint.
+// The maximum value is calculated as the minimum of the next one less 0.1.
+//
+// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
+// 767px
+@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {
+ $next: breakpoint-next($name, $breakpoints);
+ @return if($next, breakpoint-min($next, $breakpoints) - 1px, null);
+}
+
+// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.
+// Useful for making responsive utilities.
+//
+// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
+// "" (Returns a blank string)
+// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
+// "-sm"
+@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {
+ @return if(breakpoint-min($name, $breakpoints) == null, "", "-#{$name}");
+}
+
+// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.
+// Makes the @content apply to the given breakpoint and wider.
+@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {
+ $min: breakpoint-min($name, $breakpoints);
+ @if $min {
+ @media (min-width: $min) {
+ @content;
+ }
+ } @else {
+ @content;
+ }
+}
+
+// Media of at most the maximum breakpoint width. No query for the largest breakpoint.
+// Makes the @content apply to the given breakpoint and narrower.
+@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {
+ $max: breakpoint-max($name, $breakpoints);
+ @if $max {
+ @media (max-width: $max) {
+ @content;
+ }
+ } @else {
+ @content;
+ }
+}
+
+// Media that spans multiple breakpoint widths.
+// Makes the @content apply between the min and max breakpoints
+@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {
+ $min: breakpoint-max($lower, $breakpoints);
+ $max: breakpoint-max($upper, $breakpoints);
+
+ @media (min-width: $min) and (max-width: $max) {
+ @content;
+ }
+}
+
+// Media between the breakpoint's minimum and maximum widths.
+// No minimum for the smallest breakpoint, and no maximum for the largest one.
+// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.
+@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {
+ $min: breakpoint-min($name, $breakpoints);
+ $max: breakpoint-max($name, $breakpoints);
+
+ @media (min-width: $min) and (max-width: $max) {
+ @content;
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_buttons.scss b/src/scss/bootstrap/mixins/_buttons.scss
new file mode 100644
index 0000000..47f2834
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_buttons.scss
@@ -0,0 +1,87 @@
+// Button variants
+//
+// Easily pump out default styles, as well as :hover, :focus, :active,
+// and disabled options for all buttons
+
+@mixin button-variant($color, $background, $border) {
+ $active-background: darken($background, 10%);
+ $active-border: darken($border, 12%);
+
+ color: $color;
+ background-color: $background;
+ border-color: $border;
+ @include box-shadow($btn-box-shadow);
+
+ // Hover and focus styles are shared
+ @include hover {
+ color: $color;
+ background-color: $active-background;
+ border-color: $active-border;
+ }
+ &:focus,
+ &.focus {
+ // Avoid using mixin so we can pass custom focus shadow properly
+ @if $enable-shadows {
+ box-shadow: $btn-box-shadow, 0 0 0 2px rgba($border, .5);
+ } @else {
+ box-shadow: 0 0 0 2px rgba($border, .5);
+ }
+ }
+
+ // Disabled comes first so active can properly restyle
+ &.disabled,
+ &:disabled {
+ background-color: $background;
+ border-color: $border;
+ }
+
+ &:active,
+ &.active,
+ .show > &.dropdown-toggle {
+ color: $color;
+ background-color: $active-background;
+ background-image: none; // Remove the gradient for the pressed/active state
+ border-color: $active-border;
+ @include box-shadow($btn-active-box-shadow);
+ }
+}
+
+@mixin button-outline-variant($color, $color-hover: #fff) {
+ color: $color;
+ background-color: transparent;
+ background-image: none;
+ border-color: $color;
+
+ @include hover {
+ color: $color-hover;
+ background-color: $color;
+ border-color: $color;
+ }
+
+ &:focus,
+ &.focus {
+ box-shadow: 0 0 0 2px rgba($color, .5);
+ }
+
+ &.disabled,
+ &:disabled {
+ color: $color;
+ background-color: transparent;
+ }
+
+ &:active,
+ &.active,
+ .show > &.dropdown-toggle {
+ color: $color-hover;
+ background-color: $color;
+ border-color: $color;
+ }
+}
+
+// Button sizes
+@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
+ padding: $padding-y $padding-x;
+ font-size: $font-size;
+ line-height: $line-height;
+ @include border-radius($border-radius);
+}
diff --git a/src/scss/bootstrap/mixins/_cards.scss b/src/scss/bootstrap/mixins/_cards.scss
new file mode 100644
index 0000000..e535b31
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_cards.scss
@@ -0,0 +1,53 @@
+// Card variants
+
+@mixin card-variant($background, $border) {
+ background-color: $background;
+ border-color: $border;
+
+ .card-header,
+ .card-footer {
+ background-color: transparent;
+ }
+}
+
+@mixin card-outline-variant($color) {
+ background-color: transparent;
+ border-color: $color;
+
+ .card-header,
+ .card-footer {
+ background-color: transparent;
+ border-color: $color;
+ }
+}
+
+//
+// Inverse text within a card for use with dark backgrounds
+//
+
+@mixin card-inverse {
+ color: rgba(255,255,255,.65);
+
+ .card-header,
+ .card-footer {
+ background-color: transparent;
+ border-color: rgba(255,255,255,.2);
+ }
+ .card-header,
+ .card-footer,
+ .card-title,
+ .card-blockquote {
+ color: #fff;
+ }
+ .card-link,
+ .card-text,
+ .card-subtitle,
+ .card-blockquote .blockquote-footer {
+ color: rgba(255,255,255,.65);
+ }
+ .card-link {
+ @include hover-focus {
+ color: $card-link-hover-color;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_clearfix.scss b/src/scss/bootstrap/mixins/_clearfix.scss
new file mode 100644
index 0000000..11a977b
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_clearfix.scss
@@ -0,0 +1,7 @@
+@mixin clearfix() {
+ &::after {
+ display: block;
+ clear: both;
+ content: "";
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_float.scss b/src/scss/bootstrap/mixins/_float.scss
new file mode 100644
index 0000000..b43116f
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_float.scss
@@ -0,0 +1,9 @@
+@mixin float-left {
+ float: left !important;
+}
+@mixin float-right {
+ float: right !important;
+}
+@mixin float-none {
+ float: none !important;
+}
diff --git a/src/scss/bootstrap/mixins/_forms.scss b/src/scss/bootstrap/mixins/_forms.scss
new file mode 100644
index 0000000..8607955
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_forms.scss
@@ -0,0 +1,55 @@
+// Form validation states
+//
+// Used in _forms.scss to generate the form validation CSS for warnings, errors,
+// and successes.
+
+@mixin form-control-validation($color) {
+ // Color the label and help text
+ .form-control-feedback,
+ .form-control-label,
+ .col-form-label,
+ .form-check-label,
+ .custom-control {
+ color: $color;
+ }
+
+ // Set the border and box shadow on specific inputs to match
+ .form-control,
+ .custom-select,
+ .custom-file-control {
+ border-color: $color;
+
+ &:focus {
+ @include box-shadow($input-box-shadow, 0 0 6px lighten($color, 20%));
+ }
+ }
+
+ // Set validation states also for addons
+ .input-group-addon {
+ color: $color;
+ background-color: lighten($color, 40%);
+ border-color: $color;
+ }
+}
+
+// Form control focus state
+//
+// Generate a customized focus state and for any input with the specified color,
+// which defaults to the `@input-border-color-focus` variable.
+//
+// We highly encourage you to not customize the default value, but instead use
+// this to tweak colors on an as-needed basis. This aesthetic change is based on
+// WebKit's default styles, but applicable to a wider range of browsers. Its
+// usability and accessibility should be taken into account with any change.
+//
+// Example usage: change the default blue border and shadow to white for better
+// contrast against a dark gray background.
+@mixin form-control-focus() {
+ &:focus {
+ color: $input-color-focus;
+ background-color: $input-bg-focus;
+ border-color: $input-border-color-focus;
+ outline: none;
+ @include box-shadow($input-box-shadow-focus);
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_gradients.scss b/src/scss/bootstrap/mixins/_gradients.scss
new file mode 100644
index 0000000..bad79f9
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_gradients.scss
@@ -0,0 +1,37 @@
+// Gradients
+
+// Horizontal gradient, from left to right
+//
+// Creates two color stops, start and end, by specifying a color and position for each color stop.
+@mixin gradient-x($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
+ background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);
+ background-repeat: repeat-x;
+}
+
+// Vertical gradient, from top to bottom
+//
+// Creates two color stops, start and end, by specifying a color and position for each color stop.
+@mixin gradient-y($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
+ background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);
+ background-repeat: repeat-x;
+}
+
+@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {
+ background-image: linear-gradient($deg, $start-color, $end-color);
+ background-repeat: repeat-x;
+}
+@mixin gradient-x-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
+ background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
+ background-repeat: no-repeat;
+}
+@mixin gradient-y-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
+ background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
+ background-repeat: no-repeat;
+}
+@mixin gradient-radial($inner-color: #555, $outer-color: #333) {
+ background-image: radial-gradient(circle, $inner-color, $outer-color);
+ background-repeat: no-repeat;
+}
+@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {
+ background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
+}
diff --git a/src/scss/bootstrap/mixins/_grid-framework.scss b/src/scss/bootstrap/mixins/_grid-framework.scss
new file mode 100644
index 0000000..5459a86
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_grid-framework.scss
@@ -0,0 +1,66 @@
+// Framework grid generation
+//
+// Used only by Bootstrap to generate the correct number of grid classes given
+// any value of `$grid-columns`.
+
+@mixin make-grid-columns($columns: $grid-columns, $gutters: $grid-gutter-widths, $breakpoints: $grid-breakpoints) {
+ // Common properties for all breakpoints
+ %grid-column {
+ position: relative;
+ width: 100%;
+ min-height: 1px; // Prevent columns from collapsing when empty
+
+ @include make-gutters($gutters);
+ }
+
+ @each $breakpoint in map-keys($breakpoints) {
+ $infix: breakpoint-infix($breakpoint, $breakpoints);
+
+ // Allow columns to stretch full width below their breakpoints
+ @for $i from 1 through $columns {
+ .col#{$infix}-#{$i} {
+ @extend %grid-column;
+ }
+ }
+ .col#{$infix},
+ .col#{$infix}-auto {
+ @extend %grid-column;
+ }
+
+ @include media-breakpoint-up($breakpoint, $breakpoints) {
+ // Provide basic `.col-{bp}` classes for equal-width flexbox columns
+ .col#{$infix} {
+ flex-basis: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ }
+ .col#{$infix}-auto {
+ flex: 0 0 auto;
+ width: auto;
+ }
+
+ @for $i from 1 through $columns {
+ .col#{$infix}-#{$i} {
+ @include make-col($i, $columns);
+ }
+ }
+
+ @each $modifier in (pull, push) {
+ @for $i from 0 through $columns {
+ .#{$modifier}#{$infix}-#{$i} {
+ @include make-col-modifier($modifier, $i, $columns)
+ }
+ }
+ }
+
+ // `$columns - 1` because offsetting by the width of an entire row isn't possible
+ @for $i from 0 through ($columns - 1) {
+ @if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-xs-0
+ .offset#{$infix}-#{$i} {
+ @include make-col-modifier(offset, $i, $columns)
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_grid.scss b/src/scss/bootstrap/mixins/_grid.scss
new file mode 100644
index 0000000..87920e2
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_grid.scss
@@ -0,0 +1,94 @@
+/// Grid system
+//
+// Generate semantic grid columns with these mixins.
+
+@mixin make-container($gutters: $grid-gutter-widths) {
+ margin-right: auto;
+ margin-left: auto;
+
+ @each $breakpoint in map-keys($gutters) {
+ @include media-breakpoint-up($breakpoint) {
+ $gutter: map-get($gutters, $breakpoint);
+ padding-right: ($gutter / 2);
+ padding-left: ($gutter / 2);
+ }
+ }
+}
+
+
+// For each breakpoint, define the maximum width of the container in a media query
+@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {
+ @each $breakpoint, $container-max-width in $max-widths {
+ @include media-breakpoint-up($breakpoint, $breakpoints) {
+ width: $container-max-width;
+ max-width: 100%;
+ }
+ }
+}
+
+@mixin make-gutters($gutters: $grid-gutter-widths) {
+ @each $breakpoint in map-keys($gutters) {
+ @include media-breakpoint-up($breakpoint) {
+ $gutter: map-get($gutters, $breakpoint);
+ padding-right: ($gutter / 2);
+ padding-left: ($gutter / 2);
+ }
+ }
+}
+
+@mixin make-row($gutters: $grid-gutter-widths) {
+ display: flex;
+ flex-wrap: wrap;
+
+ @each $breakpoint in map-keys($gutters) {
+ @include media-breakpoint-up($breakpoint) {
+ $gutter: map-get($gutters, $breakpoint);
+ margin-right: ($gutter / -2);
+ margin-left: ($gutter / -2);
+ }
+ }
+}
+
+@mixin make-col-ready($gutters: $grid-gutter-widths) {
+ position: relative;
+ // Prevent columns from becoming too narrow when at smaller grid tiers by
+ // always setting `width: 100%;`. This works because we use `flex` values
+ // later on to override this initial width.
+ width: 100%;
+ min-height: 1px; // Prevent collapsing
+
+ @each $breakpoint in map-keys($gutters) {
+ @include media-breakpoint-up($breakpoint) {
+ $gutter: map-get($gutters, $breakpoint);
+ padding-right: ($gutter / 2);
+ padding-left: ($gutter / 2);
+ }
+ }
+}
+
+@mixin make-col($size, $columns: $grid-columns) {
+ width: percentage($size / $columns);
+}
+
+@mixin make-col-offset($size, $columns: $grid-columns) {
+ margin-left: percentage($size / $columns);
+}
+
+@mixin make-col-push($size, $columns: $grid-columns) {
+ left: if($size > 0, percentage($size / $columns), auto);
+}
+
+@mixin make-col-pull($size, $columns: $grid-columns) {
+ right: if($size > 0, percentage($size / $columns), auto);
+}
+
+@mixin make-col-modifier($type, $size, $columns) {
+ // Work around the lack of dynamic mixin @include support (https://github.com/sass/sass/issues/626)
+ @if $type == push {
+ @include make-col-push($size, $columns);
+ } @else if $type == pull {
+ @include make-col-pull($size, $columns);
+ } @else if $type == offset {
+ @include make-col-offset($size, $columns);
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_hover.scss b/src/scss/bootstrap/mixins/_hover.scss
new file mode 100644
index 0000000..4aa4b1d
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_hover.scss
@@ -0,0 +1,60 @@
+@mixin hover {
+ // TODO: re-enable along with mq4-hover-shim
+// @if $enable-hover-media-query {
+// // See Media Queries Level 4: https://drafts.csswg.org/mediaqueries/#hover
+// // Currently shimmed by https://github.com/twbs/mq4-hover-shim
+// @media (hover: hover) {
+// &:hover { @content }
+// }
+// }
+// @else {
+// scss-lint:disable Indentation
+ &:hover { @content }
+// scss-lint:enable Indentation
+// }
+}
+
+
+@mixin hover-focus {
+ @if $enable-hover-media-query {
+ &:focus { @content }
+ @include hover { @content }
+ } @else {
+ &:focus,
+ &:hover {
+ @content
+ }
+ }
+}
+
+@mixin plain-hover-focus {
+ @if $enable-hover-media-query {
+ &,
+ &:focus {
+ @content
+ }
+ @include hover { @content }
+ } @else {
+ &,
+ &:focus,
+ &:hover {
+ @content
+ }
+ }
+}
+
+@mixin hover-focus-active {
+ @if $enable-hover-media-query {
+ &:focus,
+ &:active {
+ @content
+ }
+ @include hover { @content }
+ } @else {
+ &:focus,
+ &:active,
+ &:hover {
+ @content
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_image.scss b/src/scss/bootstrap/mixins/_image.scss
new file mode 100644
index 0000000..c2b45f2
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_image.scss
@@ -0,0 +1,36 @@
+// Image Mixins
+// - Responsive image
+// - Retina image
+
+
+// Responsive image
+//
+// Keep images from scaling beyond the width of their parents.
+
+@mixin img-fluid {
+ // Part 1: Set a maximum relative to the parent
+ max-width: 100%;
+ // Part 2: Override the height to auto, otherwise images will be stretched
+ // when setting a width and height attribute on the img element.
+ height: auto;
+}
+
+
+// Retina image
+//
+// Short retina mixin for setting background-image and -size.
+
+@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
+ background-image: url($file-1x);
+
+ // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,
+ // but doesn't convert dppx=>dpi.
+ // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.
+ // Compatibility info: http://caniuse.com/#feat=css-media-resolution
+ @media
+ only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx
+ only screen and (min-resolution: 2dppx) { // Standardized
+ background-image: url($file-2x);
+ background-size: $width-1x $height-1x;
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_list-group.scss b/src/scss/bootstrap/mixins/_list-group.scss
new file mode 100644
index 0000000..ba27b50
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_list-group.scss
@@ -0,0 +1,26 @@
+// List Groups
+
+@mixin list-group-item-variant($state, $background, $color) {
+ .list-group-item-#{$state} {
+ color: $color;
+ background-color: $background;
+ }
+
+ //scss-lint:disable QualifyingElement
+ a.list-group-item-#{$state},
+ button.list-group-item-#{$state} {
+ color: $color;
+
+ @include hover-focus {
+ color: $color;
+ background-color: darken($background, 5%);
+ }
+
+ &.active {
+ color: #fff;
+ background-color: $color;
+ border-color: $color;
+ }
+ }
+ // scss-lint:enable QualifyingElement
+}
diff --git a/src/scss/bootstrap/mixins/_lists.scss b/src/scss/bootstrap/mixins/_lists.scss
new file mode 100644
index 0000000..2518562
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_lists.scss
@@ -0,0 +1,7 @@
+// Lists
+
+// Unstyled keeps list items block level, just removes default browser padding and list-style
+@mixin list-unstyled {
+ padding-left: 0;
+ list-style: none;
+}
diff --git a/src/scss/bootstrap/mixins/_nav-divider.scss b/src/scss/bootstrap/mixins/_nav-divider.scss
new file mode 100644
index 0000000..493de03
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_nav-divider.scss
@@ -0,0 +1,10 @@
+// Horizontal dividers
+//
+// Dividers (basically an hr) within dropdowns and nav lists
+
+@mixin nav-divider($color: #e5e5e5) {
+ height: 0;
+ margin: ($spacer / 2) 0;
+ overflow: hidden;
+ border-top: 1px solid $color;
+}
diff --git a/src/scss/bootstrap/mixins/_navbar-align.scss b/src/scss/bootstrap/mixins/_navbar-align.scss
new file mode 100644
index 0000000..c454a4f
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_navbar-align.scss
@@ -0,0 +1,9 @@
+// Navbar vertical align
+//
+// Vertically center elements in the navbar.
+// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
+
+// @mixin navbar-vertical-align($element-height) {
+// margin-top: (($navbar-height - $element-height) / 2);
+// margin-bottom: (($navbar-height - $element-height) / 2);
+// }
diff --git a/src/scss/bootstrap/mixins/_pagination.scss b/src/scss/bootstrap/mixins/_pagination.scss
new file mode 100644
index 0000000..8cd9317
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_pagination.scss
@@ -0,0 +1,21 @@
+// Pagination
+
+@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
+ .page-link {
+ padding: $padding-y $padding-x;
+ font-size: $font-size;
+ }
+
+ .page-item {
+ &:first-child {
+ .page-link {
+ @include border-left-radius($border-radius);
+ }
+ }
+ &:last-child {
+ .page-link {
+ @include border-right-radius($border-radius);
+ }
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_reset-text.scss b/src/scss/bootstrap/mixins/_reset-text.scss
new file mode 100644
index 0000000..4cf9e79
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_reset-text.scss
@@ -0,0 +1,18 @@
+// scss-lint:disable DuplicateProperty
+@mixin reset-text {
+ font-family: $font-family-base;
+ // We deliberately do NOT reset font-size or word-wrap.
+ font-style: normal;
+ font-weight: $font-weight-normal;
+ line-height: $line-height-base;
+ text-align: left; // Fallback for where `start` is not supported
+ text-align: start;
+ text-decoration: none;
+ text-shadow: none;
+ text-transform: none;
+ letter-spacing: normal;
+ word-break: normal;
+ word-spacing: normal;
+ white-space: normal;
+ line-break: auto;
+}
diff --git a/src/scss/bootstrap/mixins/_resize.scss b/src/scss/bootstrap/mixins/_resize.scss
new file mode 100644
index 0000000..66f233a
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_resize.scss
@@ -0,0 +1,6 @@
+// Resize anything
+
+@mixin resizable($direction) {
+ overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
+ resize: $direction; // Options: horizontal, vertical, both
+}
diff --git a/src/scss/bootstrap/mixins/_screen-reader.scss b/src/scss/bootstrap/mixins/_screen-reader.scss
new file mode 100644
index 0000000..a5fa51c
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_screen-reader.scss
@@ -0,0 +1,35 @@
+// Only display content to screen readers
+//
+// See: http://a11yproject.com/posts/how-to-hide-content
+// See: http://hugogiraudel.com/2016/10/13/css-hide-and-seek/
+
+@mixin sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0,0,0,0);
+ white-space: nowrap;
+ clip-path: inset(50%);
+ border: 0;
+}
+
+// Use in conjunction with .sr-only to only display content when it's focused.
+//
+// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
+//
+// Credit: HTML5 Boilerplate
+
+@mixin sr-only-focusable {
+ &:active,
+ &:focus {
+ position: static;
+ width: auto;
+ height: auto;
+ overflow: visible;
+ clip: auto;
+ white-space: normal;
+ clip-path: none;
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_size.scss b/src/scss/bootstrap/mixins/_size.scss
new file mode 100644
index 0000000..b9dd48e
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_size.scss
@@ -0,0 +1,6 @@
+// Sizing shortcuts
+
+@mixin size($width, $height: $width) {
+ width: $width;
+ height: $height;
+}
diff --git a/src/scss/bootstrap/mixins/_table-row.scss b/src/scss/bootstrap/mixins/_table-row.scss
new file mode 100644
index 0000000..84f1d30
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_table-row.scss
@@ -0,0 +1,30 @@
+// Tables
+
+@mixin table-row-variant($state, $background) {
+ // Exact selectors below required to override `.table-striped` and prevent
+ // inheritance to nested tables.
+ .table-#{$state} {
+ &,
+ > th,
+ > td {
+ background-color: $background;
+ }
+ }
+
+ // Hover states for `.table-hover`
+ // Note: this is not available for cells or rows within `thead` or `tfoot`.
+ .table-hover {
+ $hover-background: darken($background, 5%);
+
+ .table-#{$state} {
+ @include hover {
+ background-color: $hover-background;
+
+ > td,
+ > th {
+ background-color: $hover-background;
+ }
+ }
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_text-emphasis.scss b/src/scss/bootstrap/mixins/_text-emphasis.scss
new file mode 100644
index 0000000..9cd4b6a
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_text-emphasis.scss
@@ -0,0 +1,12 @@
+// Typography
+
+@mixin text-emphasis-variant($parent, $color) {
+ #{$parent} {
+ color: $color !important;
+ }
+ a#{$parent} {
+ @include hover-focus {
+ color: darken($color, 10%) !important;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_text-hide.scss b/src/scss/bootstrap/mixins/_text-hide.scss
new file mode 100644
index 0000000..52a38a9
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_text-hide.scss
@@ -0,0 +1,8 @@
+// CSS image replacement
+@mixin text-hide() {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
diff --git a/src/scss/bootstrap/mixins/_text-truncate.scss b/src/scss/bootstrap/mixins/_text-truncate.scss
new file mode 100644
index 0000000..3504bb1
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_text-truncate.scss
@@ -0,0 +1,8 @@
+// Text truncate
+// Requires inline-block or block for proper styling
+
+@mixin text-truncate() {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
diff --git a/src/scss/bootstrap/mixins/_transition.scss b/src/scss/bootstrap/mixins/_transition.scss
new file mode 100644
index 0000000..7e33dee
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_transition.scss
@@ -0,0 +1,9 @@
+@mixin transition($transition...) {
+ @if $enable-transitions {
+ @if length($transition) == 0 {
+ transition: $transition-base;
+ } @else {
+ transition: $transition;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_visibility.scss b/src/scss/bootstrap/mixins/_visibility.scss
new file mode 100644
index 0000000..f67fc1c
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_visibility.scss
@@ -0,0 +1,5 @@
+// Visibility
+
+@mixin invisible($visibility) {
+ visibility: $visibility !important;
+}
diff --git a/src/scss/bootstrap/utilities/_align.scss b/src/scss/bootstrap/utilities/_align.scss
new file mode 100644
index 0000000..4dbbbc2
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_align.scss
@@ -0,0 +1,6 @@
+.align-baseline { vertical-align: baseline !important; } // Browser default
+.align-top { vertical-align: top !important; }
+.align-middle { vertical-align: middle !important; }
+.align-bottom { vertical-align: bottom !important; }
+.align-text-bottom { vertical-align: text-bottom !important; }
+.align-text-top { vertical-align: text-top !important; }
diff --git a/src/scss/bootstrap/utilities/_background.scss b/src/scss/bootstrap/utilities/_background.scss
new file mode 100644
index 0000000..b9ac295
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_background.scss
@@ -0,0 +1,19 @@
+//
+// Contextual backgrounds
+//
+
+.bg-faded {
+ background-color: darken($body-bg, 3%);
+}
+
+@include bg-variant('.bg-primary', $brand-primary);
+
+@include bg-variant('.bg-success', $brand-success);
+
+@include bg-variant('.bg-info', $brand-info);
+
+@include bg-variant('.bg-warning', $brand-warning);
+
+@include bg-variant('.bg-danger', $brand-danger);
+
+@include bg-variant('.bg-inverse', $brand-inverse);
diff --git a/src/scss/bootstrap/utilities/_borders.scss b/src/scss/bootstrap/utilities/_borders.scss
new file mode 100644
index 0000000..b256881
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_borders.scss
@@ -0,0 +1,37 @@
+//
+// Border
+//
+
+.border-0 { border: 0 !important; }
+.border-top-0 { border-top: 0 !important; }
+.border-right-0 { border-right: 0 !important; }
+.border-bottom-0 { border-bottom: 0 !important; }
+.border-left-0 { border-left: 0 !important; }
+
+//
+// Border-radius
+//
+
+.rounded {
+ @include border-radius($border-radius);
+}
+.rounded-top {
+ @include border-top-radius($border-radius);
+}
+.rounded-right {
+ @include border-right-radius($border-radius);
+}
+.rounded-bottom {
+ @include border-bottom-radius($border-radius);
+}
+.rounded-left {
+ @include border-left-radius($border-radius);
+}
+
+.rounded-circle {
+ border-radius: 50%;
+}
+
+.rounded-0 {
+ border-radius: 0;
+}
diff --git a/src/scss/bootstrap/utilities/_clearfix.scss b/src/scss/bootstrap/utilities/_clearfix.scss
new file mode 100644
index 0000000..e92522a
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_clearfix.scss
@@ -0,0 +1,3 @@
+.clearfix {
+ @include clearfix();
+}
diff --git a/src/scss/bootstrap/utilities/_display.scss b/src/scss/bootstrap/utilities/_display.scss
new file mode 100644
index 0000000..4535362
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_display.scss
@@ -0,0 +1,53 @@
+//
+// Utilities for common `display` values
+//
+
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .d#{$infix}-none { display: none !important; }
+ .d#{$infix}-inline { display: inline !important; }
+ .d#{$infix}-inline-block { display: inline-block !important; }
+ .d#{$infix}-block { display: block !important; }
+ .d#{$infix}-table { display: table !important; }
+ .d#{$infix}-table-cell { display: table-cell !important; }
+ .d#{$infix}-flex { display: flex !important; }
+ .d#{$infix}-inline-flex { display: inline-flex !important; }
+ }
+}
+
+
+//
+// Utilities for toggling `display` in print
+//
+
+.d-print-block {
+ display: none !important;
+
+ @media print {
+ display: block !important;
+ }
+}
+
+.d-print-inline {
+ display: none !important;
+
+ @media print {
+ display: inline !important;
+ }
+}
+
+.d-print-inline-block {
+ display: none !important;
+
+ @media print {
+ display: inline-block !important;
+ }
+}
+
+.d-print-none {
+ @media print {
+ display: none !important;
+ }
+}
diff --git a/src/scss/bootstrap/utilities/_flex.scss b/src/scss/bootstrap/utilities/_flex.scss
new file mode 100644
index 0000000..cc69678
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_flex.scss
@@ -0,0 +1,48 @@
+// Flex variation
+//
+// Custom styles for additional flex alignment options.
+
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .order#{$infix}-first { order: -1; }
+ .order#{$infix}-last { order: 1; }
+ .order#{$infix}-0 { order: 0; }
+
+ .flex#{$infix}-row { flex-direction: row !important; }
+ .flex#{$infix}-column { flex-direction: column !important; }
+ .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }
+ .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }
+
+ .flex#{$infix}-wrap { flex-wrap: wrap !important; }
+ .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }
+ .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }
+
+ .justify-content#{$infix}-start { justify-content: flex-start !important; }
+ .justify-content#{$infix}-end { justify-content: flex-end !important; }
+ .justify-content#{$infix}-center { justify-content: center !important; }
+ .justify-content#{$infix}-between { justify-content: space-between !important; }
+ .justify-content#{$infix}-around { justify-content: space-around !important; }
+
+ .align-items#{$infix}-start { align-items: flex-start !important; }
+ .align-items#{$infix}-end { align-items: flex-end !important; }
+ .align-items#{$infix}-center { align-items: center !important; }
+ .align-items#{$infix}-baseline { align-items: baseline !important; }
+ .align-items#{$infix}-stretch { align-items: stretch !important; }
+
+ .align-content#{$infix}-start { align-content: flex-start !important; }
+ .align-content#{$infix}-end { align-content: flex-end !important; }
+ .align-content#{$infix}-center { align-content: center !important; }
+ .align-content#{$infix}-between { align-content: space-between !important; }
+ .align-content#{$infix}-around { align-content: space-around !important; }
+ .align-content#{$infix}-stretch { align-content: stretch !important; }
+
+ .align-self#{$infix}-auto { align-self: auto !important; }
+ .align-self#{$infix}-start { align-self: flex-start !important; }
+ .align-self#{$infix}-end { align-self: flex-end !important; }
+ .align-self#{$infix}-center { align-self: center !important; }
+ .align-self#{$infix}-baseline { align-self: baseline !important; }
+ .align-self#{$infix}-stretch { align-self: stretch !important; }
+ }
+}
diff --git a/src/scss/bootstrap/utilities/_float.scss b/src/scss/bootstrap/utilities/_float.scss
new file mode 100644
index 0000000..01655e9
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_float.scss
@@ -0,0 +1,9 @@
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .float#{$infix}-left { @include float-left; }
+ .float#{$infix}-right { @include float-right; }
+ .float#{$infix}-none { @include float-none; }
+ }
+}
diff --git a/src/scss/bootstrap/utilities/_position.scss b/src/scss/bootstrap/utilities/_position.scss
new file mode 100644
index 0000000..2cf08bf
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_position.scss
@@ -0,0 +1,23 @@
+// Positioning
+
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: $zindex-fixed;
+}
+
+.fixed-bottom {
+ position: fixed;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: $zindex-fixed;
+}
+
+.sticky-top {
+ position: sticky;
+ top: 0;
+ z-index: $zindex-sticky;
+}
diff --git a/src/scss/bootstrap/utilities/_screenreaders.scss b/src/scss/bootstrap/utilities/_screenreaders.scss
new file mode 100644
index 0000000..9f26fde
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_screenreaders.scss
@@ -0,0 +1,11 @@
+//
+// Screenreaders
+//
+
+.sr-only {
+ @include sr-only();
+}
+
+.sr-only-focusable {
+ @include sr-only-focusable();
+}
diff --git a/src/scss/bootstrap/utilities/_sizing.scss b/src/scss/bootstrap/utilities/_sizing.scss
new file mode 100644
index 0000000..a7dc3e4
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_sizing.scss
@@ -0,0 +1,10 @@
+// Width and height
+
+@each $prop, $abbrev in (width: w, height: h) {
+ @each $size, $length in $sizes {
+ .#{$abbrev}-#{$size} { #{$prop}: $length !important; }
+ }
+}
+
+.mw-100 { max-width: 100% !important; }
+.mh-100 { max-height: 100% !important; }
diff --git a/src/scss/bootstrap/utilities/_spacing.scss b/src/scss/bootstrap/utilities/_spacing.scss
new file mode 100644
index 0000000..c89816b
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_spacing.scss
@@ -0,0 +1,41 @@
+// Margin and Padding
+
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ @each $prop, $abbrev in (margin: m, padding: p) {
+ @each $size, $length in $spacers {
+
+ .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }
+ .#{$abbrev}t#{$infix}-#{$size} { #{$prop}-top: $length !important; }
+ .#{$abbrev}r#{$infix}-#{$size} { #{$prop}-right: $length !important; }
+ .#{$abbrev}b#{$infix}-#{$size} { #{$prop}-bottom: $length !important; }
+ .#{$abbrev}l#{$infix}-#{$size} { #{$prop}-left: $length !important; }
+ .#{$abbrev}x#{$infix}-#{$size} {
+ #{$prop}-right: $length !important;
+ #{$prop}-left: $length !important;
+ }
+ .#{$abbrev}y#{$infix}-#{$size} {
+ #{$prop}-top: $length !important;
+ #{$prop}-bottom: $length !important;
+ }
+ }
+ }
+
+ // Some special margin utils
+ .m#{$infix}-auto { margin: auto !important; }
+ .mt#{$infix}-auto { margin-top: auto !important; }
+ .mr#{$infix}-auto { margin-right: auto !important; }
+ .mb#{$infix}-auto { margin-bottom: auto !important; }
+ .ml#{$infix}-auto { margin-left: auto !important; }
+ .mx#{$infix}-auto {
+ margin-right: auto !important;
+ margin-left: auto !important;
+ }
+ .my#{$infix}-auto {
+ margin-top: auto !important;
+ margin-bottom: auto !important;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/utilities/_text.scss b/src/scss/bootstrap/utilities/_text.scss
new file mode 100644
index 0000000..4ac9053
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_text.scss
@@ -0,0 +1,61 @@
+//
+// Text
+//
+
+// Alignment
+
+.text-justify { text-align: justify !important; }
+.text-nowrap { white-space: nowrap !important; }
+.text-truncate { @include text-truncate; }
+
+// Responsive alignment
+
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .text#{$infix}-left { text-align: left !important; }
+ .text#{$infix}-right { text-align: right !important; }
+ .text#{$infix}-center { text-align: center !important; }
+ }
+}
+
+// Transformation
+
+.text-lowercase { text-transform: lowercase !important; }
+.text-uppercase { text-transform: uppercase !important; }
+.text-capitalize { text-transform: capitalize !important; }
+
+// Weight and italics
+
+.font-weight-normal { font-weight: $font-weight-normal; }
+.font-weight-bold { font-weight: $font-weight-bold; }
+.font-italic { font-style: italic; }
+
+// Contextual colors
+
+.text-white {
+ color: #fff !important;
+}
+
+@include text-emphasis-variant('.text-muted', $text-muted);
+
+@include text-emphasis-variant('.text-primary', $brand-primary);
+
+@include text-emphasis-variant('.text-success', $brand-success);
+
+@include text-emphasis-variant('.text-info', $brand-info);
+
+@include text-emphasis-variant('.text-warning', $brand-warning);
+
+@include text-emphasis-variant('.text-danger', $brand-danger);
+
+// Font color
+
+@include text-emphasis-variant('.text-gray-dark', $gray-dark);
+
+// Misc
+
+.text-hide {
+ @include text-hide();
+}
diff --git a/src/scss/bootstrap/utilities/_visibility.scss b/src/scss/bootstrap/utilities/_visibility.scss
new file mode 100644
index 0000000..823406d
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_visibility.scss
@@ -0,0 +1,11 @@
+//
+// Visibility utilities
+//
+
+.visible {
+ @include invisible(visible);
+}
+
+.invisible {
+ @include invisible(hidden);
+}
diff --git a/src/scss/core/_animate.scss b/src/scss/core/_animate.scss
new file mode 100644
index 0000000..e23d91e
--- /dev/null
+++ b/src/scss/core/_animate.scss
@@ -0,0 +1,44 @@
+// scss-lint:disable all
+@charset "UTF-8";
+
+.animated {
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+
+.animated.infinite {
+ -webkit-animation-iteration-count: infinite;
+ animation-iteration-count: infinite;
+}
+
+.animated.hinge {
+ -webkit-animation-duration: 2s;
+ animation-duration: 2s;
+}
+
+@-webkit-keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 1;
+ }
+}
+
+.fadeIn {
+ -webkit-animation-name: fadeIn;
+ animation-name: fadeIn;
+}
diff --git a/src/scss/core/_aside.scss b/src/scss/core/_aside.scss
new file mode 100644
index 0000000..298f917
--- /dev/null
+++ b/src/scss/core/_aside.scss
@@ -0,0 +1,64 @@
+.aside-menu {
+ z-index: $zindex-sticky - 1;
+ width: $aside-menu-width;
+ color: $aside-menu-color;
+ background: $aside-menu-bg;
+ @include borders($aside-menu-borders);
+
+ .nav-tabs {
+ border-color: $border-color;
+ .nav-link {
+ padding: $aside-menu-nav-padding-y $aside-menu-nav-padding-x;
+ color: $body-color;
+ border-top: 0;
+ &.active {
+ color: $brand-primary;
+ border-right-color: $border-color;
+ border-left-color: $border-color;
+ }
+ }
+ .nav-item:first-child {
+ .nav-link {
+ border-left: 0;
+ }
+ }
+ }
+
+ .tab-content {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: auto;
+ border: 0;
+ border-top: 1px solid $border-color;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+
+ &::-webkit-scrollbar {
+ width: 10px;
+ margin-left: -10px;
+ -webkit-appearance: none;
+ }
+
+ // &::-webkit-scrollbar-button { }
+
+ &::-webkit-scrollbar-track {
+ background-color: lighten($aside-menu-bg, 5%);
+ border-right: 1px solid darken($aside-menu-bg, 5%);
+ border-left: 1px solid darken($aside-menu-bg, 5%);
+ }
+
+ // &::-webkit-scrollbar-track-piece { }
+
+ &::-webkit-scrollbar-thumb {
+ height: 50px;
+ background-color: darken($aside-menu-bg, 10%);
+ background-clip: content-box;
+ border-color: transparent;
+ border-style: solid;
+ border-width: 1px 2px;
+ }
+
+ .tab-pane {
+ padding: 0;
+ }
+ }
+}
diff --git a/src/scss/core/_avatars.scss b/src/scss/core/_avatars.scss
new file mode 100644
index 0000000..623016e
--- /dev/null
+++ b/src/scss/core/_avatars.scss
@@ -0,0 +1,51 @@
+.img-avatar {
+ border-radius: 50em;
+}
+
+.avatar {
+ $width: 36px;
+ $status-width: 10px;
+ @include avatar($width,$status-width);
+}
+
+.avatar.avatar-xs {
+ $width: 20px;
+ $status-width: 8px;
+ @include avatar($width,$status-width);
+}
+
+.avatar.avatar-sm {
+ $width: 24px;
+ $status-width: 8px;
+ @include avatar($width,$status-width);
+}
+
+.avatar.avatar-lg {
+ $width: 72px;
+ $status-width: 12px;
+ @include avatar($width,$status-width);
+}
+
+.avatars-stack {
+ .avatar.avatar-xs {
+ margin-right: -10px;
+ }
+
+ // .avatar.avatar-sm {
+ //
+ // }
+
+ .avatar {
+ margin-right: -15px;
+ transition: margin-left $layout-transition-speed, margin-right $layout-transition-speed;
+
+ &:hover {
+ margin-right: 0 !important;
+ }
+ }
+
+ // .avatar.avatar-lg {
+ //
+ // }
+
+}
diff --git a/src/scss/core/_badge.scss b/src/scss/core/_badge.scss
new file mode 100644
index 0000000..3104885
--- /dev/null
+++ b/src/scss/core/_badge.scss
@@ -0,0 +1,3 @@
+.badge-pill {
+ border-radius: $badge-pill-border-radius;
+}
diff --git a/src/scss/core/_breadcrumb-menu.scss b/src/scss/core/_breadcrumb-menu.scss
new file mode 100644
index 0000000..eff8f3e
--- /dev/null
+++ b/src/scss/core/_breadcrumb-menu.scss
@@ -0,0 +1,40 @@
+.breadcrumb-menu {
+ position: absolute;
+ top: 0;
+ right: $breadcrumb-padding-x;
+
+ &::before {
+ display: none;
+ }
+
+ .btn {
+ padding-top: $breadcrumb-padding-y;
+ padding-bottom: $breadcrumb-padding-y;
+ }
+
+ .btn.btn-secondary {
+ color: $text-muted;
+ border: 0;
+ display: block;
+float: center;
+position: relative;
+width: 100%;
+
+ &:hover, &.active {
+ color: $body-color;
+ background: transparent;
+ }
+ }
+
+ .open {
+ .btn.btn-secondary {
+ color: $body-color;
+ background: transparent;
+ }
+ }
+
+ .dropdown-menu {
+ min-width: 180px;
+ line-height: $line-height-base;
+ }
+}
diff --git a/src/scss/core/_breadcrumb.scss b/src/scss/core/_breadcrumb.scss
new file mode 100644
index 0000000..55ece3a
--- /dev/null
+++ b/src/scss/core/_breadcrumb.scss
@@ -0,0 +1,6 @@
+.breadcrumb {
+ position: relative;
+ margin-bottom: 1.5 * $spacer;
+
+ @include borders($breadcrumb-borders);
+}
diff --git a/src/scss/core/_buttons.scss b/src/scss/core/_buttons.scss
new file mode 100644
index 0000000..c978049
--- /dev/null
+++ b/src/scss/core/_buttons.scss
@@ -0,0 +1,575 @@
+.btn {
+ .badge {
+ position: absolute;
+ top: 2px;
+ right: 6px;
+ font-size: 9px;
+ }
+}
+
+
+.btn-transparent {
+ $color: #fff;
+ $background: transparent;
+ $border: transparent;
+
+ @include button-variant($color, $background, $border)
+}
+
+
+.btn {
+ [class^="icon-"], [class*=" icon-"] {
+ display: inline-block;
+ margin-top: -2px;
+ vertical-align: middle;
+ }
+}
+
+.btn-facebook,
+.btn-twitter,
+.btn-linkedin,
+.btn-flickr,
+.btn-tumblr,
+.btn-xing,
+.btn-github,
+.btn-html5,
+.btn-openid,
+.btn-stack-overflow,
+.btn-youtube,
+.btn-css3,
+.btn-dribbble,
+.btn-google-plus,
+.btn-instagram,
+.btn-pinterest,
+.btn-vk,
+.btn-yahoo,
+.btn-behance,
+.btn-dropbox,
+.btn-reddit,
+.btn-spotify,
+.btn-vine,
+.btn-foursquare,
+.btn-vimeo {
+ position: relative;
+ overflow: hidden;
+ color: #fff !important;
+ text-align: center;
+
+ &::before {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block;
+ font-family: "FontAwesome";
+ font-style: normal;
+ font-weight: normal;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ }
+
+ &:hover {
+ color: #fff;
+ }
+
+ &.icon {
+
+ span {
+ display: none;
+ }
+ }
+
+ &.text {
+ &::before {
+ display: none;
+ }
+
+ span {
+ margin-left: 0 !important;
+ }
+ }
+ @include button-social-size($input-btn-padding-y, $input-btn-padding-x, $font-size-base, $line-height-base, $btn-border-radius);
+
+ &.btn-lg {
+ @include button-social-size($input-btn-padding-y-lg, $input-btn-padding-x-lg, $font-size-lg, $line-height-lg, $btn-border-radius-lg);
+ }
+
+ &.btn-sm {
+ @include button-social-size($input-btn-padding-y-sm, $input-btn-padding-x-sm, $font-size-sm, $line-height-sm, $btn-border-radius-sm);
+ }
+
+}
+
+.btn-facebook {
+ $color: $facebook;
+
+ background: $color;
+ &::before {
+ content: "\f09a";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-twitter {
+ $color: $twitter;
+
+ background: $color;
+ &::before {
+ content: "\f099";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-linkedin {
+ $color: $linkedin;
+
+ background: $color;
+ &::before {
+ content: "\f0e1";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-flickr {
+ $color: $flickr;
+
+ background: $color;
+ &::before {
+ content: "\f16e";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-tumblr {
+ $color: $tumblr;
+
+ background: $color;
+ &::before {
+ content: "\f173";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-xing {
+ $color: $xing;
+
+ background: $color;
+ &::before {
+ content: "\f168";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-github {
+ $color: $github;
+
+ background: $color;
+ &::before {
+ content: "\f09b";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-html5 {
+ $color: $html5;
+
+ background: $color;
+ &::before {
+ content: "\f13b";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-openid {
+ $color: $openid;
+
+ background: $color;
+ &::before {
+ content: "\f19b";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-stack-overflow {
+ $color: $stack-overflow;
+
+ background: $color;
+ &::before {
+ content: "\f16c";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-css3 {
+ $color: $css3;
+
+ background: $color;
+ &::before {
+ content: "\f13c";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-youtube {
+ $color: $youtube;
+
+ background: $color;
+ &::before {
+ content: "\f167";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-dribbble {
+ $color: $dribbble;
+
+ background: $color;
+ &::before {
+ content: "\f17d";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-google-plus {
+ $color: $google-plus;
+
+ background: $color;
+ &::before {
+ content: "\f0d5";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-instagram {
+ $color: $instagram;
+
+ background: $color;
+ &::before {
+ content: "\f16d";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-pinterest {
+ $color: $pinterest;
+
+ background: $color;
+ &::before {
+ content: "\f0d2";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-vk {
+ $color: $vk;
+
+ background: $color;
+ &::before {
+ content: "\f189";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-yahoo {
+ $color: $yahoo;
+
+ background: $color;
+ &::before {
+ content: "\f19e";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-behance {
+ $color: $behance;
+
+ background: $color;
+ &::before {
+ content: "\f1b4";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-dropbox {
+ $color: $dropbox;
+
+ background: $color;
+ &::before {
+ content: "\f16b";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-reddit {
+ $color: $reddit;
+
+ background: $color;
+ &::before {
+ content: "\f1a1";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-spotify {
+ $color: $spotify;
+
+ background: $color;
+ &::before {
+ content: "\f1bc";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-vine {
+ $color: $vine;
+
+ background: $color;
+ &::before {
+ content: "\f1ca";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-foursquare {
+ $color: $foursquare;
+
+ background: $color;
+ &::before {
+ content: "\f180";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
+
+.btn-vimeo {
+ $color: $vimeo;
+
+ background: $color;
+ &::before {
+ content: "\f194";
+ background: darken($color, 5%);
+
+ }
+
+ &:hover {
+ background: darken($color, 5%);
+
+ &::before {
+ background: darken($color, 10%);
+ }
+ }
+}
diff --git a/src/scss/core/_callout.scss b/src/scss/core/_callout.scss
new file mode 100644
index 0000000..3c05097
--- /dev/null
+++ b/src/scss/core/_callout.scss
@@ -0,0 +1,85 @@
+.callout {
+ position: relative;
+ padding: 0 $spacer;
+ margin: $spacer 0;
+ border: 0 solid $border-color;
+ border-left-width: .25rem;
+
+ @if $enable-rounded {
+ border-radius: .25rem;
+ }
+
+ .chart-wrapper {
+ position: absolute;
+ top: 18px;
+ left: 45%;
+ float: right;
+ width: 100px;
+ }
+}
+
+.callout-bordered {
+ border: 1px solid $border-color;
+ border-left-width: .25rem;
+}
+.callout code {
+ border-radius: .25rem;
+}
+.callout h4 {
+ margin-top: 0;
+ margin-bottom: .25rem;
+}
+.callout p:last-child {
+ margin-bottom: 0;
+}
+.callout + .callout {
+ margin-top: - .25rem;
+}
+
+.callout-default {
+ border-left-color: $text-muted;
+
+ h4 {
+ color: $text-muted;
+ }
+}
+
+.callout-primary {
+ border-left-color: $brand-primary;
+
+ h4 {
+ color: $brand-primary;
+ }
+}
+
+.callout-info {
+ border-left-color: $brand-info;
+
+ h4 {
+ color: $brand-info;
+ }
+}
+
+.callout-warning {
+ border-left-color: $brand-warning;
+
+ h4 {
+ color: $brand-warning;
+ }
+}
+
+.callout-danger {
+ border-left-color: $brand-danger;
+
+ h4 {
+ color: $brand-danger;
+ }
+}
+
+.callout-success {
+ border-left-color: $brand-success;
+
+ h4 {
+ color: $brand-success;
+ }
+}
diff --git a/src/scss/core/_card.scss b/src/scss/core/_card.scss
new file mode 100644
index 0000000..c28aa63
--- /dev/null
+++ b/src/scss/core/_card.scss
@@ -0,0 +1,232 @@
+.card {
+ margin-bottom: 1.5 * $spacer;
+}
+
+.card-header {
+
+ .icon-bg {
+ display: inline-block;
+ padding: $card-spacer-y $card-spacer-x !important;
+ margin-top: -$card-spacer-y;
+ margin-right: $card-spacer-x;
+ margin-bottom: -$card-spacer-y;
+ margin-left: -$card-spacer-x;
+ line-height: inherit;
+ color: $card-icon-color;
+ vertical-align: bottom;
+ background: $card-icon-bg;
+ border-right: $card-border-width solid $card-border-color;
+ }
+
+ .nav.nav-tabs {
+ margin-top: -$card-spacer-y;
+ margin-bottom: -$card-spacer-y;
+ border-bottom: 0;
+
+ .nav-item {
+ border-top: 0;
+ }
+
+ .nav-link {
+ padding: $card-spacer-y $card-spacer-x / 2;
+ color: $text-muted;
+ border-top: 0;
+
+ &.active {
+ color: $body-color;
+ background: #fff;
+ }
+ }
+ }
+
+ &.card-header-inverse {
+ color: #fff;
+ }
+
+ @each $variant, $color in (primary: $brand-primary, secondary: $gray-lighter, success: $brand-success, info: $brand-info, warning: $brand-warning, danger: $brand-danger) {
+ &.card-header-#{$variant} {
+ margin: -1px -1px 0;
+ background: $color;
+ border-bottom: 1px solid $color;
+ }
+ }
+
+ .btn {
+ margin-top: - $input-btn-padding-y;
+ }
+ .btn-sm {
+ margin-top: - $input-btn-padding-y-sm;
+ }
+ .btn-lg {
+ margin-top: - $input-btn-padding-y-lg;
+ }
+}
+//
+.card-footer {
+
+ ul {
+ display: table;
+ width: 100%;
+ padding: 0;
+ margin: 0;
+ table-layout: fixed;
+
+ li {
+ display: table-cell;
+ padding: 0 $card-spacer-x;
+ text-align: center;
+ }
+ }
+}
+
+
+//
+// Background variations
+//
+
+@mixin card-variant($color) {
+ background-color: $color;
+
+ .card-header {
+ border-color: darken($color,5%);
+ }
+
+ .card-header, .card-footer {
+ background-color: darken($color,5%);
+ //border: 0;
+ }
+}
+
+@each $variant, $color in (primary: $brand-primary, secondary: $gray-lighter, success: $brand-success, info: $brand-info, warning: $brand-warning, danger: $brand-danger) {
+ .card-#{$variant} {
+ @include card-variant($color)
+ }
+}
+
+.card-inverse {
+ color: #fff;
+
+ .text-muted {
+ color: rgba(255,255,255,.6) !important;
+ }
+
+}
+
+[class*="card-outline-"] {
+ .card-block {
+ background: #fff !important;
+ }
+
+ &.card-outline-top {
+ border-top-width: 2px;
+ border-right-color: $border-color;
+ border-bottom-color: $border-color;
+ border-left-color: $border-color;
+ }
+}
+
+// Cards with color accent
+.card-accent-primary {
+ @include card-accent-variant($btn-primary-bg);
+}
+.card-accent-secondary {
+ @include card-accent-variant($btn-secondary-border);
+}
+.card-accent-info {
+ @include card-accent-variant($btn-info-bg);
+}
+.card-accent-success {
+ @include card-accent-variant($btn-success-bg);
+}
+.card-accent-warning {
+ @include card-accent-variant($btn-warning-bg);
+}
+.card-accent-danger {
+ @include card-accent-variant($btn-danger-bg);
+}
+
+// Card Actions
+.card-header {
+ > i {
+ margin-right: $spacer / 2;
+ }
+ .card-actions {
+ position: absolute;
+ top: 0;
+ right: 0;
+ //height: inherit;
+
+ a, button {
+ display: block;
+ float: left;
+ width: 50px;
+ padding: $card-spacer-y 0;
+ margin: 0 !important;
+ color: $body-color;
+ text-align: center;
+ background: transparent;
+ border: 0;
+ border-left: 1px solid $border-color;
+ box-shadow: 0;
+
+ &:hover {
+ text-decoration: none;
+ }
+
+ [class^="icon-"], [class*=" icon-"] {
+ display: inline-block;
+ vertical-align: middle;
+ }
+
+ i {
+ display: inline-block;
+ transition: .4s;
+ }
+
+ .r180 {
+ transform: rotate(180deg);
+ }
+ }
+
+ .input-group {
+ width: 230px;
+ margin: 6px;
+
+ .input-group-addon {
+ background: #fff;
+ }
+
+ input {
+ border-left: 0;
+ }
+ }
+ }
+}
+
+.card-full {
+ margin-top: - $spacer;
+ margin-right: - $grid-gutter-width-base / 2;
+ margin-left: - $grid-gutter-width-base / 2;
+ border: 0;
+ border-bottom: $card-border-width solid $border-color;
+}
+
+@include media-breakpoint-up(sm) {
+ .card-columns {
+
+ &.cols-2 {
+ column-count: 2;
+ }
+ }
+}
+
+.card {
+ &.drag, .drag {
+ cursor: move;
+ }
+}
+
+.card-placeholder {
+ background: rgba(0,0,0,.025);
+ border: 1px dashed $gray-light;
+}
diff --git a/src/scss/core/_charts.scss b/src/scss/core/_charts.scss
new file mode 100644
index 0000000..0e7a3c2
--- /dev/null
+++ b/src/scss/core/_charts.scss
@@ -0,0 +1,9 @@
+.chart-wrapper {
+ canvas {
+ width: 100% !important;
+ }
+}
+// scss-lint:disable QualifyingElement
+base-chart.chart {
+ display: block !important;
+}
diff --git a/src/scss/core/_dropdown.scss b/src/scss/core/_dropdown.scss
new file mode 100644
index 0000000..dfabde8
--- /dev/null
+++ b/src/scss/core/_dropdown.scss
@@ -0,0 +1,49 @@
+// Links, buttons, and more within the dropdown menu
+.dropdown-item {
+ position: relative;
+ padding: 10px 20px;
+ border-bottom: 1px solid $dropdown-border-color;
+
+ &:last-child {
+ border-bottom: 0;
+ }
+
+ i {
+ display: inline-block;
+ width: 20px;
+ margin-right: 10px;
+ margin-left: -10px;
+ color: $dropdown-border-color;
+ text-align: center;
+ }
+
+ .badge {
+ position: absolute;
+ right: 10px;
+ margin-top: 2px;
+ }
+}
+
+// Dropdown section headers
+.dropdown-header {
+ padding: 8px 20px;
+ background: $dropdown-divider-bg;
+ border-bottom: 1px solid $dropdown-border-color;
+
+ .btn {
+ margin-top: -7px;
+ color: $dropdown-header-color;
+
+ &:hover {
+ color: $body-color;
+ }
+
+ &.pull-right {
+ margin-right: -20px;
+ }
+ }
+}
+
+.dropdown-menu-lg {
+ width: 250px;
+}
diff --git a/src/scss/core/_footer.scss b/src/scss/core/_footer.scss
new file mode 100644
index 0000000..2d678c8
--- /dev/null
+++ b/src/scss/core/_footer.scss
@@ -0,0 +1,8 @@
+.app-footer {
+ min-height: $footer-height;
+ padding: 0 $spacer;
+ line-height: $footer-height;
+ color: $footer-color;
+ background: $footer-bg;
+ @include borders($footer-borders);
+}
diff --git a/src/scss/core/_grid.scss b/src/scss/core/_grid.scss
new file mode 100644
index 0000000..1e14460
--- /dev/null
+++ b/src/scss/core/_grid.scss
@@ -0,0 +1,15 @@
+.row.row-equal {
+ padding-right: ($grid-gutter-width-base / 4);
+ padding-left: ($grid-gutter-width-base / 4);
+ margin-right: ($grid-gutter-width-base / -2);
+ margin-left: ($grid-gutter-width-base / -2);
+
+ [class*="col-"] {
+ padding-right: ($grid-gutter-width-base / 4);
+ padding-left: ($grid-gutter-width-base / 4);
+ }
+}
+
+.main .container-fluid {
+ padding: 0 30px;
+}
diff --git a/src/scss/core/_input-group.scss b/src/scss/core/_input-group.scss
new file mode 100644
index 0000000..23b2512
--- /dev/null
+++ b/src/scss/core/_input-group.scss
@@ -0,0 +1,6 @@
+.input-group-addon,
+.input-group-btn {
+ min-width: 40px;
+ white-space: nowrap;
+ vertical-align: middle; // Match the inputs
+}
diff --git a/src/scss/core/_layout.scss b/src/scss/core/_layout.scss
new file mode 100644
index 0000000..c33bd39
--- /dev/null
+++ b/src/scss/core/_layout.scss
@@ -0,0 +1,330 @@
+// IE10&11 Flexbox fix
+@media all and (-ms-high-contrast:none) {
+ html {
+ display: flex;
+ flex-direction: column;
+ }
+}
+
+// app-dashboard and app-root are Angular2 selectors. You can add here your own selectors if you need.
+.app,
+app-dashboard,
+app-root {
+ display: flex;
+ flex-direction: column;
+ min-height: 100vh;
+}
+
+.app-header {
+ flex: 0 0 $navbar-height;
+}
+
+.app-footer {
+ flex: 0 0 $footer-height;
+}
+
+.app-body {
+ display: flex;
+ flex-direction: row;
+ flex-grow: 1;
+ overflow-x: hidden;
+
+ .main {
+ flex: 1;
+ min-width: 0;
+ }
+
+ .sidebar {
+ // $sidebar-width is the width of the columns
+ flex: 0 0 $sidebar-width;
+ // put the nav on the left
+ order: -1;
+ }
+
+ .aside-menu {
+ // $aside-menu-width is the width of the columns
+ flex: 0 0 $aside-menu-width;
+ }
+}
+
+//
+// header
+//
+.header-fixed {
+ .app-header {
+ position: fixed;
+ z-index: $zindex-sticky;
+ width: 100%;
+ }
+ .app-body {
+ margin-top: $navbar-height;
+ }
+}
+
+//
+// Sidebar
+//
+.sidebar-hidden {
+
+ .sidebar {
+ margin-left: - $sidebar-width;
+ }
+}
+
+.sidebar-fixed {
+
+ .sidebar {
+ position: fixed;
+ width: $sidebar-width;
+ height: 100%;
+
+ .sidebar-nav {
+ height: calc(100vh - #{$navbar-height});
+ }
+ }
+
+ .main, .app-footer {
+ margin-left: $sidebar-width;
+ }
+
+ &.sidebar-hidden {
+
+ .main, .app-footer {
+ margin-left: 0;
+ }
+ }
+}
+
+.sidebar-off-canvas {
+ .sidebar {
+ position: fixed;
+ z-index: $zindex-sticky - 1;
+ height: 100%;
+
+
+ .sidebar-nav {
+ height: calc(100vh - #{$navbar-height});
+ }
+ }
+}
+
+@include media-breakpoint-up(lg) {
+ .sidebar-compact {
+ .sidebar {
+ flex: 0 0 $sidebar-compact-width;
+ }
+
+ &.sidebar-hidden {
+
+ .sidebar {
+ margin-left: - $sidebar-compact-width;
+ }
+ }
+
+ &.sidebar-fixed {
+
+ .main, .app-footer {
+ margin-left: $sidebar-compact-width;
+ }
+
+ .sidebar {
+ width: $sidebar-compact-width;
+ }
+
+ &.sidebar-hidden {
+
+ .main, .app-footer {
+ margin-left: 0;
+ }
+ }
+ }
+ }
+
+ .sidebar-minimized {
+ .sidebar {
+ flex: 0 0 $sidebar-minimized-width;
+ }
+
+ &.sidebar-hidden {
+
+ .sidebar {
+ margin-left: - $sidebar-minimized-width;
+ }
+ }
+
+ &.sidebar-fixed {
+
+ .main, .app-footer {
+ margin-left: $sidebar-minimized-width;
+ }
+
+ .sidebar {
+ width: $sidebar-minimized-width;
+ }
+
+ &.sidebar-hidden {
+
+ .main, .app-footer {
+ margin-left: 0;
+ }
+ }
+ }
+ }
+}
+
+//
+// Aside Menu
+//
+.aside-menu-hidden {
+
+ .aside-menu {
+ margin-right: - $aside-menu-width;
+ }
+}
+
+.aside-menu-fixed {
+
+ .aside-menu {
+ position: fixed;
+ right: 0;
+ height: 100%;
+
+ .tab-content {
+ height: calc(100vh - #{$aside-menu-nav-padding-y * 2 + $font-size-base} - #{$navbar-height});
+ }
+ }
+
+ .main, .app-footer {
+ margin-right: $aside-menu-width;
+ }
+
+ &.aside-menu-hidden {
+
+ .main, .app-footer {
+ margin-right: 0;
+ }
+ }
+}
+
+.aside-menu-off-canvas {
+ .aside-menu {
+ position: fixed;
+ right: 0;
+ z-index: $zindex-sticky - 1;
+ height: 100%;
+
+ .tab-content {
+ height: calc(100vh - #{$aside-menu-nav-padding-y * 2 + $font-size-base} - #{$navbar-height});
+ }
+ }
+}
+
+//
+// Footer
+//
+.footer-fixed {
+
+ .app-footer {
+ position: fixed;
+ bottom: 0;
+ z-index: $zindex-sticky;
+ width: 100%;
+ }
+
+ .app-body {
+ margin-bottom: $footer-height;
+ }
+}
+
+//
+// Animations
+//
+.app-header,
+.app-footer,
+.sidebar,
+.main,
+.aside-menu {
+ transition: margin-left $layout-transition-speed, margin-right $layout-transition-speed, width $layout-transition-speed, flex $layout-transition-speed;
+}
+
+//
+// Mobile layout
+//
+
+@include media-breakpoint-down(md) {
+
+ .app-header {
+ position: fixed !important;
+ z-index: $zindex-sticky;
+ width: 100%;
+
+ .navbar-toggler {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 70px;
+ height: inherit;
+ }
+
+ .navbar-toggler {
+ @if (lightness( $navbar-brand-bg ) > 40) {
+ color: $navbar-color;
+ } @else {
+ color: #fff;
+ }
+ }
+
+ .navbar-brand {
+ width: 100% !important;
+ margin: 0 auto !important;
+ }
+
+ .navbar-nav {
+ position: absolute;
+ top: 0;
+ right: 15px;
+ height: inherit;
+ }
+ }
+
+ .app-body {
+ margin-top: $navbar-height;
+ }
+
+ .sidebar {
+ position: fixed;
+ width: $mobile-sidebar-width;
+ height: 100%;
+ margin-left: - $mobile-sidebar-width;
+
+ .sidebar-nav,
+ .nav {
+ width: $mobile-sidebar-width !important;
+ }
+ }
+
+ .main, .app-footer {
+ margin-left: 0 !important;
+ }
+
+ .aside-menu {
+ margin-right: - $aside-menu-width;
+ }
+
+ .sidebar-mobile-show {
+
+ .sidebar {
+ width: $mobile-sidebar-width;
+ margin-left: 0;
+
+ .sidebar-nav {
+ height: calc(100vh - #{$navbar-height});
+ }
+ }
+
+ .main {
+ margin-right: - $mobile-sidebar-width !important;
+ margin-left: $mobile-sidebar-width !important;
+ }
+ }
+}
diff --git a/src/scss/core/_loading.scss b/src/scss/core/_loading.scss
new file mode 100644
index 0000000..f4a3165
--- /dev/null
+++ b/src/scss/core/_loading.scss
@@ -0,0 +1,128 @@
+// Angular Version
+// Make clicks pass-through
+// scss-lint:disable all
+#loading-bar,
+#loading-bar-spinner {
+ -webkit-pointer-events: none;
+ pointer-events: none;
+ -moz-transition: 350ms linear all;
+ -o-transition: 350ms linear all;
+ -webkit-transition: 350ms linear all;
+ transition: 350ms linear all;
+}
+
+#loading-bar.ng-enter,
+#loading-bar.ng-leave.ng-leave-active,
+#loading-bar-spinner.ng-enter,
+#loading-bar-spinner.ng-leave.ng-leave-active {
+ opacity: 0;
+}
+
+#loading-bar.ng-enter.ng-enter-active,
+#loading-bar.ng-leave,
+#loading-bar-spinner.ng-enter.ng-enter-active,
+#loading-bar-spinner.ng-leave {
+ opacity: 1;
+}
+
+#loading-bar .bar {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: 20002;
+ width: 100%;
+ height: 2px;
+ background: $brand-primary;
+ border-top-right-radius: 1px;
+ border-bottom-right-radius: 1px;
+ -moz-transition: width 350ms;
+ -o-transition: width 350ms;
+ -webkit-transition: width 350ms;
+ transition: width 350ms;
+}
+
+// Fancy blur effect
+#loading-bar .peg {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 70px;
+ height: 2px;
+ -moz-border-radius: 100%;
+ -webkit-border-radius: 100%;
+ border-radius: 100%;
+ -moz-box-shadow: #29d 1px 0 6px 1px;
+ -ms-box-shadow: #29d 1px 0 6px 1px;
+ -webkit-box-shadow: #29d 1px 0 6px 1px;
+ box-shadow: #29d 1px 0 6px 1px;
+ opacity: .45;
+}
+
+#loading-bar-spinner {
+ position: fixed;
+ top: 10px;
+ left: 10px;
+ z-index: 10002;
+ display: block;
+}
+
+#loading-bar-spinner .spinner-icon {
+ width: 14px;
+ height: 14px;
+
+ border: solid 2px transparent;
+ border-top-color: #29d;
+ border-left-color: #29d;
+ border-radius: 50%;
+
+ -moz-animation: loading-bar-spinner 400ms linear infinite;
+ -ms-animation: loading-bar-spinner 400ms linear infinite;
+ -o-animation: loading-bar-spinner 400ms linear infinite;
+ -webkit-animation: loading-bar-spinner 400ms linear infinite;
+ animation: loading-bar-spinner 400ms linear infinite;
+}
+
+@-webkit-keyframes loading-bar-spinner {
+ 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); }
+ 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); }
+}
+@-moz-keyframes loading-bar-spinner {
+ 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); }
+ 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); }
+}
+@-o-keyframes loading-bar-spinner {
+ 0% { -o-transform: rotate(0deg); transform: rotate(0deg); }
+ 100% { -o-transform: rotate(360deg); transform: rotate(360deg); }
+}
+@-ms-keyframes loading-bar-spinner {
+ 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); }
+ 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); }
+}
+@keyframes loading-bar-spinner {
+ 0% { transform: rotate(0deg); transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); transform: rotate(360deg); }
+}
+
+//Ajax & Static Version
+.pace {
+ -webkit-pointer-events: none;
+ pointer-events: none;
+
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+
+.pace-inactive {
+ display: none;
+}
+
+.pace .pace-progress {
+ position: fixed;
+ top: 0;
+ right: 100%;
+ z-index: 2000;
+ width: 100%;
+ height: 2px;
+ background: $brand-primary;
+}
diff --git a/src/scss/core/_mixins.scss b/src/scss/core/_mixins.scss
new file mode 100644
index 0000000..153f1d3
--- /dev/null
+++ b/src/scss/core/_mixins.scss
@@ -0,0 +1,116 @@
+@mixin button-social-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
+ padding: $padding-y $padding-x;
+ font-size: $font-size;
+ line-height: $line-height;
+ border: 0;
+ @include border-radius($border-radius);
+
+ &::before {
+ width: ($padding-y * 2) + ($font-size * $line-height);
+ height: ($padding-y * 2) + ($font-size * $line-height);
+ padding: $padding-y 0;
+ font-size: $font-size;
+ line-height: $line-height;
+ @include border-radius($border-radius);
+ }
+
+ span {
+ margin-left: ($padding-y * 2) + ($font-size * $line-height);
+ }
+
+ &.icon {
+ width: ($padding-y * 2) + ($font-size * $line-height);
+ height: ($padding-y * 2) + ($font-size * $line-height);
+ }
+}
+
+@mixin avatar($width, $status-width) {
+ position: relative;
+ display: inline-block;
+ width: $width;
+
+ .img-avatar {
+ width: $width;
+ height: $width;
+ }
+
+ .avatar-status {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ display: block;
+ width: $status-width;
+ height: $status-width;
+ border: 1px solid #fff;
+ border-radius: 50em;
+ }
+}
+
+@mixin borders($borders) {
+ @each $border in $borders {
+ $direction: nth($border, 1);
+ @if $direction == "all" {
+ $size: map-get(map-get($borders, $direction), size);
+ $style: map-get(map-get($borders, $direction), style);
+ $color: map-get(map-get($borders, $direction), color);
+ border: $size $style $color;
+ } @else if $direction == "top" {
+ $size: map-get(map-get($borders, $direction), size);
+ $style: map-get(map-get($borders, $direction), style);
+ $color: map-get(map-get($borders, $direction), color);
+ border-top: $size $style $color;
+ } @else if $direction == "right" {
+ $size: map-get(map-get($borders, $direction), size);
+ $style: map-get(map-get($borders, $direction), style);
+ $color: map-get(map-get($borders, $direction), color);
+ border-right: $size $style $color;
+ } @else if $direction == "bottom" {
+ $size: map-get(map-get($borders, $direction), size);
+ $style: map-get(map-get($borders, $direction), style);
+ $color: map-get(map-get($borders, $direction), color);
+ border-bottom: $size $style $color;
+ } @else if $direction == "left" {
+ $size: map-get(map-get($borders, $direction), size);
+ $style: map-get(map-get($borders, $direction), style);
+ $color: map-get(map-get($borders, $direction), color);
+ border-left: $size $style $color;
+ }
+ }
+}
+
+@mixin sidebar-width($borders, $width) {
+ $sidebar-width: $width;
+
+ @each $border in $borders {
+ $direction: nth($border, 1);
+ @if $direction == "all" {
+ $size: map-get(map-get($borders, $direction), size);
+ $sidebar-width: ($sidebar-width - (2 * $size));
+ } @else if $direction == "right" {
+ $size: map-get(map-get($borders, $direction), size);
+ $sidebar-width: $sidebar-width - $size;
+ } @else if $direction == "left" {
+ $size: map-get(map-get($borders, $direction), size);
+ $sidebar-width: $sidebar-width - $size;
+ }
+ width: $sidebar-width;
+ }
+}
+
+@mixin bg-variant($parent, $color) {
+ #{$parent} {
+ @include border-radius($card-border-radius-inner $card-border-radius-inner $card-border-radius-inner $card-border-radius-inner);
+ color: #fff !important;
+ background-color: $color !important;
+ }
+ a#{$parent} {
+ @include hover-focus {
+ background-color: darken($color, 10%);
+ }
+ }
+}
+
+@mixin card-accent-variant($color) {
+ border-top-width: 2px;
+ border-top-color: $color;
+}
diff --git a/src/scss/core/_mobile.scss b/src/scss/core/_mobile.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/scss/core/_modal.scss b/src/scss/core/_modal.scss
new file mode 100644
index 0000000..5dc4025
--- /dev/null
+++ b/src/scss/core/_modal.scss
@@ -0,0 +1,13 @@
+@each $variant, $color in (primary: $brand-primary, secondary: $gray-lighter, success: $brand-success, info: $brand-info, warning: $brand-warning, danger: $brand-danger) {
+ .modal-#{$variant} {
+
+ .modal-content {
+ border-color: $color;
+ }
+
+ .modal-header {
+ color: #fff;
+ background-color: $color;
+ }
+ }
+}
diff --git a/src/scss/core/_nav.scss b/src/scss/core/_nav.scss
new file mode 100644
index 0000000..18b0786
--- /dev/null
+++ b/src/scss/core/_nav.scss
@@ -0,0 +1,32 @@
+.nav-tabs {
+ .nav-link {
+ color: $gray;
+ &.active {
+ color: $gray-dark;
+ background: #fff;
+ border-color: $border-color;
+ border-bottom-color: #fff;
+ &:focus {
+ background: #fff;
+ border-color: $border-color;
+ border-bottom-color: #fff;
+ }
+ }
+ }
+}
+
+.tab-content {
+ margin-top: -1px;
+ background: #fff;
+ border: 1px solid $border-color;
+ .tab-pane {
+ padding: $spacer;
+ }
+}
+
+.card-block {
+ .tab-content {
+ margin-top: 0;
+ border: 0;
+ }
+}
diff --git a/src/scss/core/_navbar.scss b/src/scss/core/_navbar.scss
new file mode 100644
index 0000000..b307f05
--- /dev/null
+++ b/src/scss/core/_navbar.scss
@@ -0,0 +1,93 @@
+.app-header.navbar {
+ position: relative;
+ flex-direction: row;
+ height: $navbar-height;
+ margin: 0;
+ padding: 0;
+ background-color: $navbar-bg;
+ @include borders($navbar-border);
+
+ .navbar-brand {
+ display: inline-block;
+ width: $navbar-brand-width;
+ height: $navbar-height;
+ padding: $navbar-padding-y $navbar-padding-x;
+ margin-right: 0;
+ background-color: $navbar-brand-bg;
+ background-image: $navbar-brand-logo;
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-size: $navbar-brand-logo-size;
+ @include borders($navbar-brand-border);
+ }
+
+ .navbar-nav {
+ flex-direction: row;
+ align-items: center;
+ }
+
+ .nav-item {
+ position: relative;
+ min-width: 50px;
+ margin: 0 !important;
+ text-align: center;
+
+ .nav-link {
+ padding-top: 0;
+ padding-bottom: 0;
+
+ .badge {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-top: -16px;
+ margin-left: 0;
+ }
+
+ > .img-avatar {
+ height: $navbar-height - 20px;
+ margin: 0 10px;
+ }
+ }
+ }
+
+ .dropdown-menu {
+ padding-bottom: 0;
+ line-height: $line-height-base;
+ }
+
+ .dropdown-item {
+ min-width: 180px;
+ }
+}
+
+.navbar-brand {
+ color: $navbar-active-color;
+
+ @include hover-focus {
+ color: $navbar-active-color;
+ }
+}
+
+.navbar-nav {
+ .nav-link {
+ color: $navbar-color;
+
+ @include hover-focus {
+ color: $navbar-hover-color;
+ }
+ }
+
+ .open > .nav-link,
+ .active > .nav-link,
+ .nav-link.open,
+ .nav-link.active {
+ @include plain-hover-focus {
+ color: $navbar-active-color;
+ }
+ }
+}
+
+.navbar-divider {
+ background-color: rgba(0,0,0,.075);
+}
diff --git a/src/scss/core/_others.scss b/src/scss/core/_others.scss
new file mode 100644
index 0000000..381baab
--- /dev/null
+++ b/src/scss/core/_others.scss
@@ -0,0 +1,4 @@
+// scss-lint:disable QualifyingElement
+hr.transparent {
+ border-top: 1px solid transparent;
+}
diff --git a/src/scss/core/_progress.scss b/src/scss/core/_progress.scss
new file mode 100644
index 0000000..65f56dd
--- /dev/null
+++ b/src/scss/core/_progress.scss
@@ -0,0 +1,15 @@
+.progress-xs {
+ height: 4px;
+}
+
+.progress-sm {
+ height: 8px;
+}
+
+// White progress bar
+.progress-white {
+ background-color: rgba(255,255,255,.2) !important;
+ .progress-bar {
+ background-color: #fff;
+ }
+}
diff --git a/src/scss/core/_rtl.scss b/src/scss/core/_rtl.scss
new file mode 100644
index 0000000..4f00be1
--- /dev/null
+++ b/src/scss/core/_rtl.scss
@@ -0,0 +1,282 @@
+//
+// RTL Support
+//
+// scss-lint:disable NestingDepth, SelectorDepth
+*[dir="rtl"] {
+ direction: rtl;
+ unicode-bidi: embed;
+
+ ul {
+ -webkit-padding-start: 0;
+ }
+
+ table tr th {
+ text-align: right;
+ }
+
+ // Breadcrumb
+
+ .breadcrumb-item {
+ float: right;
+ }
+
+ .breadcrumb-menu {
+ right: auto;
+ left: $breadcrumb-padding-x;
+ }
+
+ // Dropdown
+ .dropdown-item {
+ text-align: right;
+
+ i {
+ margin-right: -10px;
+ margin-left: 10px;
+ }
+
+ .badge {
+ right: auto;
+ left: 10px;
+ }
+ }
+
+ //
+ // Sidebar
+ //
+ .sidebar-hidden {
+
+ .sidebar {
+ margin-right: - $sidebar-width;
+ }
+ }
+
+ .sidebar-fixed {
+
+ .main, .app-footer {
+ margin-right: $sidebar-width;
+ }
+
+ &.sidebar-hidden {
+
+ .main, .app-footer {
+ margin-right: 0;
+ }
+ }
+ }
+
+ .sidebar-minimized {
+ .sidebar {
+ flex: 0 0 $sidebar-minimized-width;
+ }
+
+ &.sidebar-hidden {
+
+ .sidebar {
+ margin-left: - $sidebar-minimized-width;
+ }
+ }
+
+ &.sidebar-fixed {
+
+ .main, .app-footer {
+ margin-left: $sidebar-minimized-width;
+ }
+
+ &.sidebar-hidden {
+
+ .main, .app-footer {
+ margin-left: 0;
+ }
+ }
+ }
+ }
+
+ //
+ // Aside Menu
+ //
+ .aside-menu-hidden {
+
+ .aside-menu {
+ // margin-right: 0;
+ margin-left: - $aside-menu-width;
+ }
+ }
+
+ .aside-menu-fixed {
+
+ .aside-menu {
+ right: auto;
+ left: 0;
+ }
+
+ .main, .app-footer {
+ //margin-right: 0;
+ margin-left: $aside-menu-width;
+ }
+
+ &.aside-menu-hidden {
+
+ .main, .app-footer {
+ margin-left: 0;
+ }
+ }
+ }
+
+ .aside-menu-off-canvas {
+ .aside-menu {
+ position: fixed;
+ right: 0;
+ z-index: $zindex-sticky - 1;
+ height: 100%;
+
+ .tab-content {
+ height: calc(100vh - #{$aside-menu-nav-padding-y * 2 + $font-size-base} - #{$navbar-height});
+ }
+ }
+ }
+
+ // Sidebar Menu
+ .sidebar {
+ .sidebar-nav {
+ direction: ltr;
+ * {
+ direction: rtl;
+ }
+ .nav {
+ .nav-item {
+ .nav-link {
+ [class^="icon-"], [class*=" icon-"] {
+ margin-right: -4px;
+ }
+ .badge {
+ float: left;
+ margin-top: 2px;
+ // margin-left: 10px;
+ }
+ &.nav-dropdown-toggle {
+ &::before {
+ position: absolute;
+ right: auto !important;
+ left: $sidebar-nav-link-padding-x;
+ }
+ }
+ }
+ &.nav-dropdown {
+ &.open {
+ > .nav-link.nav-dropdown-toggle::before {
+ transform: rotate(90deg);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Horizontal bars
+ .horizontal-bars {
+
+ li {
+
+ .bars {
+ padding-right: 100px;
+ padding-left: 0;
+
+ .progress:first-child {
+ margin-bottom: 2px;
+ }
+ }
+ }
+
+ &.type-2 {
+
+ li {
+
+ i {
+ margin-right: 5px;
+ margin-left: $spacer;
+ }
+
+ .value {
+ float: left;
+ font-weight: 600;
+ }
+
+ .bars {
+ padding: 0;
+ }
+ }
+ }
+ }
+
+ // Icon list
+ .icons-list {
+
+ li {
+ position: relative;
+ height: 40px;
+ vertical-align: middle;
+
+ i {
+ float: right;
+ }
+
+ .desc {
+ margin-right: 50px;
+ margin-left: 0;
+ }
+
+ .value {
+ right: auto;
+ left: 45px;
+ text-align: left;
+
+ strong {
+ display: block;
+ margin-top: -3px;
+ }
+ }
+
+ .actions {
+ right: auto;
+ left: 10px;
+ }
+ }
+ }
+
+ // Callouts
+ .callout {
+ border: 0 solid $border-color;
+ border-right-width: .25rem;
+
+ .chart-wrapper {
+ left: 0;
+ float: left;
+ }
+ }
+
+ .callout-default {
+ border-right-color: $text-muted;
+ }
+
+ .callout-primary {
+ border-right-color: $brand-primary;
+ }
+
+ .callout-info {
+ border-right-color: $brand-info;
+ }
+
+ .callout-warning {
+ border-right-color: $brand-warning;
+ }
+
+ .callout-danger {
+ border-right-color: $brand-danger;
+ }
+
+ .callout-success {
+ border-right-color: $brand-success;
+ }
+
+}
diff --git a/src/scss/core/_sidebar.scss b/src/scss/core/_sidebar.scss
new file mode 100644
index 0000000..df64989
--- /dev/null
+++ b/src/scss/core/_sidebar.scss
@@ -0,0 +1,425 @@
+// scss-lint:disable NestingDepth, SelectorDepth
+.sidebar {
+ padding: $sidebar-padding;
+ overflow: hidden;
+ color: $sidebar-color;
+ background: $sidebar-bg;
+ @include borders($sidebar-borders);
+
+ .sidebar-close {
+ position: absolute;
+ right: 0;
+ display: none;
+ padding: 0 $spacer;
+ font-size: 24px;
+ font-weight: 800;
+ line-height: $navbar-height;
+ color: $sidebar-color;
+ background: 0;
+ border: 0;
+ opacity: .8;
+
+ &:hover {
+ opacity: 1;
+ }
+ }
+
+ .sidebar-nav {
+ position: relative;
+ overflow-x: hidden;
+ overflow-y: auto;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ @include sidebar-width($sidebar-borders, $sidebar-width);
+
+ &::-webkit-scrollbar {
+
+ position: absolute;
+ width: 10px;
+ margin-left: -10px;
+ -webkit-appearance: none;
+ }
+
+ // &::-webkit-scrollbar-button { }
+
+ &::-webkit-scrollbar-track {
+ background-color: lighten($sidebar-bg, 5%);
+ border-right: 1px solid darken($sidebar-bg, 5%);
+ border-left: 1px solid darken($sidebar-bg, 5%);
+ }
+
+ // &::-webkit-scrollbar-track-piece { }
+
+ &::-webkit-scrollbar-thumb {
+ height: 50px;
+ background-color: darken($sidebar-bg, 10%);
+ background-clip: content-box;
+ border-color: transparent;
+ border-style: solid;
+ border-width: 1px 2px;
+ }
+
+ // &::-webkit-scrollbar-corner { }
+
+ // &::-webkit-resizer { }
+ }
+
+ .nav {
+ @include sidebar-width($sidebar-borders, $sidebar-width);
+ flex-direction: column !important;
+
+ .nav-title {
+ padding: $sidebar-nav-title-padding-y $sidebar-nav-title-padding-x;
+ font-size: 11px;
+ font-weight: 600;
+ color: $sidebar-nav-title-color;
+ text-transform: uppercase;
+ }
+
+ .divider {
+ height: 10px;
+ }
+
+ .nav-item {
+ position: relative;
+ margin: 0;
+ transition: background .3s ease-in-out;
+
+ ul {
+ max-height: 0;
+ padding: 0;
+ margin: 0;
+ overflow-y: hidden;
+ transition: max-height .3s ease-in-out;
+
+ li {
+ padding: 0;
+ list-style: none;
+ }
+ }
+
+ .nav-link {
+ display: block;
+ padding: $sidebar-nav-link-padding-y $sidebar-nav-link-padding-x;
+ color: $sidebar-nav-link-color;
+ text-decoration: none;
+ background: $sidebar-nav-link-bg;
+ @include borders($sidebar-nav-link-borders);
+ @if $enable-sidebar-nav-rounded {
+ border-radius: $border-radius;
+ }
+
+ &:hover {
+ color: $sidebar-nav-link-hover-color !important;
+ background: $sidebar-nav-link-hover-bg !important;
+ @include borders($sidebar-nav-link-hover-borders);
+
+ i {
+ color: $sidebar-nav-link-hover-icon-color;
+ }
+ }
+
+ &.active {
+ color: $sidebar-nav-link-active-color;
+ background: $sidebar-nav-link-active-bg;
+ @include borders($sidebar-nav-link-active-borders);
+
+ i {
+ color: $sidebar-nav-link-active-icon-color;
+ }
+ }
+
+ [class^="icon-"], [class*=" icon-"] {
+ display: inline-block;
+ margin-top: -4px;
+ vertical-align: middle;
+ }
+
+ i {
+ width: 20px;
+ margin: 0 ($sidebar-nav-link-padding-x / 2) 0 0;
+ font-size: 14px;
+ color: $sidebar-nav-link-icon-color;
+ text-align: center;
+ }
+
+ .badge {
+ float: right;
+ margin-top: 2px;
+ // margin-left: 10px;
+ }
+
+ &.nav-dropdown-toggle {
+
+ &::before {
+ position: absolute;
+ top: ($sidebar-nav-link-padding-y + ($font-size-base / 4));
+ right: $sidebar-nav-link-padding-x;
+ display: block;
+ width: ($font-size-base);
+ height: ($font-size-base);
+ padding: 0;
+ font-size: $font-size-base;
+ line-height: ($font-size-base * 3 / 4);
+ text-align: center;
+ content: "\2039";
+ transition: .3s;
+ }
+ }
+ }
+
+ &.nav-dropdown {
+ &.open {
+ background: $sidebar-nav-dropdown-bg;
+ @include borders($sidebar-nav-dropdown-borders);
+ @if $enable-sidebar-nav-rounded {
+ border-radius: $border-radius;
+ }
+ > ul, > ol {
+ // display: inline;
+ max-height: 1000px;
+ }
+
+ .nav-link {
+ color: $sidebar-nav-dropdown-color;
+ border-left: 0 !important;
+ }
+
+ > .nav-link.nav-dropdown-toggle::before {
+ transform: rotate(-90deg);
+ }
+
+ .nav-dropdown.open {
+ border-left: 0;
+ }
+ }
+ &.nt {
+ transition: 0s !important;
+ > ul, > ol {
+ transition: 0s !important;
+ }
+ .nav-link {
+ &.nav-dropdown-toggle {
+
+ &::before {
+ transition: 0s !important;
+ }
+ }
+ }
+ }
+ }
+
+ .nav-label {
+ display: block;
+ padding: ($sidebar-nav-link-padding-y / 8) $sidebar-nav-link-padding-x;
+ color: $sidebar-nav-title-color;
+
+ &:hover {
+ color: $sidebar-color;
+ text-decoration: none;
+ }
+
+ i {
+ width: 20px;
+ margin: -3px ($sidebar-nav-link-padding-x / 2) 0 0;
+ font-size: 10px;
+ color: $sidebar-nav-link-icon-color;
+ text-align: center;
+ vertical-align: middle;
+ }
+ }
+
+ @if (lightness( $sidebar-bg ) < 40) {
+ .progress {
+ background-color: lighten($sidebar-bg, 15%) !important;
+ }
+ }
+ }
+ }
+}
+
+@include media-breakpoint-up(lg) {
+ .sidebar-compact {
+ .sidebar {
+ .sidebar-nav {
+ @include sidebar-width($sidebar-borders, $sidebar-compact-width);
+ }
+
+ .nav {
+ @include sidebar-width($sidebar-borders, $sidebar-compact-width);
+
+ .nav-title {
+ text-align: center;
+ }
+
+ .nav-item {
+ width: $sidebar-compact-width;
+ border-left: 0 !important;
+
+ .nav-link {
+ text-align: center;
+
+ i {
+ display: block;
+ width: 100%;
+ margin: $spacer / 4 0;
+ font-size: 24px;
+ }
+
+ .badge {
+ position: absolute;
+ top: 18px;
+ right: 10px;
+ }
+
+ &.nav-dropdown-toggle {
+
+ &::before {
+ top: 30px;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ .sidebar-minimized {
+ .hidden-cn {
+ display: none;
+ }
+ .sidebar {
+ z-index: $zindex-sticky - 1;
+
+ &:hover {
+ overflow: visible;
+ }
+
+ .sidebar-nav {
+ overflow: visible;
+ @include sidebar-width($sidebar-borders, $sidebar-minimized-width);
+ }
+
+ .nav {
+ @include sidebar-width($sidebar-borders, $sidebar-minimized-width);
+
+ .nav-title, .divider {
+ display: none;
+ }
+
+ .nav-item {
+ width: $sidebar-minimized-width;
+ overflow: hidden;
+ border-left: 0 !important;
+
+ ul {
+ background: $sidebar-bg;
+ }
+
+ .nav-link {
+ position: relative;
+ padding-left: 0;
+ margin: 0;
+ white-space: nowrap;
+ border-left: 0 !important;
+
+ &.nav-dropdown-toggle {
+
+ &::before {
+ display: none;
+ }
+ }
+
+ i {
+ display: block;
+ float: left;
+ width: $sidebar-minimized-height;
+ padding: 0;
+ margin: 0 !important;
+ font-size: 18px;
+ }
+
+ .badge {
+ position: absolute;
+ // top: 14px;
+ right: 15px;
+ display: none;
+ }
+
+ &:hover {
+ width: $sidebar-width;
+
+ .badge {
+ display: inline;
+ }
+ }
+ }
+
+ ul {
+ position: absolute;
+ left: $sidebar-minimized-width;
+
+ li {
+ position: relative;
+ padding: 0;
+
+ .nav-link {
+ width: $sidebar-width - $sidebar-minimized-width;
+ }
+
+ ul, ol {
+ position: absolute;
+ top: 0;
+ left: 100%;
+ }
+ }
+ }
+
+ &.nav-dropdown {
+ &.open {
+ background: $sidebar-nav-link-active-bg;
+ > .nav-link i {
+ color: $sidebar-nav-link-active-icon-color;
+ }
+ > ul, > ol {
+ display: none;
+ }
+ }
+ }
+
+ &:hover {
+ width: $sidebar-width + $sidebar-minimized-width;
+ overflow: visible;
+ background: $sidebar-nav-link-hover-bg;
+ transition: 0s;
+
+ > .nav-link {
+ width: $sidebar-width + $sidebar-minimized-width;
+ }
+
+ > ul, > ol {
+ display: inline;
+ max-height: 10000px;
+ transition: 0s;
+
+ li {
+ width: $sidebar-width;
+
+ .nav-link {
+ width: $sidebar-width;
+ }
+ }
+ }
+
+ &.nav-dropdown {
+ &.open {
+ > ul, > ol {
+ display: inline;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/scss/core/_switches.scss b/src/scss/core/_switches.scss
new file mode 100644
index 0000000..01f42bf
--- /dev/null
+++ b/src/scss/core/_switches.scss
@@ -0,0 +1,301 @@
+@mixin switch-size($width, $height, $font-size, $handle-margin) {
+ width: $width;
+ height: $height;
+
+ .switch-label {
+ font-size: $font-size;
+ }
+
+ .switch-handle {
+ width: $height - $handle-margin * 2;
+ height: $height - $handle-margin * 2;
+ }
+
+ .switch-input:checked ~ .switch-handle {
+ left: $width - $height + $handle-margin;
+ }
+}
+
+@mixin switch($type, $width, $height, $font-size, $handle-margin) {
+ position: relative;
+ display: inline-block;
+ vertical-align: top;
+ width: $width;
+ height: $height;
+ background-color: transparent;
+ cursor: pointer;
+
+ .switch-input {
+ position: absolute;
+ top: 0;
+ left: 0;
+ opacity: 0;
+ }
+
+ .switch-label {
+ position: relative;
+ display: block;
+ height: inherit;
+ @if $type == icon {
+ font-family: FontAwesome;
+ }
+ font-size: $font-size;
+ font-weight: 600;
+ text-transform: uppercase;
+ @if $type == ddd {
+ background-color: $gray-lightest;
+ } @else {
+ background-color: #fff;
+ }
+ border: 1px solid $border-color;
+ border-radius: 2px;
+ transition: opacity background .15s ease-out;
+ }
+ @if $type == text or $type == icon {
+ .switch-label::before,
+ .switch-label::after {
+ position: absolute;
+ top: 50%;
+ width: 50%;
+ margin-top: -.5em;
+ line-height: 1;
+ text-align: center;
+ transition: inherit;
+ }
+ .switch-label::before {
+ right: 1px;
+ color: $gray-lighter;
+ content: attr(data-off);
+ }
+ .switch-label::after {
+ left: 1px;
+ color: #fff;
+ content: attr(data-on);
+ opacity: 0;
+ }
+ }
+ .switch-input:checked ~ .switch-label {
+ //background: $gray-lightest;
+ }
+ .switch-input:checked ~ .switch-label::before {
+ opacity: 0;
+ }
+ .switch-input:checked ~ .switch-label::after {
+ opacity: 1;
+ }
+
+ .switch-handle {
+ position: absolute;
+ top: $handle-margin;
+ left: $handle-margin;
+ width: $height - $handle-margin * 2;
+ height: $height - $handle-margin * 2;
+ background: #fff;
+ border: 1px solid $border-color;
+ border-radius: 1px;
+ transition: left .15s ease-out;
+ @if $type == ddd {
+ border: 0;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, .3);
+ }
+ }
+
+ .switch-input:checked ~ .switch-handle {
+ left: $width - $height + $handle-margin;
+ }
+
+
+ @if $type == ddd {
+ @extend .switch-pill;
+ }
+
+ //size variations
+ @if $type == default {
+
+ &.switch-lg {
+ @include switch-size($switch-lg-width, $switch-lg-height, $switch-lg-font-size, $handle-margin);
+ }
+ &.switch-sm {
+ @include switch-size($switch-sm-width, $switch-sm-height, $switch-sm-font-size, $handle-margin);
+ }
+ &.switch-xs {
+ @include switch-size($switch-xs-width, $switch-xs-height, $switch-xs-font-size, $handle-margin);
+ }
+
+ } @else if $type == text {
+
+ &.switch-lg {
+ @include switch-size($switch-text-lg-width, $switch-text-lg-height, $switch-text-lg-font-size, $handle-margin);
+ }
+ &.switch-sm {
+ @include switch-size($switch-text-sm-width, $switch-text-sm-height, $switch-text-sm-font-size, $handle-margin);
+ }
+ &.switch-xs {
+ @include switch-size($switch-text-xs-width, $switch-text-xs-height, $switch-text-xs-font-size, $handle-margin);
+ }
+
+ } @else if $type == icon {
+
+ &.switch-lg {
+ @include switch-size($switch-icon-lg-width, $switch-icon-lg-height, $switch-icon-lg-font-size, $handle-margin);
+ }
+ &.switch-sm {
+ @include switch-size($switch-icon-sm-width, $switch-icon-sm-height, $switch-icon-sm-font-size, $handle-margin);
+ }
+ &.switch-xs {
+ @include switch-size($switch-icon-xs-width, $switch-icon-xs-height, $switch-icon-xs-font-size, $handle-margin);
+ }
+
+ } @else if $type == ddd {
+
+ &.switch-lg {
+ @include switch-size($switch-lg-width, $switch-lg-height, $switch-lg-font-size, 0);
+ }
+ &.switch-sm {
+ @include switch-size($switch-sm-width, $switch-sm-height, $switch-sm-font-size, 0);
+ }
+ &.switch-xs {
+ @include switch-size($switch-xs-width, $switch-xs-height, $switch-xs-font-size, 0);
+ }
+ }
+}
+
+@mixin switch-variant($color) {
+ > .switch-input:checked ~ .switch-label {
+ background: $color !important;
+ border-color: darken($color,10%);
+ }
+
+ > .switch-input:checked ~ .switch-handle {
+ border-color: darken($color,10%);
+ }
+}
+
+@mixin switch-outline-variant($color) {
+ > .switch-input:checked ~ .switch-label {
+ background: #fff !important;
+ border-color: $color;
+
+ &::after {
+ color: $color;
+ }
+ }
+
+ > .switch-input:checked ~ .switch-handle {
+ border-color: $color;
+ }
+}
+
+@mixin switch-outline-alt-variant($color) {
+ > .switch-input:checked ~ .switch-label {
+ background: #fff !important;
+ border-color: $color;
+
+ &::after {
+ color: $color;
+ }
+ }
+
+ > .switch-input:checked ~ .switch-handle {
+ background: $color !important;
+ border-color: $color;
+ }
+}
+
+$switch-lg-width: 48px;
+$switch-lg-height: 28px;
+$switch-lg-font-size: 12px;
+
+$switch-width: 40px;
+$switch-height: 24px;
+$switch-font-size: 10px;
+
+$handle-margin: 2px;
+
+$switch-sm-width: 32px;
+$switch-sm-height: 20px;
+$switch-sm-font-size: 8px;
+
+$switch-xs-width: 24px;
+$switch-xs-height: 16px;
+$switch-xs-font-size: 7px;
+
+
+$switch-text-lg-width: 56px;
+$switch-text-lg-height: 28px;
+$switch-text-lg-font-size: 12px;
+
+$switch-text-width: 48px;
+$switch-text-height: 24px;
+$switch-text-font-size: 10px;
+
+$switch-text-sm-width: 40px;
+$switch-text-sm-height: 20px;
+$switch-text-sm-font-size: 8px;
+
+$switch-text-xs-width: 32px;
+$switch-text-xs-height: 16px;
+$switch-text-xs-font-size: 7px;
+
+
+$switch-icon-lg-width: 56px;
+$switch-icon-lg-height: 28px;
+$switch-icon-lg-font-size: 12px;
+
+$switch-icon-width: 48px;
+$switch-icon-height: 24px;
+$switch-icon-font-size: 10px;
+
+$switch-icon-sm-width: 40px;
+$switch-icon-sm-height: 20px;
+$switch-icon-sm-font-size: 8px;
+
+$switch-icon-xs-width: 32px;
+$switch-icon-xs-height: 16px;
+$switch-icon-xs-font-size: 7px;
+
+.switch.switch-default {
+ @include switch('default', $switch-width, $switch-height, $switch-font-size, $handle-margin);
+}
+
+.switch.switch-text {
+ @include switch('text', $switch-text-width, $switch-text-height, $switch-text-font-size, $handle-margin);
+}
+
+.switch.switch-icon {
+ @include switch('icon', $switch-icon-width, $switch-icon-height, $switch-icon-font-size, $handle-margin);
+}
+
+.switch.switch-3d {
+ @include switch('ddd', $switch-width, $switch-height, $switch-font-size, 0);
+}
+
+//pills style
+.switch-pill {
+ .switch-label,
+ .switch-handle {
+ border-radius: 50em !important;
+ }
+
+ .switch-label::before {
+ right: 2px !important;
+ }
+ .switch-label::after {
+ left: 2px !important;
+ }
+}
+
+@each $variant, $color in (primary: $brand-primary, secondary: $gray-lighter, success: $brand-success, info: $brand-info, warning: $brand-warning, danger: $brand-danger) {
+ //normal style
+ .switch-#{$variant} {
+ @include switch-variant($color);
+ }
+ //outline style
+ .switch-#{$variant}-outline {
+ @include switch-outline-variant($color);
+ }
+ //outline alternative style
+ .switch-#{$variant}-outline-alt {
+ @include switch-outline-alt-variant($color);
+ }
+}
diff --git a/src/scss/core/_tables.scss b/src/scss/core/_tables.scss
new file mode 100644
index 0000000..aabc023
--- /dev/null
+++ b/src/scss/core/_tables.scss
@@ -0,0 +1,20 @@
+.table-outline {
+ border: 1px solid $table-border-color;
+
+ td {
+ vertical-align: middle;
+ }
+}
+
+.table-align-middle {
+
+ td {
+ vertical-align: middle;
+ }
+}
+
+.table-clear {
+ td {
+ border: 0;
+ }
+}
diff --git a/src/scss/core/_temp.scss b/src/scss/core/_temp.scss
new file mode 100644
index 0000000..ccb7b3a
--- /dev/null
+++ b/src/scss/core/_temp.scss
@@ -0,0 +1,38 @@
+.pagination-datatables, .pagination {
+ li {
+ @extend .page-item;
+
+ a {
+ @extend .page-link;
+ }
+ }
+}
+
+.label-pill {
+ border-radius: 1rem !important;
+}
+
+// temp fix for Vue-Strap
+
+// Open state for the dropdown
+.open {
+ // Show the menu
+ > .dropdown-menu {
+ display: block;
+ }
+
+ // Remove the outline when :focus is triggered
+ > a {
+ outline: 0;
+ }
+}
+
+// navbar dropdown fix
+.navbar .dropdown-toggle {
+ @extend .nav-link;
+
+ .img-avatar {
+ height: $navbar-height - 20px;
+ margin: 0 10px;
+ }
+}
diff --git a/src/scss/core/_typography.scss b/src/scss/core/_typography.scss
new file mode 100644
index 0000000..be550c9
--- /dev/null
+++ b/src/scss/core/_typography.scss
@@ -0,0 +1,36 @@
+body {
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+}
+
+.font-xs {
+ font-size: .75rem !important;
+}
+
+.font-sm {
+ font-size: .85rem !important;
+}
+
+.font-lg {
+ font-size: 1rem !important;
+}
+
+.font-xl {
+ font-size: 1.25rem !important;
+}
+
+.font-2xl {
+ font-size: 1.5rem !important;
+}
+
+.font-3xl {
+ font-size: 1.75rem !important;
+}
+
+.font-4xl {
+ font-size: 2rem !important;
+}
+
+.font-5xl {
+ font-size: 2.5rem !important;
+}
diff --git a/src/scss/core/_utilities.scss b/src/scss/core/_utilities.scss
new file mode 100644
index 0000000..6398c9f
--- /dev/null
+++ b/src/scss/core/_utilities.scss
@@ -0,0 +1,3 @@
+@import "utilities/background";
+@import "utilities/borders";
+@import "utilities/display";
diff --git a/src/scss/core/_widgets.scss b/src/scss/core/_widgets.scss
new file mode 100644
index 0000000..7bcbe57
--- /dev/null
+++ b/src/scss/core/_widgets.scss
@@ -0,0 +1,253 @@
+// .social-box
+.social-box {
+ min-height: 160px;
+ margin-bottom: 2 * $card-spacer-y;
+ text-align: center;
+ background: #fff;
+ border: $card-border-width solid $card-border-color;
+ @include border-radius($card-border-radius);
+
+ i {
+ display: block;
+ margin: -1px -1px 0;
+ font-size: 40px;
+ line-height: 90px;
+ background: $gray-lighter;
+
+ @include border-radius($card-border-radius-inner $card-border-radius-inner 0 0);
+ }
+
+ .chart-wrapper {
+ height: 90px;
+ margin: -90px 0 0;
+
+ canvas {
+ width: 100% !important;
+ height: 90px !important;
+ }
+ }
+
+ ul {
+ padding: 10px 0;
+ list-style: none;
+
+
+ li {
+ display: block;
+ float: left;
+ width: 50%;
+
+ &:first-child {
+ border-right: 1px solid $border-color;
+ }
+
+ strong {
+ display: block;
+ font-size: 20px;
+ }
+
+ span {
+ font-size: 10px;
+ font-weight: 500;
+ color: $border-color;
+ text-transform: uppercase;
+ }
+ }
+ }
+
+ &.facebook {
+ i {
+ color: #fff;
+ background: $facebook;
+ }
+ }
+
+ &.twitter {
+ i {
+ color: #fff;
+ background: $twitter;
+ }
+ }
+
+ &.linkedin {
+ i {
+ color: #fff;
+ background: $linkedin;
+ }
+ }
+
+ &.google-plus {
+ i {
+ color: #fff;
+ background: $google-plus;
+ }
+ }
+}
+
+.horizontal-bars {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+
+ li {
+ position: relative;
+ height: 40px;
+ line-height: 40px;
+ vertical-align: middle;
+
+ .title {
+ width: 100px;
+ font-size: 12px;
+ font-weight: 600;
+ color: $text-muted;
+ vertical-align: middle;
+ }
+
+ .bars {
+ position: absolute;
+ top: 15px;
+ width: 100%;
+ padding-left: 100px;
+
+ .progress:first-child {
+ margin-bottom: 2px;
+ }
+ }
+
+ &.legend {
+ text-align: center;
+
+ .badge {
+ display: inline-block;
+ width: 8px;
+ height: 8px;
+ padding: 0;
+ }
+ }
+
+ &.divider {
+ height: 40px;
+
+ i {
+ margin: 0 !important;
+ }
+ }
+ }
+
+ &.type-2 {
+
+ li {
+ overflow: hidden;
+
+ i {
+ display: inline-block;
+ margin-right: $spacer;
+ margin-left: 5px;
+ font-size: 18px;
+ line-height: 40px;
+ }
+
+ .title {
+ display: inline-block;
+ width: auto;
+ margin-top: -9px;
+ font-size: $font-size-base;
+ font-weight: normal;
+ line-height: 40px;
+ color: $body-color;
+ }
+
+ .value {
+ float: right;
+ font-weight: 600;
+ }
+
+ .bars {
+ position: absolute;
+ top: auto;
+ bottom: 0;
+ padding: 0;
+ }
+ }
+ }
+}
+
+.icons-list {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+
+ li {
+ position: relative;
+ height: 40px;
+ vertical-align: middle;
+
+ i {
+ display: block;
+ float: left;
+ width: 35px !important;
+ height: 35px !important;
+ margin: 2px;
+ line-height: 35px !important;
+ text-align: center;
+ }
+
+ .desc {
+ height: 40px;
+ margin-left: 50px;
+ border-bottom: 1px solid $border-color;
+
+ .title {
+ padding: 2px 0 0;
+ margin: 0;
+ }
+ small {
+ display: block;
+ margin-top: -4px;
+ color: $text-muted;
+ }
+ }
+
+ .value {
+ position: absolute;
+ top: 2px;
+ right: 45px;
+ text-align: right;
+
+ strong {
+ display: block;
+ margin-top: -3px;
+ }
+ }
+
+ .actions {
+ position: absolute;
+ top: -4px;
+ right: 10px;
+ width: 40px;
+ height: 40px;
+ line-height: 40px;
+ text-align: center;
+
+ i {
+ float: none;
+ width: auto;
+ height: auto;
+ padding: 0;
+ margin: 0;
+ line-height: normal;
+ }
+ }
+
+ &.divider {
+ height: 40px;
+
+ i {
+ width: auto;
+ height: auto;
+ margin: 2px 0 0;
+ font-size: 18px;
+ }
+ }
+ }
+}
diff --git a/src/scss/core/utilities/_background.scss b/src/scss/core/utilities/_background.scss
new file mode 100644
index 0000000..2260386
--- /dev/null
+++ b/src/scss/core/utilities/_background.scss
@@ -0,0 +1,8 @@
+.bg-primary,
+.bg-success,
+.bg-info,
+.bg-warning,
+.bg-danger,
+.bg-inverse {
+ color: #fff;
+}
diff --git a/src/scss/core/utilities/_borders.scss b/src/scss/core/utilities/_borders.scss
new file mode 100644
index 0000000..c840fd0
--- /dev/null
+++ b/src/scss/core/utilities/_borders.scss
@@ -0,0 +1,18 @@
+//border
+@each $prop, $abbrev in (border: b) {
+ @each $size in (0,1,2) {
+ @if $size == 0 {
+ .#{$abbrev}-a-#{$size} { #{$prop}: 0 !important; } // a = All sides
+ .#{$abbrev}-t-#{$size} { #{$prop}-top: 0 !important; }
+ .#{$abbrev}-r-#{$size} { #{$prop}-right: 0 !important; }
+ .#{$abbrev}-b-#{$size} { #{$prop}-bottom: 0 !important; }
+ .#{$abbrev}-l-#{$size} { #{$prop}-left: 0 !important; }
+ } @else {
+ .#{$abbrev}-a-#{$size} { #{$prop}: $size * $border-width solid $border-color !important; } // a = All sides
+ .#{$abbrev}-t-#{$size} { #{$prop}-top: $size * $border-width solid $border-color !important; }
+ .#{$abbrev}-r-#{$size} { #{$prop}-right: $size * $border-width solid $border-color !important; }
+ .#{$abbrev}-b-#{$size} { #{$prop}-bottom: $size * $border-width solid $border-color !important; }
+ .#{$abbrev}-l-#{$size} { #{$prop}-left: $size * $border-width solid $border-color !important; }
+ }
+ }
+}
diff --git a/src/scss/core/utilities/_display.scss b/src/scss/core/utilities/_display.scss
new file mode 100644
index 0000000..0f0e58a
--- /dev/null
+++ b/src/scss/core/utilities/_display.scss
@@ -0,0 +1,18 @@
+//
+// Utilities for common `display` values
+//
+
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-down($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .d#{$infix}-down-none { display: none !important; }
+ // .d#{$infix}-inline { display: inline !important; }
+ // .d#{$infix}-inline-block { display: inline-block !important; }
+ // .d#{$infix}-block { display: block !important; }
+ // .d#{$infix}-table { display: table !important; }
+ // .d#{$infix}-table-cell { display: table-cell !important; }
+ // .d#{$infix}-flex { display: flex !important; }
+ // .d#{$infix}-inline-flex { display: inline-flex !important; }
+ }
+}
diff --git a/src/scss/style.scss b/src/scss/style.scss
new file mode 100644
index 0000000..eb8ef09
--- /dev/null
+++ b/src/scss/style.scss
@@ -0,0 +1,78 @@
+/**
+ * CoreUI - Open Source Bootstrap Admin Template
+ * @version v1.0.0-alpha.5
+ * @link http://coreui.io
+ * Copyright (c) 2017 creativeLabs Ćukasz Holeczek
+ * @license MIT
+ */
+// Import normalize
+@import "bootstrap/normalize";
+
+// Override Boostrap variables
+@import "bootstrap-variables";
+
+// Import Bootstrap source files
+@import "bootstrap/bootstrap";
+
+// If you want you can import bootstrap scss files directly from node_modules or bower_components.
+// To do this please remove @import "bootstrap/bootstrap"; and uncomment proper line.
+
+// Import Bootstrap source files from node_modules
+// @import "node_modules/bootstrap/scss/bootstrap";
+
+// Import Bootstrap source files from bower_components
+// @import "bower_components/bootstrap/scss/bootstrap";
+
+// Import vendors styles
+@import "vendors/vendors";
+
+// Import core styles
+@import "custom-variables";
+@import "core/mixins";
+
+// Additional typography
+@import "core/typography";
+
+// Animations
+@import "core/animate";
+
+// Components
+@import "core/aside";
+@import "core/avatars";
+@import "core/badge";
+@import "core/breadcrumb-menu";
+@import "core/breadcrumb";
+@import "core/buttons";
+@import "core/callout";
+@import "core/card";
+@import "core/charts";
+@import "core/dropdown";
+@import "core/footer";
+@import "core/grid";
+@import "core/input-group";
+@import "core/loading";
+@import "core/modal";
+@import "core/nav";
+@import "core/navbar";
+@import "core/progress";
+@import "core/sidebar";
+@import "core/switches";
+@import "core/tables";
+@import "core/widgets";
+
+// Layout Options
+@import "core/layout";
+
+@import "core/others";
+
+// Utility classes
+@import "core/utilities";
+
+// Temporary fixes
+@import "core/temp";
+
+// Right-to-left
+@import "core/rtl";
+
+// Custom styles
+@import "custom";
diff --git a/src/scss/vendors/_vendors.scss b/src/scss/vendors/_vendors.scss
new file mode 100644
index 0000000..7aab687
--- /dev/null
+++ b/src/scss/vendors/_vendors.scss
@@ -0,0 +1 @@
+@import "chart.js/chart";
diff --git a/src/scss/vendors/chart.js/chart.scss b/src/scss/vendors/chart.js/chart.scss
new file mode 100644
index 0000000..41eda00
--- /dev/null
+++ b/src/scss/vendors/chart.js/chart.scss
@@ -0,0 +1,45 @@
+.chart-legend,
+.bar-legend,
+.line-legend,
+.pie-legend,
+.radar-legend,
+.polararea-legend,
+.doughnut-legend {
+ list-style-type: none;
+ margin-top: 5px;
+ text-align: center;
+ -webkit-padding-start: 0;
+ -moz-padding-start: 0;
+ padding-left: 0;
+}
+.chart-legend li,
+.bar-legend li,
+.line-legend li,
+.pie-legend li,
+.radar-legend li,
+.polararea-legend li,
+.doughnut-legend li {
+ display: inline-block;
+ white-space: nowrap;
+ position: relative;
+ margin-bottom: 4px;
+ @include border-radius($border-radius);
+ padding: 2px 8px 2px 28px;
+ font-size: smaller;
+ cursor: default;
+}
+.chart-legend li span,
+.bar-legend li span,
+.line-legend li span,
+.pie-legend li span,
+.radar-legend li span,
+.polararea-legend li span,
+.doughnut-legend li span {
+ display: block;
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 20px;
+ height: 20px;
+ @include border-radius($border-radius);
+}
diff --git a/src/test.ts b/src/test.ts
new file mode 100644
index 0000000..9bf7226
--- /dev/null
+++ b/src/test.ts
@@ -0,0 +1,32 @@
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import 'zone.js/dist/long-stack-trace-zone';
+import 'zone.js/dist/proxy.js';
+import 'zone.js/dist/sync-test';
+import 'zone.js/dist/jasmine-patch';
+import 'zone.js/dist/async-test';
+import 'zone.js/dist/fake-async-test';
+import { getTestBed } from '@angular/core/testing';
+import {
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting
+} from '@angular/platform-browser-dynamic/testing';
+
+// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any.
+declare var __karma__: any;
+declare var require: any;
+
+// Prevent Karma from running prematurely.
+__karma__.loaded = function () {};
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting()
+);
+// Then we find all the tests.
+const context = require.context('./', true, /\.spec\.ts$/);
+// And load the modules.
+context.keys().map(context);
+// Finally, start Karma to run the tests.
+__karma__.start();
diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json
new file mode 100644
index 0000000..5e2507d
--- /dev/null
+++ b/src/tsconfig.app.json
@@ -0,0 +1,13 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/app",
+ "module": "es2015",
+ "baseUrl": "",
+ "types": []
+ },
+ "exclude": [
+ "test.ts",
+ "**/*.spec.ts"
+ ]
+}
diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json
new file mode 100644
index 0000000..510e3f1
--- /dev/null
+++ b/src/tsconfig.spec.json
@@ -0,0 +1,20 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../out-tsc/spec",
+ "module": "commonjs",
+ "target": "es5",
+ "baseUrl": "",
+ "types": [
+ "jasmine",
+ "node"
+ ]
+ },
+ "files": [
+ "test.ts"
+ ],
+ "include": [
+ "**/*.spec.ts",
+ "**/*.d.ts"
+ ]
+}
diff --git a/src/typings.d.ts b/src/typings.d.ts
new file mode 100644
index 0000000..ef5c7bd
--- /dev/null
+++ b/src/typings.d.ts
@@ -0,0 +1,5 @@
+/* SystemJS module definition */
+declare var module: NodeModule;
+interface NodeModule {
+ id: string;
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..a35a8ee
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compileOnSave": false,
+ "compilerOptions": {
+ "outDir": "./dist/out-tsc",
+ "baseUrl": "src",
+ "sourceMap": true,
+ "declaration": false,
+ "moduleResolution": "node",
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "target": "es5",
+ "typeRoots": [
+ "node_modules/@types"
+ ],
+ "lib": [
+ "es2016",
+ "dom"
+ ]
+ }
+}
diff --git a/tslint.json b/tslint.json
new file mode 100644
index 0000000..b4db95c
--- /dev/null
+++ b/tslint.json
@@ -0,0 +1,116 @@
+{
+ "rulesDirectory": [
+ "node_modules/codelyzer"
+ ],
+ "rules": {
+ "callable-types": true,
+ "class-name": true,
+ "comment-format": [
+ true,
+ "check-space"
+ ],
+ "curly": true,
+ "eofline": true,
+ "forin": true,
+ "import-blacklist": [true, "rxjs"],
+ "import-spacing": true,
+ "indent": [
+ true,
+ "spaces"
+ ],
+ "interface-over-type-literal": true,
+ "label-position": true,
+ "max-line-length": [
+ true,
+ 140
+ ],
+ "member-access": false,
+ "member-ordering": [
+ true,
+ "static-before-instance",
+ "variables-before-functions"
+ ],
+ "no-arg": true,
+ "no-bitwise": true,
+ "no-console": [
+ true,
+ "debug",
+ "info",
+ "time",
+ "timeEnd",
+ "trace"
+ ],
+ "no-construct": true,
+ "no-debugger": true,
+ "no-duplicate-variable": true,
+ "no-empty": false,
+ "no-empty-interface": true,
+ "no-eval": true,
+ "no-inferrable-types": [true, "ignore-params"],
+ "no-shadowed-variable": true,
+ "no-string-literal": false,
+ "no-string-throw": true,
+ "no-switch-case-fall-through": true,
+ "no-trailing-whitespace": true,
+ "no-unused-expression": true,
+ "no-use-before-declare": true,
+ "no-var-keyword": true,
+ "object-literal-sort-keys": false,
+ "one-line": [
+ true,
+ "check-open-brace",
+ "check-catch",
+ "check-else",
+ "check-whitespace"
+ ],
+ "prefer-const": true,
+ "quotemark": [
+ true,
+ "single"
+ ],
+ "radix": true,
+ "semicolon": [
+ "always"
+ ],
+ "triple-equals": [
+ true,
+ "allow-null-check"
+ ],
+ "typedef-whitespace": [
+ true,
+ {
+ "call-signature": "nospace",
+ "index-signature": "nospace",
+ "parameter": "nospace",
+ "property-declaration": "nospace",
+ "variable-declaration": "nospace"
+ }
+ ],
+ "typeof-compare": true,
+ "unified-signatures": true,
+ "variable-name": false,
+ "whitespace": [
+ true,
+ "check-branch",
+ "check-decl",
+ "check-operator",
+ "check-separator",
+ "check-type"
+ ],
+
+ "directive-selector": [true, "attribute", "app", "camelCase"],
+ "component-selector": [true, "element", ["app", "widget", "snippet", "panel"], "kebab-case"],
+ "use-input-property-decorator": true,
+ "use-output-property-decorator": true,
+ "use-host-property-decorator": true,
+ "no-input-rename": true,
+ "no-output-rename": true,
+ "use-life-cycle-interface": true,
+ "use-pipe-transform-interface": true,
+ "component-class-suffix": [true, "Component", "Widget", "Panel"],
+ "directive-class-suffix": true,
+ "no-access-missing-member": true,
+ "templates-use-public": true,
+ "invoke-injectable": true
+ }
+}
|