aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/fonts/opensans/latin.woff2bin0 -> 14380 bytes
-rw-r--r--src/images/channel1.pngbin0 -> 287477 bytes
-rw-r--r--src/images/channel2.pngbin0 -> 210508 bytes
-rw-r--r--src/images/channel3.pngbin0 -> 198413 bytes
-rw-r--r--src/images/favicon/favicon-16x16.pngbin0 -> 463 bytes
-rw-r--r--src/images/favicon/favicon-192x192.pngbin0 -> 2866 bytes
-rw-r--r--src/images/favicon/favicon-32x32.pngbin0 -> 925 bytes
-rw-r--r--src/images/favicon/favicon-96x96.pngbin0 -> 1749 bytes
-rw-r--r--src/images/football1.pngbin0 -> 256151 bytes
-rw-r--r--src/images/football2.pngbin0 -> 303325 bytes
-rw-r--r--src/images/football3.pngbin0 -> 271849 bytes
-rw-r--r--src/images/logo.svg62
-rw-r--r--src/images/nike.pngbin0 -> 1975 bytes
-rw-r--r--src/images/profile.pngbin0 -> 12603 bytes
-rw-r--r--src/images/search.pngbin0 -> 1566 bytes
-rw-r--r--src/images/shakira.pngbin0 -> 4259 bytes
-rw-r--r--src/images/shakira1.pngbin0 -> 250566 bytes
-rw-r--r--src/images/shakira2.pngbin0 -> 257941 bytes
-rw-r--r--src/images/shakira3.pngbin0 -> 272060 bytes
-rw-r--r--src/images/shoes.pngbin0 -> 4247 bytes
-rw-r--r--src/images/svg/master.svg120
-rw-r--r--src/images/video.pngbin0 -> 666999 bytes
-rw-r--r--src/images/video2.pngbin0 -> 833949 bytes
-rw-r--r--src/images/video3.pngbin0 -> 166399 bytes
-rw-r--r--src/images/video4.pngbin0 -> 124958 bytes
-rw-r--r--src/images/video5.pngbin0 -> 175255 bytes
-rw-r--r--src/images/video6.pngbin0 -> 143268 bytes
-rw-r--r--src/js/menu.js52
-rw-r--r--src/scss/bootstrap/_alert.scss51
-rw-r--r--src/scss/bootstrap/_badge.scss28
-rw-r--r--src/scss/bootstrap/_breadcrumb.scss41
-rw-r--r--src/scss/bootstrap/_button-group.scss163
-rw-r--r--src/scss/bootstrap/_buttons.scss137
-rw-r--r--src/scss/bootstrap/_card.scss289
-rw-r--r--src/scss/bootstrap/_carousel.scss197
-rw-r--r--src/scss/bootstrap/_close.scss41
-rw-r--r--src/scss/bootstrap/_code.scss48
-rw-r--r--src/scss/bootstrap/_custom-forms.scss511
-rw-r--r--src/scss/bootstrap/_dropdown.scss191
-rw-r--r--src/scss/bootstrap/_forms.scss332
-rw-r--r--src/scss/bootstrap/_functions.scss86
-rw-r--r--src/scss/bootstrap/_grid.scss52
-rw-r--r--src/scss/bootstrap/_images.scss42
-rw-r--r--src/scss/bootstrap/_input-group.scss193
-rw-r--r--src/scss/bootstrap/_jumbotron.scss17
-rw-r--r--src/scss/bootstrap/_list-group.scss149
-rw-r--r--src/scss/bootstrap/_media.scss8
-rw-r--r--src/scss/bootstrap/_mixins.scss42
-rw-r--r--src/scss/bootstrap/_modal.scss229
-rw-r--r--src/scss/bootstrap/_nav.scss120
-rw-r--r--src/scss/bootstrap/_navbar.scss294
-rw-r--r--src/scss/bootstrap/_pagination.scss73
-rw-r--r--src/scss/bootstrap/_popover.scss171
-rw-r--r--src/scss/bootstrap/_print.scss141
-rw-r--r--src/scss/bootstrap/_progress.scss45
-rw-r--r--src/scss/bootstrap/_reboot.scss487
-rw-r--r--src/scss/bootstrap/_root.scss19
-rw-r--r--src/scss/bootstrap/_spinners.scss55
-rw-r--r--src/scss/bootstrap/_tables.scss185
-rw-r--r--src/scss/bootstrap/_toasts.scss44
-rw-r--r--src/scss/bootstrap/_tooltip.scss115
-rw-r--r--src/scss/bootstrap/_transitions.scss20
-rw-r--r--src/scss/bootstrap/_type.scss125
-rw-r--r--src/scss/bootstrap/_utilities.scss17
-rw-r--r--src/scss/bootstrap/_variables.scss1115
-rw-r--r--src/scss/bootstrap/bootstrap-grid.scss29
-rw-r--r--src/scss/bootstrap/bootstrap-reboot.scss12
-rw-r--r--src/scss/bootstrap/bootstrap.scss44
-rw-r--r--src/scss/bootstrap/mixins/_alert.scss9
-rw-r--r--src/scss/bootstrap/mixins/_background-variant.scss7
-rw-r--r--src/scss/bootstrap/mixins/_border-radius.scss63
-rw-r--r--src/scss/bootstrap/mixins/_box-shadow.scss20
-rw-r--r--src/scss/bootstrap/mixins/_breakpoints.scss123
-rw-r--r--src/scss/bootstrap/mixins/_buttons.scss107
-rw-r--r--src/scss/bootstrap/mixins/_caret.scss62
-rw-r--r--src/scss/bootstrap/mixins/_clearfix.scss7
-rw-r--r--src/scss/bootstrap/mixins/_deprecate.scss10
-rw-r--r--src/scss/bootstrap/mixins/_forms.scss193
-rw-r--r--src/scss/bootstrap/mixins/_gradients.scss45
-rw-r--r--src/scss/bootstrap/mixins/_grid-framework.scss66
-rw-r--r--src/scss/bootstrap/mixins/_grid.scss51
-rw-r--r--src/scss/bootstrap/mixins/_hover.scss37
-rw-r--r--src/scss/bootstrap/mixins/_image.scss16
-rw-r--r--src/scss/bootstrap/mixins/_list-group.scss21
-rw-r--r--src/scss/bootstrap/mixins/_lists.scss7
-rw-r--r--src/scss/bootstrap/mixins/_nav-divider.scss10
-rw-r--r--src/scss/bootstrap/mixins/_pagination.scss22
-rw-r--r--src/scss/bootstrap/mixins/_reset-text.scss17
-rw-r--r--src/scss/bootstrap/mixins/_resize.scss6
-rw-r--r--src/scss/bootstrap/mixins/_screen-reader.scss33
-rw-r--r--src/scss/bootstrap/mixins/_table-row.scss39
-rw-r--r--src/scss/bootstrap/mixins/_text-emphasis.scss16
-rw-r--r--src/scss/bootstrap/mixins/_text-truncate.scss8
-rw-r--r--src/scss/bootstrap/mixins/_transition.scss16
-rw-r--r--src/scss/bootstrap/utilities/_align.scss8
-rw-r--r--src/scss/bootstrap/utilities/_background.scss21
-rw-r--r--src/scss/bootstrap/utilities/_borders.scss75
-rw-r--r--src/scss/bootstrap/utilities/_clearfix.scss3
-rw-r--r--src/scss/bootstrap/utilities/_display.scss26
-rw-r--r--src/scss/bootstrap/utilities/_embed.scss39
-rw-r--r--src/scss/bootstrap/utilities/_flex.scss51
-rw-r--r--src/scss/bootstrap/utilities/_float.scss11
-rw-r--r--src/scss/bootstrap/utilities/_overflow.scss5
-rw-r--r--src/scss/bootstrap/utilities/_position.scss32
-rw-r--r--src/scss/bootstrap/utilities/_screenreaders.scss11
-rw-r--r--src/scss/bootstrap/utilities/_shadows.scss6
-rw-r--r--src/scss/bootstrap/utilities/_sizing.scss20
-rw-r--r--src/scss/bootstrap/utilities/_spacing.scss73
-rw-r--r--src/scss/bootstrap/utilities/_stretched-link.scss19
-rw-r--r--src/scss/bootstrap/utilities/_text.scss68
-rw-r--r--src/scss/bootstrap/utilities/_visibility.scss13
-rw-r--r--src/scss/bootstrap/vendor/_rfs.scss186
-rw-r--r--src/scss/custom/_main.scss779
-rw-r--r--src/scss/custom/_typography.scss7
-rw-r--r--src/scss/custom/_variables.scss9
-rw-r--r--src/scss/custom/comments.scss304
-rw-r--r--src/scss/custom/styles.scss14
117 files changed, 8983 insertions, 0 deletions
diff --git a/src/fonts/opensans/latin.woff2 b/src/fonts/opensans/latin.woff2
new file mode 100644
index 0000000..e9f58b7
--- /dev/null
+++ b/src/fonts/opensans/latin.woff2
Binary files differ
diff --git a/src/images/channel1.png b/src/images/channel1.png
new file mode 100644
index 0000000..d88d898
--- /dev/null
+++ b/src/images/channel1.png
Binary files differ
diff --git a/src/images/channel2.png b/src/images/channel2.png
new file mode 100644
index 0000000..b18560b
--- /dev/null
+++ b/src/images/channel2.png
Binary files differ
diff --git a/src/images/channel3.png b/src/images/channel3.png
new file mode 100644
index 0000000..c0fce7c
--- /dev/null
+++ b/src/images/channel3.png
Binary files differ
diff --git a/src/images/favicon/favicon-16x16.png b/src/images/favicon/favicon-16x16.png
new file mode 100644
index 0000000..f10facf
--- /dev/null
+++ b/src/images/favicon/favicon-16x16.png
Binary files differ
diff --git a/src/images/favicon/favicon-192x192.png b/src/images/favicon/favicon-192x192.png
new file mode 100644
index 0000000..9a0e4ec
--- /dev/null
+++ b/src/images/favicon/favicon-192x192.png
Binary files differ
diff --git a/src/images/favicon/favicon-32x32.png b/src/images/favicon/favicon-32x32.png
new file mode 100644
index 0000000..efae001
--- /dev/null
+++ b/src/images/favicon/favicon-32x32.png
Binary files differ
diff --git a/src/images/favicon/favicon-96x96.png b/src/images/favicon/favicon-96x96.png
new file mode 100644
index 0000000..e4b3054
--- /dev/null
+++ b/src/images/favicon/favicon-96x96.png
Binary files differ
diff --git a/src/images/football1.png b/src/images/football1.png
new file mode 100644
index 0000000..8d97aea
--- /dev/null
+++ b/src/images/football1.png
Binary files differ
diff --git a/src/images/football2.png b/src/images/football2.png
new file mode 100644
index 0000000..4d799ec
--- /dev/null
+++ b/src/images/football2.png
Binary files differ
diff --git a/src/images/football3.png b/src/images/football3.png
new file mode 100644
index 0000000..ef9ff63
--- /dev/null
+++ b/src/images/football3.png
Binary files differ
diff --git a/src/images/logo.svg b/src/images/logo.svg
new file mode 100644
index 0000000..597d419
--- /dev/null
+++ b/src/images/logo.svg
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ height="85"
+ width="386.3674"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 386.36741 85"
+ xml:space="preserve">
+ <style
+ type="text/css">
+ .st0{fill:#FF0000;}
+ .st1{fill:#FFFFFF;}
+ .st2{fill:#282828;}
+ </style>
+ <g
+ aria-label="LibreTube"
+ transform="matrix(1.5966382,0,0,1.5966413,-103.9904,-19.793844)"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none">
+ <path
+ d="m 143.11914,48.195312 h 10.07813 v 4.765625 h -15.82032 v -28.4375 h 5.74219 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff" />
+ <path
+ d="m 162.04492,52.960937 h -5.54687 V 31.828125 h 5.54687 z m -5.80078,-26.601562 q 0,-1.289063 0.82031,-2.109375 0.82032,-0.820313 2.1875,-0.820313 1.36719,0 2.1875,0.820313 0.82032,0.820312 0.82032,2.109375 0,1.269531 -0.82032,2.109375 -0.80078,0.839844 -2.1875,0.839844 -1.38672,0 -2.20703,-0.839844 -0.80078,-0.839844 -0.80078,-2.109375 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/>
+ <path
+ d="m 182.80664,43.078125 q 0,5.136719 -1.64062,7.714844 -1.64063,2.558593 -5.15625,2.558593 -2.75391,0 -4.41407,-2.480468 l -0.17578,2.089843 h -5.09765 v -30 h 5.52734 v 10.585938 q 1.5625,-2.109375 4.12109,-2.109375 3.51563,0 5.15625,2.558594 1.64063,2.539062 1.67969,7.460937 z m -5.52734,-1.386719 q 0,-3.339844 -0.64453,-4.472656 -0.64454,-1.152344 -2.2461,-1.152344 -1.73828,0 -2.53906,1.582031 v 9.628907 q 0.74219,1.484375 2.57812,1.484375 1.58204,0 2.1875,-1.035157 0.625,-1.035156 0.66407,-4.023437 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/>
+ <path
+ d="m 196.5957,37.160156 -1.83593,-0.15625 q -2.26563,0 -3.06641,1.992188 v 13.964843 h -5.54688 V 31.828125 h 5.21485 l 0.15625,2.285156 q 1.30859,-2.675781 3.61328,-2.675781 0.9375,0 1.52344,0.253906 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/>
+ <path
+ d="m 207.5918,53.351562 q -4.25782,0 -6.64063,-2.539062 -2.38281,-2.539063 -2.38281,-7.265625 v -1.679688 q 0,-5 2.1875,-7.714843 2.1875,-2.714844 6.26953,-2.714844 3.98438,0 5.99609,2.558594 2.01172,2.539062 2.05079,7.539062 V 44.25 h -10.9961 q 0.11719,2.34375 1.03516,3.4375 0.91797,1.074219 2.83203,1.074219 2.77344,0 4.62891,-1.894532 l 2.16796,3.339844 q -1.01562,1.40625 -2.94921,2.285156 -1.9336,0.859375 -4.19922,0.859375 z m -3.47657,-12.96875 h 5.52735 V 39.875 q -0.0391,-1.894531 -0.625,-2.871094 -0.58594,-0.976562 -2.03125,-0.976562 -1.44531,0 -2.10938,1.035156 -0.64453,1.035156 -0.76172,3.320312 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/>
+ <path
+ d="m 236.88867,29.308594 h -7.03125 V 52.960937 H 224.0957 V 29.308594 h -6.91406 v -4.785157 h 19.70703 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/>
+ <path
+ d="m 249.05664,51.027344 q -1.71875,2.324218 -4.60937,2.324218 -2.91016,0 -4.41407,-1.992187 -1.5039,-2.011719 -1.5039,-5.839844 V 31.828125 h 5.52734 V 45.65625 q 0.0391,3.085937 2.05078,3.085937 1.89453,0 2.73438,-1.640625 V 31.828125 h 5.5664 v 21.132812 h -5.19531 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/>
+ <path
+ d="m 274.83789,43.078125 q 0,5.136719 -1.64062,7.714844 -1.64063,2.558593 -5.15625,2.558593 -2.75391,0 -4.41407,-2.480468 l -0.17578,2.089843 h -5.09765 v -30 h 5.52734 v 10.585938 q 1.5625,-2.109375 4.12109,-2.109375 3.51563,0 5.15625,2.558594 1.64063,2.539062 1.67969,7.460937 z m -5.52734,-1.386719 q 0,-3.339844 -0.64453,-4.472656 -0.64454,-1.152344 -2.2461,-1.152344 -1.73828,0 -2.53906,1.582031 v 9.628907 q 0.74219,1.484375 2.57812,1.484375 1.58204,0 2.1875,-1.035157 0.625,-1.035156 0.66407,-4.023437 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/>
+ <path
+ d="m 286.73242,53.351562 q -4.25781,0 -6.64062,-2.539062 -2.38282,-2.539063 -2.38282,-7.265625 v -1.679688 q 0,-5 2.1875,-7.714843 2.1875,-2.714844 6.26954,-2.714844 3.98437,0 5.99609,2.558594 2.01172,2.539062 2.05078,7.539062 V 44.25 H 283.2168 q 0.11718,2.34375 1.03515,3.4375 0.91797,1.074219 2.83203,1.074219 2.77344,0 4.62891,-1.894532 l 2.16797,3.339844 q -1.01563,1.40625 -2.94922,2.285156 -1.93359,0.859375 -4.19922,0.859375 z m -3.47656,-12.96875 h 5.52734 V 39.875 q -0.0391,-1.894531 -0.625,-2.871094 -0.58593,-0.976562 -2.03125,-0.976562 -1.44531,0 -2.10937,1.035156 -0.64453,1.035156 -0.76172,3.320312 z"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:'Roboto Condensed';-inkscape-font-specification:'Roboto Condensed, Bold';fill:#ffffff"/>
+ </g>
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:Roboto;-inkscape-font-specification:Roboto;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
+ transform="translate(1.5454696,-46.879245)"
+ aria-label="»">
+ <path
+ style="font-size:133.33332825px;fill:#ffffff;stroke-width:1.28791881"
+ d="m 23.698415,54.366399 24.735419,32.617215 v 1.593129 L 23.698415,121.19396 H 11.791873 L 33.424885,87.822102 11.791873,54.366399 Z m 29.263259,0 24.735419,32.617215 v 1.593129 L 52.961674,121.19396 H 41.055133 L 62.688144,87.822102 41.055133,54.366399 Z" />
+ </g>
+</svg>
diff --git a/src/images/nike.png b/src/images/nike.png
new file mode 100644
index 0000000..f5a3da6
--- /dev/null
+++ b/src/images/nike.png
Binary files differ
diff --git a/src/images/profile.png b/src/images/profile.png
new file mode 100644
index 0000000..6257a93
--- /dev/null
+++ b/src/images/profile.png
Binary files differ
diff --git a/src/images/search.png b/src/images/search.png
new file mode 100644
index 0000000..92e8113
--- /dev/null
+++ b/src/images/search.png
Binary files differ
diff --git a/src/images/shakira.png b/src/images/shakira.png
new file mode 100644
index 0000000..8a19920
--- /dev/null
+++ b/src/images/shakira.png
Binary files differ
diff --git a/src/images/shakira1.png b/src/images/shakira1.png
new file mode 100644
index 0000000..4488304
--- /dev/null
+++ b/src/images/shakira1.png
Binary files differ
diff --git a/src/images/shakira2.png b/src/images/shakira2.png
new file mode 100644
index 0000000..f0d86ee
--- /dev/null
+++ b/src/images/shakira2.png
Binary files differ
diff --git a/src/images/shakira3.png b/src/images/shakira3.png
new file mode 100644
index 0000000..fb52f65
--- /dev/null
+++ b/src/images/shakira3.png
Binary files differ
diff --git a/src/images/shoes.png b/src/images/shoes.png
new file mode 100644
index 0000000..1f61aca
--- /dev/null
+++ b/src/images/shoes.png
Binary files differ
diff --git a/src/images/svg/master.svg b/src/images/svg/master.svg
new file mode 100644
index 0000000..7c34e61
--- /dev/null
+++ b/src/images/svg/master.svg
@@ -0,0 +1,120 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" y="0px" x="0px">
+ <!-- comments -->
+ <symbol id="comments" viewBox="0 0 100 100">
+ <path d="m 93.141704,45.721236 a 38.314288,38.314288 0 0 1 -4.1149,17.374022 38.86294,38.86294 0 0 1 -34.748042,21.48892 38.314288,38.314288 0 0 1 -17.37402,-4.1149 l -26.06103,8.68701 8.68701,-26.06103 A 38.314288,38.314288 0 0 1 15.415823,45.721236 38.86294,38.86294 0 0 1 36.904742,10.973196 38.314288,38.314288 0 0 1 54.278762,6.8582959 h 2.286056 A 38.771498,38.771498 0 0 1 93.141704,43.435182 Z"/>
+ </symbol>
+ <!-- calendar -->
+ <symbol id="calendar" viewBox="0 0 100 100">
+ <g transform="matrix(1.6964286,0,0,1.6666667,-0.8928572,-2e-6)">
+ <path d="M 57,4 H 50 V 1 C 50,0.447 49.553,0 49,0 H 42 C 41.447,0 41,0.447 41,1 V 4 H 19 V 1 C 19,0.447 18.553,0 18,0 H 11 C 10.447,0 10,0.447 10,1 V 4 H 3 C 2.447,4 2,4.447 2,5 v 11 43 c 0,0.553 0.447,1 1,1 h 54 c 0.553,0 1,-0.447 1,-1 V 16 5 C 58,4.447 57.553,4 57,4 Z M 43,2 h 5 V 5 8 H 43 V 5 Z M 12,2 h 5 V 5 8 H 12 V 5 Z M 4,6 h 6 v 3 c 0,0.553 0.447,1 1,1 h 7 c 0.553,0 1,-0.447 1,-1 V 6 h 22 v 3 c 0,0.553 0.447,1 1,1 h 7 c 0.553,0 1,-0.447 1,-1 V 6 h 6 v 9 H 4 Z M 4,58 V 17 h 52 v 41 z"/>
+ <path d="m 38,23 h -7 -2 -7 -2 -9 v 9 2 7 2 9 h 9 2 7 2 7 2 9 v -9 -2 -7 -2 -9 h -9 z m -7,2 h 7 v 7 h -7 z m 7,16 h -7 v -7 h 7 z M 22,34 h 7 v 7 h -7 z m 0,-9 h 7 v 7 h -7 z m -9,0 h 7 v 7 h -7 z m 0,9 h 7 v 7 h -7 z m 7,16 h -7 v -7 h 7 z m 9,0 h -7 v -7 h 7 z m 9,0 h -7 v -7 h 7 z m 9,0 h -7 v -7 h 7 z m 0,-9 h -7 v -7 h 7 z m 0,-16 v 7 h -7 v -7 z"/>
+ </g>
+ </symbol>
+ <!-- user -->
+ <symbol id="user" viewBox="0 0 100 100">
+ <g transform="translate(0,-1022.5196)">
+ <path d="m 45.343216,1122.4373 c -12.431003,-0.5463 -21.892105,-3.0765 -27.668276,-7.4097 -1.357852,-1.0193 -2.550369,-2.1929 -3.205655,-3.1565 L 14,1111.1777 l 0.09658,-4.1631 c 0.267095,-11.4561 1.126773,-17.004 3.329847,-21.4906 0.954043,-1.9418 1.822277,-3.1323 3.404948,-4.6653 3.225552,-3.1249 8.239195,-5.2999 16.119869,-6.9958 l 2.52958,-0.5464 0.880104,0.7881 c 1.964495,1.7589 4.525956,2.9483 7.194452,3.3424 1.502615,0.2206 4.905725,0.105 6.205506,-0.2207 2.191069,-0.5359 4.372709,-1.7032 6.01368,-3.2058 l 0.761303,-0.6935 1.253351,0.2417 c 2.112416,0.4098 5.762972,1.3523 7.715546,1.9838 4.779656,1.5456 7.855803,3.3098 10.30434,5.9072 3.437048,3.6471 5.060145,8.635 5.750999,17.6734 0.08308,1.0812 0.215379,4.245 0.295029,7.0315 l 0.144867,5.0656 -0.457654,0.6725 c -2.856854,4.2008 -10.655862,7.8878 -19.927609,9.4209 -5.932035,0.9771 -13.5725,1.3974 -20.272007,1.1043 z m 1.990748,-51.321 c -7.062888,-1.2977 -13.179719,-7.911 -15.356115,-16.6037 -0.600133,-2.3968 -0.820288,-4.0748 -0.907623,-6.9139 -0.136248,-4.4288 0.271975,-8.9754 1.10648,-12.3262 1.872716,-7.518 6.270898,-11.4845 13.95797,-12.5857 1.79723,-0.2521 6.37108,-0.2206 8.219122,0.1051 8.717639,1.366 13.059672,6.5471 14.306387,17.0703 0.316838,2.6751 0.431174,7.747 0.223272,9.9052 -0.611348,6.3444 -3.004909,11.9973 -6.75142,15.947 -2.902069,3.0598 -5.960698,4.8093 -9.504696,5.4366 -1.454701,0.2626 -3.883788,0.2521 -5.293408,0 z"/>
+ </g>
+ </symbol>
+ <!-- code -->
+ <symbol id="code" viewBox="0 0 100 100">
+ <g transform="translate(0,-1022.5197)">
+ <path d="m 39.131848,1109.4351 c -2.082202,-0.595 -2.70165,-1.0418 -2.71064,-1.9552 -0.0067,-0.6522 20.37655,-71.1668 20.730167,-71.7157 0.582368,-0.904 1.065053,-0.9501 3.417971,-0.3258 2.302098,0.6107 3.059927,1.1107 3.059927,2.0189 0,0.3675 -17.888915,62.7019 -20.120744,70.1112 -0.520101,1.7266 -1.12616,2.4818 -1.966388,2.4502 -0.232775,-0.01 -1.317406,-0.2714 -2.410293,-0.5836 z m -25.74513,-22.9586 C 1.654173,1074.7317 0,1073.002 0,1072.4783 c 0,-0.5237 1.654173,-2.2535 13.386718,-13.9982 15.648088,-15.6644 13.604538,-14.2752 16.577068,-11.2687 1.600191,1.6185 1.85085,1.9636 1.85085,2.5488 0,0.6269 -0.8093,1.4873 -11.003081,11.6978 l -11.0030824,11.0212 11.0030824,11.0199 c 10.196786,10.2123 11.003081,11.0694 11.003081,11.697 0,0.5856 -0.250194,0.9303 -1.85085,2.5491 -2.97253,3.0066 -0.92898,4.3957 -16.577068,-11.2687 z m 58.746463,13.1552 c -0.220098,-0.094 -1.188045,-0.9799 -2.150988,-1.9687 -1.497218,-1.5376 -1.750799,-1.8955 -1.750799,-2.4711 0,-0.622 0.833267,-1.5075 11.003082,-11.6928 l 11.003081,-11.0199 -11.003081,-11.0212 c -10.19379,-10.2105 -11.003082,-11.0709 -11.003082,-11.6978 0,-0.5852 0.250651,-0.9303 1.85085,-2.5488 1.326269,-1.3414 2.032799,-1.9073 2.492812,-1.9964 0.627098,-0.1215 0.945156,0.1756 13.728295,12.8248 7.197479,7.1221 13.247175,13.2481 13.443763,13.6136 0.591986,1.1004 0.323596,1.5504 -2.765753,4.6381 -14.922813,14.9148 -23.513699,23.3106 -23.947759,23.4037 -0.275129,0.059 -0.680315,0.031 -0.900421,-0.064 z"/>
+ </g>
+ </symbol>
+ <!-- translate 2K -->
+ <symbol id="translate" viewBox="0 0 100 100">
+ <g transform="translate(0,-1022.5197)">
+ <path d="m 42.827446,1122.2992 c -4.329166,-0.7064 -10.765084,-2.7746 -14.417493,-4.633 -2.107187,-1.0722 -3.625894,-2.1314 -3.745667,-2.6125 -0.156628,-0.629 0.230789,-1.2721 0.766336,-1.2721 0.244285,0 1.972913,0.7791 3.841392,1.7315 3.804546,1.9391 8.469711,3.6115 12.105811,4.3398 4.058445,0.8129 10.25799,0.722 14.948952,-0.2193 2.140059,-0.4294 7.155504,-2.0673 8.713067,-2.8453 2.179692,-1.0889 4.973965,-2.716 4.973965,-2.8964 0,-0.1051 -0.488455,-1.0162 -1.085466,-2.0246 -0.597,-1.0084 -1.055664,-1.8597 -1.019244,-1.8917 0.11408,-0.1004 8.329822,0.6224 8.449894,0.7434 0.138159,0.1392 -2.677196,8.5419 -2.862022,8.5419 -0.07163,0 -0.585681,-0.7485 -1.142264,-1.6634 -0.556593,-0.9148 -1.041685,-1.6633 -1.077976,-1.6633 -0.03631,0 -0.750278,0.4103 -1.586631,0.9118 -3.685319,2.2097 -8.214501,3.9209 -13.169181,4.9755 -2.710153,0.5769 -3.22856,0.6243 -7.474471,0.684 -3.228977,0.045 -5.046517,-0.015 -6.219002,-0.2063 z M 7.8397494,1109.8521 C 7.5184707,1109.6635 7.5,1107.9885 7.5,1079.0414 v -30.6113 l 0.4628173,-0.3056 c 0.2545496,-0.1682 2.3731277,-0.9483 4.7079507,-1.7337 l 4.245132,-1.428 0.05019,-10.6972 c 0.02761,-5.8834 0.11497,-10.6974 0.194142,-10.6976 0.07917,-2e-4 7.049074,2.4698 15.48867,5.4891 l 15.34472,5.4897 10.4762,-3.6488 c 19.787478,-6.8918 24.795303,-8.5457 25.328086,-8.3652 l 0.48536,0.1644 0.09703,12.1216 0.09703,12.1215 3.979911,1.2898 3.979921,1.2899 0.04911,30.168 c 0.03929,24.1066 1.89e-4,30.1511 -0.194142,30.0838 -0.133813,-0.046 -9.762192,-3.1309 -21.39641,-6.8547 l -21.15311,-6.7706 -4.08538,1.399 c -14.020006,4.8011 -36.9414355,12.5114 -37.1866397,12.509 -0.1601671,0 -0.4441005,-0.093 -0.6309617,-0.2024 z m 21.2100426,-8.951 18.928869,-6.395 0.04921,-28.8154 c 0.03929,-22.9932 2e-5,-28.8132 -0.194142,-28.8048 -0.133823,0.01 -8.761312,2.8986 -19.17219,6.4286 l -18.9288716,6.4181 -0.049178,28.7956 c -0.039247,22.9788 -2.68e-5,28.7928 0.1941422,28.7817 0.1338264,-0.01 8.7613134,-2.8916 19.1721914,-6.4088 z M 17.51107,1089.7606 c 2.4767,-2.7928 3.551093,-4.1357 5.831822,-7.2894 4.071101,-5.6294 5.835528,-8.4995 8.340291,-13.5666 1.337674,-2.7061 2.354615,-4.9462 2.259869,-4.978 -0.09475,-0.032 -1.212647,0.2671 -2.484227,0.6644 -1.27158,0.3972 -3.578741,1.0908 -5.127026,1.5412 -2.798439,0.814 -2.815415,0.8224 -2.87482,1.4216 -0.07735,0.7803 -0.301168,0.9492 -1.755637,1.3248 -2.20562,0.5695 -4.052821,-0.1951 -4.39212,-1.818 -0.07313,-0.3498 -0.09002,-0.636 -0.03754,-0.636 1.877337,0 14.308333,-4.0247 16.969844,-5.4942 1.707093,-0.9425 4.307289,-1.9738 4.567668,-1.8116 0.106538,0.066 0.141789,0.5261 0.0804,1.0486 -0.171418,1.4589 -4.600859,10.1384 -6.951172,13.6209 l -0.545388,0.8081 3.53633,1.5596 c 1.944981,0.8579 4.564801,1.9873 5.821821,2.5099 l 2.285493,0.9503 0.286892,0.9738 c 0.157787,0.5356 0.286888,1.233 0.286888,1.5498 0,0.5412 -0.03681,0.5686 -0.608869,0.4532 -0.903602,-0.1821 -3.968876,-1.5771 -5.666178,-2.5786 -0.818521,-0.483 -2.58744,-1.7209 -3.930928,-2.7509 -1.34349,-1.03 -2.464099,-1.8427 -2.490241,-1.806 -0.02614,0.037 -0.643595,0.9473 -1.372114,2.0236 -2.66822,3.9419 -5.470659,7.4918 -9.023618,11.4302 -2.157977,2.3921 -2.922377,2.953 -4.024258,2.953 h -0.848747 z m 7.17052,-30.3141 c -1.192876,-0.6328 -2.019837,-1.6501 -2.299603,-2.829 l -0.121457,-0.5118 1.3076,0.086 c 1.126264,0.075 1.736725,-0.038 4.40194,-0.8091 1.701884,-0.4925 3.208912,-0.8955 3.348954,-0.8955 0.474487,0 1.031205,0.7665 1.030459,1.4187 -0.0016,1.3941 -1.476335,2.801 -3.643362,3.4756 -1.491625,0.4644 -3.218658,0.4922 -4.024531,0.065 z m 54.348717,13.5169 c -2.735065,-10.0003 -4.997885,-18.2078 -5.028491,-18.239 -0.03056,-0.031 -1.284907,-0.4379 -2.787339,-0.904 -1.815337,-0.5631 -2.760452,-0.7739 -2.817438,-0.6283 -0.04712,0.1205 -2.716751,6.7953 -5.932405,14.8329 -3.215654,8.0375 -5.846639,14.6946 -5.846639,14.7935 0,0.1826 5.40879,1.8979 5.546591,1.759 0.04127,-0.042 0.610166,-1.3912 1.264132,-2.999 0.653966,-1.6078 1.210142,-2.9463 1.235937,-2.9744 0.07966,-0.087 11.449649,3.4801 11.610675,3.6425 0.08334,0.084 0.590919,1.7727 1.127928,3.7526 0.537009,1.9799 1.010742,3.6345 1.052728,3.6769 0.180292,0.1817 5.444097,1.7119 5.493077,1.5968 0.02976,-0.07 -2.183691,-8.3092 -4.918756,-18.3095 z m -8.308204,1.2701 c -2.012952,-0.6215 -3.700667,-1.1711 -3.75048,-1.2213 -0.09316,-0.094 3.755649,-9.7056 3.986954,-9.9566 0.07103,-0.077 0.895283,2.6424 1.831737,6.0431 0.936454,3.4008 1.677675,6.2016 1.647168,6.224 -0.03056,0.022 -1.702427,-0.4677 -3.715379,-1.0892 z m 11.522667,-38.7111 v -10.5504 l -5.290373,1.8259 c -2.909713,1.0042 -9.985433,3.4403 -15.723825,5.4135 -5.738401,1.9732 -10.434214,3.638 -10.435147,3.6995 -0.002,0.1315 30.609441,10.11 31.109594,10.1409 0.319631,0.02 0.339751,-0.6038 0.339751,-10.5294 z"/>
+ </g>
+ </symbol>
+ <!-- Eye -->
+ <symbol id="eye" viewBox="0 0 25 19"
+ style="stroke:#000000;stroke-width:2;stroke-linecap:square">
+ <path
+ d="m 1.6605849,9.5 c 0,0 3.9416649,-8.0100436 10.8395781,-8.0100436 6.897914,0 10.839579,8.0100436 10.839579,8.0100436 0,0 -3.941665,8.010044 -10.839579,8.010044 C 5.6022498,17.510044 1.6605849,9.5 1.6605849,9.5 Z" />
+ <ellipse
+ ry="3.0037663"
+ rx="2.9562488"
+ id="circle4"
+ cy="9.5"
+ cx="12.500164" />
+ </symbol>
+ <!-- clock -->
+ <symbol id="clock" viewBox="0 0 23 23"
+ style="stroke:#000000;stroke-width:2;stroke-linecap:square">
+ <circle
+ r="10"
+ cy="11.5"
+ cx="11.5" />
+ <polyline
+ transform="translate(-0.5,-0.5)"
+ points="12 6 12 12 16 14" />
+ </symbol>
+ <!-- repeat -->
+ <symbol id="repeat" viewBox="0 0 100 100">
+ <g transform="translate(0,-270.54167)">
+ <path d="M 45.24677,370.36379 C 33.492886,369.03878 22.704976,363.9051 14.527455,355.74529 7.1155883,348.34948 2.2998327,338.93272 0.45059825,328.21936 c -0.60079767,-3.48066 -0.60079767,-11.78329 0,-15.26395 C 3.2945617,296.47913 13.347054,282.93684 28.035767,275.79385 c 5.335674,-2.5947 10.701305,-4.16577 16.69701,-4.88891 14.013953,-1.69024 29.17093,3.0795 39.519029,12.43623 l 1.462222,1.32214 0.06657,-7.06082 0.06657,-7.06082 h 6.512986 6.512999 v 19.64294 19.64295 H 79.067656 59.262157 l 0.06677,-6.5685 0.06687,-6.5685 9.745738,-0.12512 9.745737,-0.12511 -1.474292,-1.50766 c -8.901613,-9.10306 -21.989907,-13.05798 -34.67304,-10.47724 -14.871687,3.02605 -26.60223,15.06943 -29.222073,30.00136 -0.586149,3.34081 -0.586149,8.92038 0,12.2612 2.292684,13.06725 11.303486,23.78098 23.946074,28.47155 13.506037,5.01092 29.04734,1.69036 39.375287,-8.41295 4.192821,-4.10163 6.962532,-8.52349 9.512784,-15.18727 0.709339,-1.85349 1.363535,-3.49227 1.453789,-3.64176 0.106947,-0.17716 2.24488,0.53516 6.140169,2.04579 3.286842,1.27467 6.009915,2.35411 6.051282,2.39874 0.09495,0.10245 -2.295755,6.29618 -3.266883,8.46381 -6.830659,15.24639 -20.983934,26.13671 -37.710541,29.01659 -3.617158,0.62278 -10.445932,0.86637 -13.773048,0.4913 z" />
+ </g>
+ </symbol>
+ <!-- headphones -->
+ <symbol id="headphones" viewBox="0 0 100 100">
+ <g transform="translate(0,-1022.5197)">
+ <path d="m 11.749479,1122.1383 c -5.4986601,-1.1851 -10.2140101,-5.9469 -11.37758005,-11.489 -0.3048,-1.4517 -0.36827,-5.0445 -0.37187000415,-21.0433 C -0.00197105,1078.0149 0.09982895,1069.2794 0.25625895,1067.7234 2.0314089,1050.0806 12.690179,1034.9385 28.702289,1027.3123 c 19.3964,-9.2382 42.67463,-4.8531 57.57425,10.8453 6.88786,7.2573 11.01019,15.4634 13.04885,25.9756 0.51279,2.6442 0.53735,3.5625 0.63226,23.6437 0.110281,23.3318 0.130791,22.9904 -1.58699,26.4802 -1.27544,2.5909 -4.04284,5.3651 -6.59529,6.6118 -2.6438,1.2909 -4.66113,1.6508 -9.25299,1.6508 -2.44919,0 -4.52074,-0.135 -5.62682,-0.3674 -5.60341,-1.1766 -10.32617,-5.8996 -11.50262,-11.503 -0.52877,-2.5186 -0.52877,-18.7387 0,-21.2574 1.17888,-5.6149 5.88768,-10.324 11.50262,-11.503 1.23978,-0.2601 3.4106,-0.3686 7.43991,-0.3719 h 5.68934 v -3.6953 c 0,-7.6251 -1.20789,-13.0595 -4.26483,-19.1876 -1.98524,-3.9796 -4.29214,-7.171 -7.49845,-10.3729 -12.31004,-12.293 -30.52035,-15.2495 -46.13046,-7.4896 -3.9672,1.9722 -7.16186,4.2787 -10.37258,7.4896 -3.20508,3.2052 -5.51181,6.3978 -7.49475,10.3729 -3.05694,6.1281 -4.2648301,11.5625 -4.2648301,19.1876 v 3.6953 h 5.6893401 c 4.02931,0 6.20013,0.1126 7.43991,0.3719 5.61494,1.179 10.32374,5.8881 11.50262,11.503 0.52877,2.5187 0.52877,18.7388 0,21.2574 -1.17888,5.6153 -5.88768,10.3241 -11.50262,11.503 -2.27971,0.4787 -9.13245,0.4702 -11.37868,-0.025 z m 11.02637,-10.4887 c 0.58529,-0.4126 1.326,-1.2461 1.64603,-1.8523 0.57676,-1.0926 0.58189,-1.1787 0.58189,-9.7766 0,-8.598 -0.005,-8.684 -0.58189,-9.7767 -0.32003,-0.6062 -1.06087,-1.4398 -1.64633,-1.8524 l -1.06445,-0.7502 -5.86377,-0.075 -5.8637501,-0.075 0.0703,10.8702 0.0703,10.8706 0.75024,1.0648 c 0.41263,0.5857 1.25666,1.3335 1.87561,1.6613 1.06984,0.5673 1.31862,0.5928 5.04363,0.5195 3.89626,-0.078 3.92424,-0.082 4.98241,-0.8273 z m 65.02104,0 c 0.58529,-0.4126 1.326,-1.2461 1.64603,-1.8523 l 0.58189,-1.1024 v -10.6022 -10.6021 l -5.8561,0.075 -5.85609,0.075 -1.06445,0.7503 c -0.58544,0.4126 -1.33028,1.2536 -1.65518,1.8691 l -0.59072,1.1189 0.0713,8.9261 0.0713,8.9258 0.75024,1.0649 c 0.41263,0.5854 1.25666,1.3332 1.87561,1.661 1.06984,0.5673 1.31862,0.5928 5.04363,0.5195 3.89626,-0.077 3.92424,-0.082 4.98241,-0.8273 z" />
+ </g>
+ </symbol>
+ <!-- film -->
+ <symbol id="film" viewBox="0 0 100 100">
+ <g transform="translate(0,-1022.5197)">
+ <path
+ d="m 11.841951,1122.3027 c -0.592278,-0.1032 -1.804383,-0.4645 -2.6939193,-0.7999 -3.9500145,-1.4957 -6.7661775,-4.3813 -8.39649247,-8.6043 L 0,1110.9522 v -38.3615 -38.3622 l 0.65942618,-1.918 c 1.48672192,-4.3228 4.44234582,-7.3348 8.87496382,-9.0429 l 1.948837,-0.7483 H 49.880511 88.27771 l 1.762716,0.5762 c 4.321308,1.4218 7.492752,4.5026 9.208035,8.9458 L 100,1033.9885 v 38.2427 38.2428 l -0.693861,2.1149 c -1.592695,4.8552 -5.575336,8.452 -10.59722,9.571 -1.543195,0.344 -5.565092,0.3784 -38.756095,0.3526 -20.368865,0 -37.518681,-0.1118 -38.110787,-0.215 z m 10.76552,-15.6518 v -6.8119 H 15.789297 8.971123 v 4.4535 c 0,2.8134 0.1076087,4.8165 0.2926957,5.4375 0.3598435,1.2093 2.1350433,3.0507 3.2960983,3.4188 0.479504,0.1548 2.80566,0.2752 5.44259,0.2924 h 4.605222 z m 45.69393,-11.354 V 1077.132 H 49.999914 31.698427 v 18.1649 18.1658 h 18.301487 18.301487 z m 18.991474,17.8734 c 0.591417,-0.172 1.416905,-0.7224 2.067895,-1.3744 1.505575,-1.5043 1.668021,-2.2345 1.668021,-7.5034 v -4.4535 h -6.81826 -6.818174 v 6.8119 6.8118 h 4.457927 c 2.815905,0 4.820526,-0.1118 5.442591,-0.2924 z m -64.685404,-29.2265 v -6.8118 H 15.789297 8.971123 v 6.8118 6.8119 h 6.818174 6.818174 z m 68.42132,0 v -6.8118 h -6.81826 -6.818174 v 6.8118 6.8119 h 6.818174 6.81826 z m -68.42132,-22.9453 v -6.8118 H 15.789297 8.971123 v 6.8118 6.8119 h 6.818174 6.818174 z m 45.69393,-11.3531 v -18.1658 H 49.999914 31.698427 v 18.1658 18.165 h 18.301487 18.301487 z m 22.72739,11.3531 v -6.8118 h -6.81826 -6.818174 v 6.8118 6.8119 h 6.818174 6.81826 z m -68.42132,-22.707 v -6.8119 h -4.457842 c -5.273601,0 -6.00491,0.1634 -7.510485,1.6669 -1.505661,1.5043 -1.668021,2.2345 -1.668021,7.5033 v 4.4544 h 6.818174 6.818174 z m 68.42132,2.3583 c 0,-5.2688 -0.162704,-5.999 -1.668021,-7.5033 -1.505661,-1.5043 -2.23697,-1.6669 -7.510486,-1.6669 h -4.457927 v 6.8119 6.8127 h 6.818174 6.81826 z" />
+ </g>
+ </symbol>
+ <!-- like -->
+ <symbol id="like" viewBox="0 0 100 95">
+ <g transform="translate(0,-1378.6667)">
+ <path d="m 32.41546,1473.4728 c -1.70895,-0.3282 -4.51844,-1.6605 -6.07254,-2.8797 l -1.30201,-1.0215 -1.3028,0.7978 -1.30279,0.7979 h -9.27876 c -9.02143,0 -9.30653,-0.014 -10.27948,-0.5306 -1.25608,-0.666 -1.99438,-1.439 -2.48987,-2.6073 C 0.04667,1467.2264 0,1464.2103 0,1443.0061 v -24.1103 l 0.56291,-1.0854 c 0.78567,-1.5149 2.02409,-2.4109 3.77357,-2.7294 0.89991,-0.1641 4.54016,-0.2348 9.62585,-0.1869 9.02486,0.086 9.18137,0.1095 10.737,1.6834 0.79401,0.8032 0.82448,0.8115 1.87635,0.5064 0.58809,-0.1707 1.98767,-0.7316 3.11019,-1.2466 5.91721,-2.7146 10.32223,-6.9755 12.06274,-11.6679 l 0.65605,-1.7686 0.12554,-10.804 0.12555,-10.8038 0.78774,-0.6931 c 0.94815,-0.8341 2.58408,-1.2274 5.84203,-1.4039 7.38616,-0.4007 12.69848,3.323 14.654296,10.2721 0.391497,1.3907 0.463224,2.9094 0.544237,11.5225 l 0.0933,9.9208 h 11.555411 c 12.636063,0 13.359331,0.068 16.123793,1.447 4.437917,2.2126 7.353122,6.5717 7.722651,11.5478 0.124062,1.6705 -0.242318,4.2569 -2.889367,20.3988 -1.667279,10.1672 -3.213851,19.0401 -3.436837,19.7179 -0.772906,2.3497 -1.884233,4.1647 -3.562217,5.8177 -1.820637,1.7936 -3.680555,2.8462 -6.573443,3.72 l -1.833483,0.5539 -24.017302,0.046 c -14.540009,0.029 -24.504159,-0.046 -25.251099,-0.1911 z m 49.470226,-5.0147 c 3.798976,-0.9747 6.207928,-3.229 7.155459,-6.6957 0.152803,-0.559 1.580151,-8.9868 3.171873,-18.728 3.268059,-20.0003 3.274853,-20.083 1.883635,-22.8669 -1.30761,-2.617 -3.71086,-4.3525 -6.692543,-4.8337 -0.806958,-0.1303 -7.052746,-0.2373 -13.879542,-0.2383 H 61.112232 l -0.65957,-0.6498 -0.659569,-0.6499 -0.0043,-9.3938 c -0.0025,-5.1667 -0.114077,-10.4202 -0.248206,-11.6747 -0.471871,-4.4127 -1.803322,-6.7772 -4.614518,-8.1947 -1.651858,-0.8328 -1.806699,-0.8626 -4.488769,-0.8626 h -2.77791 l -0.14109,9.4893 c -0.15208,10.2288 -0.20412,10.6532 -1.73828,14.1792 -2.54792,5.8561 -9.56454,11.6321 -17.20224,14.1605 l -2.18372,0.7229 -0.064,19.8389 c -0.063,19.5064 -0.0554,19.8614 0.45126,21.1957 0.56443,1.4863 2.26052,3.5132 3.64508,4.3562 1.97455,1.2023 1.49171,1.1804 26.499656,1.1979 20.085596,0.013 23.736505,-0.037 24.959685,-0.351 z m -60.620366,-25.389 v -23.2919 H 13.13447 5.00361 v 23.2919 23.2921 h 8.13086 8.13085 z" />
+ </g>
+ </symbol>
+ <!-- close -->
+ <symbol id="close" viewBox="0 0 100 100">
+ <g
+ transform="translate(0,-932.41665)">
+ <path d="M 4.8118946,1027.6048 0,1022.7929 20.18695,1002.6048 40.373877,982.41669 20.18695,962.22858 0,942.04045 4.8118946,937.22855 9.6237892,932.41665 29.811905,952.60362 50,972.79056 70.188095,952.60362 90.376211,932.41665 95.188106,937.22855 100,942.04045 79.813051,962.22858 59.626123,982.41669 79.813051,1002.6048 100,1022.7929 l -4.811894,4.8119 -4.811895,4.8119 L 70.188095,1012.2298 50,992.04283 29.811905,1012.2298 9.6237892,1032.4167 Z" />
+ </g>
+ </symbol>
+ <!-- envelope -->
+ <symbol id="envelope" viewBox="0 0 100 75">
+ <g transform="translate(0,-1047.5197)">
+ <path d="m 7.732,1122.4553 c -1.9541,-0.2182 -3.7802,-1.1223 -5.266,-2.607 -1.0835,-1.0826 -1.7082,-2.1037 -2.1867,-3.5743 L 0.054,1115.5819 0.027,1093.6706 0,1071.7593 l 0.7233,0.7268 c 1.7251,1.7331 2.8515,2.5542 8.906,6.4923 9.1665,5.9621 17.7128,11.6135 21.1678,13.9977 0.7762,0.5355 2.4318,1.6796 3.6792,2.5423 3.1854,2.2028 4.8851,3.2598 6.4007,3.9802 2.5577,1.2155 4.4079,1.8889 6.3025,2.2935 1.5182,0.3242 4.116,0.3254 5.6265,0 1.8611,-0.3976 3.8573,-1.1324 6.3293,-2.3296 1.8979,-0.9193 2.2327,-1.1342 9.0331,-5.8001 5.0501,-3.465 13.0729,-8.7735 22.705,-15.0237 5.4366,-3.5276 5.7532,-3.758 7.7889,-5.6671 l 1.3377,-1.2544 -0.03,21.7867 -0.029,21.7866 -0.218,0.7696 c -0.4421,1.5615 -1.1972,2.8072 -2.3935,3.9489 -1.1949,1.1404 -2.4238,1.8206 -4.1038,2.2712 l -0.8402,0.2254 -41.9828,0.012 c -23.0906,0.01 -42.2923,-0.023 -42.6705,-0.065 z m 40.5935,-27.3619 c -2.4429,-0.5358 -5.0045,-1.9005 -10.2207,-5.445 -4.2455,-2.8849 -7.7442,-5.2203 -17.2365,-11.5059 -13.735,-9.0948 -13.0118,-8.5903 -14.8715,-10.3751 -1.9192,-1.842 -3.7957,-4.2176 -4.7086,-5.9612 -1.0262,-1.9597 -1.3407,-3.2786 -1.2505,-5.2429 0.1119,-2.4362 0.812,-4.423 2.1384,-6.068 1.386,-1.7191 3.2324,-2.6436 5.7451,-2.8768 1.4309,-0.1327 82.6456,-0.1308 84.002,0 2.1843,0.214 3.7712,0.9505 5.4334,2.5216 0.8354,0.7897 1.2828,1.3921 1.7846,2.4028 0.5967,1.2021 0.7764,2.0422 0.777,3.6336 9e-4,2.1559 -0.4259,3.8593 -1.4824,5.9163 -0.9815,1.9112 -2.4462,3.7958 -4.3778,5.6329 -1.4797,1.4072 -2.4805,2.1644 -5.5535,4.2016 -17.674,11.7167 -25.3296,16.8063 -27.2157,18.0935 -3.9765,2.714 -6.9174,4.3241 -8.9208,4.884 -1.1217,0.3135 -3.0568,0.4028 -4.0425,0.1866 z" />
+ </g>
+ </symbol>
+ <!-- bell -->
+ <symbol id="bell" viewBox="0 0 100 100">
+ <g transform="translate(0,-1022.5197)">
+ <path d="m 47.9,1122.3111 c -3.6912,-0.6815 -7.1246,-4.0313 -7.9101,-7.7176 -0.2358,-1.1065 -0.1706,-4.0945 0.099,-4.5193 0.095,-0.1495 3.0791,-0.2132 9.9971,-0.2132 h 9.86212 l 0.1239,0.7315 c 0.7622,4.4969 -1.4997,8.9247 -5.5378,10.8409 -2.2409,1.0633 -4.21422,1.3245 -6.63382,0.8777 z M 0.4909,1107.2367 C 0.1297,1106.8845 0,1106.5472 0,1105.96 c 0,-1.153 0.6119,-1.6851 2.1232,-1.8462 2.4326,-0.2594 4.4167,-0.7221 5.6343,-1.3141 5.3025,-2.5781 8.6711,-11.3293 11.0245,-28.6406 0.3798,-2.7939 0.6988,-5.7444 1.5174,-14.0359 1.2485,-12.6469 7.8188,-22.2131 17.4015,-25.3361 1.9476,-0.6347 4.8417,-1.1908 6.1978,-1.1908 h 0.8463 l 0.1414,-1.7067 c 0.5489,-6.6259 3.3832,-10.5785 6.4806,-9.0375 2.03962,1.0148 3.39912,4.2514 3.75132,8.9307 l 0.1365,1.8135 h 0.8464 c 1.2514,0 4.0378,0.5119 5.933,1.0898 7.2769,2.2192 13.1172,8.3023 15.9743,16.6379 1.1061,3.2274 1.3397,4.5105 1.9014,10.4451 2.1178,22.3765 5.001,33.8899 9.7212,38.8191 2.0648,2.1563 3.9184,3.0432 6.9689,3.3343 2.7395,0.2615 3.4,0.6675 3.4,2.0898 0,0.5317 -0.1409,0.8831 -0.4909,1.2244 l -0.4909,0.4788 H 50 0.9818 Z"/>
+ </g>
+ </symbol>
+ <!-- heart -->
+ <symbol id="heart" viewBox="0 0 100 90">
+ <g transform="translate(0,-1032.5197)">
+ <path d="m 49.149719,1121.2079 c -2.1204,-3.848 -6.8633,-8.6072 -15.8504,-15.9049 -11.3613,-9.2256 -13.9831,-11.4731 -17.8664,-15.3162 -5.8793995,-5.8184 -9.2199995,-10.1759 -11.7720995,-15.3558 -2.3185,-4.7058 -3.37050004,-8.7563 -3.61910004,-13.9356 -0.3846,-8.0098 1.88560004,-14.4809 6.99070004,-19.9274 9.4018995,-10.0306 26.0395995,-11.0751 35.6891995,-2.2407 2.9204,2.6736 5.524,6.7492 6.6617,10.4282 0.2502,0.8089 0.5306,1.4707 0.6231,1.4707 0.093,0 0.313,-0.4978 0.4899,-1.1061 1.4385,-4.9489 4.926,-9.7414 9.2185,-12.6679 3.8236,-2.6069 7.6744,-3.8559 12.6281,-4.0962 8.0206,-0.3888 15.4673,2.635 20.851,8.4668 4.8503,5.2539 7.129401,11.8758 6.7692,19.668 -0.2375,5.1391 -1.2988,9.2221 -3.6234,13.9402 -2.5164,5.1073 -5.7924,9.3933 -11.6498,15.2414 -3.9347,3.9285 -6.377,6.0425 -15.1558,13.1185 -11.6489,9.3896 -16.3368,13.9586 -18.6745,18.2009 -0.4024,0.7304 -0.7892,1.3279 -0.8594,1.3279 -0.07,0 -0.4529,-0.5903 -0.8505,-1.3118 z" />
+ </g>
+ </symbol>
+ <!-- reply -->
+ <symbol id="reply" viewBox="0 0 100 90">
+ <g transform="translate(0,-1032.5197)">
+ <path d="m 88.367753,1122.2869 c -0.666242,-0.4575 -0.764773,-0.6974 -0.764773,-1.8619 0,-0.5768 0.05748,-1.6051 0.12773,-2.2851 0.316161,-3.0604 0.418747,-8.0181 0.225989,-10.9215 -0.421474,-6.3481 -1.907174,-11.751 -4.303331,-15.6494 -2.874966,-4.6774 -8.13873,-8.3577 -14.467466,-10.1155 -2.527247,-0.7019 -6.669169,-1.4138 -10.122094,-1.7398 -3.405097,-0.3213 -5.445217,-0.3837 -14.3181,-0.4376 l -9.059545,-0.055 -0.02808,7.6645 -0.02808,7.6646 -0.335605,0.6877 c -0.371302,0.761 -0.977754,1.3704 -1.741033,1.7499 -0.395343,0.1965 -0.640536,0.2366 -1.446088,0.2366 -0.811563,0 -1.053425,-0.04 -1.480566,-0.2458 -0.413285,-0.1989 -3.315833,-3.0736 -15.237334,-15.0911 -12.3329016,-12.4321 -14.78090008,-14.9463 -15.05962777,-15.4666 -0.30659204,-0.5724 -0.33257506,-0.6945 -0.32954751692,-1.5486 0.002604957,-0.7543 0.0481020069,-1.0235 0.24345943692,-1.4425 0.19600576,-0.4204 2.95561805,-3.2586 15.00529185,-15.4325 12.425899,-12.5541 14.854083,-14.9618 15.326707,-15.1973 0.497749,-0.2481 0.677674,-0.2799 1.582671,-0.2799 0.938156,0 1.064934,0.024 1.561068,0.3018 0.654612,0.366 1.238085,0.9856 1.623419,1.7238 l 0.287185,0.5502 0.02863,7.6935 0.02862,7.6935 9.620576,0.044 c 9.921344,0.046 10.72537,0.075 15.083353,0.5398 8.346485,0.8901 15.468696,2.7993 21.139741,5.6668 8.403808,4.2493 13.886884,10.6299 16.433072,19.123 1.374017,4.5833 2.184825,11.2798 2.013228,16.6275 -0.172588,5.3783 -1.651194,11.333 -4.822586,19.4217 -1.064908,2.7159 -3.493545,8.3636 -3.893461,9.0538 -0.339945,0.5868 -0.914671,1.2244 -1.271472,1.4106 -0.44062,0.2299 -1.223998,0.1894 -1.62198,-0.084 z"/>
+ </g>
+ </symbol>
+ <!-- bars -->
+ <symbol id="bars" viewBox="0 0 100 90">
+ <g transform="translate(0,-1032.5197)">
+ <path d="m 2.9279237,1122.426 c -0.7985762,-0.1636 -2.60258205,-2.2341 -2.7786324,-3.1868 C 0.06727557,1118.7954 0,1116.1314 0,1113.3193 c 0,-4.8226 0.03023621,-5.1739 0.50229909,-6.1875 0.29366921,-0.6282 0.90428951,-1.3771 1.47023581,-1.8025 l 0.9680124,-0.7282 H 50.004876 97.069242 l 0.967974,0.7282 c 0.563754,0.4236 1.18182,1.1805 1.479987,1.8115 0.497237,1.0529 0.510087,1.2472 0.446476,6.7618 -0.0635,5.4945 -0.08202,5.7027 -0.58337,6.4631 -0.284976,0.4319 -0.879723,1.0844 -1.322003,1.4497 l -0.80417,0.6634 -46.897009,0.041 c -25.793341,0 -47.1365546,-0.041 -47.4293545,-0.082 z m -0.1028032,-36.1761 c -1.1053603,-0.4266 -1.88696641,-1.2157 -2.40317415,-2.4261 -0.36094479,-0.8466 -0.41211958,-1.6237 -0.41211958,-6.2815 0,-4.6408 0.05215747,-5.4388 0.40981407,-6.2913 0.50010696,-1.1914 1.54635556,-2.1821 2.65681826,-2.516 1.1554768,-0.3476 92.7014699,-0.3476 93.8569459,0 1.110463,0.3355 2.156712,1.3246 2.656819,2.516 0.357921,0.8525 0.409776,1.6505 0.409776,6.2913 0,4.641 -0.05178,5.439 -0.409776,6.2918 -0.500107,1.1916 -1.546356,2.1822 -2.656819,2.516 -0.559256,0.1676 -15.912487,0.2455 -47.040101,0.2413 -38.558428,0 -46.352001,-0.066 -47.0681835,-0.3395 z M 3.2513,1050.3334 c -1.204006,-0.3068 -2.32505141,-1.2892 -2.8241757,-2.4787 -0.36585817,-0.8716 -0.41775107,-1.6369 -0.42092588,-6.1891 -0.00196535,-2.8567 0.09788974,-5.5894 0.22185822,-6.0728 0.32995267,-1.2853 1.92136016,-2.7888 3.15265436,-2.9782 0.5348408,-0.082 21.875144,-0.1186 47.42293,-0.078 l 46.450533,0.069 0.80417,0.6638 c 0.44228,0.3641 1.037177,1.0173 1.322003,1.4497 0.500258,0.7588 0.520251,0.9764 0.588434,6.392 0.06463,5.1293 0.03402,5.697 -0.364346,6.67 -0.527244,1.2902 -1.605619,2.2273 -2.947842,2.5619 -1.292182,0.323 -92.1340871,0.3108 -93.405482,0 z"/>
+ </g>
+ </symbol>
+ <!-- play -->
+ <symbol id="play" viewBox="0 0 15 15">
+ <path d="M7.5,0.5c3.9,0,7,3.1,7,7c0,3.9-3.1,7-7,7c-3.9,0-7-3.1-7-7l0,0C0.5,3.6,3.6,0.5,7.5,0.5 C7.5,0.5,7.5,0.5,7.5,0.5L7.5,0.5L7.5,0.5z M6.1,4.7v5.6l4.2-2.8L6.1,4.7z"/>
+ </symbol>
+</svg>
diff --git a/src/images/video.png b/src/images/video.png
new file mode 100644
index 0000000..eff5d70
--- /dev/null
+++ b/src/images/video.png
Binary files differ
diff --git a/src/images/video2.png b/src/images/video2.png
new file mode 100644
index 0000000..a824267
--- /dev/null
+++ b/src/images/video2.png
Binary files differ
diff --git a/src/images/video3.png b/src/images/video3.png
new file mode 100644
index 0000000..978d059
--- /dev/null
+++ b/src/images/video3.png
Binary files differ
diff --git a/src/images/video4.png b/src/images/video4.png
new file mode 100644
index 0000000..b5364cb
--- /dev/null
+++ b/src/images/video4.png
Binary files differ
diff --git a/src/images/video5.png b/src/images/video5.png
new file mode 100644
index 0000000..05a6215
--- /dev/null
+++ b/src/images/video5.png
Binary files differ
diff --git a/src/images/video6.png b/src/images/video6.png
new file mode 100644
index 0000000..642496b
--- /dev/null
+++ b/src/images/video6.png
Binary files differ
diff --git a/src/js/menu.js b/src/js/menu.js
new file mode 100644
index 0000000..7d02fb9
--- /dev/null
+++ b/src/js/menu.js
@@ -0,0 +1,52 @@
+/**
+ *
+ * @licstart The following is the entire license notice for the
+ * JavaScript code in this page.
+ *
+ * Copyright (C) 2019 Jesús E.
+ *
+ * The JavaScript code in this page is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GNU GPL) as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option)
+ * any later version. The code is distributed WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
+ *
+ * As additional permission under GNU GPL version 3 section 7, you
+ * may distribute non-source (e.g., minimized or compacted) forms of
+ * that code without the copy of the GNU GPL normally required by
+ * section 4, provided you include this license notice and a URL
+ * through which recipients can access the Corresponding Source.
+ *
+ * @licend The above is the entire license notice
+ * for the JavaScript code in this page.
+ *
+ */
+document.addEventListener('DOMContentLoaded', () => {
+
+ function toggleMenu() {
+ document.getElementById('menu-toggle').addEventListener('click', function(e) {
+ let sidebar = document.getElementById("sidebar-wrapper");
+ if (sidebar.classList) {
+ sidebar.classList.toggle("active");
+ }
+ });
+ }
+
+ function closeMenu() {
+ document.getElementById('menu-close').addEventListener('click', function(e) {
+ let close = document.getElementById("sidebar-wrapper");
+ if (close.classList) {
+ close.classList.remove("active");
+ }
+ });
+ }
+
+ // Open Menu
+ toggleMenu();
+
+ // Close Menu
+ closeMenu();
+
+});
diff --git a/src/scss/bootstrap/_alert.scss b/src/scss/bootstrap/_alert.scss
new file mode 100644
index 0000000..da2a98a
--- /dev/null
+++ b/src/scss/bootstrap/_alert.scss
@@ -0,0 +1,51 @@
+//
+// Base styles
+//
+
+.alert {
+ position: relative;
+ padding: $alert-padding-y $alert-padding-x;
+ margin-bottom: $alert-margin-bottom;
+ border: $alert-border-width solid transparent;
+ @include border-radius($alert-border-radius);
+}
+
+// Headings for larger alerts
+.alert-heading {
+ // Specified to prevent conflicts of changing $headings-color
+ color: inherit;
+}
+
+// Provide class for links that match alerts
+.alert-link {
+ font-weight: $alert-link-font-weight;
+}
+
+
+// Dismissible alerts
+//
+// Expand the right padding and account for the close button's positioning.
+
+.alert-dismissible {
+ padding-right: $close-font-size + $alert-padding-x * 2;
+
+ // Adjust close link position
+ .close {
+ position: absolute;
+ top: 0;
+ right: 0;
+ padding: $alert-padding-y $alert-padding-x;
+ color: inherit;
+ }
+}
+
+
+// Alternate styles
+//
+// Generate contextual modifier classes for colorizing the alert.
+
+@each $color, $value in $theme-colors {
+ .alert-#{$color} {
+ @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));
+ }
+}
diff --git a/src/scss/bootstrap/_badge.scss b/src/scss/bootstrap/_badge.scss
new file mode 100644
index 0000000..baa80a7
--- /dev/null
+++ b/src/scss/bootstrap/_badge.scss
@@ -0,0 +1,28 @@
+// Base class
+//
+// Requires one of the contextual, color modifier classes for `color` and
+// `background-color`.
+
+.badge {
+ display: inline-block;
+ padding: $badge-padding-y $badge-padding-x;
+ @include font-size($badge-font-size);
+ font-weight: $badge-font-weight;
+ line-height: 1;
+ color: $badge-color;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ @include border-radius($badge-border-radius);
+
+ // Empty badges collapse automatically
+ &:empty {
+ display: none;
+ }
+}
+
+// Quick fix for badges in buttons
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
diff --git a/src/scss/bootstrap/_breadcrumb.scss b/src/scss/bootstrap/_breadcrumb.scss
new file mode 100644
index 0000000..38f6681
--- /dev/null
+++ b/src/scss/bootstrap/_breadcrumb.scss
@@ -0,0 +1,41 @@
+.breadcrumb {
+ display: flex;
+ flex-wrap: wrap;
+ padding: $breadcrumb-padding-y $breadcrumb-padding-x;
+ margin-bottom: $breadcrumb-margin-bottom;
+ list-style: none;
+ background-color: $breadcrumb-bg;
+ @include border-radius($breadcrumb-border-radius);
+}
+
+.breadcrumb-item {
+ // The separator between breadcrumbs (by default, a forward-slash: "/")
+ + .breadcrumb-item {
+ padding-left: $breadcrumb-item-padding-x;
+
+ &::before {
+ display: inline-block; // Suppress underlining of the separator in modern browsers
+ padding-right: $breadcrumb-item-padding-x;
+ color: $breadcrumb-divider-color;
+ content: $breadcrumb-divider;
+ }
+ }
+
+ // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built
+ // without `<ul>`s. The `::before` pseudo-element generates an element
+ // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.
+ //
+ // To trick IE into suppressing the underline, we give the pseudo-element an
+ // underline and then immediately remove it.
+ + .breadcrumb-item:hover::before {
+ text-decoration: underline;
+ }
+ // stylelint-disable-next-line no-duplicate-selectors
+ + .breadcrumb-item:hover::before {
+ text-decoration: none;
+ }
+
+ &.active {
+ color: $breadcrumb-active-color;
+ }
+}
diff --git a/src/scss/bootstrap/_button-group.scss b/src/scss/bootstrap/_button-group.scss
new file mode 100644
index 0000000..d722002
--- /dev/null
+++ b/src/scss/bootstrap/_button-group.scss
@@ -0,0 +1,163 @@
+// stylelint-disable selector-no-qualifying-type
+
+// Make the div behave like a button
+.btn-group,
+.btn-group-vertical {
+ position: relative;
+ display: inline-flex;
+ vertical-align: middle; // match .btn alignment given font-size hack above
+
+ > .btn {
+ position: relative;
+ flex: 1 1 auto;
+
+ // Bring the hover, focused, and "active" buttons to the front to overlay
+ // the borders properly
+ @include hover {
+ z-index: 1;
+ }
+ &:focus,
+ &:active,
+ &.active {
+ z-index: 1;
+ }
+ }
+}
+
+// Optional: Group multiple button groups together for a toolbar
+.btn-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+
+ .input-group {
+ width: auto;
+ }
+}
+
+.btn-group {
+ // Prevent double borders when buttons are next to each other
+ > .btn:not(:first-child),
+ > .btn-group:not(:first-child) {
+ margin-left: -$btn-border-width;
+ }
+
+ // Reset rounded corners
+ > .btn:not(:last-child):not(.dropdown-toggle),
+ > .btn-group:not(:last-child) > .btn {
+ @include border-right-radius(0);
+ }
+
+ > .btn:not(:first-child),
+ > .btn-group:not(:first-child) > .btn {
+ @include border-left-radius(0);
+ }
+}
+
+// Sizing
+//
+// Remix the default button sizing classes into new ones for easier manipulation.
+
+.btn-group-sm > .btn { @extend .btn-sm; }
+.btn-group-lg > .btn { @extend .btn-lg; }
+
+
+//
+// Split button dropdowns
+//
+
+.dropdown-toggle-split {
+ padding-right: $btn-padding-x * .75;
+ padding-left: $btn-padding-x * .75;
+
+ &::after,
+ .dropup &::after,
+ .dropright &::after {
+ margin-left: 0;
+ }
+
+ .dropleft &::before {
+ margin-right: 0;
+ }
+}
+
+.btn-sm + .dropdown-toggle-split {
+ padding-right: $btn-padding-x-sm * .75;
+ padding-left: $btn-padding-x-sm * .75;
+}
+
+.btn-lg + .dropdown-toggle-split {
+ padding-right: $btn-padding-x-lg * .75;
+ padding-left: $btn-padding-x-lg * .75;
+}
+
+
+// The clickable button for toggling the menu
+// Set the same inset shadow as the :active state
+.btn-group.show .dropdown-toggle {
+ @include box-shadow($btn-active-box-shadow);
+
+ // Show no shadow for `.btn-link` since it has no other button styles.
+ &.btn-link {
+ @include box-shadow(none);
+ }
+}
+
+
+//
+// Vertical button groups
+//
+
+.btn-group-vertical {
+ flex-direction: column;
+ align-items: flex-start;
+ justify-content: center;
+
+ > .btn,
+ > .btn-group {
+ width: 100%;
+ }
+
+ > .btn:not(:first-child),
+ > .btn-group:not(:first-child) {
+ margin-top: -$btn-border-width;
+ }
+
+ // Reset rounded corners
+ > .btn:not(:last-child):not(.dropdown-toggle),
+ > .btn-group:not(:last-child) > .btn {
+ @include border-bottom-radius(0);
+ }
+
+ > .btn:not(:first-child),
+ > .btn-group:not(:first-child) > .btn {
+ @include border-top-radius(0);
+ }
+}
+
+
+// Checkbox and radio options
+//
+// In order to support the browser's form validation feedback, powered by the
+// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
+// `display: none;` or `visibility: hidden;` as that also hides the popover.
+// Simply visually hiding the inputs via `opacity` would leave them clickable in
+// certain cases which is prevented by using `clip` and `pointer-events`.
+// This way, we ensure a DOM element is visible to position the popover from.
+//
+// See https://github.com/twbs/bootstrap/pull/12794 and
+// https://github.com/twbs/bootstrap/pull/14559 for more information.
+
+.btn-group-toggle {
+ > .btn,
+ > .btn-group > .btn {
+ margin-bottom: 0; // Override default `<label>` value
+
+ input[type="radio"],
+ input[type="checkbox"] {
+ position: absolute;
+ clip: rect(0, 0, 0, 0);
+ pointer-events: none;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/_buttons.scss b/src/scss/bootstrap/_buttons.scss
new file mode 100644
index 0000000..2a7d94a
--- /dev/null
+++ b/src/scss/bootstrap/_buttons.scss
@@ -0,0 +1,137 @@
+// stylelint-disable selector-no-qualifying-type
+
+//
+// Base styles
+//
+
+.btn {
+ display: inline-block;
+ font-family: $btn-font-family;
+ font-weight: $btn-font-weight;
+ color: $body-color;
+ text-align: center;
+ vertical-align: middle;
+ user-select: none;
+ background-color: transparent;
+ border: $btn-border-width solid transparent;
+ @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);
+ @include transition($btn-transition);
+
+ @include hover {
+ color: $body-color;
+ text-decoration: none;
+ }
+
+ &:focus,
+ &.focus {
+ outline: 0;
+ box-shadow: $btn-focus-box-shadow;
+ }
+
+ // Disabled comes first so active can properly restyle
+ &.disabled,
+ &:disabled {
+ opacity: $btn-disabled-opacity;
+ @include box-shadow(none);
+ }
+
+ &:not(:disabled):not(.disabled):active,
+ &:not(:disabled):not(.disabled).active {
+ @include box-shadow($btn-active-box-shadow);
+
+ &:focus {
+ @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
+ }
+ }
+}
+
+// Future-proof disabling of clicks on `<a>` elements
+a.btn.disabled,
+fieldset:disabled a.btn {
+ pointer-events: none;
+}
+
+
+//
+// Alternate buttons
+//
+
+@each $color, $value in $theme-colors {
+ .btn-#{$color} {
+ @include button-variant($value, $value);
+ }
+}
+
+@each $color, $value in $theme-colors {
+ .btn-outline-#{$color} {
+ @include button-outline-variant($value);
+ }
+}
+
+
+//
+// Link buttons
+//
+
+// Make a button look and behave like a link
+.btn-link {
+ font-weight: $font-weight-normal;
+ color: $link-color;
+ text-decoration: $link-decoration;
+
+ @include hover {
+ color: $link-hover-color;
+ text-decoration: $link-hover-decoration;
+ }
+
+ &:focus,
+ &.focus {
+ text-decoration: $link-hover-decoration;
+ box-shadow: none;
+ }
+
+ &:disabled,
+ &.disabled {
+ color: $btn-link-disabled-color;
+ pointer-events: none;
+ }
+
+ // No need for an active state here
+}
+
+
+//
+// Button Sizes
+//
+
+.btn-lg {
+ @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);
+}
+
+.btn-sm {
+ @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);
+}
+
+
+//
+// Block button
+//
+
+.btn-block {
+ display: block;
+ width: 100%;
+
+ // Vertically space out multiple block buttons
+ + .btn-block {
+ margin-top: $btn-block-spacing-y;
+ }
+}
+
+// Specificity overrides
+input[type="submit"],
+input[type="reset"],
+input[type="button"] {
+ &.btn-block {
+ width: 100%;
+ }
+}
diff --git a/src/scss/bootstrap/_card.scss b/src/scss/bootstrap/_card.scss
new file mode 100644
index 0000000..c0b2078
--- /dev/null
+++ b/src/scss/bootstrap/_card.scss
@@ -0,0 +1,289 @@
+//
+// Base styles
+//
+
+.card {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106
+ word-wrap: break-word;
+ background-color: $card-bg;
+ background-clip: border-box;
+ border: $card-border-width solid $card-border-color;
+ @include border-radius($card-border-radius);
+
+ > hr {
+ margin-right: 0;
+ margin-left: 0;
+ }
+
+ > .list-group:first-child {
+ .list-group-item:first-child {
+ @include border-top-radius($card-border-radius);
+ }
+ }
+
+ > .list-group:last-child {
+ .list-group-item:last-child {
+ @include border-bottom-radius($card-border-radius);
+ }
+ }
+}
+
+.card-body {
+ // Enable `flex-grow: 1` for decks and groups so that card blocks take up
+ // as much space as possible, ensuring footers are aligned to the bottom.
+ flex: 1 1 auto;
+ padding: $card-spacer-x;
+ color: $card-color;
+}
+
+.card-title {
+ margin-bottom: $card-spacer-y;
+}
+
+.card-subtitle {
+ margin-top: -$card-spacer-y / 2;
+ margin-bottom: 0;
+}
+
+.card-text:last-child {
+ margin-bottom: 0;
+}
+
+.card-link {
+ @include hover {
+ text-decoration: none;
+ }
+
+ + .card-link {
+ margin-left: $card-spacer-x;
+ }
+}
+
+//
+// Optional textual caps
+//
+
+.card-header {
+ padding: $card-spacer-y $card-spacer-x;
+ margin-bottom: 0; // Removes the default margin-bottom of <hN>
+ color: $card-cap-color;
+ background-color: $card-cap-bg;
+ border-bottom: $card-border-width solid $card-border-color;
+
+ &:first-child {
+ @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
+ }
+
+ + .list-group {
+ .list-group-item:first-child {
+ border-top: 0;
+ }
+ }
+}
+
+.card-footer {
+ padding: $card-spacer-y $card-spacer-x;
+ background-color: $card-cap-bg;
+ border-top: $card-border-width solid $card-border-color;
+
+ &:last-child {
+ @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
+ }
+}
+
+
+//
+// Header navs
+//
+
+.card-header-tabs {
+ margin-right: -$card-spacer-x / 2;
+ margin-bottom: -$card-spacer-y;
+ margin-left: -$card-spacer-x / 2;
+ border-bottom: 0;
+}
+
+.card-header-pills {
+ margin-right: -$card-spacer-x / 2;
+ margin-left: -$card-spacer-x / 2;
+}
+
+// Card image
+.card-img-overlay {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: $card-img-overlay-padding;
+}
+
+.card-img {
+ width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
+ @include border-radius($card-inner-border-radius);
+}
+
+// Card image caps
+.card-img-top {
+ width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
+ @include border-top-radius($card-inner-border-radius);
+}
+
+.card-img-bottom {
+ width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
+ @include border-bottom-radius($card-inner-border-radius);
+}
+
+
+// Card deck
+
+.card-deck {
+ display: flex;
+ flex-direction: column;
+
+ .card {
+ margin-bottom: $card-deck-margin;
+ }
+
+ @include media-breakpoint-up(sm) {
+ flex-flow: row wrap;
+ margin-right: -$card-deck-margin;
+ margin-left: -$card-deck-margin;
+
+ .card {
+ display: flex;
+ // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
+ flex: 1 0 0%;
+ flex-direction: column;
+ margin-right: $card-deck-margin;
+ margin-bottom: 0; // Override the default
+ margin-left: $card-deck-margin;
+ }
+ }
+}
+
+
+//
+// Card groups
+//
+
+.card-group {
+ display: flex;
+ flex-direction: column;
+
+ // The child selector allows nested `.card` within `.card-group`
+ // to display properly.
+ > .card {
+ margin-bottom: $card-group-margin;
+ }
+
+ @include media-breakpoint-up(sm) {
+ flex-flow: row wrap;
+ // The child selector allows nested `.card` within `.card-group`
+ // to display properly.
+ > .card {
+ // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
+ flex: 1 0 0%;
+ margin-bottom: 0;
+
+ + .card {
+ margin-left: 0;
+ border-left: 0;
+ }
+
+ // Handle rounded corners
+ @if $enable-rounded {
+ &:not(:last-child) {
+ @include border-right-radius(0);
+
+ .card-img-top,
+ .card-header {
+ // stylelint-disable-next-line property-blacklist
+ border-top-right-radius: 0;
+ }
+ .card-img-bottom,
+ .card-footer {
+ // stylelint-disable-next-line property-blacklist
+ border-bottom-right-radius: 0;
+ }
+ }
+
+ &:not(:first-child) {
+ @include border-left-radius(0);
+
+ .card-img-top,
+ .card-header {
+ // stylelint-disable-next-line property-blacklist
+ border-top-left-radius: 0;
+ }
+ .card-img-bottom,
+ .card-footer {
+ // stylelint-disable-next-line property-blacklist
+ border-bottom-left-radius: 0;
+ }
+ }
+ }
+ }
+ }
+}
+
+
+//
+// Columns
+//
+
+.card-columns {
+ .card {
+ margin-bottom: $card-columns-margin;
+ }
+
+ @include media-breakpoint-up(sm) {
+ column-count: $card-columns-count;
+ column-gap: $card-columns-gap;
+ orphans: 1;
+ widows: 1;
+
+ .card {
+ display: inline-block; // Don't let them vertically span multiple columns
+ width: 100%; // Don't let their width change
+ }
+ }
+}
+
+
+//
+// Accordion
+//
+
+.accordion {
+ > .card {
+ overflow: hidden;
+
+ &:not(:first-of-type) {
+ .card-header:first-child {
+ @include border-radius(0);
+ }
+
+ &:not(:last-of-type) {
+ border-bottom: 0;
+ @include border-radius(0);
+ }
+ }
+
+ &:first-of-type:not(:last-of-type) {
+ border-bottom: 0;
+ @include border-bottom-radius(0);
+ }
+
+ &:last-of-type {
+ @include border-top-radius(0);
+ }
+
+ .card-header {
+ margin-bottom: -$card-border-width;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/_carousel.scss b/src/scss/bootstrap/_carousel.scss
new file mode 100644
index 0000000..20ea04b
--- /dev/null
+++ b/src/scss/bootstrap/_carousel.scss
@@ -0,0 +1,197 @@
+// Notes on the classes:
+//
+// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)
+// even when their scroll action started on a carousel, but for compatibility (with Firefox)
+// we're preventing all actions instead
+// 2. The .carousel-item-left and .carousel-item-right is used to indicate where
+// the active slide is heading.
+// 3. .active.carousel-item is the current slide.
+// 4. .active.carousel-item-left and .active.carousel-item-right is the current
+// slide in its in-transition state. Only one of these occurs at a time.
+// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right
+// is the upcoming slide in transition.
+
+.carousel {
+ position: relative;
+}
+
+.carousel.pointer-event {
+ touch-action: pan-y;
+}
+
+.carousel-inner {
+ position: relative;
+ width: 100%;
+ overflow: hidden;
+ @include clearfix();
+}
+
+.carousel-item {
+ position: relative;
+ display: none;
+ float: left;
+ width: 100%;
+ margin-right: -100%;
+ backface-visibility: hidden;
+ @include transition($carousel-transition);
+}
+
+.carousel-item.active,
+.carousel-item-next,
+.carousel-item-prev {
+ display: block;
+}
+
+.carousel-item-next:not(.carousel-item-left),
+.active.carousel-item-right {
+ transform: translateX(100%);
+}
+
+.carousel-item-prev:not(.carousel-item-right),
+.active.carousel-item-left {
+ transform: translateX(-100%);
+}
+
+
+//
+// Alternate transitions
+//
+
+.carousel-fade {
+ .carousel-item {
+ opacity: 0;
+ transition-property: opacity;
+ transform: none;
+ }
+
+ .carousel-item.active,
+ .carousel-item-next.carousel-item-left,
+ .carousel-item-prev.carousel-item-right {
+ z-index: 1;
+ opacity: 1;
+ }
+
+ .active.carousel-item-left,
+ .active.carousel-item-right {
+ z-index: 0;
+ opacity: 0;
+ @include transition(0s $carousel-transition-duration opacity);
+ }
+}
+
+
+//
+// Left/right controls for nav
+//
+
+.carousel-control-prev,
+.carousel-control-next {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ // Use flex for alignment (1-3)
+ display: flex; // 1. allow flex styles
+ align-items: center; // 2. vertically center contents
+ justify-content: center; // 3. horizontally center contents
+ width: $carousel-control-width;
+ color: $carousel-control-color;
+ text-align: center;
+ opacity: $carousel-control-opacity;
+ @include transition($carousel-control-transition);
+
+ // Hover/focus state
+ @include hover-focus {
+ color: $carousel-control-color;
+ text-decoration: none;
+ outline: 0;
+ opacity: $carousel-control-hover-opacity;
+ }
+}
+.carousel-control-prev {
+ left: 0;
+ @if $enable-gradients {
+ background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));
+ }
+}
+.carousel-control-next {
+ right: 0;
+ @if $enable-gradients {
+ background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));
+ }
+}
+
+// Icons for within
+.carousel-control-prev-icon,
+.carousel-control-next-icon {
+ display: inline-block;
+ width: $carousel-control-icon-width;
+ height: $carousel-control-icon-width;
+ background: no-repeat 50% / 100% 100%;
+}
+.carousel-control-prev-icon {
+ background-image: $carousel-control-prev-icon-bg;
+}
+.carousel-control-next-icon {
+ background-image: $carousel-control-next-icon-bg;
+}
+
+
+// Optional indicator pips
+//
+// Add an ordered list with the following class and add a list item for each
+// slide your carousel holds.
+
+.carousel-indicators {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 15;
+ display: flex;
+ justify-content: center;
+ padding-left: 0; // override <ol> default
+ // Use the .carousel-control's width as margin so we don't overlay those
+ margin-right: $carousel-control-width;
+ margin-left: $carousel-control-width;
+ list-style: none;
+
+ li {
+ box-sizing: content-box;
+ flex: 0 1 auto;
+ width: $carousel-indicator-width;
+ height: $carousel-indicator-height;
+ margin-right: $carousel-indicator-spacer;
+ margin-left: $carousel-indicator-spacer;
+ text-indent: -999px;
+ cursor: pointer;
+ background-color: $carousel-indicator-active-bg;
+ background-clip: padding-box;
+ // Use transparent borders to increase the hit area by 10px on top and bottom.
+ border-top: $carousel-indicator-hit-area-height solid transparent;
+ border-bottom: $carousel-indicator-hit-area-height solid transparent;
+ opacity: .5;
+ @include transition($carousel-indicator-transition);
+ }
+
+ .active {
+ opacity: 1;
+ }
+}
+
+
+// Optional captions
+//
+//
+
+.carousel-caption {
+ position: absolute;
+ right: (100% - $carousel-caption-width) / 2;
+ bottom: 20px;
+ left: (100% - $carousel-caption-width) / 2;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: $carousel-caption-color;
+ text-align: center;
+}
diff --git a/src/scss/bootstrap/_close.scss b/src/scss/bootstrap/_close.scss
new file mode 100644
index 0000000..5cc96f5
--- /dev/null
+++ b/src/scss/bootstrap/_close.scss
@@ -0,0 +1,41 @@
+.close {
+ float: right;
+ @include font-size($close-font-size);
+ font-weight: $close-font-weight;
+ line-height: 1;
+ color: $close-color;
+ text-shadow: $close-text-shadow;
+ opacity: .5;
+
+ // Override <a>'s hover style
+ @include hover {
+ color: $close-color;
+ text-decoration: none;
+ }
+
+ &:not(:disabled):not(.disabled) {
+ @include hover-focus {
+ opacity: .75;
+ }
+ }
+}
+
+// Additional properties for button version
+// iOS requires the button element instead of an anchor tag.
+// If you want the anchor version, it requires `href="#"`.
+// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
+
+// stylelint-disable-next-line selector-no-qualifying-type
+button.close {
+ padding: 0;
+ background-color: transparent;
+ border: 0;
+ appearance: none;
+}
+
+// Future-proof disabling of clicks on `<a>` elements
+
+// stylelint-disable-next-line selector-no-qualifying-type
+a.close.disabled {
+ pointer-events: none;
+}
diff --git a/src/scss/bootstrap/_code.scss b/src/scss/bootstrap/_code.scss
new file mode 100644
index 0000000..74b6e1c
--- /dev/null
+++ b/src/scss/bootstrap/_code.scss
@@ -0,0 +1,48 @@
+// Inline code
+code {
+ @include font-size($code-font-size);
+ color: $code-color;
+ word-break: break-word;
+
+ // Streamline the style when inside anchors to avoid broken underline and more
+ a > & {
+ color: inherit;
+ }
+}
+
+// User input typically entered via keyboard
+kbd {
+ padding: $kbd-padding-y $kbd-padding-x;
+ @include font-size($kbd-font-size);
+ color: $kbd-color;
+ background-color: $kbd-bg;
+ @include border-radius($border-radius-sm);
+ @include box-shadow($kbd-box-shadow);
+
+ kbd {
+ padding: 0;
+ @include font-size(100%);
+ font-weight: $nested-kbd-font-weight;
+ @include box-shadow(none);
+ }
+}
+
+// Blocks of code
+pre {
+ display: block;
+ @include font-size($code-font-size);
+ color: $pre-color;
+
+ // Account for some code outputs that place code tags in pre tags
+ code {
+ @include font-size(inherit);
+ color: inherit;
+ word-break: normal;
+ }
+}
+
+// Enable scrollable blocks of code
+.pre-scrollable {
+ max-height: $pre-scrollable-max-height;
+ overflow-y: scroll;
+}
diff --git a/src/scss/bootstrap/_custom-forms.scss b/src/scss/bootstrap/_custom-forms.scss
new file mode 100644
index 0000000..07574df
--- /dev/null
+++ b/src/scss/bootstrap/_custom-forms.scss
@@ -0,0 +1,511 @@
+// Embedded icons from Open Iconic.
+// Released under MIT and copyright 2014 Waybury.
+// https://useiconic.com/open
+
+
+// Checkboxes and radios
+//
+// Base class takes care of all the key behavioral aspects.
+
+.custom-control {
+ position: relative;
+ display: block;
+ min-height: $font-size-base * $line-height-base;
+ padding-left: $custom-control-gutter + $custom-control-indicator-size;
+}
+
+.custom-control-inline {
+ display: inline-flex;
+ margin-right: $custom-control-spacer-x;
+}
+
+.custom-control-input {
+ position: absolute;
+ z-index: -1; // Put the input behind the label so it doesn't overlay text
+ opacity: 0;
+
+ &:checked ~ .custom-control-label::before {
+ color: $custom-control-indicator-checked-color;
+ border-color: $custom-control-indicator-checked-border-color;
+ @include gradient-bg($custom-control-indicator-checked-bg);
+ @include box-shadow($custom-control-indicator-checked-box-shadow);
+ }
+
+ &:focus ~ .custom-control-label::before {
+ // the mixin is not used here to make sure there is feedback
+ @if $enable-shadows {
+ box-shadow: $input-box-shadow, $input-focus-box-shadow;
+ } @else {
+ box-shadow: $custom-control-indicator-focus-box-shadow;
+ }
+ }
+
+ &:focus:not(:checked) ~ .custom-control-label::before {
+ border-color: $custom-control-indicator-focus-border-color;
+ }
+
+ &:not(:disabled):active ~ .custom-control-label::before {
+ color: $custom-control-indicator-active-color;
+ background-color: $custom-control-indicator-active-bg;
+ border-color: $custom-control-indicator-active-border-color;
+ @include box-shadow($custom-control-indicator-active-box-shadow);
+ }
+
+ // Use disabled attribute instead of :disabled pseudo-class
+ // Workaround for: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11295231
+ &[disabled] {
+ ~ .custom-control-label {
+ color: $custom-control-label-disabled-color;
+
+ &::before {
+ background-color: $custom-control-indicator-disabled-bg;
+ }
+ }
+ }
+}
+
+// Custom control indicators
+//
+// Build the custom controls out of pseudo-elements.
+
+.custom-control-label {
+ position: relative;
+ margin-bottom: 0;
+ vertical-align: top;
+
+ // Background-color and (when enabled) gradient
+ &::before {
+ position: absolute;
+ top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
+ left: -($custom-control-gutter + $custom-control-indicator-size);
+ display: block;
+ width: $custom-control-indicator-size;
+ height: $custom-control-indicator-size;
+ pointer-events: none;
+ content: "";
+ background-color: $custom-control-indicator-bg;
+ border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;
+ @include box-shadow($custom-control-indicator-box-shadow);
+ }
+
+ // Foreground (icon)
+ &::after {
+ position: absolute;
+ top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
+ left: -($custom-control-gutter + $custom-control-indicator-size);
+ display: block;
+ width: $custom-control-indicator-size;
+ height: $custom-control-indicator-size;
+ content: "";
+ background: no-repeat 50% / #{$custom-control-indicator-bg-size};
+ }
+}
+
+
+// Checkboxes
+//
+// Tweak just a few things for checkboxes.
+
+.custom-checkbox {
+ .custom-control-label::before {
+ @include border-radius($custom-checkbox-indicator-border-radius);
+ }
+
+ .custom-control-input:checked ~ .custom-control-label {
+ &::after {
+ background-image: $custom-checkbox-indicator-icon-checked;
+ }
+ }
+
+ .custom-control-input:indeterminate ~ .custom-control-label {
+ &::before {
+ border-color: $custom-checkbox-indicator-indeterminate-border-color;
+ @include gradient-bg($custom-checkbox-indicator-indeterminate-bg);
+ @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);
+ }
+ &::after {
+ background-image: $custom-checkbox-indicator-icon-indeterminate;
+ }
+ }
+
+ .custom-control-input:disabled {
+ &:checked ~ .custom-control-label::before {
+ background-color: $custom-control-indicator-checked-disabled-bg;
+ }
+ &:indeterminate ~ .custom-control-label::before {
+ background-color: $custom-control-indicator-checked-disabled-bg;
+ }
+ }
+}
+
+// Radios
+//
+// Tweak just a few things for radios.
+
+.custom-radio {
+ .custom-control-label::before {
+ // stylelint-disable-next-line property-blacklist
+ border-radius: $custom-radio-indicator-border-radius;
+ }
+
+ .custom-control-input:checked ~ .custom-control-label {
+ &::after {
+ background-image: $custom-radio-indicator-icon-checked;
+ }
+ }
+
+ .custom-control-input:disabled {
+ &:checked ~ .custom-control-label::before {
+ background-color: $custom-control-indicator-checked-disabled-bg;
+ }
+ }
+}
+
+
+// switches
+//
+// Tweak a few things for switches
+
+.custom-switch {
+ padding-left: $custom-switch-width + $custom-control-gutter;
+
+ .custom-control-label {
+ &::before {
+ left: -($custom-switch-width + $custom-control-gutter);
+ width: $custom-switch-width;
+ pointer-events: all;
+ // stylelint-disable-next-line property-blacklist
+ border-radius: $custom-switch-indicator-border-radius;
+ }
+
+ &::after {
+ top: calc(#{(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2)} + #{$custom-control-indicator-border-width * 2});
+ left: calc(#{-($custom-switch-width + $custom-control-gutter)} + #{$custom-control-indicator-border-width * 2});
+ width: $custom-switch-indicator-size;
+ height: $custom-switch-indicator-size;
+ background-color: $custom-control-indicator-border-color;
+ // stylelint-disable-next-line property-blacklist
+ border-radius: $custom-switch-indicator-border-radius;
+ @include transition(transform .15s ease-in-out, $custom-forms-transition);
+ }
+ }
+
+ .custom-control-input:checked ~ .custom-control-label {
+ &::after {
+ background-color: $custom-control-indicator-bg;
+ transform: translateX($custom-switch-width - $custom-control-indicator-size);
+ }
+ }
+
+ .custom-control-input:disabled {
+ &:checked ~ .custom-control-label::before {
+ background-color: $custom-control-indicator-checked-disabled-bg;
+ }
+ }
+}
+
+
+// Select
+//
+// Replaces the browser default select with a custom one, mostly pulled from
+// https://primer.github.io/.
+//
+
+.custom-select {
+ display: inline-block;
+ width: 100%;
+ height: $custom-select-height;
+ padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;
+ font-family: $custom-select-font-family;
+ @include font-size($custom-select-font-size);
+ font-weight: $custom-select-font-weight;
+ line-height: $custom-select-line-height;
+ color: $custom-select-color;
+ vertical-align: middle;
+ background: $custom-select-background;
+ background-color: $custom-select-bg;
+ border: $custom-select-border-width solid $custom-select-border-color;
+ @include border-radius($custom-select-border-radius, 0);
+ @include box-shadow($custom-select-box-shadow);
+ appearance: none;
+
+ &:focus {
+ border-color: $custom-select-focus-border-color;
+ outline: 0;
+ @if $enable-shadows {
+ box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;
+ } @else {
+ box-shadow: $custom-select-focus-box-shadow;
+ }
+
+ &::-ms-value {
+ // For visual consistency with other platforms/browsers,
+ // suppress the default white text on blue background highlight given to
+ // the selected option text when the (still closed) <select> receives focus
+ // in IE and (under certain conditions) Edge.
+ // See https://github.com/twbs/bootstrap/issues/19398.
+ color: $input-color;
+ background-color: $input-bg;
+ }
+ }
+
+ &[multiple],
+ &[size]:not([size="1"]) {
+ height: auto;
+ padding-right: $custom-select-padding-x;
+ background-image: none;
+ }
+
+ &:disabled {
+ color: $custom-select-disabled-color;
+ background-color: $custom-select-disabled-bg;
+ }
+
+ // Hides the default caret in IE11
+ &::-ms-expand {
+ display: none;
+ }
+}
+
+.custom-select-sm {
+ height: $custom-select-height-sm;
+ padding-top: $custom-select-padding-y-sm;
+ padding-bottom: $custom-select-padding-y-sm;
+ padding-left: $custom-select-padding-x-sm;
+ @include font-size($custom-select-font-size-sm);
+}
+
+.custom-select-lg {
+ height: $custom-select-height-lg;
+ padding-top: $custom-select-padding-y-lg;
+ padding-bottom: $custom-select-padding-y-lg;
+ padding-left: $custom-select-padding-x-lg;
+ @include font-size($custom-select-font-size-lg);
+}
+
+
+// File
+//
+// Custom file input.
+
+.custom-file {
+ position: relative;
+ display: inline-block;
+ width: 100%;
+ height: $custom-file-height;
+ margin-bottom: 0;
+}
+
+.custom-file-input {
+ position: relative;
+ z-index: 2;
+ width: 100%;
+ height: $custom-file-height;
+ margin: 0;
+ opacity: 0;
+
+ &:focus ~ .custom-file-label {
+ border-color: $custom-file-focus-border-color;
+ box-shadow: $custom-file-focus-box-shadow;
+ }
+
+ // Use disabled attribute instead of :disabled pseudo-class
+ // Workaround for: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11295231
+ &[disabled] ~ .custom-file-label {
+ background-color: $custom-file-disabled-bg;
+ }
+
+ @each $lang, $value in $custom-file-text {
+ &:lang(#{$lang}) ~ .custom-file-label::after {
+ content: $value;
+ }
+ }
+
+ ~ .custom-file-label[data-browse]::after {
+ content: attr(data-browse);
+ }
+}
+
+.custom-file-label {
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 1;
+ height: $custom-file-height;
+ padding: $custom-file-padding-y $custom-file-padding-x;
+ font-family: $custom-file-font-family;
+ font-weight: $custom-file-font-weight;
+ line-height: $custom-file-line-height;
+ color: $custom-file-color;
+ background-color: $custom-file-bg;
+ border: $custom-file-border-width solid $custom-file-border-color;
+ @include border-radius($custom-file-border-radius);
+ @include box-shadow($custom-file-box-shadow);
+
+ &::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 3;
+ display: block;
+ height: $custom-file-height-inner;
+ padding: $custom-file-padding-y $custom-file-padding-x;
+ line-height: $custom-file-line-height;
+ color: $custom-file-button-color;
+ content: "Browse";
+ @include gradient-bg($custom-file-button-bg);
+ border-left: inherit;
+ @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);
+ }
+}
+
+// Range
+//
+// Style range inputs the same across browsers. Vendor-specific rules for pseudo
+// elements cannot be mixed. As such, there are no shared styles for focus or
+// active states on prefixed selectors.
+
+.custom-range {
+ width: 100%;
+ height: calc(#{$custom-range-thumb-height} + #{$custom-range-thumb-focus-box-shadow-width * 2});
+ padding: 0; // Need to reset padding
+ background-color: transparent;
+ appearance: none;
+
+ &:focus {
+ outline: none;
+
+ // Pseudo-elements must be split across multiple rulesets to have an effect.
+ // No box-shadow() mixin for focus accessibility.
+ &::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
+ &::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
+ &::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
+ }
+
+ &::-moz-focus-outer {
+ border: 0;
+ }
+
+ &::-webkit-slider-thumb {
+ width: $custom-range-thumb-width;
+ height: $custom-range-thumb-height;
+ margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific
+ @include gradient-bg($custom-range-thumb-bg);
+ border: $custom-range-thumb-border;
+ @include border-radius($custom-range-thumb-border-radius);
+ @include box-shadow($custom-range-thumb-box-shadow);
+ @include transition($custom-forms-transition);
+ appearance: none;
+
+ &:active {
+ @include gradient-bg($custom-range-thumb-active-bg);
+ }
+ }
+
+ &::-webkit-slider-runnable-track {
+ width: $custom-range-track-width;
+ height: $custom-range-track-height;
+ color: transparent; // Why?
+ cursor: $custom-range-track-cursor;
+ background-color: $custom-range-track-bg;
+ border-color: transparent;
+ @include border-radius($custom-range-track-border-radius);
+ @include box-shadow($custom-range-track-box-shadow);
+ }
+
+ &::-moz-range-thumb {
+ width: $custom-range-thumb-width;
+ height: $custom-range-thumb-height;
+ @include gradient-bg($custom-range-thumb-bg);
+ border: $custom-range-thumb-border;
+ @include border-radius($custom-range-thumb-border-radius);
+ @include box-shadow($custom-range-thumb-box-shadow);
+ @include transition($custom-forms-transition);
+ appearance: none;
+
+ &:active {
+ @include gradient-bg($custom-range-thumb-active-bg);
+ }
+ }
+
+ &::-moz-range-track {
+ width: $custom-range-track-width;
+ height: $custom-range-track-height;
+ color: transparent;
+ cursor: $custom-range-track-cursor;
+ background-color: $custom-range-track-bg;
+ border-color: transparent; // Firefox specific?
+ @include border-radius($custom-range-track-border-radius);
+ @include box-shadow($custom-range-track-box-shadow);
+ }
+
+ &::-ms-thumb {
+ width: $custom-range-thumb-width;
+ height: $custom-range-thumb-height;
+ margin-top: 0; // Edge specific
+ margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
+ margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
+ @include gradient-bg($custom-range-thumb-bg);
+ border: $custom-range-thumb-border;
+ @include border-radius($custom-range-thumb-border-radius);
+ @include box-shadow($custom-range-thumb-box-shadow);
+ @include transition($custom-forms-transition);
+ appearance: none;
+
+ &:active {
+ @include gradient-bg($custom-range-thumb-active-bg);
+ }
+ }
+
+ &::-ms-track {
+ width: $custom-range-track-width;
+ height: $custom-range-track-height;
+ color: transparent;
+ cursor: $custom-range-track-cursor;
+ background-color: transparent;
+ border-color: transparent;
+ border-width: $custom-range-thumb-height / 2;
+ @include box-shadow($custom-range-track-box-shadow);
+ }
+
+ &::-ms-fill-lower {
+ background-color: $custom-range-track-bg;
+ @include border-radius($custom-range-track-border-radius);
+ }
+
+ &::-ms-fill-upper {
+ margin-right: 15px; // arbitrary?
+ background-color: $custom-range-track-bg;
+ @include border-radius($custom-range-track-border-radius);
+ }
+
+ &:disabled {
+ &::-webkit-slider-thumb {
+ background-color: $custom-range-thumb-disabled-bg;
+ }
+
+ &::-webkit-slider-runnable-track {
+ cursor: default;
+ }
+
+ &::-moz-range-thumb {
+ background-color: $custom-range-thumb-disabled-bg;
+ }
+
+ &::-moz-range-track {
+ cursor: default;
+ }
+
+ &::-ms-thumb {
+ background-color: $custom-range-thumb-disabled-bg;
+ }
+ }
+}
+
+.custom-control-label::before,
+.custom-file-label,
+.custom-select {
+ @include transition($custom-forms-transition);
+}
diff --git a/src/scss/bootstrap/_dropdown.scss b/src/scss/bootstrap/_dropdown.scss
new file mode 100644
index 0000000..ac3c8c8
--- /dev/null
+++ b/src/scss/bootstrap/_dropdown.scss
@@ -0,0 +1,191 @@
+// The dropdown wrapper (`<div>`)
+.dropup,
+.dropright,
+.dropdown,
+.dropleft {
+ position: relative;
+}
+
+.dropdown-toggle {
+ white-space: nowrap;
+
+ // Generate the caret automatically
+ @include caret;
+}
+
+// The dropdown menu
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: $zindex-dropdown;
+ display: none; // none by default, but block on "open" of the menu
+ float: left;
+ min-width: $dropdown-min-width;
+ padding: $dropdown-padding-y 0;
+ margin: $dropdown-spacer 0 0; // override default ul
+ @include font-size($dropdown-font-size);
+ color: $dropdown-color;
+ text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
+ list-style: none;
+ background-color: $dropdown-bg;
+ background-clip: padding-box;
+ border: $dropdown-border-width solid $dropdown-border-color;
+ @include border-radius($dropdown-border-radius);
+ @include box-shadow($dropdown-box-shadow);
+}
+
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .dropdown-menu#{$infix}-left {
+ right: auto;
+ left: 0;
+ }
+
+ .dropdown-menu#{$infix}-right {
+ right: 0;
+ left: auto;
+ }
+ }
+}
+
+// Allow for dropdowns to go bottom up (aka, dropup-menu)
+// Just add .dropup after the standard .dropdown class and you're set.
+.dropup {
+ .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-top: 0;
+ margin-bottom: $dropdown-spacer;
+ }
+
+ .dropdown-toggle {
+ @include caret(up);
+ }
+}
+
+.dropright {
+ .dropdown-menu {
+ top: 0;
+ right: auto;
+ left: 100%;
+ margin-top: 0;
+ margin-left: $dropdown-spacer;
+ }
+
+ .dropdown-toggle {
+ @include caret(right);
+ &::after {
+ vertical-align: 0;
+ }
+ }
+}
+
+.dropleft {
+ .dropdown-menu {
+ top: 0;
+ right: 100%;
+ left: auto;
+ margin-top: 0;
+ margin-right: $dropdown-spacer;
+ }
+
+ .dropdown-toggle {
+ @include caret(left);
+ &::before {
+ vertical-align: 0;
+ }
+ }
+}
+
+// When enabled Popper.js, reset basic dropdown position
+// stylelint-disable-next-line no-duplicate-selectors
+.dropdown-menu {
+ &[x-placement^="top"],
+ &[x-placement^="right"],
+ &[x-placement^="bottom"],
+ &[x-placement^="left"] {
+ right: auto;
+ bottom: auto;
+ }
+}
+
+// Dividers (basically an `<hr>`) within the dropdown
+.dropdown-divider {
+ @include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);
+}
+
+// Links, buttons, and more within the dropdown menu
+//
+// `<button>`-specific styles are denoted with `// For <button>s`
+.dropdown-item {
+ display: block;
+ width: 100%; // For `<button>`s
+ padding: $dropdown-item-padding-y $dropdown-item-padding-x;
+ clear: both;
+ font-weight: $font-weight-normal;
+ color: $dropdown-link-color;
+ text-align: inherit; // For `<button>`s
+ white-space: nowrap; // prevent links from randomly breaking onto new lines
+ background-color: transparent; // For `<button>`s
+ border: 0; // For `<button>`s
+
+ // Prevent dropdown overflow if there's no padding
+ // See https://github.com/twbs/bootstrap/pull/27703
+ @if $dropdown-padding-y == 0 {
+ &:first-child {
+ @include border-top-radius($dropdown-inner-border-radius);
+ }
+
+ &:last-child {
+ @include border-bottom-radius($dropdown-inner-border-radius);
+ }
+ }
+
+ @include hover-focus {
+ color: $dropdown-link-hover-color;
+ text-decoration: none;
+ @include gradient-bg($dropdown-link-hover-bg);
+ }
+
+ &.active,
+ &:active {
+ color: $dropdown-link-active-color;
+ text-decoration: none;
+ @include gradient-bg($dropdown-link-active-bg);
+ }
+
+ &.disabled,
+ &:disabled {
+ color: $dropdown-link-disabled-color;
+ pointer-events: none;
+ background-color: transparent;
+ // Remove CSS gradients if they're enabled
+ @if $enable-gradients {
+ background-image: none;
+ }
+ }
+}
+
+.dropdown-menu.show {
+ display: block;
+}
+
+// Dropdown section headers
+.dropdown-header {
+ display: block;
+ padding: $dropdown-padding-y $dropdown-item-padding-x;
+ margin-bottom: 0; // for use with heading elements
+ @include font-size($font-size-sm);
+ color: $dropdown-header-color;
+ white-space: nowrap; // as with > li > a
+}
+
+// Dropdown text
+.dropdown-item-text {
+ display: block;
+ padding: $dropdown-item-padding-y $dropdown-item-padding-x;
+ color: $dropdown-link-color;
+}
diff --git a/src/scss/bootstrap/_forms.scss b/src/scss/bootstrap/_forms.scss
new file mode 100644
index 0000000..677162b
--- /dev/null
+++ b/src/scss/bootstrap/_forms.scss
@@ -0,0 +1,332 @@
+// stylelint-disable selector-no-qualifying-type
+
+//
+// Textual form controls
+//
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: $input-height;
+ padding: $input-padding-y $input-padding-x;
+ font-family: $input-font-family;
+ @include font-size($input-font-size);
+ font-weight: $input-font-weight;
+ line-height: $input-line-height;
+ color: $input-color;
+ background-color: $input-bg;
+ background-clip: padding-box;
+ border: $input-border-width solid $input-border-color;
+
+ // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
+ @include border-radius($input-border-radius, 0);
+
+ @include box-shadow($input-box-shadow);
+ @include transition($input-transition);
+
+ // Unstyle the caret on `<select>`s in IE10+.
+ &::-ms-expand {
+ background-color: transparent;
+ border: 0;
+ }
+
+ // Customize the `:focus` state to imitate native WebKit styles.
+ @include form-control-focus($ignore-warning: true);
+
+ // Placeholder
+ &::placeholder {
+ color: $input-placeholder-color;
+ // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
+ opacity: 1;
+ }
+
+ // Disabled and read-only inputs
+ //
+ // HTML5 says that controls under a fieldset > legend:first-child won't be
+ // disabled if the fieldset is disabled. Due to implementation difficulty, we
+ // don't honor that edge case; we style them as disabled anyway.
+ &:disabled,
+ &[readonly] {
+ background-color: $input-disabled-bg;
+ // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
+ opacity: 1;
+ }
+}
+
+select.form-control {
+ &:focus::-ms-value {
+ // Suppress the nested default white text on blue background highlight given to
+ // the selected option text when the (still closed) <select> receives focus
+ // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to
+ // match the appearance of the native widget.
+ // See https://github.com/twbs/bootstrap/issues/19398.
+ color: $input-color;
+ background-color: $input-bg;
+ }
+}
+
+// Make file inputs better match text inputs by forcing them to new lines.
+.form-control-file,
+.form-control-range {
+ display: block;
+ width: 100%;
+}
+
+
+//
+// Labels
+//
+
+// For use with horizontal and inline forms, when you need the label (or legend)
+// text to align with the form controls.
+.col-form-label {
+ padding-top: calc(#{$input-padding-y} + #{$input-border-width});
+ padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});
+ margin-bottom: 0; // Override the `<label>/<legend>` default
+ @include font-size(inherit); // Override the `<legend>` default
+ line-height: $input-line-height;
+}
+
+.col-form-label-lg {
+ padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});
+ padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});
+ @include font-size($input-font-size-lg);
+ line-height: $input-line-height-lg;
+}
+
+.col-form-label-sm {
+ padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});
+ padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});
+ @include font-size($input-font-size-sm);
+ line-height: $input-line-height-sm;
+}
+
+
+// Readonly controls as plain text
+//
+// Apply class to a readonly input to make it appear like regular plain
+// text (without any border, background color, focus indicator)
+
+.form-control-plaintext {
+ display: block;
+ width: 100%;
+ padding-top: $input-padding-y;
+ padding-bottom: $input-padding-y;
+ margin-bottom: 0; // match inputs if this class comes on inputs with default margins
+ line-height: $input-line-height;
+ color: $input-plaintext-color;
+ background-color: transparent;
+ border: solid transparent;
+ border-width: $input-border-width 0;
+
+ &.form-control-sm,
+ &.form-control-lg {
+ padding-right: 0;
+ padding-left: 0;
+ }
+}
+
+
+// Form control sizing
+//
+// Build on `.form-control` with modifier classes to decrease or increase the
+// height and font-size of form controls.
+//
+// Repeated in `_input_group.scss` to avoid Sass extend issues.
+
+.form-control-sm {
+ height: $input-height-sm;
+ padding: $input-padding-y-sm $input-padding-x-sm;
+ @include font-size($input-font-size-sm);
+ line-height: $input-line-height-sm;
+ @include border-radius($input-border-radius-sm);
+}
+
+.form-control-lg {
+ height: $input-height-lg;
+ padding: $input-padding-y-lg $input-padding-x-lg;
+ @include font-size($input-font-size-lg);
+ line-height: $input-line-height-lg;
+ @include border-radius($input-border-radius-lg);
+}
+
+// stylelint-disable-next-line no-duplicate-selectors
+select.form-control {
+ &[size],
+ &[multiple] {
+ height: auto;
+ }
+}
+
+textarea.form-control {
+ height: auto;
+}
+
+// Form groups
+//
+// Designed to help with the organization and spacing of vertical forms. For
+// horizontal forms, use the predefined grid classes.
+
+.form-group {
+ margin-bottom: $form-group-margin-bottom;
+}
+
+.form-text {
+ display: block;
+ margin-top: $form-text-margin-top;
+}
+
+
+// Form grid
+//
+// Special replacement for our grid system's `.row` for tighter form layouts.
+
+.form-row {
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -$form-grid-gutter-width / 2;
+ margin-left: -$form-grid-gutter-width / 2;
+
+ > .col,
+ > [class*="col-"] {
+ padding-right: $form-grid-gutter-width / 2;
+ padding-left: $form-grid-gutter-width / 2;
+ }
+}
+
+
+// Checkboxes and radios
+//
+// Indent the labels to position radios/checkboxes as hanging controls.
+
+.form-check {
+ position: relative;
+ display: block;
+ padding-left: $form-check-input-gutter;
+}
+
+.form-check-input {
+ position: absolute;
+ margin-top: $form-check-input-margin-y;
+ margin-left: -$form-check-input-gutter;
+
+ // Use disabled attribute instead of :disabled pseudo-class
+ // Workaround for: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11295231
+ &[disabled] ~ .form-check-label {
+ color: $text-muted;
+ }
+}
+
+.form-check-label {
+ margin-bottom: 0; // Override default `<label>` bottom margin
+}
+
+.form-check-inline {
+ display: inline-flex;
+ align-items: center;
+ padding-left: 0; // Override base .form-check
+ margin-right: $form-check-inline-margin-x;
+
+ // Undo .form-check-input defaults and add some `margin-right`.
+ .form-check-input {
+ position: static;
+ margin-top: 0;
+ margin-right: $form-check-inline-input-margin-x;
+ margin-left: 0;
+ }
+}
+
+
+// Form validation
+//
+// Provide feedback to users when form field values are valid or invalid. Works
+// primarily for client-side validation via scoped `:invalid` and `:valid`
+// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
+// server-side validation.
+
+@each $state, $data in $form-validation-states {
+ @include form-validation-state($state, map-get($data, color), map-get($data, icon));
+}
+
+// Inline forms
+//
+// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
+// forms begin stacked on extra small (mobile) devices and then go inline when
+// viewports reach <768px.
+//
+// Requires wrapping inputs and labels with `.form-group` for proper display of
+// default HTML form controls and our custom form controls (e.g., input groups).
+
+.form-inline {
+ display: flex;
+ flex-flow: row wrap;
+ align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)
+
+ // Because we use flex, the initial sizing of checkboxes is collapsed and
+ // doesn't occupy the full-width (which is what we want for xs grid tier),
+ // so we force that here.
+ .form-check {
+ width: 100%;
+ }
+
+ // Kick in the inline
+ @include media-breakpoint-up(sm) {
+ label {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 0;
+ }
+
+ // Inline-block all the things for "inline"
+ .form-group {
+ display: flex;
+ flex: 0 0 auto;
+ flex-flow: row wrap;
+ align-items: center;
+ margin-bottom: 0;
+ }
+
+ // Allow folks to *not* use `.form-group`
+ .form-control {
+ display: inline-block;
+ width: auto; // Prevent labels from stacking above inputs in `.form-group`
+ vertical-align: middle;
+ }
+
+ // Make static controls behave like regular ones
+ .form-control-plaintext {
+ display: inline-block;
+ }
+
+ .input-group,
+ .custom-select {
+ width: auto;
+ }
+
+ // Remove default margin on radios/checkboxes that were used for stacking, and
+ // then undo the floating of radios and checkboxes to match.
+ .form-check {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: auto;
+ padding-left: 0;
+ }
+ .form-check-input {
+ position: relative;
+ flex-shrink: 0;
+ margin-top: 0;
+ margin-right: $form-check-input-margin-x;
+ margin-left: 0;
+ }
+
+ .custom-control {
+ align-items: center;
+ justify-content: center;
+ }
+ .custom-control-label {
+ margin-bottom: 0;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/_functions.scss b/src/scss/bootstrap/_functions.scss
new file mode 100644
index 0000000..41e99ec
--- /dev/null
+++ b/src/scss/bootstrap/_functions.scss
@@ -0,0 +1,86 @@
+// Bootstrap functions
+//
+// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.
+
+// Ascending
+// Used to evaluate Sass maps like our grid breakpoints.
+@mixin _assert-ascending($map, $map-name) {
+ $prev-key: null;
+ $prev-num: null;
+ @each $key, $num in $map {
+ @if $prev-num == null or unit($num) == "%" or unit($prev-num) == "%" {
+ // 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;
+ }
+}
+
+// Starts at zero
+// Used to ensure the min-width of the lowest breakpoint starts at 0.
+@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") {
+ $values: map-values($map);
+ $first-value: nth($values, 1);
+ @if $first-value != 0 {
+ @warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
+ }
+}
+
+// Replace `$search` with `$replace` in `$string`
+// Used on our SVG icon backgrounds for custom forms.
+//
+// @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;
+}
+
+// Color contrast
+@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {
+ $r: red($color);
+ $g: green($color);
+ $b: blue($color);
+
+ $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
+
+ @if ($yiq >= $yiq-contrasted-threshold) {
+ @return $dark;
+ } @else {
+ @return $light;
+ }
+}
+
+// Retrieve color Sass maps
+@function color($key: "blue") {
+ @return map-get($colors, $key);
+}
+
+@function theme-color($key: "primary") {
+ @return map-get($theme-colors, $key);
+}
+
+@function gray($key: "100") {
+ @return map-get($grays, $key);
+}
+
+// Request a theme color level
+@function theme-color-level($color-name: "primary", $level: 0) {
+ $color: theme-color($color-name);
+ $color-base: if($level > 0, $black, $white);
+ $level: abs($level);
+
+ @return mix($color-base, $color, $level * $theme-color-interval);
+}
diff --git a/src/scss/bootstrap/_grid.scss b/src/scss/bootstrap/_grid.scss
new file mode 100644
index 0000000..a227515
--- /dev/null
+++ b/src/scss/bootstrap/_grid.scss
@@ -0,0 +1,52 @@
+// Container widths
+//
+// Set the container width, and override it for fixed navbars in media queries.
+
+@if $enable-grid-classes {
+ .container {
+ @include make-container();
+ @include make-container-max-widths();
+ }
+}
+
+// Fluid container
+//
+// Utilizes the mixin meant for fixed width containers, but with 100% width for
+// fluid, full width layouts.
+
+@if $enable-grid-classes {
+ .container-fluid {
+ @include make-container();
+ }
+}
+
+// Row
+//
+// Rows contain and clear the floats of your columns.
+
+@if $enable-grid-classes {
+ .row {
+ @include make-row();
+ }
+
+ // Remove the negative margin from default .row, then the horizontal padding
+ // from all immediate children columns (to prevent runaway style inheritance).
+ .no-gutters {
+ margin-right: 0;
+ margin-left: 0;
+
+ > .col,
+ > [class*="col-"] {
+ padding-right: 0;
+ padding-left: 0;
+ }
+ }
+}
+
+// Columns
+//
+// Common styles for small and large grid columns
+
+@if $enable-grid-classes {
+ @include make-grid-columns();
+}
diff --git a/src/scss/bootstrap/_images.scss b/src/scss/bootstrap/_images.scss
new file mode 100644
index 0000000..cb9795e
--- /dev/null
+++ b/src/scss/bootstrap/_images.scss
@@ -0,0 +1,42 @@
+// Responsive images (ensure images don't scale beyond their parents)
+//
+// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.
+// We previously tried the "images are responsive by default" approach in Bootstrap v2,
+// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)
+// which weren't expecting the images within themselves to be involuntarily resized.
+// See also https://github.com/twbs/bootstrap/issues/18178
+.img-fluid {
+ @include img-fluid;
+}
+
+
+// Image thumbnails
+.img-thumbnail {
+ padding: $thumbnail-padding;
+ background-color: $thumbnail-bg;
+ border: $thumbnail-border-width solid $thumbnail-border-color;
+ @include border-radius($thumbnail-border-radius);
+ @include box-shadow($thumbnail-box-shadow);
+
+ // Keep them at most 100% wide
+ @include img-fluid;
+}
+
+//
+// Figures
+//
+
+.figure {
+ // Ensures the caption's text aligns with the image.
+ display: inline-block;
+}
+
+.figure-img {
+ margin-bottom: $spacer / 2;
+ line-height: 1;
+}
+
+.figure-caption {
+ @include font-size($figure-caption-font-size);
+ color: $figure-caption-color;
+}
diff --git a/src/scss/bootstrap/_input-group.scss b/src/scss/bootstrap/_input-group.scss
new file mode 100644
index 0000000..ac49f69
--- /dev/null
+++ b/src/scss/bootstrap/_input-group.scss
@@ -0,0 +1,193 @@
+// stylelint-disable selector-no-qualifying-type
+
+//
+// Base styles
+//
+
+.input-group {
+ position: relative;
+ display: flex;
+ flex-wrap: wrap; // For form validation feedback
+ align-items: stretch;
+ width: 100%;
+
+ > .form-control,
+ > .form-control-plaintext,
+ > .custom-select,
+ > .custom-file {
+ position: relative; // For focus state's z-index
+ flex: 1 1 auto;
+ // Add width 1% and flex-basis auto to ensure that button will not wrap out
+ // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.
+ width: 1%;
+ margin-bottom: 0;
+
+ + .form-control,
+ + .custom-select,
+ + .custom-file {
+ margin-left: -$input-border-width;
+ }
+ }
+
+ // Bring the "active" form control to the top of surrounding elements
+ > .form-control:focus,
+ > .custom-select:focus,
+ > .custom-file .custom-file-input:focus ~ .custom-file-label {
+ z-index: 3;
+ }
+
+ // Bring the custom file input above the label
+ > .custom-file .custom-file-input:focus {
+ z-index: 4;
+ }
+
+ > .form-control,
+ > .custom-select {
+ &:not(:last-child) { @include border-right-radius(0); }
+ &:not(:first-child) { @include border-left-radius(0); }
+ }
+
+ // Custom file inputs have more complex markup, thus requiring different
+ // border-radius overrides.
+ > .custom-file {
+ display: flex;
+ align-items: center;
+
+ &:not(:last-child) .custom-file-label,
+ &:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }
+ &:not(:first-child) .custom-file-label { @include border-left-radius(0); }
+ }
+}
+
+
+// Prepend and append
+//
+// While it requires one extra layer of HTML for each, dedicated prepend and
+// append elements allow us to 1) be less clever, 2) simplify our selectors, and
+// 3) support HTML5 form validation.
+
+.input-group-prepend,
+.input-group-append {
+ display: flex;
+
+ // Ensure buttons are always above inputs for more visually pleasing borders.
+ // This isn't needed for `.input-group-text` since it shares the same border-color
+ // as our inputs.
+ .btn {
+ position: relative;
+ z-index: 2;
+
+ &:focus {
+ z-index: 3;
+ }
+ }
+
+ .btn + .btn,
+ .btn + .input-group-text,
+ .input-group-text + .input-group-text,
+ .input-group-text + .btn {
+ margin-left: -$input-border-width;
+ }
+}
+
+.input-group-prepend { margin-right: -$input-border-width; }
+.input-group-append { margin-left: -$input-border-width; }
+
+
+// Textual addons
+//
+// Serves as a catch-all element for any text or radio/checkbox input you wish
+// to prepend or append to an input.
+
+.input-group-text {
+ display: flex;
+ align-items: center;
+ padding: $input-padding-y $input-padding-x;
+ margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom
+ @include font-size($input-font-size); // Match inputs
+ font-weight: $font-weight-normal;
+ line-height: $input-line-height;
+ color: $input-group-addon-color;
+ text-align: center;
+ white-space: nowrap;
+ background-color: $input-group-addon-bg;
+ border: $input-border-width solid $input-group-addon-border-color;
+ @include border-radius($input-border-radius);
+
+ // Nuke default margins from checkboxes and radios to vertically center within.
+ input[type="radio"],
+ input[type="checkbox"] {
+ margin-top: 0;
+ }
+}
+
+
+// Sizing
+//
+// Remix the default form control sizing classes into new ones for easier
+// manipulation.
+
+.input-group-lg > .form-control:not(textarea),
+.input-group-lg > .custom-select {
+ height: $input-height-lg;
+}
+
+.input-group-lg > .form-control,
+.input-group-lg > .custom-select,
+.input-group-lg > .input-group-prepend > .input-group-text,
+.input-group-lg > .input-group-append > .input-group-text,
+.input-group-lg > .input-group-prepend > .btn,
+.input-group-lg > .input-group-append > .btn {
+ padding: $input-padding-y-lg $input-padding-x-lg;
+ @include font-size($input-font-size-lg);
+ line-height: $input-line-height-lg;
+ @include border-radius($input-border-radius-lg);
+}
+
+.input-group-sm > .form-control:not(textarea),
+.input-group-sm > .custom-select {
+ height: $input-height-sm;
+}
+
+.input-group-sm > .form-control,
+.input-group-sm > .custom-select,
+.input-group-sm > .input-group-prepend > .input-group-text,
+.input-group-sm > .input-group-append > .input-group-text,
+.input-group-sm > .input-group-prepend > .btn,
+.input-group-sm > .input-group-append > .btn {
+ padding: $input-padding-y-sm $input-padding-x-sm;
+ @include font-size($input-font-size-sm);
+ line-height: $input-line-height-sm;
+ @include border-radius($input-border-radius-sm);
+}
+
+.input-group-lg > .custom-select,
+.input-group-sm > .custom-select {
+ padding-right: $custom-select-padding-x + $custom-select-indicator-padding;
+}
+
+
+// Prepend and append rounded corners
+//
+// These rulesets must come after the sizing ones to properly override sm and lg
+// border-radius values when extending. They're more specific than we'd like
+// with the `.input-group >` part, but without it, we cannot override the sizing.
+
+
+.input-group > .input-group-prepend > .btn,
+.input-group > .input-group-prepend > .input-group-text,
+.input-group > .input-group-append:not(:last-child) > .btn,
+.input-group > .input-group-append:not(:last-child) > .input-group-text,
+.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
+ @include border-right-radius(0);
+}
+
+.input-group > .input-group-append > .btn,
+.input-group > .input-group-append > .input-group-text,
+.input-group > .input-group-prepend:not(:first-child) > .btn,
+.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
+.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
+.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
+ @include border-left-radius(0);
+}
diff --git a/src/scss/bootstrap/_jumbotron.scss b/src/scss/bootstrap/_jumbotron.scss
new file mode 100644
index 0000000..bcd7dca
--- /dev/null
+++ b/src/scss/bootstrap/_jumbotron.scss
@@ -0,0 +1,17 @@
+.jumbotron {
+ padding: $jumbotron-padding ($jumbotron-padding / 2);
+ margin-bottom: $jumbotron-padding;
+ color: $jumbotron-color;
+ background-color: $jumbotron-bg;
+ @include border-radius($border-radius-lg);
+
+ @include media-breakpoint-up(sm) {
+ padding: ($jumbotron-padding * 2) $jumbotron-padding;
+ }
+}
+
+.jumbotron-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ @include border-radius(0);
+}
diff --git a/src/scss/bootstrap/_list-group.scss b/src/scss/bootstrap/_list-group.scss
new file mode 100644
index 0000000..3f80687
--- /dev/null
+++ b/src/scss/bootstrap/_list-group.scss
@@ -0,0 +1,149 @@
+// Base class
+//
+// Easily usable on <ul>, <ol>, or <div>.
+
+.list-group {
+ display: flex;
+ flex-direction: column;
+
+ // No need to set list-style: none; since .list-group-item is block level
+ padding-left: 0; // reset padding because ul and ol
+ margin-bottom: 0;
+}
+
+
+// Interactive list items
+//
+// Use anchor or button elements instead of `li`s or `div`s to create interactive
+// list items. Includes an extra `.active` modifier class for selected items.
+
+.list-group-item-action {
+ width: 100%; // For `<button>`s (anchors become 100% by default though)
+ color: $list-group-action-color;
+ text-align: inherit; // For `<button>`s (anchors inherit)
+
+ // Hover state
+ @include hover-focus {
+ z-index: 1; // Place hover/focus items above their siblings for proper border styling
+ color: $list-group-action-hover-color;
+ text-decoration: none;
+ background-color: $list-group-hover-bg;
+ }
+
+ &:active {
+ color: $list-group-action-active-color;
+ background-color: $list-group-action-active-bg;
+ }
+}
+
+
+// Individual list items
+//
+// Use on `li`s or `div`s within the `.list-group` parent.
+
+.list-group-item {
+ position: relative;
+ display: block;
+ padding: $list-group-item-padding-y $list-group-item-padding-x;
+ // Place the border on the list items and negative margin up for better styling
+ margin-bottom: -$list-group-border-width;
+ color: $list-group-color;
+ background-color: $list-group-bg;
+ border: $list-group-border-width solid $list-group-border-color;
+
+ &:first-child {
+ @include border-top-radius($list-group-border-radius);
+ }
+
+ &:last-child {
+ margin-bottom: 0;
+ @include border-bottom-radius($list-group-border-radius);
+ }
+
+ &.disabled,
+ &:disabled {
+ color: $list-group-disabled-color;
+ pointer-events: none;
+ background-color: $list-group-disabled-bg;
+ }
+
+ // Include both here for `<a>`s and `<button>`s
+ &.active {
+ z-index: 2; // Place active items above their siblings for proper border styling
+ color: $list-group-active-color;
+ background-color: $list-group-active-bg;
+ border-color: $list-group-active-border-color;
+ }
+}
+
+
+// Horizontal
+//
+// Change the layout of list group items from vertical (default) to horizontal.
+
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .list-group-horizontal#{$infix} {
+ flex-direction: row;
+
+ .list-group-item {
+ margin-right: -$list-group-border-width;
+ margin-bottom: 0;
+
+ &:first-child {
+ @include border-left-radius($list-group-border-radius);
+ @include border-top-right-radius(0);
+ }
+
+ &:last-child {
+ margin-right: 0;
+ @include border-right-radius($list-group-border-radius);
+ @include border-bottom-left-radius(0);
+ }
+ }
+ }
+ }
+}
+
+
+// Flush list items
+//
+// Remove borders and border-radius to keep list group items edge-to-edge. Most
+// useful within other components (e.g., cards).
+
+.list-group-flush {
+ .list-group-item {
+ border-right: 0;
+ border-left: 0;
+ @include border-radius(0);
+
+ &:last-child {
+ margin-bottom: -$list-group-border-width;
+ }
+ }
+
+ &:first-child {
+ .list-group-item:first-child {
+ border-top: 0;
+ }
+ }
+
+ &:last-child {
+ .list-group-item:last-child {
+ margin-bottom: 0;
+ border-bottom: 0;
+ }
+ }
+}
+
+
+// Contextual variants
+//
+// Add modifier classes to change text and background color on individual items.
+// Organizationally, this must come after the `:hover` states.
+
+@each $color, $value in $theme-colors {
+ @include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));
+}
diff --git a/src/scss/bootstrap/_media.scss b/src/scss/bootstrap/_media.scss
new file mode 100644
index 0000000..b573052
--- /dev/null
+++ b/src/scss/bootstrap/_media.scss
@@ -0,0 +1,8 @@
+.media {
+ display: flex;
+ align-items: flex-start;
+}
+
+.media-body {
+ flex: 1;
+}
diff --git a/src/scss/bootstrap/_mixins.scss b/src/scss/bootstrap/_mixins.scss
new file mode 100644
index 0000000..47297a7
--- /dev/null
+++ b/src/scss/bootstrap/_mixins.scss
@@ -0,0 +1,42 @@
+// Toggles
+//
+// Used in conjunction with global variables to enable certain theme features.
+
+// Vendor
+@import "vendor/rfs";
+
+// Deprecate
+@import "mixins/deprecate";
+
+// Utilities
+@import "mixins/breakpoints";
+@import "mixins/hover";
+@import "mixins/image";
+@import "mixins/resize";
+@import "mixins/screen-reader";
+@import "mixins/reset-text";
+@import "mixins/text-emphasis";
+@import "mixins/text-truncate";
+
+// // Components
+@import "mixins/alert";
+@import "mixins/buttons";
+@import "mixins/caret";
+@import "mixins/pagination";
+@import "mixins/lists";
+@import "mixins/list-group";
+@import "mixins/nav-divider";
+@import "mixins/forms";
+@import "mixins/table-row";
+
+// // Skins
+@import "mixins/background-variant";
+@import "mixins/border-radius";
+@import "mixins/box-shadow";
+@import "mixins/gradients";
+@import "mixins/transition";
+
+// // Layout
+@import "mixins/clearfix";
+@import "mixins/grid-framework";
+@import "mixins/grid";
diff --git a/src/scss/bootstrap/_modal.scss b/src/scss/bootstrap/_modal.scss
new file mode 100644
index 0000000..6b6770b
--- /dev/null
+++ b/src/scss/bootstrap/_modal.scss
@@ -0,0 +1,229 @@
+// .modal-open - body class for killing the scroll
+// .modal - container to scroll within
+// .modal-dialog - positioning shell for the actual modal
+// .modal-content - actual modal w/ bg and corners and stuff
+
+
+.modal-open {
+ // Kill the scroll on the body
+ overflow: hidden;
+
+ .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+ }
+}
+
+// Container that the modal scrolls within
+.modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: $zindex-modal;
+ display: none;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ // Prevent Chrome on Windows from adding a focus outline. For details, see
+ // https://github.com/twbs/bootstrap/pull/10951.
+ outline: 0;
+ // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a
+ // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342
+ // See also https://github.com/twbs/bootstrap/issues/17695
+}
+
+// Shell div to position the modal with bottom padding
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: $modal-dialog-margin;
+ // allow clicks to pass through for custom click handling to close modal
+ pointer-events: none;
+
+ // When fading in the modal, animate it to slide down
+ .modal.fade & {
+ @include transition($modal-transition);
+ transform: $modal-fade-transform;
+ }
+ .modal.show & {
+ transform: $modal-show-transform;
+ }
+}
+
+.modal-dialog-scrollable {
+ display: flex; // IE10/11
+ max-height: calc(100% - #{$modal-dialog-margin * 2});
+
+ .modal-content {
+ max-height: calc(100vh - #{$modal-dialog-margin * 2}); // IE10/11
+ overflow: hidden;
+ }
+
+ .modal-header,
+ .modal-footer {
+ flex-shrink: 0;
+ }
+
+ .modal-body {
+ overflow-y: auto;
+ }
+}
+
+.modal-dialog-centered {
+ display: flex;
+ align-items: center;
+ min-height: calc(100% - #{$modal-dialog-margin * 2});
+
+ // Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)
+ &::before {
+ display: block; // IE10
+ height: calc(100vh - #{$modal-dialog-margin * 2});
+ content: "";
+ }
+
+ // Ensure `.modal-body` shows scrollbar (IE10/11)
+ &.modal-dialog-scrollable {
+ flex-direction: column;
+ justify-content: center;
+ height: 100%;
+
+ .modal-content {
+ max-height: none;
+ }
+
+ &::before {
+ content: none;
+ }
+ }
+}
+
+// Actual modal
+.modal-content {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`
+ // counteract the pointer-events: none; in the .modal-dialog
+ color: $modal-content-color;
+ pointer-events: auto;
+ background-color: $modal-content-bg;
+ background-clip: padding-box;
+ border: $modal-content-border-width solid $modal-content-border-color;
+ @include border-radius($modal-content-border-radius);
+ @include box-shadow($modal-content-box-shadow-xs);
+ // Remove focus outline from opened modal
+ outline: 0;
+}
+
+// Modal background
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ left: 0;
+ z-index: $zindex-modal-backdrop;
+ width: 100vw;
+ height: 100vh;
+ background-color: $modal-backdrop-bg;
+
+ // Fade for backdrop
+ &.fade { opacity: 0; }
+ &.show { opacity: $modal-backdrop-opacity; }
+}
+
+// Modal header
+// Top section of the modal w/ title and dismiss
+.modal-header {
+ display: flex;
+ align-items: flex-start; // so the close btn always stays on the upper right corner
+ justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends
+ padding: $modal-header-padding;
+ border-bottom: $modal-header-border-width solid $modal-header-border-color;
+ @include border-top-radius($modal-content-border-radius);
+
+ .close {
+ padding: $modal-header-padding;
+ // auto on the left force icon to the right even when there is no .modal-title
+ margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;
+ }
+}
+
+// Title text within header
+.modal-title {
+ margin-bottom: 0;
+ line-height: $modal-title-line-height;
+}
+
+// Modal body
+// Where all modal content resides (sibling of .modal-header and .modal-footer)
+.modal-body {
+ position: relative;
+ // Enable `flex-grow: 1` so that the body take up as much space as possible
+ // when should there be a fixed height on `.modal-dialog`.
+ flex: 1 1 auto;
+ padding: $modal-inner-padding;
+}
+
+// Footer (for actions)
+.modal-footer {
+ display: flex;
+ align-items: center; // vertically center
+ justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
+ padding: $modal-inner-padding;
+ border-top: $modal-footer-border-width solid $modal-footer-border-color;
+ @include border-bottom-radius($modal-content-border-radius);
+
+ // Easily place margin between footer elements
+ > :not(:first-child) { margin-left: .25rem; }
+ > :not(:last-child) { margin-right: .25rem; }
+}
+
+// Measure scrollbar width for padding body during modal show/hide
+.modal-scrollbar-measure {
+ position: absolute;
+ top: -9999px;
+ width: 50px;
+ height: 50px;
+ overflow: scroll;
+}
+
+// Scale up the modal
+@include media-breakpoint-up(sm) {
+ // Automatically set modal's width for larger viewports
+ .modal-dialog {
+ max-width: $modal-md;
+ margin: $modal-dialog-margin-y-sm-up auto;
+ }
+
+ .modal-dialog-scrollable {
+ max-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});
+
+ .modal-content {
+ max-height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});
+ }
+ }
+
+ .modal-dialog-centered {
+ min-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});
+
+ &::before {
+ height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});
+ }
+ }
+
+ .modal-content {
+ @include box-shadow($modal-content-box-shadow-sm-up);
+ }
+
+ .modal-sm { max-width: $modal-sm; }
+}
+
+@include media-breakpoint-up(lg) {
+ .modal-lg,
+ .modal-xl {
+ max-width: $modal-lg;
+ }
+}
+
+@include media-breakpoint-up(xl) {
+ .modal-xl { max-width: $modal-xl; }
+}
diff --git a/src/scss/bootstrap/_nav.scss b/src/scss/bootstrap/_nav.scss
new file mode 100644
index 0000000..2085d06
--- /dev/null
+++ b/src/scss/bootstrap/_nav.scss
@@ -0,0 +1,120 @@
+// Base class
+//
+// Kickstart any navigation component with a set of style resets. Works with
+// `<nav>`s, `<ul>`s or `<ol>`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-link-disabled-color;
+ pointer-events: none;
+ cursor: default;
+ }
+}
+
+//
+// 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;
+ }
+
+ &.disabled {
+ color: $nav-link-disabled-color;
+ background-color: transparent;
+ border-color: transparent;
+ }
+ }
+
+ .nav-link.active,
+ .nav-item.show .nav-link {
+ color: $nav-tabs-link-active-color;
+ background-color: $nav-tabs-link-active-bg;
+ border-color: $nav-tabs-link-active-border-color;
+ }
+
+ .dropdown-menu {
+ // Make dropdown border overlap tab border
+ margin-top: -$nav-tabs-border-width;
+ // Remove the top rounded corners here since there is a hard edge above the menu
+ @include border-top-radius(0);
+ }
+}
+
+
+//
+// Pills
+//
+
+.nav-pills {
+ .nav-link {
+ @include border-radius($nav-pills-border-radius);
+ }
+
+ .nav-link.active,
+ .show > .nav-link {
+ color: $nav-pills-link-active-color;
+ background-color: $nav-pills-link-active-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..5c6e963
--- /dev/null
+++ b/src/scss/bootstrap/_navbar.scss
@@ -0,0 +1,294 @@
+// 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 properties so that content nested within behave properly.
+ > .container,
+ > .container-fluid {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+ }
+}
+
+
+// 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;
+ @include 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;
+ }
+
+ .dropdown-menu {
+ position: static;
+ float: none;
+ }
+}
+
+
+// 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 orientation. Requires the use of `flex-wrap: wrap`
+// on the `.navbar` parent.
+.navbar-collapse {
+ flex-basis: 100%;
+ flex-grow: 1;
+ // For always expanded or extra full navbars, ensure content aligns itself
+ // properly vertically. Can be easily overridden with flex utilities.
+ align-items: center;
+}
+
+// Button for toggling the navbar when in its collapsed state
+.navbar-toggler {
+ padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;
+ @include font-size($navbar-toggler-font-size);
+ line-height: 1;
+ background-color: 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) {
+ > .container,
+ > .container-fluid {
+ padding-right: 0;
+ padding-left: 0;
+ }
+ }
+
+ @include media-breakpoint-up($next) {
+ flex-flow: row nowrap;
+ justify-content: flex-start;
+
+ .navbar-nav {
+ flex-direction: row;
+
+ .dropdown-menu {
+ position: absolute;
+ }
+
+ .nav-link {
+ padding-right: $navbar-nav-link-padding-x;
+ padding-left: $navbar-nav-link-padding-x;
+ }
+ }
+
+ // For nesting containers, have to redeclare for alignment purposes
+ > .container,
+ > .container-fluid {
+ flex-wrap: nowrap;
+ }
+
+ .navbar-collapse {
+ display: flex !important; // stylelint-disable-line declaration-no-important
+
+ // Changes flex-bases to auto because of an IE10 bug
+ flex-basis: auto;
+ }
+
+ .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-brand-color;
+
+ @include hover-focus {
+ color: $navbar-light-brand-hover-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-icon-bg;
+ }
+
+ .navbar-text {
+ color: $navbar-light-color;
+ a {
+ color: $navbar-light-active-color;
+
+ @include hover-focus {
+ color: $navbar-light-active-color;
+ }
+ }
+ }
+}
+
+// White links against a dark background
+.navbar-dark {
+ .navbar-brand {
+ color: $navbar-dark-brand-color;
+
+ @include hover-focus {
+ color: $navbar-dark-brand-hover-color;
+ }
+ }
+
+ .navbar-nav {
+ .nav-link {
+ color: $navbar-dark-color;
+
+ @include hover-focus {
+ color: $navbar-dark-hover-color;
+ }
+
+ &.disabled {
+ color: $navbar-dark-disabled-color;
+ }
+ }
+
+ .show > .nav-link,
+ .active > .nav-link,
+ .nav-link.show,
+ .nav-link.active {
+ color: $navbar-dark-active-color;
+ }
+ }
+
+ .navbar-toggler {
+ color: $navbar-dark-color;
+ border-color: $navbar-dark-toggler-border-color;
+ }
+
+ .navbar-toggler-icon {
+ background-image: $navbar-dark-toggler-icon-bg;
+ }
+
+ .navbar-text {
+ color: $navbar-dark-color;
+ a {
+ color: $navbar-dark-active-color;
+
+ @include hover-focus {
+ color: $navbar-dark-active-color;
+ }
+ }
+ }
+}
diff --git a/src/scss/bootstrap/_pagination.scss b/src/scss/bootstrap/_pagination.scss
new file mode 100644
index 0000000..b434531
--- /dev/null
+++ b/src/scss/bootstrap/_pagination.scss
@@ -0,0 +1,73 @@
+.pagination {
+ display: flex;
+ @include list-unstyled();
+ @include border-radius();
+}
+
+.page-link {
+ position: relative;
+ display: block;
+ padding: $pagination-padding-y $pagination-padding-x;
+ margin-left: -$pagination-border-width;
+ line-height: $pagination-line-height;
+ color: $pagination-color;
+ background-color: $pagination-bg;
+ border: $pagination-border-width solid $pagination-border-color;
+
+ &:hover {
+ z-index: 2;
+ color: $pagination-hover-color;
+ text-decoration: none;
+ background-color: $pagination-hover-bg;
+ border-color: $pagination-hover-border-color;
+ }
+
+ &:focus {
+ z-index: 2;
+ outline: $pagination-focus-outline;
+ box-shadow: $pagination-focus-box-shadow;
+ }
+}
+
+.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: 1;
+ 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;
+ // Opinionated: remove the "hand" cursor set previously for .page-link
+ cursor: auto;
+ background-color: $pagination-disabled-bg;
+ border-color: $pagination-disabled-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..fe70dd0
--- /dev/null
+++ b/src/scss/bootstrap/_popover.scss
@@ -0,0 +1,171 @@
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: $zindex-popover;
+ display: block;
+ max-width: $popover-max-width;
+ // 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();
+ @include font-size($popover-font-size);
+ // 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($popover-border-radius);
+ @include box-shadow($popover-box-shadow);
+
+ .popover-arrow {
+ position: absolute;
+ display: block;
+ width: $popover-arrow-width;
+ height: $popover-arrow-height;
+ margin: 0 $border-radius-lg;
+
+ &::before,
+ &::after {
+ position: absolute;
+ display: block;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+ }
+ }
+}
+
+.bs-popover-top {
+ margin-bottom: $popover-arrow-height;
+
+ > .popover-arrow {
+ bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
+
+ &::before {
+ bottom: 0;
+ border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
+ border-top-color: $popover-arrow-outer-color;
+ }
+
+ &::after {
+ bottom: $popover-border-width;
+ border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
+ border-top-color: $popover-arrow-color;
+ }
+ }
+}
+
+.bs-popover-right {
+ margin-left: $popover-arrow-height;
+
+ > .popover-arrow {
+ left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
+ width: $popover-arrow-height;
+ height: $popover-arrow-width;
+ margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners
+
+ &::before {
+ left: 0;
+ border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
+ border-right-color: $popover-arrow-outer-color;
+ }
+
+ &::after {
+ left: $popover-border-width;
+ border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
+ border-right-color: $popover-arrow-color;
+ }
+ }
+}
+
+.bs-popover-bottom {
+ margin-top: $popover-arrow-height;
+
+ > .popover-arrow {
+ top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
+
+ &::before {
+ top: 0;
+ border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
+ border-bottom-color: $popover-arrow-outer-color;
+ }
+
+ &::after {
+ top: $popover-border-width;
+ border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
+ border-bottom-color: $popover-arrow-color;
+ }
+ }
+
+ // This will remove the popover-header's border just below the arrow
+ .popover-header::before {
+ position: absolute;
+ top: 0;
+ left: 50%;
+ display: block;
+ width: $popover-arrow-width;
+ margin-left: -$popover-arrow-width / 2;
+ content: "";
+ border-bottom: $popover-border-width solid $popover-header-bg;
+ }
+}
+
+.bs-popover-left {
+ margin-right: $popover-arrow-height;
+
+ > .popover-arrow {
+ right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
+ width: $popover-arrow-height;
+ height: $popover-arrow-width;
+ margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners
+
+ &::before {
+ right: 0;
+ border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
+ border-left-color: $popover-arrow-outer-color;
+ }
+
+ &::after {
+ right: $popover-border-width;
+ border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
+ border-left-color: $popover-arrow-color;
+ }
+ }
+}
+
+.bs-popover-auto {
+ &[x-placement^="top"] {
+ @extend .bs-popover-top;
+ }
+ &[x-placement^="right"] {
+ @extend .bs-popover-right;
+ }
+ &[x-placement^="bottom"] {
+ @extend .bs-popover-bottom;
+ }
+ &[x-placement^="left"] {
+ @extend .bs-popover-left;
+ }
+}
+
+
+// Offset the popover to account for the popover arrow
+.popover-header {
+ padding: $popover-header-padding-y $popover-header-padding-x;
+ margin-bottom: 0; // Reset the default from Reboot
+ @include font-size($font-size-base);
+ color: $popover-header-color;
+ background-color: $popover-header-bg;
+ border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);
+ $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});
+ @include border-top-radius($offset-border-width);
+
+ &:empty {
+ display: none;
+ }
+}
+
+.popover-body {
+ padding: $popover-body-padding-y $popover-body-padding-x;
+ color: $popover-body-color;
+}
diff --git a/src/scss/bootstrap/_print.scss b/src/scss/bootstrap/_print.scss
new file mode 100644
index 0000000..61b60b9
--- /dev/null
+++ b/src/scss/bootstrap/_print.scss
@@ -0,0 +1,141 @@
+// stylelint-disable declaration-no-important, selector-no-qualifying-type
+
+// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css
+
+// ==========================================================================
+// Print styles.
+// Inlined to avoid the additional HTTP request:
+// https://www.phpied.com/delay-loading-your-print-css/
+// ==========================================================================
+
+@if $enable-print-styles {
+ @media print {
+ *,
+ *::before,
+ *::after {
+ // Bootstrap specific; comment out `color` and `background`
+ //color: $black !important; // Black prints faster
+ text-shadow: none !important;
+ //background: transparent !important;
+ box-shadow: none !important;
+ }
+
+ a {
+ &:not(.btn) {
+ 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 $gray-500; // 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
+
+ // Specify a size and min-width to make printing closer across browsers.
+ // We don't set margin here because it breaks `size` in Chrome. We also
+ // don't use `!important` on `size` as it breaks in Chrome.
+ @page {
+ size: $print-page-size;
+ }
+ body {
+ min-width: $print-body-min-width !important;
+ }
+ .container {
+ min-width: $print-body-min-width !important;
+ }
+
+ // Bootstrap components
+ .navbar {
+ display: none;
+ }
+ .badge {
+ border: $border-width solid $black;
+ }
+
+ .table {
+ border-collapse: collapse !important;
+
+ td,
+ th {
+ background-color: $white !important;
+ }
+ }
+
+ .table-bordered {
+ th,
+ td {
+ border: 1px solid $gray-300 !important;
+ }
+ }
+
+ .table-dark {
+ color: inherit;
+
+ th,
+ td,
+ thead th,
+ tbody + tbody {
+ border-color: $table-border-color;
+ }
+ }
+
+ .table .thead-dark th {
+ color: inherit;
+ border-color: $table-border-color;
+ }
+
+ // Bootstrap specific changes end
+ }
+}
diff --git a/src/scss/bootstrap/_progress.scss b/src/scss/bootstrap/_progress.scss
new file mode 100644
index 0000000..391081a
--- /dev/null
+++ b/src/scss/bootstrap/_progress.scss
@@ -0,0 +1,45 @@
+// Disable animation if transitions are disabled
+@if $enable-transitions {
+ @keyframes progress-bar-stripes {
+ from { background-position: $progress-height 0; }
+ to { background-position: 0 0; }
+ }
+}
+
+.progress {
+ display: flex;
+ height: $progress-height;
+ overflow: hidden; // force rounded corners by cropping it
+ @include font-size($progress-font-size);
+ background-color: $progress-bg;
+ @include border-radius($progress-border-radius);
+ @include box-shadow($progress-box-shadow);
+}
+
+.progress-bar {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ color: $progress-bar-color;
+ text-align: center;
+ white-space: nowrap;
+ background-color: $progress-bar-bg;
+ @include transition($progress-bar-transition);
+}
+
+.progress-bar-striped {
+ @include gradient-striped();
+ background-size: $progress-height $progress-height;
+}
+
+@if $enable-transitions {
+ .progress-bar-animated {
+ animation: progress-bar-stripes $progress-bar-animation-timing;
+
+ @if $enable-prefers-reduced-motion-media-query {
+ @media (prefers-reduced-motion: reduce) {
+ animation: none;
+ }
+ }
+ }
+}
diff --git a/src/scss/bootstrap/_reboot.scss b/src/scss/bootstrap/_reboot.scss
new file mode 100644
index 0000000..4955f7f
--- /dev/null
+++ b/src/scss/bootstrap/_reboot.scss
@@ -0,0 +1,487 @@
+// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
+
+// 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. Change the default tap highlight to be completely transparent in iOS.
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box; // 1
+}
+
+html {
+ font-family: sans-serif; // 2
+ line-height: 1.15; // 3
+ -webkit-text-size-adjust: 100%; // 4
+ -webkit-tap-highlight-color: rgba($black, 0); // 5
+}
+
+// Shim for "new" HTML5 structural elements to display correctly (IE10, older browsers)
+// TODO: remove in v5
+// stylelint-disable-next-line selector-list-comma-newline-after
+article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
+ display: block;
+}
+
+// Body
+//
+// 1. Remove the margin in all browsers.
+// 2. As a best practice, apply a default `background-color`.
+// 3. Set an explicit initial text-align value so that we can later use
+// the `inherit` value on things like `<th>` elements.
+
+body {
+ margin: 0; // 1
+ font-family: $font-family-base;
+ @include font-size($font-size-base);
+ font-weight: $font-weight-base;
+ line-height: $line-height-base;
+ color: $body-color;
+ text-align: left; // 3
+ background-color: $body-bg; // 2
+}
+
+// Future-proof rule: in browsers that support :focus-visible, suppress the focus outline
+// on elements that programmatically receive focus but wouldn't normally show a visible
+// focus outline. In general, this would mean that the outline is only applied if the
+// interaction that led to the element receiving programmatic focus was a keyboard interaction,
+// or the browser has somehow determined that the user is primarily a keyboard user and/or
+// wants focus outlines to always be presented.
+//
+// See https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible
+// and https://developer.paciellogroup.com/blog/2018/03/focus-visible-and-backwards-compatibility/
+[tabindex="-1"]:focus:not(:focus-visible) {
+ outline: 0 !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, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top
+// margin for easier control within type scales as it avoids margin collapsing.
+// stylelint-disable-next-line selector-list-comma-newline-after
+h1, h2, h3, h4, h5, h6 {
+ margin-top: 0;
+ margin-bottom: $headings-margin-bottom;
+}
+
+// Reset margins on paragraphs
+//
+// Similarly, the top margin on `<p>`s get reset. However, we also reset the
+// bottom margin to use `rem` units instead of `em`.
+p {
+ margin-top: 0;
+ margin-bottom: $paragraph-margin-bottom;
+}
+
+// Abbreviations
+//
+// 1. Duplicate behavior to the data-* attribute for our tooltip plugin
+// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+// 3. Add explicit cursor to indicate changed behavior.
+// 4. Remove the bottom border in Firefox 39-.
+// 5. Prevent the text-decoration to be skipped.
+
+abbr[title],
+abbr[data-original-title] { // 1
+ text-decoration: underline; // 2
+ text-decoration: underline dotted; // 2
+ cursor: help; // 3
+ border-bottom: 0; // 4
+ text-decoration-skip-ink: none; // 5
+}
+
+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;
+}
+
+b,
+strong {
+ font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari
+}
+
+small {
+ @include 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;
+ @include 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.
+
+ @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: $font-family-monospace;
+ @include 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 {
+ // Workaround for the SVG overflow bug in IE10/11 is still required.
+ // See https://github.com/twbs/bootstrap/issues/26878
+ overflow: hidden;
+ vertical-align: middle;
+}
+
+
+//
+// Tables
+//
+
+table {
+ border-collapse: collapse; // Prevent double borders
+}
+
+caption {
+ padding-top: $table-cell-padding;
+ padding-bottom: $table-cell-padding;
+ color: $table-caption-color;
+ text-align: left;
+ caption-side: bottom;
+}
+
+th {
+ // Matches default `<td>` alignment by inheriting from the `<body>`, or the
+ // closest parent with a set `text-align`.
+ text-align: inherit;
+}
+
+
+//
+// Forms
+//
+
+label {
+ // Allow labels to use `margin` for spacing.
+ display: inline-block;
+ margin-bottom: $label-margin-bottom;
+}
+
+// Remove the default `border-radius` that macOS Chrome adds.
+//
+// Details at https://github.com/twbs/bootstrap/issues/24093
+button {
+ // stylelint-disable-next-line property-blacklist
+ border-radius: 0;
+}
+
+// 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;
+ @include 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
+}
+
+// Remove the inheritance of word-wrap in Safari.
+//
+// Details at https://github.com/twbs/bootstrap/issues/24990
+select {
+ word-wrap: normal;
+}
+
+
+// 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,
+[type="button"], // 1
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button; // 2
+}
+
+// Opinionated: add "hand" cursor to non-disabled button elements.
+@if $enable-pointer-cursor-for-buttons {
+ button,
+ [type="button"],
+ [type="reset"],
+ [type="submit"] {
+ &:not(:disabled) {
+ cursor: pointer;
+ }
+ }
+}
+
+// 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. `<div>`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;
+ @include 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 in Chrome and Safari on macOS.
+//
+
+[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
+ cursor: pointer;
+}
+
+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/_root.scss b/src/scss/bootstrap/_root.scss
new file mode 100644
index 0000000..ad550df
--- /dev/null
+++ b/src/scss/bootstrap/_root.scss
@@ -0,0 +1,19 @@
+:root {
+ // Custom variable values only support SassScript inside `#{}`.
+ @each $color, $value in $colors {
+ --#{$color}: #{$value};
+ }
+
+ @each $color, $value in $theme-colors {
+ --#{$color}: #{$value};
+ }
+
+ @each $bp, $value in $grid-breakpoints {
+ --breakpoint-#{$bp}: #{$value};
+ }
+
+ // Use `inspect` for lists so that quoted items keep the quotes.
+ // See https://github.com/sass/sass/issues/2383#issuecomment-336349172
+ --font-family-sans-serif: #{inspect($font-family-sans-serif)};
+ --font-family-monospace: #{inspect($font-family-monospace)};
+}
diff --git a/src/scss/bootstrap/_spinners.scss b/src/scss/bootstrap/_spinners.scss
new file mode 100644
index 0000000..364a5c1
--- /dev/null
+++ b/src/scss/bootstrap/_spinners.scss
@@ -0,0 +1,55 @@
+//
+// Rotating border
+//
+
+@keyframes spinner-border {
+ to { transform: rotate(360deg); }
+}
+
+.spinner-border {
+ display: inline-block;
+ width: $spinner-width;
+ height: $spinner-height;
+ vertical-align: text-bottom;
+ border: $spinner-border-width solid currentColor;
+ border-right-color: transparent;
+ // stylelint-disable-next-line property-blacklist
+ border-radius: 50%;
+ animation: spinner-border .75s linear infinite;
+}
+
+.spinner-border-sm {
+ width: $spinner-width-sm;
+ height: $spinner-height-sm;
+ border-width: $spinner-border-width-sm;
+}
+
+//
+// Growing circle
+//
+
+@keyframes spinner-grow {
+ 0% {
+ transform: scale(0);
+ }
+ 50% {
+ opacity: 1;
+ }
+}
+
+.spinner-grow {
+ display: inline-block;
+ width: $spinner-width;
+ height: $spinner-height;
+ vertical-align: text-bottom;
+ background-color: currentColor;
+ // stylelint-disable-next-line property-blacklist
+ border-radius: 50%;
+ opacity: 0;
+ animation: spinner-grow .75s linear infinite;
+}
+
+.spinner-grow-sm {
+ width: $spinner-width-sm;
+ height: $spinner-height-sm;
+}
diff --git a/src/scss/bootstrap/_tables.scss b/src/scss/bootstrap/_tables.scss
new file mode 100644
index 0000000..b7ab3d5
--- /dev/null
+++ b/src/scss/bootstrap/_tables.scss
@@ -0,0 +1,185 @@
+//
+// Basic Bootstrap table
+//
+
+.table {
+ width: 100%;
+ margin-bottom: $spacer;
+ color: $table-color;
+ 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;
+ }
+}
+
+
+//
+// Condensed table w/ half padding
+//
+
+.table-sm {
+ th,
+ td {
+ padding: $table-cell-padding-sm;
+ }
+}
+
+
+// Border versions
+//
+// Add or remove 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;
+ }
+ }
+}
+
+.table-borderless {
+ th,
+ td,
+ thead th,
+ tbody + tbody {
+ border: 0;
+ }
+}
+
+// Zebra-striping
+//
+// Default zebra-stripe styles (alternating gray and transparent backgrounds)
+
+.table-striped {
+ tbody tr:nth-of-type(#{$table-striped-order}) {
+ background-color: $table-accent-bg;
+ }
+}
+
+
+// Hover effect
+//
+// Placed here since it has to come after the potential zebra striping
+
+.table-hover {
+ tbody tr {
+ @include hover {
+ color: $table-hover-color;
+ background-color: $table-hover-bg;
+ }
+ }
+}
+
+
+// Table backgrounds
+//
+// Exact selectors below required to override `.table-striped` and prevent
+// inheritance to nested tables.
+
+@each $color, $value in $theme-colors {
+ @include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));
+}
+
+@include table-row-variant(active, $table-active-bg);
+
+
+// Dark styles
+//
+// Same table markup, but inverted color scheme: dark background and light text.
+
+// stylelint-disable-next-line no-duplicate-selectors
+.table {
+ .thead-dark {
+ th {
+ color: $table-dark-color;
+ background-color: $table-dark-bg;
+ border-color: $table-dark-border-color;
+ }
+ }
+
+ .thead-light {
+ th {
+ color: $table-head-color;
+ background-color: $table-head-bg;
+ border-color: $table-border-color;
+ }
+ }
+}
+
+.table-dark {
+ color: $table-dark-color;
+ background-color: $table-dark-bg;
+
+ th,
+ td,
+ thead th {
+ border-color: $table-dark-border-color;
+ }
+
+ &.table-bordered {
+ border: 0;
+ }
+
+ &.table-striped {
+ tbody tr:nth-of-type(odd) {
+ background-color: $table-dark-accent-bg;
+ }
+ }
+
+ &.table-hover {
+ tbody tr {
+ @include hover {
+ color: $table-dark-hover-color;
+ background-color: $table-dark-hover-bg;
+ }
+ }
+ }
+}
+
+
+// Responsive tables
+//
+// Generate series of `.table-responsive-*` classes for configuring the screen
+// size of where your table will overflow.
+
+.table-responsive {
+ @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) {
+ display: block;
+ width: 100%;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+
+ // Prevent double border on horizontal scroll due to use of `display: block;`
+ > .table-bordered {
+ border: 0;
+ }
+ }
+ }
+ }
+}
diff --git a/src/scss/bootstrap/_toasts.scss b/src/scss/bootstrap/_toasts.scss
new file mode 100644
index 0000000..6aa5352
--- /dev/null
+++ b/src/scss/bootstrap/_toasts.scss
@@ -0,0 +1,44 @@
+.toast {
+ max-width: $toast-max-width;
+ overflow: hidden; // cheap rounded corners on nested items
+ @include font-size($toast-font-size);
+ color: $toast-color;
+ background-color: $toast-background-color;
+ background-clip: padding-box;
+ border: $toast-border-width solid $toast-border-color;
+ box-shadow: $toast-box-shadow;
+ backdrop-filter: blur(10px);
+ opacity: 0;
+ @include border-radius($toast-border-radius);
+
+ &:not(:last-child) {
+ margin-bottom: $toast-padding-x;
+ }
+
+ &.showing {
+ opacity: 1;
+ }
+
+ &.show {
+ display: block;
+ opacity: 1;
+ }
+
+ &.hide {
+ display: none;
+ }
+}
+
+.toast-header {
+ display: flex;
+ align-items: center;
+ padding: $toast-padding-y $toast-padding-x;
+ color: $toast-header-color;
+ background-color: $toast-header-background-color;
+ background-clip: padding-box;
+ border-bottom: $toast-border-width solid $toast-header-border-color;
+}
+
+.toast-body {
+ padding: $toast-padding-x; // apply to both vertical and horizontal
+}
diff --git a/src/scss/bootstrap/_tooltip.scss b/src/scss/bootstrap/_tooltip.scss
new file mode 100644
index 0000000..4d405e0
--- /dev/null
+++ b/src/scss/bootstrap/_tooltip.scss
@@ -0,0 +1,115 @@
+// Base class
+.tooltip {
+ position: absolute;
+ z-index: $zindex-tooltip;
+ display: block;
+ margin: $tooltip-margin;
+ // 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();
+ @include font-size($tooltip-font-size);
+ // 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-arrow {
+ position: absolute;
+ display: block;
+ width: $tooltip-arrow-width;
+ height: $tooltip-arrow-height;
+
+ &::before {
+ position: absolute;
+ content: "";
+ border-color: transparent;
+ border-style: solid;
+ }
+ }
+}
+
+.bs-tooltip-top {
+ padding: $tooltip-arrow-height 0;
+
+ .tooltip-arrow {
+ bottom: 0;
+
+ &::before {
+ top: 0;
+ border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
+ border-top-color: $tooltip-arrow-color;
+ }
+ }
+}
+
+.bs-tooltip-right {
+ padding: 0 $tooltip-arrow-height;
+
+ .tooltip-arrow {
+ left: 0;
+ width: $tooltip-arrow-height;
+ height: $tooltip-arrow-width;
+
+ &::before {
+ right: 0;
+ border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
+ border-right-color: $tooltip-arrow-color;
+ }
+ }
+}
+
+.bs-tooltip-bottom {
+ padding: $tooltip-arrow-height 0;
+
+ .tooltip-arrow {
+ top: 0;
+
+ &::before {
+ bottom: 0;
+ border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
+ border-bottom-color: $tooltip-arrow-color;
+ }
+ }
+}
+
+.bs-tooltip-left {
+ padding: 0 $tooltip-arrow-height;
+
+ .tooltip-arrow {
+ right: 0;
+ width: $tooltip-arrow-height;
+ height: $tooltip-arrow-width;
+
+ &::before {
+ left: 0;
+ border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
+ border-left-color: $tooltip-arrow-color;
+ }
+ }
+}
+
+.bs-tooltip-auto {
+ &[x-placement^="top"] {
+ @extend .bs-tooltip-top;
+ }
+ &[x-placement^="right"] {
+ @extend .bs-tooltip-right;
+ }
+ &[x-placement^="bottom"] {
+ @extend .bs-tooltip-bottom;
+ }
+ &[x-placement^="left"] {
+ @extend .bs-tooltip-left;
+ }
+}
+
+// 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($tooltip-border-radius);
+}
diff --git a/src/scss/bootstrap/_transitions.scss b/src/scss/bootstrap/_transitions.scss
new file mode 100644
index 0000000..40be4d9
--- /dev/null
+++ b/src/scss/bootstrap/_transitions.scss
@@ -0,0 +1,20 @@
+.fade {
+ @include transition($transition-fade);
+
+ &:not(.show) {
+ opacity: 0;
+ }
+}
+
+.collapse {
+ &:not(.show) {
+ display: none;
+ }
+}
+
+.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..f8ed090
--- /dev/null
+++ b/src/scss/bootstrap/_type.scss
@@ -0,0 +1,125 @@
+// stylelint-disable declaration-no-important, selector-list-comma-newline-after
+
+//
+// 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 { @include font-size($h1-font-size); }
+h2, .h2 { @include font-size($h2-font-size); }
+h3, .h3 { @include font-size($h3-font-size); }
+h4, .h4 { @include font-size($h4-font-size); }
+h5, .h5 { @include font-size($h5-font-size); }
+h6, .h6 { @include font-size($h6-font-size); }
+
+.lead {
+ @include font-size($lead-font-size);
+ font-weight: $lead-font-weight;
+}
+
+// Type display classes
+.display-1 {
+ @include font-size($display1-size);
+ font-weight: $display1-weight;
+ line-height: $display-line-height;
+}
+.display-2 {
+ @include font-size($display2-size);
+ font-weight: $display2-weight;
+ line-height: $display-line-height;
+}
+.display-3 {
+ @include font-size($display3-size);
+ font-weight: $display3-weight;
+ line-height: $display-line-height;
+}
+.display-4 {
+ @include font-size($display4-size);
+ font-weight: $display4-weight;
+ line-height: $display-line-height;
+}
+
+
+//
+// Horizontal rules
+//
+
+hr {
+ margin-top: $hr-margin-y;
+ margin-bottom: $hr-margin-y;
+ border: 0;
+ border-top: $hr-border-width solid $hr-border-color;
+}
+
+
+//
+// Emphasis
+//
+
+small,
+.small {
+ @include 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 {
+ @include font-size(90%);
+ text-transform: uppercase;
+}
+
+// Blockquotes
+.blockquote {
+ margin-bottom: $spacer;
+ @include font-size($blockquote-font-size);
+}
+
+.blockquote-footer {
+ display: block;
+ @include font-size($blockquote-small-font-size);
+ color: $blockquote-small-color;
+
+ &::before {
+ content: "\2014\00A0"; // em dash, nbsp
+ }
+}
diff --git a/src/scss/bootstrap/_utilities.scss b/src/scss/bootstrap/_utilities.scss
new file mode 100644
index 0000000..a5de31b
--- /dev/null
+++ b/src/scss/bootstrap/_utilities.scss
@@ -0,0 +1,17 @@
+@import "utilities/align";
+@import "utilities/background";
+@import "utilities/borders";
+@import "utilities/clearfix";
+@import "utilities/display";
+@import "utilities/embed";
+@import "utilities/flex";
+@import "utilities/float";
+@import "utilities/overflow";
+@import "utilities/position";
+@import "utilities/screenreaders";
+@import "utilities/shadows";
+@import "utilities/sizing";
+@import "utilities/stretched-link";
+@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..89b60c0
--- /dev/null
+++ b/src/scss/bootstrap/_variables.scss
@@ -0,0 +1,1115 @@
+// Variables
+//
+// Variables should follow the `$component-state-property-size` formula for
+// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
+
+// Color system
+
+$white: #fff !default;
+$gray-100: #f8f9fa !default;
+$gray-200: #e9ecef !default;
+$gray-300: #dee2e6 !default;
+$gray-400: #ced4da !default;
+$gray-500: #adb5bd !default;
+$gray-600: #6c757d !default;
+$gray-700: #495057 !default;
+$gray-800: #343a40 !default;
+$gray-900: #212529 !default;
+$black: #000 !default;
+
+$grays: () !default;
+// stylelint-disable-next-line scss/dollar-variable-default
+$grays: map-merge(
+ (
+ "100": $gray-100,
+ "200": $gray-200,
+ "300": $gray-300,
+ "400": $gray-400,
+ "500": $gray-500,
+ "600": $gray-600,
+ "700": $gray-700,
+ "800": $gray-800,
+ "900": $gray-900
+ ),
+ $grays
+);
+
+$blue: #007bff !default;
+$indigo: #6610f2 !default;
+$purple: #6f42c1 !default;
+$pink: #e83e8c !default;
+$red: #dc3545 !default;
+$orange: #fd7e14 !default;
+$yellow: #ffc107 !default;
+$green: #28a745 !default;
+$teal: #20c997 !default;
+$cyan: #17a2b8 !default;
+
+$colors: () !default;
+// stylelint-disable-next-line scss/dollar-variable-default
+$colors: map-merge(
+ (
+ "blue": $blue,
+ "indigo": $indigo,
+ "purple": $purple,
+ "pink": $pink,
+ "red": $red,
+ "orange": $orange,
+ "yellow": $yellow,
+ "green": $green,
+ "teal": $teal,
+ "cyan": $cyan,
+ "white": $white,
+ "gray": $gray-600,
+ "gray-dark": $gray-800
+ ),
+ $colors
+);
+
+$primary: $blue !default;
+$secondary: $gray-600 !default;
+$success: $green !default;
+$info: $cyan !default;
+$warning: $yellow !default;
+$danger: $red !default;
+$light: $gray-100 !default;
+$dark: $gray-800 !default;
+
+$theme-colors: () !default;
+// stylelint-disable-next-line scss/dollar-variable-default
+$theme-colors: map-merge(
+ (
+ "primary": $primary,
+ "secondary": $secondary,
+ "success": $success,
+ "info": $info,
+ "warning": $warning,
+ "danger": $danger,
+ "light": $light,
+ "dark": $dark
+ ),
+ $theme-colors
+);
+
+// Set a specific jump point for requesting color jumps
+$theme-color-interval: 8% !default;
+
+// The yiq lightness value that determines when the lightness of color changes from "dark" to "light". Acceptable values are between 0 and 255.
+$yiq-contrasted-threshold: 150 !default;
+
+// Customize the light and dark text colors for use in our YIQ color contrast function.
+$yiq-text-dark: $gray-900 !default;
+$yiq-text-light: $white !default;
+
+
+// Options
+//
+// Quickly modify global styling by enabling or disabling optional features.
+
+$enable-caret: true !default;
+$enable-rounded: true !default;
+$enable-shadows: false !default;
+$enable-gradients: false !default;
+$enable-transitions: true !default;
+$enable-prefers-reduced-motion-media-query: true !default;
+$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS
+$enable-grid-classes: true !default;
+$enable-pointer-cursor-for-buttons: true !default;
+$enable-print-styles: true !default;
+$enable-responsive-font-sizes: false !default;
+$enable-validation-icons: true !default;
+$enable-deprecation-messages: 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: () !default;
+// stylelint-disable-next-line scss/dollar-variable-default
+$spacers: map-merge(
+ (
+ 0: 0,
+ 1: ($spacer * .25),
+ 2: ($spacer * .5),
+ 3: $spacer,
+ 4: ($spacer * 1.5),
+ 5: ($spacer * 3)
+ ),
+ $spacers
+);
+
+// This variable affects the `.h-*` and `.w-*` classes.
+$sizes: () !default;
+// stylelint-disable-next-line scss/dollar-variable-default
+$sizes: map-merge(
+ (
+ 25: 25%,
+ 50: 50%,
+ 75: 75%,
+ 100: 100%,
+ auto: auto
+ ),
+ $sizes
+);
+
+
+// Body
+//
+// Settings for the `<body>` element.
+
+$body-bg: $white !default;
+$body-color: $gray-900 !default;
+
+
+// Links
+//
+// Style anchor elements.
+
+$link-color: theme-color("primary") !default;
+$link-decoration: none !default;
+$link-hover-color: darken($link-color, 15%) !default;
+$link-hover-decoration: underline !default;
+// Darken percentage for links with `.text-*` class (e.g. `.text-success`)
+$emphasized-link-hover-darken-percentage: 15% !default;
+
+// Paragraphs
+//
+// Style p element.
+
+$paragraph-margin-bottom: 1rem !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-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: 30px !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-color: $gray-300 !default;
+
+$border-radius: .25rem !default;
+$border-radius-lg: .3rem !default;
+$border-radius-sm: .2rem !default;
+
+$rounded-pill: 50rem !default;
+
+$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;
+$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;
+$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;
+
+$component-active-color: $white !default;
+$component-active-bg: theme-color("primary") !default;
+
+$caret-width: .3em !default;
+$caret-vertical-align: $caret-width * .85 !default;
+$caret-spacing: $caret-width * .85 !default;
+
+$transition-base: all .2s ease-in-out !default;
+$transition-fade: opacity .15s linear !default;
+$transition-collapse: height .35s ease !default;
+
+$embed-responsive-aspect-ratios: () !default;
+// stylelint-disable-next-line scss/dollar-variable-default
+$embed-responsive-aspect-ratios: join(
+ (
+ (21 9),
+ (16 9),
+ (4 3),
+ (1 1),
+ ),
+ $embed-responsive-aspect-ratios
+);
+
+// Typography
+//
+// Font, line-height, and color for body text, headings, and more.
+
+// stylelint-disable value-keyword-case
+$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
+$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
+$font-family-base: $font-family-sans-serif !default;
+// stylelint-enable value-keyword-case
+
+$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`
+$font-size-lg: $font-size-base * 1.25 !default;
+$font-size-sm: $font-size-base * .875 !default;
+
+$font-weight-lighter: lighter !default;
+$font-weight-light: 300 !default;
+$font-weight-normal: 400 !default;
+$font-weight-bold: 700 !default;
+$font-weight-bolder: bolder !default;
+
+$font-weight-base: $font-weight-normal !default;
+$line-height-base: 1.5 !default;
+
+$h1-font-size: $font-size-base * 2.5 !default;
+$h2-font-size: $font-size-base * 2 !default;
+$h3-font-size: $font-size-base * 1.75 !default;
+$h4-font-size: $font-size-base * 1.5 !default;
+$h5-font-size: $font-size-base * 1.25 !default;
+$h6-font-size: $font-size-base !default;
+
+$headings-margin-bottom: $spacer / 2 !default;
+$headings-font-family: null !default;
+$headings-font-weight: 500 !default;
+$headings-line-height: 1.2 !default;
+$headings-color: null !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: $font-size-base * 1.25 !default;
+$lead-font-weight: 300 !default;
+
+$small-font-size: 80% !default;
+
+$text-muted: $gray-600 !default;
+
+$blockquote-small-color: $gray-600 !default;
+$blockquote-small-font-size: $small-font-size !default;
+$blockquote-font-size: $font-size-base * 1.25 !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: .5rem !default;
+
+$mark-bg: #fcf8e3 !default;
+
+$hr-margin-y: $spacer !default;
+
+
+// Tables
+//
+// Customizes the `.table` component with basic values, each used across all table variations.
+
+$table-cell-padding: .75rem !default;
+$table-cell-padding-sm: .3rem !default;
+
+$table-color: $body-color !default;
+$table-bg: null !default;
+$table-accent-bg: rgba($black, .05) !default;
+$table-hover-color: $table-color !default;
+$table-hover-bg: rgba($black, .075) !default;
+$table-active-bg: $table-hover-bg !default;
+
+$table-border-width: $border-width !default;
+$table-border-color: $border-color !default;
+
+$table-head-bg: $gray-200 !default;
+$table-head-color: $gray-700 !default;
+
+$table-dark-color: $white !default;
+$table-dark-bg: $gray-800 !default;
+$table-dark-accent-bg: rgba($white, .05) !default;
+$table-dark-hover-color: $table-dark-color !default;
+$table-dark-hover-bg: rgba($white, .075) !default;
+$table-dark-border-color: lighten($table-dark-bg, 7.5%) !default;
+
+$table-striped-order: odd !default;
+
+$table-caption-color: $text-muted !default;
+
+$table-bg-level: -9 !default;
+$table-border-level: -6 !default;
+
+
+// Buttons + Forms
+//
+// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.
+
+$input-btn-padding-y: .375rem !default;
+$input-btn-padding-x: .75rem !default;
+$input-btn-font-family: null !default;
+$input-btn-font-size: $font-size-base !default;
+$input-btn-line-height: $line-height-base !default;
+
+$input-btn-focus-width: .2rem !default;
+$input-btn-focus-color: rgba($component-active-bg, .25) !default;
+$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;
+
+$input-btn-padding-y-sm: .25rem !default;
+$input-btn-padding-x-sm: .5rem !default;
+$input-btn-font-size-sm: $font-size-sm !default;
+$input-btn-line-height-sm: $line-height-sm !default;
+
+$input-btn-padding-y-lg: .5rem !default;
+$input-btn-padding-x-lg: 1rem !default;
+$input-btn-font-size-lg: $font-size-lg !default;
+$input-btn-line-height-lg: $line-height-lg !default;
+
+$input-btn-border-width: $border-width !default;
+
+
+// Buttons
+//
+// For each of Bootstrap's buttons, define text, background, and border color.
+
+$btn-padding-y: $input-btn-padding-y !default;
+$btn-padding-x: $input-btn-padding-x !default;
+$btn-font-family: $input-btn-font-family !default;
+$btn-font-size: $input-btn-font-size !default;
+$btn-line-height: $input-btn-line-height !default;
+
+$btn-padding-y-sm: $input-btn-padding-y-sm !default;
+$btn-padding-x-sm: $input-btn-padding-x-sm !default;
+$btn-font-size-sm: $input-btn-font-size-sm !default;
+$btn-line-height-sm: $input-btn-line-height-sm !default;
+
+$btn-padding-y-lg: $input-btn-padding-y-lg !default;
+$btn-padding-x-lg: $input-btn-padding-x-lg !default;
+$btn-font-size-lg: $input-btn-font-size-lg !default;
+$btn-line-height-lg: $input-btn-line-height-lg !default;
+
+$btn-border-width: $input-btn-border-width !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-width: $input-btn-focus-width !default;
+$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;
+$btn-disabled-opacity: .65 !default;
+$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;
+
+$btn-link-disabled-color: $gray-600 !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: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
+
+
+// Forms
+
+$label-margin-bottom: .5rem !default;
+
+$input-padding-y: $input-btn-padding-y !default;
+$input-padding-x: $input-btn-padding-x !default;
+$input-font-family: $input-btn-font-family !default;
+$input-font-size: $input-btn-font-size !default;
+$input-font-weight: $font-weight-base !default;
+$input-line-height: $input-btn-line-height !default;
+
+$input-padding-y-sm: $input-btn-padding-y-sm !default;
+$input-padding-x-sm: $input-btn-padding-x-sm !default;
+$input-font-size-sm: $input-btn-font-size-sm !default;
+$input-line-height-sm: $input-btn-line-height-sm !default;
+
+$input-padding-y-lg: $input-btn-padding-y-lg !default;
+$input-padding-x-lg: $input-btn-padding-x-lg !default;
+$input-font-size-lg: $input-btn-font-size-lg !default;
+$input-line-height-lg: $input-btn-line-height-lg !default;
+
+$input-bg: $white !default;
+$input-disabled-bg: $gray-200 !default;
+
+$input-color: $gray-700 !default;
+$input-border-color: $gray-400 !default;
+$input-border-width: $input-btn-border-width !default;
+$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-focus-bg: $input-bg !default;
+$input-focus-border-color: lighten($component-active-bg, 25%) !default;
+$input-focus-color: $input-color !default;
+$input-focus-width: $input-btn-focus-width !default;
+$input-focus-box-shadow: $input-btn-focus-box-shadow !default;
+
+$input-placeholder-color: $gray-600 !default;
+$input-plaintext-color: $body-color !default;
+
+$input-height-border: $input-border-width * 2 !default;
+
+$input-height-inner: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2}) !default;
+$input-height-inner-half: calc(#{$input-line-height * .5em} + #{$input-padding-y}) !default;
+$input-height-inner-quarter: calc(#{$input-line-height * .25em} + #{$input-padding-y / 2}) !default;
+
+$input-height: calc(#{$input-line-height * 1em} + #{$input-padding-y * 2} + #{$input-height-border}) !default;
+$input-height-sm: calc(#{$input-line-height-sm * 1em} + #{$input-btn-padding-y-sm * 2} + #{$input-height-border}) !default;
+$input-height-lg: calc(#{$input-line-height-lg * 1em} + #{$input-btn-padding-y-lg * 2} + #{$input-height-border}) !default;
+
+$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
+
+$form-text-margin-top: .25rem !default;
+
+$form-check-input-gutter: 1.25rem !default;
+$form-check-input-margin-y: .3rem !default;
+$form-check-input-margin-x: .25rem !default;
+
+$form-check-inline-margin-x: .75rem !default;
+$form-check-inline-input-margin-x: .3125rem !default;
+
+$form-grid-gutter-width: 10px !default;
+$form-group-margin-bottom: 1rem !default;
+
+$input-group-addon-color: $input-color !default;
+$input-group-addon-bg: $gray-200 !default;
+$input-group-addon-border-color: $input-border-color !default;
+
+$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
+
+$custom-control-gutter: .5rem !default;
+$custom-control-spacer-x: 1rem !default;
+
+$custom-control-indicator-size: 1rem !default;
+$custom-control-indicator-bg: $input-bg !default;
+
+$custom-control-indicator-bg-size: 50% 50% !default;
+$custom-control-indicator-box-shadow: $input-box-shadow !default;
+$custom-control-indicator-border-color: $gray-500 !default;
+$custom-control-indicator-border-width: $input-border-width !default;
+
+$custom-control-indicator-disabled-bg: $input-disabled-bg !default;
+$custom-control-label-disabled-color: $gray-600 !default;
+
+$custom-control-indicator-checked-color: $component-active-color !default;
+$custom-control-indicator-checked-bg: $component-active-bg !default;
+$custom-control-indicator-checked-disabled-bg: rgba(theme-color("primary"), .5) !default;
+$custom-control-indicator-checked-box-shadow: none !default;
+$custom-control-indicator-checked-border-color: $custom-control-indicator-checked-bg !default;
+
+$custom-control-indicator-focus-box-shadow: $input-focus-box-shadow !default;
+$custom-control-indicator-focus-border-color: $input-focus-border-color !default;
+
+$custom-control-indicator-active-color: $component-active-color !default;
+$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;
+$custom-control-indicator-active-box-shadow: none !default;
+$custom-control-indicator-active-border-color: $custom-control-indicator-active-bg !default;
+
+$custom-checkbox-indicator-border-radius: $border-radius !default;
+$custom-checkbox-indicator-icon-checked: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$custom-control-indicator-checked-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-indicator-indeterminate-bg: $component-active-bg !default;
+$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;
+$custom-checkbox-indicator-icon-indeterminate: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3e%3c/svg%3e"), "#", "%23") !default;
+$custom-checkbox-indicator-indeterminate-box-shadow: none !default;
+$custom-checkbox-indicator-indeterminate-border-color: $custom-checkbox-indicator-indeterminate-bg !default;
+
+$custom-radio-indicator-border-radius: 50% !default;
+$custom-radio-indicator-icon-checked: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3e%3c/svg%3e"), "#", "%23") !default;
+
+$custom-switch-width: $custom-control-indicator-size * 1.75 !default;
+$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default;
+$custom-switch-indicator-size: calc(#{$custom-control-indicator-size} - #{$custom-control-indicator-border-width * 4}) !default;
+
+$custom-select-padding-y: $input-padding-y !default;
+$custom-select-padding-x: $input-padding-x !default;
+$custom-select-font-family: $input-font-family !default;
+$custom-select-font-size: $input-font-size !default;
+$custom-select-height: $input-height !default;
+$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator
+$custom-select-font-weight: $input-font-weight !default;
+$custom-select-line-height: $input-line-height !default;
+$custom-select-color: $input-color !default;
+$custom-select-disabled-color: $gray-600 !default;
+$custom-select-bg: $input-bg !default;
+$custom-select-disabled-bg: $gray-200 !default;
+$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions
+$custom-select-indicator-color: $gray-800 !default;
+$custom-select-indicator: str-replace(url("data:image/svg+xml,%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-background: $custom-select-indicator no-repeat right $custom-select-padding-x center / $custom-select-bg-size !default; // Used so we can have multiple background elements (e.g., arrow and feedback icon)
+
+$custom-select-feedback-icon-padding-right: calc((1em + #{2 * $custom-select-padding-y}) * 3 / 4 + #{$custom-select-padding-x + $custom-select-indicator-padding}) !default;
+$custom-select-feedback-icon-position: center right ($custom-select-padding-x + $custom-select-indicator-padding) !default;
+$custom-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;
+
+$custom-select-border-width: $input-border-width !default;
+$custom-select-border-color: $input-border-color !default;
+$custom-select-border-radius: $border-radius !default;
+$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;
+
+$custom-select-focus-border-color: $input-focus-border-color !default;
+$custom-select-focus-width: $input-focus-width !default;
+$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width $input-btn-focus-color !default;
+
+$custom-select-padding-y-sm: $input-padding-y-sm !default;
+$custom-select-padding-x-sm: $input-padding-x-sm !default;
+$custom-select-font-size-sm: $input-font-size-sm !default;
+$custom-select-height-sm: $input-height-sm !default;
+
+$custom-select-padding-y-lg: $input-padding-y-lg !default;
+$custom-select-padding-x-lg: $input-padding-x-lg !default;
+$custom-select-font-size-lg: $input-font-size-lg !default;
+$custom-select-height-lg: $input-height-lg !default;
+
+$custom-range-track-width: 100% !default;
+$custom-range-track-height: .5rem !default;
+$custom-range-track-cursor: pointer !default;
+$custom-range-track-bg: $gray-300 !default;
+$custom-range-track-border-radius: 1rem !default;
+$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;
+
+$custom-range-thumb-width: 1rem !default;
+$custom-range-thumb-height: $custom-range-thumb-width !default;
+$custom-range-thumb-bg: $component-active-bg !default;
+$custom-range-thumb-border: 0 !default;
+$custom-range-thumb-border-radius: 1rem !default;
+$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;
+$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;
+$custom-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in IE/Edge
+$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;
+$custom-range-thumb-disabled-bg: $gray-500 !default;
+
+$custom-file-height: $input-height !default;
+$custom-file-height-inner: $input-height-inner !default;
+$custom-file-focus-border-color: $input-focus-border-color !default;
+$custom-file-focus-box-shadow: $input-focus-box-shadow !default;
+$custom-file-disabled-bg: $input-disabled-bg !default;
+
+$custom-file-padding-y: $input-padding-y !default;
+$custom-file-padding-x: $input-padding-x !default;
+$custom-file-line-height: $input-line-height !default;
+$custom-file-font-family: $input-font-family !default;
+$custom-file-font-weight: $input-font-weight !default;
+$custom-file-color: $input-color !default;
+$custom-file-bg: $input-bg !default;
+$custom-file-border-width: $input-border-width !default;
+$custom-file-border-color: $input-border-color !default;
+$custom-file-border-radius: $input-border-radius !default;
+$custom-file-box-shadow: $input-box-shadow !default;
+$custom-file-button-color: $custom-file-color !default;
+$custom-file-button-bg: $input-group-addon-bg !default;
+$custom-file-text: (
+ en: "Browse"
+) !default;
+
+
+// Form validation
+
+$form-feedback-margin-top: $form-text-margin-top !default;
+$form-feedback-font-size: $small-font-size !default;
+$form-feedback-valid-color: theme-color("success") !default;
+$form-feedback-invalid-color: theme-color("danger") !default;
+
+$form-feedback-icon-valid-color: $form-feedback-valid-color !default;
+$form-feedback-icon-valid: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='#{$form-feedback-icon-valid-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-feedback-icon-invalid-color: $form-feedback-invalid-color !default;
+$form-feedback-icon-invalid: str-replace(url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$form-feedback-icon-invalid-color}' viewBox='-2 -2 7 7'%3e%3cpath stroke='#{$form-feedback-icon-invalid-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;
+
+$form-validation-states: () !default;
+// stylelint-disable-next-line scss/dollar-variable-default
+$form-validation-states: map-merge(
+ (
+ "valid": (
+ "color": $form-feedback-valid-color,
+ "icon": $form-feedback-icon-valid
+ ),
+ "invalid": (
+ "color": $form-feedback-invalid-color,
+ "icon": $form-feedback-icon-invalid
+ ),
+ ),
+ $form-validation-states
+);
+
+// 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-link-padding-y: .5rem !default;
+$nav-link-padding-x: 1rem !default;
+$nav-link-disabled-color: $gray-600 !default;
+
+$nav-tabs-border-color: $gray-300 !default;
+$nav-tabs-border-width: $border-width !default;
+$nav-tabs-border-radius: $border-radius !default;
+$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;
+$nav-tabs-link-active-color: $gray-700 !default;
+$nav-tabs-link-active-bg: $body-bg !default;
+$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;
+
+$nav-pills-border-radius: $border-radius !default;
+$nav-pills-link-active-color: $component-active-color !default;
+$nav-pills-link-active-bg: $component-active-bg !default;
+
+$nav-divider-color: $gray-200 !default;
+$nav-divider-margin-y: $spacer / 2 !default;
+
+
+// Navbar
+
+$navbar-padding-y: $spacer / 2 !default;
+$navbar-padding-x: $spacer !default;
+
+$navbar-nav-link-padding-x: .5rem !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: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;
+$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;
+$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;
+
+$navbar-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-dark-color: rgba($white, .5) !default;
+$navbar-dark-hover-color: rgba($white, .75) !default;
+$navbar-dark-active-color: $white !default;
+$navbar-dark-disabled-color: rgba($white, .25) !default;
+$navbar-dark-toggler-icon-bg: str-replace(url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"), "#", "%23") !default;
+$navbar-dark-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-icon-bg: str-replace(url("data:image/svg+xml,%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;
+
+$navbar-light-brand-color: $navbar-light-active-color !default;
+$navbar-light-brand-hover-color: $navbar-light-active-color !default;
+$navbar-dark-brand-color: $navbar-dark-active-color !default;
+$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;
+
+
+// Dropdowns
+//
+// Dropdown menu container and contents.
+
+$dropdown-min-width: 10rem !default;
+$dropdown-padding-y: .5rem !default;
+$dropdown-spacer: .125rem !default;
+$dropdown-font-size: $font-size-base !default;
+$dropdown-color: $body-color !default;
+$dropdown-bg: $white !default;
+$dropdown-border-color: rgba($black, .15) !default;
+$dropdown-border-radius: $border-radius !default;
+$dropdown-border-width: $border-width !default;
+$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default;
+$dropdown-divider-bg: $gray-200 !default;
+$dropdown-divider-margin-y: $nav-divider-margin-y !default;
+$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;
+
+$dropdown-link-color: $gray-900 !default;
+$dropdown-link-hover-color: darken($gray-900, 5%) !default;
+$dropdown-link-hover-bg: $gray-100 !default;
+
+$dropdown-link-active-color: $component-active-color !default;
+$dropdown-link-active-bg: $component-active-bg !default;
+
+$dropdown-link-disabled-color: $gray-600 !default;
+
+$dropdown-item-padding-y: .25rem !default;
+$dropdown-item-padding-x: 1.5rem !default;
+
+$dropdown-header-color: $gray-600 !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: $gray-300 !default;
+
+$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;
+$pagination-focus-outline: 0 !default;
+
+$pagination-hover-color: $link-hover-color !default;
+$pagination-hover-bg: $gray-200 !default;
+$pagination-hover-border-color: $gray-300 !default;
+
+$pagination-active-color: $component-active-color !default;
+$pagination-active-bg: $component-active-bg !default;
+$pagination-active-border-color: $pagination-active-bg !default;
+
+$pagination-disabled-color: $gray-600 !default;
+$pagination-disabled-bg: $white !default;
+$pagination-disabled-border-color: $gray-300 !default;
+
+
+// Jumbotron
+
+$jumbotron-padding: 2rem !default;
+$jumbotron-color: null !default;
+$jumbotron-bg: $gray-200 !default;
+
+
+// Cards
+
+$card-spacer-y: .75rem !default;
+$card-spacer-x: 1.25rem !default;
+$card-border-width: $border-width !default;
+$card-border-radius: $border-radius !default;
+$card-border-color: rgba($black, .125) !default;
+$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;
+$card-cap-bg: rgba($black, .03) !default;
+$card-cap-color: null !default;
+$card-color: null !default;
+$card-bg: $white !default;
+
+$card-img-overlay-padding: 1.25rem !default;
+
+$card-group-margin: $grid-gutter-width / 2 !default;
+$card-deck-margin: $card-group-margin !default;
+
+$card-columns-count: 3 !default;
+$card-columns-gap: 1.25rem !default;
+$card-columns-margin: $card-spacer-y !default;
+
+
+// Tooltips
+
+$tooltip-font-size: $font-size-sm !default;
+$tooltip-max-width: 200px !default;
+$tooltip-color: $white !default;
+$tooltip-bg: $black !default;
+$tooltip-border-radius: $border-radius !default;
+$tooltip-opacity: .9 !default;
+$tooltip-padding-y: .25rem !default;
+$tooltip-padding-x: .5rem !default;
+$tooltip-margin: 0 !default;
+
+$tooltip-arrow-width: .8rem !default;
+$tooltip-arrow-height: .4rem !default;
+$tooltip-arrow-color: $tooltip-bg !default;
+
+// Form tooltips must come after regular tooltips
+$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;
+$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;
+$form-feedback-tooltip-font-size: $tooltip-font-size !default;
+$form-feedback-tooltip-line-height: $line-height-base !default;
+$form-feedback-tooltip-opacity: $tooltip-opacity !default;
+$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;
+
+
+// Popovers
+
+$popover-font-size: $font-size-sm !default;
+$popover-bg: $white !default;
+$popover-max-width: 276px !default;
+$popover-border-width: $border-width !default;
+$popover-border-color: rgba($black, .2) !default;
+$popover-border-radius: $border-radius-lg !default;
+$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;
+
+$popover-header-bg: darken($popover-bg, 3%) !default;
+$popover-header-color: $headings-color !default;
+$popover-header-padding-y: .5rem !default;
+$popover-header-padding-x: .75rem !default;
+
+$popover-body-color: $body-color !default;
+$popover-body-padding-y: $popover-header-padding-y !default;
+$popover-body-padding-x: $popover-header-padding-x !default;
+
+$popover-arrow-width: 1rem !default;
+$popover-arrow-height: .5rem !default;
+$popover-arrow-color: $popover-bg !default;
+
+$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;
+
+
+// Toasts
+
+$toast-max-width: 350px !default;
+$toast-padding-x: .75rem !default;
+$toast-padding-y: .25rem !default;
+$toast-font-size: .875rem !default;
+$toast-color: null !default;
+$toast-background-color: rgba($white, .85) !default;
+$toast-border-width: 1px !default;
+$toast-border-color: rgba(0, 0, 0, .1) !default;
+$toast-border-radius: .25rem !default;
+$toast-box-shadow: 0 .25rem .75rem rgba($black, .1) !default;
+
+$toast-header-color: $gray-600 !default;
+$toast-header-background-color: rgba($white, .85) !default;
+$toast-header-border-color: rgba(0, 0, 0, .05) !default;
+
+
+// Badges
+
+$badge-font-size: 75% !default;
+$badge-font-weight: $font-weight-bold !default;
+$badge-color: $white !default;
+$badge-padding-y: .25em !default;
+$badge-padding-x: .5em !default;
+$badge-border-radius: $border-radius !default;
+
+
+// Modals
+
+// Padding applied to the modal body
+$modal-inner-padding: 1rem !default;
+
+$modal-dialog-margin: .5rem !default;
+$modal-dialog-margin-y-sm-up: 1.75rem !default;
+
+$modal-title-line-height: $line-height-base !default;
+
+$modal-content-color: null !default;
+$modal-content-bg: $white !default;
+$modal-content-border-color: rgba($black, .2) !default;
+$modal-content-border-width: $border-width !default;
+$modal-content-border-radius: $border-radius-lg !default;
+$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;
+$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;
+
+$modal-backdrop-bg: $black !default;
+$modal-backdrop-opacity: .5 !default;
+$modal-header-border-color: $border-color !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-y: 1rem !default;
+$modal-header-padding-x: 1rem !default;
+$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility
+
+$modal-xl: 1140px !default;
+$modal-lg: 800px !default;
+$modal-md: 500px !default;
+$modal-sm: 300px !default;
+
+$modal-fade-transform: translate(0, -50px) !default;
+$modal-show-transform: none !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-bg-level: -10 !default;
+$alert-border-level: -9 !default;
+$alert-color-level: 6 !default;
+
+
+// Progress bars
+
+$progress-height: 1rem !default;
+$progress-font-size: $font-size-base * .75 !default;
+$progress-bg: $gray-200 !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: theme-color("primary") !default;
+$progress-bar-animation-timing: 1s linear infinite !default;
+$progress-bar-transition: width .6s ease !default;
+
+
+// List group
+
+$list-group-color: null !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-100 !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-600 !default;
+$list-group-disabled-bg: $list-group-bg !default;
+
+$list-group-action-color: $gray-700 !default;
+$list-group-action-hover-color: $list-group-action-color !default;
+
+$list-group-action-active-color: $body-color !default;
+$list-group-action-active-bg: $gray-200 !default;
+
+
+// Image thumbnails
+
+$thumbnail-padding: .25rem !default;
+$thumbnail-bg: $body-bg !default;
+$thumbnail-border-width: $border-width !default;
+$thumbnail-border-color: $gray-300 !default;
+$thumbnail-border-radius: $border-radius !default;
+$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;
+
+
+// Figures
+
+$figure-caption-font-size: 90% !default;
+$figure-caption-color: $gray-600 !default;
+
+
+// Breadcrumbs
+
+$breadcrumb-padding-y: .75rem !default;
+$breadcrumb-padding-x: 1rem !default;
+$breadcrumb-item-padding-x: .5rem !default;
+
+$breadcrumb-margin-bottom: 1rem !default;
+
+$breadcrumb-bg: $gray-200 !default;
+$breadcrumb-divider-color: $gray-600 !default;
+$breadcrumb-active-color: $gray-600 !default;
+$breadcrumb-divider: quote("/") !default;
+
+$breadcrumb-border-radius: $border-radius !default;
+
+
+// Carousel
+
+$carousel-control-color: $white !default;
+$carousel-control-width: 15% !default;
+$carousel-control-opacity: .5 !default;
+$carousel-control-hover-opacity: .9 !default;
+$carousel-control-transition: opacity .15s ease !default;
+
+$carousel-indicator-width: 30px !default;
+$carousel-indicator-height: 3px !default;
+$carousel-indicator-hit-area-height: 10px !default;
+$carousel-indicator-spacer: 3px !default;
+$carousel-indicator-active-bg: $white !default;
+$carousel-indicator-transition: opacity .6s ease !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,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M5.25 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,%3csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3e%3cpath d='M2.75 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-duration: .6s !default;
+$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)
+
+
+// Spinners
+
+$spinner-width: 2rem !default;
+$spinner-height: $spinner-width !default;
+$spinner-border-width: .25em !default;
+
+$spinner-width-sm: 1rem !default;
+$spinner-height-sm: $spinner-width-sm !default;
+$spinner-border-width-sm: .2em !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: 87.5% !default;
+$code-color: $pink !default;
+
+$kbd-padding-y: .2rem !default;
+$kbd-padding-x: .4rem !default;
+$kbd-font-size: $code-font-size !default;
+$kbd-color: $white !default;
+$kbd-bg: $gray-900 !default;
+
+$pre-color: $gray-900 !default;
+$pre-scrollable-max-height: 340px !default;
+
+
+// Utilities
+
+$displays: none, inline, inline-block, block, table, table-row, table-cell, flex, inline-flex !default;
+$overflows: auto, hidden !default;
+$positions: static, relative, absolute, fixed, sticky !default;
+
+
+// Printing
+
+$print-page-size: a3 !default;
+$print-body-min-width: map-get($grid-breakpoints, "lg") !default;
diff --git a/src/scss/bootstrap/bootstrap-grid.scss b/src/scss/bootstrap/bootstrap-grid.scss
new file mode 100644
index 0000000..d5f92a1
--- /dev/null
+++ b/src/scss/bootstrap/bootstrap-grid.scss
@@ -0,0 +1,29 @@
+/*!
+ * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+html {
+ box-sizing: border-box;
+ -ms-overflow-style: scrollbar;
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: inherit;
+}
+
+@import "functions";
+@import "variables";
+
+@import "mixins/breakpoints";
+@import "mixins/grid-framework";
+@import "mixins/grid";
+
+@import "grid";
+@import "utilities/display";
+@import "utilities/flex";
+@import "utilities/spacing";
diff --git a/src/scss/bootstrap/bootstrap-reboot.scss b/src/scss/bootstrap/bootstrap-reboot.scss
new file mode 100644
index 0000000..2983f3f
--- /dev/null
+++ b/src/scss/bootstrap/bootstrap-reboot.scss
@@ -0,0 +1,12 @@
+/*!
+ * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
+ */
+
+@import "functions";
+@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..9f15c2a
--- /dev/null
+++ b/src/scss/bootstrap/bootstrap.scss
@@ -0,0 +1,44 @@
+/*!
+ * Bootstrap v4.3.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 The Bootstrap Authors
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+@import "functions";
+@import "variables";
+@import "mixins";
+@import "root";
+@import "reboot";
+@import "type";
+@import "images";
+@import "code";
+@import "grid";
+@import "tables";
+@import "forms";
+@import "buttons";
+@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 "close";
+@import "toasts";
+@import "modal";
+@import "tooltip";
+@import "popover";
+@import "carousel";
+@import "spinners";
+@import "utilities";
+@import "print";
diff --git a/src/scss/bootstrap/mixins/_alert.scss b/src/scss/bootstrap/mixins/_alert.scss
new file mode 100644
index 0000000..20da83a
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_alert.scss
@@ -0,0 +1,9 @@
+@mixin alert-variant($background, $border, $color) {
+ color: $color;
+ @include gradient-bg($background);
+ border-color: $border;
+
+ .alert-link {
+ color: darken($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..55dcccd
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_background-variant.scss
@@ -0,0 +1,7 @@
+// stylelint-disable declaration-no-important
+
+@mixin bg-gradient-variant($parent, $color) {
+ #{$parent} {
+ background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important;
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_border-radius.scss b/src/scss/bootstrap/mixins/_border-radius.scss
new file mode 100644
index 0000000..88aeb37
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_border-radius.scss
@@ -0,0 +1,63 @@
+// stylelint-disable property-blacklist
+// Single side border-radius
+
+@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {
+ @if $enable-rounded {
+ border-radius: $radius;
+ }
+ @else if $fallback-border-radius != false {
+ border-radius: $fallback-border-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;
+ }
+}
+
+@mixin border-top-left-radius($radius) {
+ @if $enable-rounded {
+ border-top-left-radius: $radius;
+ }
+}
+
+@mixin border-top-right-radius($radius) {
+ @if $enable-rounded {
+ border-top-right-radius: $radius;
+ }
+}
+
+@mixin border-bottom-right-radius($radius) {
+ @if $enable-rounded {
+ border-bottom-right-radius: $radius;
+ }
+}
+
+@mixin border-bottom-left-radius($radius) {
+ @if $enable-rounded {
+ 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..0726d43
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_box-shadow.scss
@@ -0,0 +1,20 @@
+@mixin box-shadow($shadow...) {
+ @if $enable-shadows {
+ $result: ();
+
+ @if (length($shadow) == 1) {
+ // We can pass `@include box-shadow(none);`
+ $result: $shadow;
+ } @else {
+ // Filter to avoid invalid properties for example `box-shadow: none, 1px 1px black;`
+ @for $i from 1 through length($shadow) {
+ @if nth($shadow, $i) != "none" {
+ $result: append($result, nth($shadow, $i), "comma");
+ }
+ }
+ }
+ @if (length($result) > 0) {
+ box-shadow: $result;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_breakpoints.scss b/src/scss/bootstrap/mixins/_breakpoints.scss
new file mode 100644
index 0000000..23a5de9
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_breakpoints.scss
@@ -0,0 +1,123 @@
+// 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 != null and $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.02px
+// to work around the limitations of `min-` and `max-` prefixes and viewports with fractional widths.
+// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max
+// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.
+// See https://bugs.webkit.org/show_bug.cgi?id=178261
+//
+// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
+// 767.98px
+@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {
+ $next: breakpoint-next($name, $breakpoints);
+ @return if($next, breakpoint-min($next, $breakpoints) - .02, null);
+}
+
+// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.
+// 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-min($lower, $breakpoints);
+ $max: breakpoint-max($upper, $breakpoints);
+
+ @if $min != null and $max != null {
+ @media (min-width: $min) and (max-width: $max) {
+ @content;
+ }
+ } @else if $max == null {
+ @include media-breakpoint-up($lower, $breakpoints) {
+ @content;
+ }
+ } @else if $min == null {
+ @include media-breakpoint-down($upper, $breakpoints) {
+ @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);
+
+ @if $min != null and $max != null {
+ @media (min-width: $min) and (max-width: $max) {
+ @content;
+ }
+ } @else if $max == null {
+ @include media-breakpoint-up($name, $breakpoints) {
+ @content;
+ }
+ } @else if $min == null {
+ @include media-breakpoint-down($name, $breakpoints) {
+ @content;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_buttons.scss b/src/scss/bootstrap/mixins/_buttons.scss
new file mode 100644
index 0000000..eee903f
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_buttons.scss
@@ -0,0 +1,107 @@
+// Button variants
+//
+// Easily pump out default styles, as well as :hover, :focus, :active,
+// and disabled options for all buttons
+
+@mixin button-variant($background, $border, $hover-background: darken($background, 7.5%), $hover-border: darken($border, 10%), $active-background: darken($background, 10%), $active-border: darken($border, 12.5%)) {
+ color: color-yiq($background);
+ @include gradient-bg($background);
+ border-color: $border;
+ @include box-shadow($btn-box-shadow);
+
+ @include hover {
+ color: color-yiq($hover-background);
+ @include gradient-bg($hover-background);
+ border-color: $hover-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 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);
+ } @else {
+ box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);
+ }
+ }
+
+ // Disabled comes first so active can properly restyle
+ &.disabled,
+ &:disabled {
+ color: color-yiq($background);
+ background-color: $background;
+ border-color: $border;
+ // Remove CSS gradients if they're enabled
+ @if $enable-gradients {
+ background-image: none;
+ }
+ }
+
+ &:not(:disabled):not(.disabled):active,
+ &:not(:disabled):not(.disabled).active,
+ .show > &.dropdown-toggle {
+ color: color-yiq($active-background);
+ background-color: $active-background;
+ @if $enable-gradients {
+ background-image: none; // Remove the gradient for the pressed/active state
+ }
+ border-color: $active-border;
+
+ &:focus {
+ // Avoid using mixin so we can pass custom focus shadow properly
+ @if $enable-shadows and $btn-active-box-shadow != none {
+ box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);
+ } @else {
+ box-shadow: 0 0 0 $btn-focus-width rgba(mix(color-yiq($background), $border, 15%), .5);
+ }
+ }
+ }
+}
+
+@mixin button-outline-variant($color, $color-hover: color-yiq($color), $active-background: $color, $active-border: $color) {
+ color: $color;
+ border-color: $color;
+
+ @include hover {
+ color: $color-hover;
+ background-color: $active-background;
+ border-color: $active-border;
+ }
+
+ &:focus,
+ &.focus {
+ box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);
+ }
+
+ &.disabled,
+ &:disabled {
+ color: $color;
+ background-color: transparent;
+ }
+
+ &:not(:disabled):not(.disabled):active,
+ &:not(:disabled):not(.disabled).active,
+ .show > &.dropdown-toggle {
+ color: color-yiq($active-background);
+ background-color: $active-background;
+ border-color: $active-border;
+
+ &:focus {
+ // Avoid using mixin so we can pass custom focus shadow properly
+ @if $enable-shadows and $btn-active-box-shadow != none {
+ box-shadow: $btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5);
+ } @else {
+ box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);
+ }
+ }
+ }
+}
+
+// Button sizes
+@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
+ padding: $padding-y $padding-x;
+ @include font-size($font-size);
+ line-height: $line-height;
+ // Manually declare to provide an override to the browser default
+ @include border-radius($border-radius, 0);
+}
diff --git a/src/scss/bootstrap/mixins/_caret.scss b/src/scss/bootstrap/mixins/_caret.scss
new file mode 100644
index 0000000..8ecef65
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_caret.scss
@@ -0,0 +1,62 @@
+@mixin caret-down {
+ border-top: $caret-width solid;
+ border-right: $caret-width solid transparent;
+ border-bottom: 0;
+ border-left: $caret-width solid transparent;
+}
+
+@mixin caret-up {
+ border-top: 0;
+ border-right: $caret-width solid transparent;
+ border-bottom: $caret-width solid;
+ border-left: $caret-width solid transparent;
+}
+
+@mixin caret-right {
+ border-top: $caret-width solid transparent;
+ border-right: 0;
+ border-bottom: $caret-width solid transparent;
+ border-left: $caret-width solid;
+}
+
+@mixin caret-left {
+ border-top: $caret-width solid transparent;
+ border-right: $caret-width solid;
+ border-bottom: $caret-width solid transparent;
+}
+
+@mixin caret($direction: down) {
+ @if $enable-caret {
+ &::after {
+ display: inline-block;
+ margin-left: $caret-spacing;
+ vertical-align: $caret-vertical-align;
+ content: "";
+ @if $direction == down {
+ @include caret-down;
+ } @else if $direction == up {
+ @include caret-up;
+ } @else if $direction == right {
+ @include caret-right;
+ }
+ }
+
+ @if $direction == left {
+ &::after {
+ display: none;
+ }
+
+ &::before {
+ display: inline-block;
+ margin-right: $caret-spacing;
+ vertical-align: $caret-vertical-align;
+ content: "";
+ @include caret-left;
+ }
+ }
+
+ &:empty::after {
+ margin-left: 0;
+ }
+ }
+}
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/_deprecate.scss b/src/scss/bootstrap/mixins/_deprecate.scss
new file mode 100644
index 0000000..df070bc
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_deprecate.scss
@@ -0,0 +1,10 @@
+// Deprecate mixin
+//
+// This mixin can be used to deprecate mixins or functions.
+// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to
+// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)
+@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {
+ @if ($enable-deprecation-messages != false and $ignore-warning != true) {
+ @warn "#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.";
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_forms.scss b/src/scss/bootstrap/mixins/_forms.scss
new file mode 100644
index 0000000..1b51a64
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_forms.scss
@@ -0,0 +1,193 @@
+// Form control focus state
+//
+// Generate a customized focus state and for any input with the specified color,
+// which defaults to the `$input-focus-border-color` 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($ignore-warning: false) {
+ &:focus {
+ color: $input-focus-color;
+ background-color: $input-focus-bg;
+ border-color: $input-focus-border-color;
+ outline: 0;
+ // Avoid using mixin so we can pass custom focus shadow properly
+ @if $enable-shadows {
+ box-shadow: $input-box-shadow, $input-focus-box-shadow;
+ } @else {
+ box-shadow: $input-focus-box-shadow;
+ }
+ }
+ @include deprecate("The `form-control-focus()` mixin", "v4.3.2", "v5", $ignore-warning);
+}
+
+
+@mixin form-validation-state($state, $color, $icon) {
+ .#{$state}-feedback {
+ display: none;
+ width: 100%;
+ margin-top: $form-feedback-margin-top;
+ @include font-size($form-feedback-font-size);
+ color: $color;
+ }
+
+ .#{$state}-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ max-width: 100%; // Contain to parent when possible
+ padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;
+ margin-top: .1rem;
+ @include font-size($form-feedback-tooltip-font-size);
+ line-height: $form-feedback-tooltip-line-height;
+ color: color-yiq($color);
+ background-color: rgba($color, $form-feedback-tooltip-opacity);
+ @include border-radius($form-feedback-tooltip-border-radius);
+ }
+
+ .form-control {
+ .was-validated &:#{$state},
+ &.is-#{$state} {
+ border-color: $color;
+
+ @if $enable-validation-icons {
+ padding-right: $input-height-inner;
+ background-image: $icon;
+ background-repeat: no-repeat;
+ background-position: center right $input-height-inner-quarter;
+ background-size: $input-height-inner-half $input-height-inner-half;
+ }
+
+ &:focus {
+ border-color: $color;
+ box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
+ }
+
+ ~ .#{$state}-feedback,
+ ~ .#{$state}-tooltip {
+ display: block;
+ }
+ }
+ }
+
+ // stylelint-disable-next-line selector-no-qualifying-type
+ textarea.form-control {
+ .was-validated &:#{$state},
+ &.is-#{$state} {
+ @if $enable-validation-icons {
+ padding-right: $input-height-inner;
+ background-position: top $input-height-inner-quarter right $input-height-inner-quarter;
+ }
+ }
+ }
+
+ .custom-select {
+ .was-validated &:#{$state},
+ &.is-#{$state} {
+ border-color: $color;
+
+ @if $enable-validation-icons {
+ padding-right: $custom-select-feedback-icon-padding-right;
+ background: $custom-select-background, $icon $custom-select-bg no-repeat $custom-select-feedback-icon-position / $custom-select-feedback-icon-size;
+ }
+
+ &:focus {
+ border-color: $color;
+ box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
+ }
+
+ ~ .#{$state}-feedback,
+ ~ .#{$state}-tooltip {
+ display: block;
+ }
+ }
+ }
+
+
+ .form-control-file {
+ .was-validated &:#{$state},
+ &.is-#{$state} {
+ ~ .#{$state}-feedback,
+ ~ .#{$state}-tooltip {
+ display: block;
+ }
+ }
+ }
+
+ .form-check-input {
+ .was-validated &:#{$state},
+ &.is-#{$state} {
+ ~ .form-check-label {
+ color: $color;
+ }
+
+ ~ .#{$state}-feedback,
+ ~ .#{$state}-tooltip {
+ display: block;
+ }
+ }
+ }
+
+ .custom-control-input {
+ .was-validated &:#{$state},
+ &.is-#{$state} {
+ ~ .custom-control-label {
+ color: $color;
+
+ &::before {
+ border-color: $color;
+ }
+ }
+
+ ~ .#{$state}-feedback,
+ ~ .#{$state}-tooltip {
+ display: block;
+ }
+
+ &:checked {
+ ~ .custom-control-label::before {
+ border-color: lighten($color, 10%);
+ @include gradient-bg(lighten($color, 10%));
+ }
+ }
+
+ &:focus {
+ ~ .custom-control-label::before {
+ box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
+ }
+
+ &:not(:checked) ~ .custom-control-label::before {
+ border-color: $color;
+ }
+ }
+ }
+ }
+
+ // custom file
+ .custom-file-input {
+ .was-validated &:#{$state},
+ &.is-#{$state} {
+ ~ .custom-file-label {
+ border-color: $color;
+ }
+
+ ~ .#{$state}-feedback,
+ ~ .#{$state}-tooltip {
+ display: block;
+ }
+
+ &:focus {
+ ~ .custom-file-label {
+ border-color: $color;
+ box-shadow: 0 0 0 $input-focus-width rgba($color, .25);
+ }
+ }
+ }
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_gradients.scss b/src/scss/bootstrap/mixins/_gradients.scss
new file mode 100644
index 0000000..88c4d64
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_gradients.scss
@@ -0,0 +1,45 @@
+// Gradients
+
+@mixin gradient-bg($color) {
+ @if $enable-gradients {
+ background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x;
+ } @else {
+ background-color: $color;
+ }
+}
+
+// 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: $gray-700, $end-color: $gray-800, $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: $gray-700, $end-color: $gray-800, $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: $gray-700, $end-color: $gray-800, $deg: 45deg) {
+ background-image: linear-gradient($deg, $start-color, $end-color);
+ background-repeat: repeat-x;
+}
+@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {
+ 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: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {
+ background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
+ background-repeat: no-repeat;
+}
+@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {
+ background-image: radial-gradient(circle, $inner-color, $outer-color);
+ background-repeat: no-repeat;
+}
+@mixin gradient-striped($color: rgba($white, .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..649c28b
--- /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, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {
+ // Common properties for all breakpoints
+ %grid-column {
+ position: relative;
+ width: 100%;
+ padding-right: $gutter / 2;
+ padding-left: $gutter / 2;
+ }
+
+ @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;
+ max-width: 100%; // Reset earlier grid tiers
+ }
+
+ @for $i from 1 through $columns {
+ .col#{$infix}-#{$i} {
+ @include make-col($i, $columns);
+ }
+ }
+
+ .order#{$infix}-first { order: -1; }
+
+ .order#{$infix}-last { order: $columns + 1; }
+
+ @for $i from 0 through $columns {
+ .order#{$infix}-#{$i} { order: $i; }
+ }
+
+ // `$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-0
+ .offset#{$infix}-#{$i} {
+ @include make-col-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..924eb0c
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_grid.scss
@@ -0,0 +1,51 @@
+/// Grid system
+//
+// Generate semantic grid columns with these mixins.
+
+@mixin make-container($gutter: $grid-gutter-width) {
+ width: 100%;
+ padding-right: $gutter / 2;
+ padding-left: $gutter / 2;
+ margin-right: auto;
+ margin-left: auto;
+}
+
+
+// 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) {
+ max-width: $container-max-width;
+ }
+ }
+}
+
+@mixin make-row($gutter: $grid-gutter-width) {
+ display: flex;
+ flex-wrap: wrap;
+ margin-right: -$gutter / 2;
+ margin-left: -$gutter / 2;
+}
+
+@mixin make-col-ready($gutter: $grid-gutter-width) {
+ 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%;
+ padding-right: $gutter / 2;
+ padding-left: $gutter / 2;
+}
+
+@mixin make-col($size, $columns: $grid-columns) {
+ flex: 0 0 percentage($size / $columns);
+ // Add a `max-width` to ensure content within each column does not blow out
+ // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari
+ // do not appear to require this.
+ max-width: percentage($size / $columns);
+}
+
+@mixin make-col-offset($size, $columns: $grid-columns) {
+ $num: $size / $columns;
+ margin-left: if($num == 0, 0, percentage($num));
+}
diff --git a/src/scss/bootstrap/mixins/_hover.scss b/src/scss/bootstrap/mixins/_hover.scss
new file mode 100644
index 0000000..192f847
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_hover.scss
@@ -0,0 +1,37 @@
+// Hover mixin and `$enable-hover-media-query` are deprecated.
+//
+// Originally added during our alphas and maintained during betas, this mixin was
+// designed to prevent `:hover` stickiness on iOS-an issue where hover styles
+// would persist after initial touch.
+//
+// For backward compatibility, we've kept these mixins and updated them to
+// always return their regular pseudo-classes instead of a shimmed media query.
+//
+// Issue: https://github.com/twbs/bootstrap/issues/25195
+
+@mixin hover {
+ &:hover { @content; }
+}
+
+@mixin hover-focus {
+ &:hover,
+ &:focus {
+ @content;
+ }
+}
+
+@mixin plain-hover-focus {
+ &,
+ &:hover,
+ &:focus {
+ @content;
+ }
+}
+
+@mixin hover-focus-active {
+ &:hover,
+ &:focus,
+ &:active {
+ @content;
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_image.scss b/src/scss/bootstrap/mixins/_image.scss
new file mode 100644
index 0000000..e1df779
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_image.scss
@@ -0,0 +1,16 @@
+// 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;
+}
diff --git a/src/scss/bootstrap/mixins/_list-group.scss b/src/scss/bootstrap/mixins/_list-group.scss
new file mode 100644
index 0000000..cd47a4e
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_list-group.scss
@@ -0,0 +1,21 @@
+// List Groups
+
+@mixin list-group-item-variant($state, $background, $color) {
+ .list-group-item-#{$state} {
+ color: $color;
+ background-color: $background;
+
+ &.list-group-item-action {
+ @include hover-focus {
+ color: $color;
+ background-color: darken($background, 5%);
+ }
+
+ &.active {
+ color: $white;
+ background-color: $color;
+ border-color: $color;
+ }
+ }
+ }
+}
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..4fb37b6
--- /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: $nav-divider-color, $margin-y: $nav-divider-margin-y) {
+ height: 0;
+ margin: $margin-y 0;
+ overflow: hidden;
+ border-top: 1px solid $color;
+}
diff --git a/src/scss/bootstrap/mixins/_pagination.scss b/src/scss/bootstrap/mixins/_pagination.scss
new file mode 100644
index 0000000..af8e16d
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_pagination.scss
@@ -0,0 +1,22 @@
+// Pagination
+
+@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
+ .page-link {
+ padding: $padding-y $padding-x;
+ @include font-size($font-size);
+ line-height: $line-height;
+ }
+
+ .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..bfa9f6e
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_reset-text.scss
@@ -0,0 +1,17 @@
+@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..812591b
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_screen-reader.scss
@@ -0,0 +1,33 @@
+// Only display content to screen readers
+//
+// See: https://a11yproject.com/posts/how-to-hide-content/
+// See: https://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;
+ 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;
+ }
+}
diff --git a/src/scss/bootstrap/mixins/_table-row.scss b/src/scss/bootstrap/mixins/_table-row.scss
new file mode 100644
index 0000000..f8d6186
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_table-row.scss
@@ -0,0 +1,39 @@
+// Tables
+
+@mixin table-row-variant($state, $background, $border: null) {
+ // Exact selectors below required to override `.table-striped` and prevent
+ // inheritance to nested tables.
+ .table-#{$state} {
+ &,
+ > th,
+ > td {
+ background-color: $background;
+ }
+
+ @if $border != null {
+ th,
+ td,
+ thead th,
+ tbody + tbody {
+ border-color: $border;
+ }
+ }
+ }
+
+ // 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..155d6ca
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_text-emphasis.scss
@@ -0,0 +1,16 @@
+// stylelint-disable declaration-no-important
+
+// Typography
+
+@mixin text-emphasis-variant($parent, $color) {
+ #{$parent} {
+ color: $color !important;
+ }
+ @if $emphasized-link-hover-darken-percentage != 0 {
+ a#{$parent} {
+ @include hover-focus {
+ color: darken($color, $emphasized-link-hover-darken-percentage) !important;
+ }
+ }
+ }
+}
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..8ce35a6
--- /dev/null
+++ b/src/scss/bootstrap/mixins/_transition.scss
@@ -0,0 +1,16 @@
+// stylelint-disable property-blacklist
+@mixin transition($transition...) {
+ @if $enable-transitions {
+ @if length($transition) == 0 {
+ transition: $transition-base;
+ } @else {
+ transition: $transition;
+ }
+ }
+
+ @if $enable-prefers-reduced-motion-media-query {
+ @media (prefers-reduced-motion: reduce) {
+ transition: none;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/utilities/_align.scss b/src/scss/bootstrap/utilities/_align.scss
new file mode 100644
index 0000000..8b7df9f
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_align.scss
@@ -0,0 +1,8 @@
+// stylelint-disable declaration-no-important
+
+.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..f9fbb48
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_background.scss
@@ -0,0 +1,21 @@
+// stylelint-disable declaration-no-important
+
+@each $color, $value in $theme-colors {
+ .bg-#{$color} {
+ background-color: $value !important;
+ }
+}
+
+@if $enable-gradients {
+ @each $color, $value in $theme-colors {
+ @include bg-gradient-variant(".bg-gradient-#{$color}", $value);
+ }
+}
+
+.bg-white {
+ background-color: $white !important;
+}
+
+.bg-transparent {
+ background-color: transparent !important;
+}
diff --git a/src/scss/bootstrap/utilities/_borders.scss b/src/scss/bootstrap/utilities/_borders.scss
new file mode 100644
index 0000000..302f6bf
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_borders.scss
@@ -0,0 +1,75 @@
+// stylelint-disable property-blacklist, declaration-no-important
+
+//
+// Border
+//
+
+.border { border: $border-width solid $border-color !important; }
+.border-top { border-top: $border-width solid $border-color !important; }
+.border-right { border-right: $border-width solid $border-color !important; }
+.border-bottom { border-bottom: $border-width solid $border-color !important; }
+.border-left { border-left: $border-width solid $border-color !important; }
+
+.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; }
+
+@each $color, $value in $theme-colors {
+ .border-#{$color} {
+ border-color: $value !important;
+ }
+}
+
+.border-white {
+ border-color: $white !important;
+}
+
+//
+// Border-radius
+//
+
+.rounded-sm {
+ border-radius: $border-radius-sm !important;
+}
+
+.rounded {
+ border-radius: $border-radius !important;
+}
+
+.rounded-top {
+ border-top-left-radius: $border-radius !important;
+ border-top-right-radius: $border-radius !important;
+}
+
+.rounded-right {
+ border-top-right-radius: $border-radius !important;
+ border-bottom-right-radius: $border-radius !important;
+}
+
+.rounded-bottom {
+ border-bottom-right-radius: $border-radius !important;
+ border-bottom-left-radius: $border-radius !important;
+}
+
+.rounded-left {
+ border-top-left-radius: $border-radius !important;
+ border-bottom-left-radius: $border-radius !important;
+}
+
+.rounded-lg {
+ border-radius: $border-radius-lg !important;
+}
+
+.rounded-circle {
+ border-radius: 50% !important;
+}
+
+.rounded-pill {
+ border-radius: $rounded-pill !important;
+}
+
+.rounded-0 {
+ border-radius: 0 !important;
+}
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..1303679
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_display.scss
@@ -0,0 +1,26 @@
+// stylelint-disable declaration-no-important
+
+//
+// Utilities for common `display` values
+//
+
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ @each $value in $displays {
+ .d#{$infix}-#{$value} { display: $value !important; }
+ }
+ }
+}
+
+
+//
+// Utilities for toggling `display` in print
+//
+
+@media print {
+ @each $value in $displays {
+ .d-print-#{$value} { display: $value !important; }
+ }
+}
diff --git a/src/scss/bootstrap/utilities/_embed.scss b/src/scss/bootstrap/utilities/_embed.scss
new file mode 100644
index 0000000..4497ac0
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_embed.scss
@@ -0,0 +1,39 @@
+// 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;
+ }
+}
+
+@each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios {
+ $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1);
+ $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2);
+
+ .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} {
+ &::before {
+ padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x);
+ }
+ }
+}
diff --git a/src/scss/bootstrap/utilities/_flex.scss b/src/scss/bootstrap/utilities/_flex.scss
new file mode 100644
index 0000000..3d4266e
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_flex.scss
@@ -0,0 +1,51 @@
+// stylelint-disable declaration-no-important
+
+// 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);
+
+ .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; }
+ .flex#{$infix}-fill { flex: 1 1 auto !important; }
+ .flex#{$infix}-grow-0 { flex-grow: 0 !important; }
+ .flex#{$infix}-grow-1 { flex-grow: 1 !important; }
+ .flex#{$infix}-shrink-0 { flex-shrink: 0 !important; }
+ .flex#{$infix}-shrink-1 { flex-shrink: 1 !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..5425084
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_float.scss
@@ -0,0 +1,11 @@
+// stylelint-disable declaration-no-important
+
+@each $breakpoint in map-keys($grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint) {
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+
+ .float#{$infix}-left { float: left !important; }
+ .float#{$infix}-right { float: right !important; }
+ .float#{$infix}-none { float: none !important; }
+ }
+}
diff --git a/src/scss/bootstrap/utilities/_overflow.scss b/src/scss/bootstrap/utilities/_overflow.scss
new file mode 100644
index 0000000..8326c30
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_overflow.scss
@@ -0,0 +1,5 @@
+// stylelint-disable declaration-no-important
+
+@each $value in $overflows {
+ .overflow-#{$value} { overflow: $value !important; }
+}
diff --git a/src/scss/bootstrap/utilities/_position.scss b/src/scss/bootstrap/utilities/_position.scss
new file mode 100644
index 0000000..cdf6c11
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_position.scss
@@ -0,0 +1,32 @@
+// stylelint-disable declaration-no-important
+
+// Common values
+@each $position in $positions {
+ .position-#{$position} { position: $position !important; }
+}
+
+// Shorthand
+
+.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 {
+ @supports (position: sticky) {
+ 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/_shadows.scss b/src/scss/bootstrap/utilities/_shadows.scss
new file mode 100644
index 0000000..f5d03fc
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_shadows.scss
@@ -0,0 +1,6 @@
+// stylelint-disable declaration-no-important
+
+.shadow-sm { box-shadow: $box-shadow-sm !important; }
+.shadow { box-shadow: $box-shadow !important; }
+.shadow-lg { box-shadow: $box-shadow-lg !important; }
+.shadow-none { box-shadow: none !important; }
diff --git a/src/scss/bootstrap/utilities/_sizing.scss b/src/scss/bootstrap/utilities/_sizing.scss
new file mode 100644
index 0000000..f376488
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_sizing.scss
@@ -0,0 +1,20 @@
+// stylelint-disable declaration-no-important
+
+// 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; }
+
+// Viewport additional helpers
+
+.min-vw-100 { min-width: 100vw !important; }
+.min-vh-100 { min-height: 100vh !important; }
+
+.vw-100 { width: 100vw !important; }
+.vh-100 { height: 100vh !important; }
diff --git a/src/scss/bootstrap/utilities/_spacing.scss b/src/scss/bootstrap/utilities/_spacing.scss
new file mode 100644
index 0000000..3511367
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_spacing.scss
@@ -0,0 +1,73 @@
+// stylelint-disable declaration-no-important
+
+// 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},
+ .#{$abbrev}y#{$infix}-#{$size} {
+ #{$prop}-top: $length !important;
+ }
+ .#{$abbrev}r#{$infix}-#{$size},
+ .#{$abbrev}x#{$infix}-#{$size} {
+ #{$prop}-right: $length !important;
+ }
+ .#{$abbrev}b#{$infix}-#{$size},
+ .#{$abbrev}y#{$infix}-#{$size} {
+ #{$prop}-bottom: $length !important;
+ }
+ .#{$abbrev}l#{$infix}-#{$size},
+ .#{$abbrev}x#{$infix}-#{$size} {
+ #{$prop}-left: $length !important;
+ }
+ }
+ }
+
+ // Negative margins (e.g., where `.mb-n1` is negative version of `.mb-1`)
+ @each $size, $length in $spacers {
+ @if $size != 0 {
+ .m#{$infix}-n#{$size} { margin: -$length !important; }
+ .mt#{$infix}-n#{$size},
+ .my#{$infix}-n#{$size} {
+ margin-top: -$length !important;
+ }
+ .mr#{$infix}-n#{$size},
+ .mx#{$infix}-n#{$size} {
+ margin-right: -$length !important;
+ }
+ .mb#{$infix}-n#{$size},
+ .my#{$infix}-n#{$size} {
+ margin-bottom: -$length !important;
+ }
+ .ml#{$infix}-n#{$size},
+ .mx#{$infix}-n#{$size} {
+ margin-left: -$length !important;
+ }
+ }
+ }
+
+ // Some special margin utils
+ .m#{$infix}-auto { margin: auto !important; }
+ .mt#{$infix}-auto,
+ .my#{$infix}-auto {
+ margin-top: auto !important;
+ }
+ .mr#{$infix}-auto,
+ .mx#{$infix}-auto {
+ margin-right: auto !important;
+ }
+ .mb#{$infix}-auto,
+ .my#{$infix}-auto {
+ margin-bottom: auto !important;
+ }
+ .ml#{$infix}-auto,
+ .mx#{$infix}-auto {
+ margin-left: auto !important;
+ }
+ }
+}
diff --git a/src/scss/bootstrap/utilities/_stretched-link.scss b/src/scss/bootstrap/utilities/_stretched-link.scss
new file mode 100644
index 0000000..fb5066b
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_stretched-link.scss
@@ -0,0 +1,19 @@
+//
+// Stretched link
+//
+
+.stretched-link {
+ &::after {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ // Just in case `pointer-events: none` is set on a parent
+ pointer-events: auto;
+ content: "";
+ // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color
+ background-color: rgba(0, 0, 0, 0);
+ }
+}
diff --git a/src/scss/bootstrap/utilities/_text.scss b/src/scss/bootstrap/utilities/_text.scss
new file mode 100644
index 0000000..fbf707d
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_text.scss
@@ -0,0 +1,68 @@
+// stylelint-disable declaration-no-important
+
+//
+// Text
+//
+
+.text-monospace { font-family: $font-family-monospace !important; }
+
+// Alignment
+
+.text-justify { text-align: justify !important; }
+.text-wrap { white-space: normal !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-light { font-weight: $font-weight-light !important; }
+.font-weight-lighter { font-weight: $font-weight-lighter !important; }
+.font-weight-normal { font-weight: $font-weight-normal !important; }
+.font-weight-bold { font-weight: $font-weight-bold !important; }
+.font-weight-bolder { font-weight: $font-weight-bolder !important; }
+.font-italic { font-style: italic !important; }
+
+// Contextual colors
+
+.text-white { color: $white !important; }
+
+@each $color, $value in $theme-colors {
+ @include text-emphasis-variant(".text-#{$color}", $value);
+}
+
+.text-body { color: $body-color !important; }
+.text-muted { color: $text-muted !important; }
+
+.text-black-50 { color: rgba($black, .5) !important; }
+.text-white-50 { color: rgba($white, .5) !important; }
+
+// Misc
+
+.text-decoration-none { text-decoration: none !important; }
+
+.text-break {
+ word-break: break-word !important; // IE & < Edge 18
+ overflow-wrap: break-word !important;
+}
+
+// Reset
+
+.text-reset { color: inherit !important; }
diff --git a/src/scss/bootstrap/utilities/_visibility.scss b/src/scss/bootstrap/utilities/_visibility.scss
new file mode 100644
index 0000000..7756c3b
--- /dev/null
+++ b/src/scss/bootstrap/utilities/_visibility.scss
@@ -0,0 +1,13 @@
+// stylelint-disable declaration-no-important
+
+//
+// Visibility utilities
+//
+
+.visible {
+ visibility: visible !important;
+}
+
+.invisible {
+ visibility: hidden !important;
+}
diff --git a/src/scss/bootstrap/vendor/_rfs.scss b/src/scss/bootstrap/vendor/_rfs.scss
new file mode 100644
index 0000000..43f19ca
--- /dev/null
+++ b/src/scss/bootstrap/vendor/_rfs.scss
@@ -0,0 +1,186 @@
+// stylelint-disable property-blacklist, scss/dollar-variable-default
+
+// SCSS RFS mixin
+//
+// Automated responsive font sizes
+//
+// Licensed under MIT (https://github.com/twbs/rfs/blob/master/LICENSE)
+
+// Configuration
+
+// Base font size
+$rfs-base-font-size: 1.25rem !default;
+$rfs-font-size-unit: rem !default;
+
+@if $rfs-font-size-unit != rem and $rfs-font-size-unit != px {
+ @error "`#{$rfs-font-size-unit}` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.";
+}
+
+// Breakpoint at where font-size starts decreasing if screen width is smaller
+$rfs-breakpoint: 1200px !default;
+$rfs-breakpoint-unit: px !default;
+
+@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {
+ @error "`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.";
+}
+
+// Resize font size based on screen height and width
+$rfs-two-dimensional: false !default;
+
+// Factor of decrease
+$rfs-factor: 10 !default;
+
+@if type-of($rfs-factor) != "number" or $rfs-factor <= 1 {
+ @error "`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.";
+}
+
+// Generate enable or disable classes. Possibilities: false, "enable" or "disable"
+$rfs-class: false !default;
+
+// 1 rem = $rfs-rem-value px
+$rfs-rem-value: 16 !default;
+
+// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14
+$rfs-safari-iframe-resize-bug-fix: false !default;
+
+// Disable RFS by setting $enable-responsive-font-sizes to false
+$enable-responsive-font-sizes: true !default;
+
+// Cache $rfs-base-font-size unit
+$rfs-base-font-size-unit: unit($rfs-base-font-size);
+
+// Remove px-unit from $rfs-base-font-size for calculations
+@if $rfs-base-font-size-unit == "px" {
+ $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1);
+}
+@else if $rfs-base-font-size-unit == "rem" {
+ $rfs-base-font-size: $rfs-base-font-size / ($rfs-base-font-size * 0 + 1 / $rfs-rem-value);
+}
+
+// Cache $rfs-breakpoint unit to prevent multiple calls
+$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);
+
+// Remove unit from $rfs-breakpoint for calculations
+@if $rfs-breakpoint-unit-cache == "px" {
+ $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);
+}
+@else if $rfs-breakpoint-unit-cache == "rem" or $rfs-breakpoint-unit-cache == "em" {
+ $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);
+}
+
+// Internal mixin that adds disable classes to the selector if needed.
+@mixin _rfs-disable-class {
+ @if $rfs-class == "disable" {
+ // Adding an extra class increases specificity, which prevents the media query to override the font size
+ &,
+ .disable-responsive-font-size &,
+ &.disable-responsive-font-size {
+ @content;
+ }
+ }
+ @else {
+ @content;
+ }
+}
+
+// Internal mixin that adds enable classes to the selector if needed.
+@mixin _rfs-enable-class {
+ @if $rfs-class == "enable" {
+ .enable-responsive-font-size &,
+ &.enable-responsive-font-size {
+ @content;
+ }
+ }
+ @else {
+ @content;
+ }
+}
+
+// Internal mixin used to determine which media query needs to be used
+@mixin _rfs-media-query($mq-value) {
+ @if $rfs-two-dimensional {
+ @media (max-width: #{$mq-value}), (max-height: #{$mq-value}) {
+ @content;
+ }
+ }
+ @else {
+ @media (max-width: #{$mq-value}) {
+ @content;
+ }
+ }
+}
+
+// Responsive font size mixin
+@mixin rfs($fs, $important: false) {
+ // Cache $fs unit
+ $fs-unit: if(type-of($fs) == "number", unit($fs), false);
+
+ // Add !important suffix if needed
+ $rfs-suffix: if($important, " !important", "");
+
+ // If $fs isn't a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value
+ @if not $fs-unit or $fs-unit != "" and $fs-unit != "px" and $fs-unit != "rem" or $fs == 0 {
+ font-size: #{$fs}#{$rfs-suffix};
+ }
+ @else {
+ // Remove unit from $fs for calculations
+ @if $fs-unit == "px" {
+ $fs: $fs / ($fs * 0 + 1);
+ }
+ @else if $fs-unit == "rem" {
+ $fs: $fs / ($fs * 0 + 1 / $rfs-rem-value);
+ }
+
+ // Set default font size
+ $rfs-static: if($rfs-font-size-unit == rem, #{$fs / $rfs-rem-value}rem, #{$fs}px);
+
+ // Only add the media query if the font size is bigger than the minimum font size
+ @if $fs <= $rfs-base-font-size or not $enable-responsive-font-sizes {
+ font-size: #{$rfs-static}#{$rfs-suffix};
+ }
+ @else {
+ // Calculate the minimum font size for $fs
+ $fs-min: $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor;
+
+ // Calculate difference between $fs and the minimum font size
+ $fs-diff: $fs - $fs-min;
+
+ // Base font-size formatting
+ $min-width: if($rfs-font-size-unit == rem, #{$fs-min / $rfs-rem-value}rem, #{$fs-min}px);
+
+ // Use `vmin` if two-dimensional is enabled
+ $variable-unit: if($rfs-two-dimensional, vmin, vw);
+
+ // Calculate the variable width between 0 and $rfs-breakpoint
+ $variable-width: #{$fs-diff * 100 / $rfs-breakpoint}#{$variable-unit};
+
+ // Set the calculated font-size
+ $rfs-fluid: calc(#{$min-width} + #{$variable-width}) #{$rfs-suffix};
+
+ // Breakpoint formatting
+ $mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit});
+
+ @include _rfs-disable-class {
+ font-size: #{$rfs-static}#{$rfs-suffix};
+ }
+
+ @include _rfs-media-query($mq-value) {
+ @include _rfs-enable-class {
+ font-size: $rfs-fluid;
+ }
+
+ // Include safari iframe resize fix if needed
+ min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);
+ }
+ }
+ }
+}
+
+// The font-size & responsive-font-size mixins use RFS to rescale the font size
+@mixin font-size($fs, $important: false) {
+ @include rfs($fs, $important);
+}
+
+@mixin responsive-font-size($fs, $important: false) {
+ @include rfs($fs, $important);
+}
diff --git a/src/scss/custom/_main.scss b/src/scss/custom/_main.scss
new file mode 100644
index 0000000..805bc76
--- /dev/null
+++ b/src/scss/custom/_main.scss
@@ -0,0 +1,779 @@
+/* General Styling */
+
+body {
+ font-family: 'Open Sans', sans-serif;
+ color: #fff;
+ background: #111;
+ overflow-x: hidden;
+}
+
+p {
+ line-height: 24px;
+ font-weight: 300;
+}
+
+a {
+ text-decoration: none;
+ color: #007bff;
+ &:hover {
+ color: $principal;
+ text-decoration: none;
+ transition: all 0.3s ease-in-out;
+ -o-transition: all 0.3s ease-in-out;
+ -ms-transition: all 0.3s ease-in-out;
+ -moz-transition: all 0.3s ease-in-out;
+ -webkit-transition: all 0.3s ease-in-out;
+ }
+}
+
+article span {
+ color: #e00918;
+}
+
+ul {
+ padding: 0;
+}
+
+hr {
+ width: 100%;
+ height: 1px;
+ background-color: #222;
+ border: none;
+ margin: 30px 0;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ margin: 0;
+ padding: 0;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+summary {
+ font-weight: 700;
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+}
+
+.button {
+ background-color: $principal;
+ color: #fff;
+ padding: 17px 25px;
+ text-transform: uppercase;
+ font-weight: 700;
+ font-size: 12px;
+ border: 2px solid $principal;
+ float: left;
+ border-radius: 999px;
+ &:hover {
+ background-color: #fff;
+ color: #0288D1;
+ border: 2px solid #0288D1;
+ text-decoration: none;
+ transition: all 0.3s ease-in-out;
+ -o-transition: all 0.3s ease-in-out;
+ -ms-transition: all 0.3s ease-in-out;
+ -moz-transition: all 0.3s ease-in-out;
+ -webkit-transition: all 0.3s ease-in-out;
+ }
+}
+
+.clear {
+ clear: both;
+}
+
+video {
+ width: 100%;
+ margin-left: 1rem;
+}
+
+/* Code */
+
+code {
+ background-color: #282828;
+ color: #73d1ed;
+}
+
+pre {
+ background-color: #282828;
+ color: #78dcfa;
+ padding: 1rem;
+}
+
+/* Colors Code */
+
+.highlight {
+ background: #000000;
+ color: #cccccc;
+ pre {
+ font-size: 75%;
+ }
+ .hll {
+ background-color: #222222;
+ }
+ .c {
+ color: #4E4F8E;
+ }
+ .err {
+ color: #cccccc;
+ border: 1px solid #FF0000;
+ }
+ .esc, .g {
+ color: #cccccc;
+ }
+ .k {
+ color: #cdcd00;
+ }
+ .l, .n {
+ color: #cccccc;
+ }
+ .o {
+ color: #3399cc;
+ }
+ .x {
+ color: #cccccc;
+ }
+ .p {
+ color: #fac0ba;
+ }
+ .ch, .cm, .cp, .cpf, .c1 {
+ color: #4E4F8E;
+ }
+ .cs {
+ color: #cd0000;
+ font-weight: bold;
+ }
+ .gd {
+ color: #cd0000;
+ }
+ .ge {
+ color: #cccccc;
+ font-style: italic;
+ }
+ .gr {
+ color: #FF0000;
+ }
+ .gh {
+ color: #4E4F8E;
+ font-weight: bold;
+ }
+ .gi {
+ color: #00cd00;
+ }
+ .go {
+ color: #888888;
+ }
+ .gp {
+ color: #4E4F8E;
+ font-weight: bold;
+ }
+ .gs {
+ color: #cccccc;
+ font-weight: bold;
+ }
+ .gu {
+ color: #800080;
+ font-weight: bold;
+ }
+ .gt {
+ color: #0044DD;
+ }
+ .kc {
+ color: #cdcd00;
+ }
+ .kd {
+ color: #00cd00;
+ }
+ .kn {
+ color: #cd00cd;
+ }
+ .kp, .kr {
+ color: #cdcd00;
+ }
+ .kt {
+ color: #00cd00;
+ }
+ .ld {
+ color: #cccccc;
+ }
+ .m {
+ color: #cd00cd;
+ }
+ .s {
+ color: #cd0000;
+ }
+ .na {
+ color: #cccccc;
+ }
+ .nb {
+ color: #cd00cd;
+ }
+ .nc {
+ color: #00cdcd;
+ }
+ .no, .nd, .ni {
+ color: #cccccc;
+ }
+ .ne {
+ color: #666699;
+ font-weight: bold;
+ }
+ .nf, .nl, .nn, .nx, .py {
+ color: #cccccc;
+ }
+ .nt {
+ color: orange;
+ }
+ .nv {
+ color: #00cdcd;
+ }
+ .ow {
+ color: #cdcd00;
+ }
+ .w {
+ color: #cccccc;
+ }
+ .mb, .mf, .mh, .mi, .mo {
+ color: #cd00cd;
+ }
+ .sb, .sc, .sd, .s2, .se, .sh, .si, .sx, .sr, .s1, .ss {
+ color: #cd0000;
+ }
+ .bp {
+ color: #cd00cd;
+ }
+ .vc, .vg, .vi {
+ color: #00cdcd;
+ }
+ .il {
+ color: #cd00cd;
+ }
+}
+
+/* Header */
+
+header {
+ background: #222;
+}
+
+.fixed-top {
+ position: fixed;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 4;
+}
+
+.logo {
+ max-width: 60%;
+}
+
+#menu-toggle {
+ position: relative;
+ color: white;
+ img {
+ width: 20px;
+ }
+}
+
+.menu-bars {
+ left: 1rem;
+}
+
+.menu-logo {
+ position: relative;
+ left: 2rem;
+}
+
+input {
+ border: 1px solid #000;
+ color: #fff;
+ font-size: 12px;
+ padding: 0.5rem 1rem;
+ width: 100%;
+ background: url(../images/search.png) #111 no-repeat right 35px center;
+ background-size: 3%;
+ outline: none;
+}
+
+.notifications {
+ display: flex;
+ margin: 0px;
+ align-items: center;
+ justify-content: center;
+ li {
+ list-style: none;
+ &:hover {
+ cursor: pointer;
+ }
+ }
+ i {
+ color: #bbc3ca;
+ font-size: 20px;
+ }
+ span {
+ border-radius: 50px;
+ background-color: $principal;
+ color: #fff;
+ font-weight: 700;
+ padding: 4px 9px;
+ font-size: 11px;
+ position: relative;
+ top: -12px;
+ left: -12px;
+ }
+}
+
+/* Menu-profile */
+
+.menu-profile {
+ display: flex;
+ flex-wrap: nowrap;
+ justify-content: flex-end;
+ align-items: center;
+ ul {
+ display: inline-flex;
+ list-style: none;
+ margin-bottom: 0px;
+ }
+}
+
+.image-profile-menu {
+ width: 2rem;
+ img {
+ width: 100%;
+ }
+}
+
+.log-out a {
+ background: $principal;
+ color: white;
+ padding: .2rem;
+ font-size: .8rem;
+ font-weight: 700;
+ &:hover {
+ color: white;
+ }
+}
+
+/*----------------------*/
+
+.username {
+ color: #fff;
+ font-weight: 700;
+}
+
+/* header mt-6 */
+
+.mt-6, .my-6 {
+ margin-top: 6rem !important;
+}
+
+/* Tabs */
+
+.tab {
+ text-align: center;
+ margin: -10px 0;
+ li {
+ display: inline-block;
+ text-transform: uppercase;
+ color: #808791;
+ font-weight: 700;
+ font-size: 12px;
+ margin: 0 20px;
+ &:hover {
+ color: $principal;
+ cursor: pointer;
+ transition: all 0.3s ease-in-out;
+ -o-transition: all 0.3s ease-in-out;
+ -ms-transition: all 0.3s ease-in-out;
+ -moz-transition: all 0.3s ease-in-out;
+ -webkit-transition: all 0.3s ease-in-out;
+ }
+ > a {
+ color: white;
+ }
+ }
+ .active {
+ border-bottom: 3px solid $principal;
+ padding-bottom: 20px;
+ margin-bottom: -20px;
+ color: #fff;
+ }
+}
+
+/* Main Content */
+
+.main-videos h2 {
+ margin: 20px 0px 0px 0px;
+ font-weight: 900;
+ > a {
+ color: white;
+ }
+}
+
+.area {
+ position: relative;
+ margin-bottom: 0.5rem;
+}
+
+.duration {
+ background-color: $principal;
+ color: #fff;
+ padding: 10px 30px;
+ text-transform: uppercase;
+ font-weight: 700;
+ font-size: 12px;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+}
+
+p.views {
+ color: #343434;
+}
+
+.video p {
+ margin: 0;
+ padding: 0;
+ color: #757a80;
+ line-height: inherit;
+}
+
+.area:hover .mask {
+ display: block;
+ cursor: pointer;
+ opacity: 100;
+ transition: all 0.3s ease-in-out;
+ -o-transition: all 0.3s ease-in-out;
+ -ms-transition: all 0.3s ease-in-out;
+ -moz-transition: all 0.3s ease-in-out;
+ -webkit-transition: all 0.3s ease-in-out;
+}
+
+.vertical-align {
+ position: relative;
+ top: 50%;
+ transform: translateY(-50%);
+ -webkit-transform: translateY(-50%);
+ -ms-transform: translateY(-50%);
+}
+
+.mask {
+ position: absolute;
+ background-color: $pri-rgb;
+ width: 100%;
+ height: 100%;
+ text-align: center;
+ opacity: 0;
+ p {
+ color: #fff;
+ font-weight: 700;
+ }
+ i {
+ color: #fff;
+ }
+}
+
+.mini {
+ list-style: none;
+ h4 {
+ margin-top: 13px;
+ font-weight: 700;
+ }
+ p {
+ font-size: 12px;
+ margin-top: 6px;
+ }
+ i {
+ font-size: 50px;
+ }
+ .duration {
+ padding: 8px 20px;
+ }
+ .mask p {
+ display: none;
+ }
+}
+
+li.mini:nth-child(2) {
+ margin-bottom: 30px;
+}
+
+.video h4 {
+ margin-top: 15px;
+ font-weight: 400;
+}
+
+.single-channel .video p {
+ margin-top: 7px;
+}
+
+/* Channel Information Section */
+
+.channel-bio {
+ hr {
+ margin: 20px 0;
+ }
+ p {
+ text-align: justify;
+ }
+ .button {
+ margin-top: 10px;
+ }
+}
+
+.channel-name {
+ font-weight: 500;
+ font-size: 16px;
+ img {
+ margin-right: 10px;
+ }
+}
+
+/* Pagination */
+
+.page-item {
+ &:first-child .page-link > span, &:last-child .page-link > span {
+ color: white;
+ }
+}
+
+.page-link {
+ background-color: #222;
+ border: 1px solid #111;
+}
+
+.page-item.disabled .page-link {
+ pointer-events: none;
+ cursor: auto;
+ background-color: #111;
+ border-color: #222;
+}
+
+.page-link:hover {
+ text-decoration: none;
+ background-color: $principal;
+ border: solid 1px #111;
+}
+
+.page-item.active .page-link {
+ color: #fff;
+ background-color: $principal;
+ border-color: $principal;
+}
+
+/* Footer */
+
+footer {
+ text-align: center;
+ padding: 0 0 30px;
+ li {
+ display: inline;
+ margin: 0 15px;
+ }
+ ul {
+ &:nth-child(1) a {
+ font-size: 16px;
+ font-weight: 600;
+ color: #fff;
+ }
+ &:nth-child(2) {
+ margin: 20px 0;
+ a {
+ color: #f5f5f5;
+ }
+ }
+ }
+ li a:hover {
+ color: $principal;
+ text-decoration: none;
+ transition: all 0.3s ease-in-out;
+ -o-transition: all 0.3s ease-in-out;
+ -ms-transition: all 0.3s ease-in-out;
+ -moz-transition: all 0.3s ease-in-out;
+ -webkit-transition: all 0.3s ease-in-out;
+ }
+ > {
+ h4, h6 {
+ color: #aaa7a7;
+ font-weight: 300;
+ }
+ }
+}
+
+/* Sidebar */
+
+.title {
+ color: $sidebar-title;
+ text-transform: uppercase;
+ font-weight: 700;
+}
+
+.sidebar {
+ margin-top: 0px;
+ /* Adjust vertical columm with menu-bar */
+ ul {
+ margin-bottom: 5px;
+ list-style: none;
+ }
+ li {
+ line-height: 40px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ a {
+ color: #828c95;
+ font-weight: 500;
+ &:hover {
+ color: $principal;
+ text-decoration: none;
+ }
+ }
+ i {
+ font-size: 20px;
+ margin-right: 15px;
+ }
+ #subs img {
+ margin-right: 15px;
+ width: 25px;
+ }
+}
+
+#playlist {
+ p {
+ font-size: 12px;
+ font-weight: 300;
+ margin-left: 35px;
+ margin-top: -15px;
+ }
+ i {
+ float: left;
+ }
+}
+
+#sidebar-wrapper {
+ padding-top: 10px;
+ padding-left: 30px;
+ padding-right: 30px;
+ margin-bottom: -10px;
+ font-weight: 600;
+ font-size: 14px;
+ background-color: #111;
+ border-right: 1px solid #dbdee0;
+ top: 0;
+ bottom: 0;
+ z-index: 1000;
+ left: 0;
+ position: fixed;
+ width: 300px;
+ margin-left: -300px;
+ overflow-x: hidden;
+ overflow-y: hidden;
+ transition: all 0.3s ease-in-out;
+ -o-transition: all 0.3s ease-in-out;
+ -ms-transition: all 0.3s ease-in-out;
+ -moz-transition: all 0.3s ease-in-out;
+ -webkit-transition: all 0.3s ease-in-out;
+ &.active {
+ left: 300px;
+ width: 300px;
+ }
+}
+
+#menu-close {
+ padding: 7px 0;
+ img {
+ width: 10px;
+ }
+}
+
+/* Main */
+
+h2.title-video {
+ margin-left: 1rem;
+}
+
+soumaicon {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -ms-flex-line-pack: center;
+ align-content: center;
+}
+
+.soumaicon {
+ svg {
+ width: 1rem;
+ height: 1rem;
+ fill: currentcolor;
+ }
+ &:hover svg {
+ fill: $principal;
+ }
+ &.play {
+ svg {
+ width: 4rem;
+ height: 4rem;
+ }
+ &:hover svg {
+ fill: currentcolor;
+ }
+ }
+}
+
+/*------ play icon -------*/
+
+/*------- End play -------*/
+
+@media only screen and (max-width: 991px) {
+ .logo {
+ max-width: 15%;
+ margin: .5rem 0;
+ }
+ .menu-profile {
+ justify-content: center;
+ }
+ .mt-8 {
+ margin-top: 8rem !important;
+ }
+ .mt-10 {
+ margin-top: 10rem !important;
+ }
+}
+
+@media only screen and (max-width: 480px) {
+ .logo {
+ max-width: 20%;
+ }
+ .channel-bio .button {
+ margin-bottom: 1rem;
+ }
+ ul#user-info {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ }
+ .notifications {
+ position: relative;
+ right: 0px;
+ top: 0px;
+ left: 0px;
+ margin: 20px;
+ }
+ .ml-1 {
+ margin-left: 0rem !important;
+ }
+ .mt-8, .mt-10 {
+ margin-top: 1rem !important;
+ }
+ .fixed-top {
+ position: relative;
+ top: 0;
+ right: 0;
+ left: 0;
+ z-index: 3;
+ }
+}
diff --git a/src/scss/custom/_typography.scss b/src/scss/custom/_typography.scss
new file mode 100644
index 0000000..672d281
--- /dev/null
+++ b/src/scss/custom/_typography.scss
@@ -0,0 +1,7 @@
+@font-face {
+ font-family: 'Open Sans';
+ font-style: normal;
+ font-weight: 400;
+ src: local("Open Sans Regular"), local("OpenSans-Regular"), url(../fonts/opensans/latin.woff2) format("woff2");
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
diff --git a/src/scss/custom/_variables.scss b/src/scss/custom/_variables.scss
new file mode 100644
index 0000000..0c9b7c0
--- /dev/null
+++ b/src/scss/custom/_variables.scss
@@ -0,0 +1,9 @@
+/* Colores */
+
+$principal: #0091EA;
+// Declare the color as RGB; SASS will treat this as hex
+$blue: rgb(0,145,234);
+// Declare an alpha
+$alpha: .8;
+$pri-rgb: rgba($blue, $alpha);
+$sidebar-title: #00A5FF;
diff --git a/src/scss/custom/comments.scss b/src/scss/custom/comments.scss
new file mode 100644
index 0000000..f0223c2
--- /dev/null
+++ b/src/scss/custom/comments.scss
@@ -0,0 +1,304 @@
+/*---------------------
+ Lista de comentarios
+ ----------------------- */
+
+.comments-info-title {
+ margin-top: 1rem;
+ margin-left: 1rem;
+}
+
+.comments-container {
+ > ul {
+ list-style: none;
+ > li > ul {
+ list-style: none;
+ }
+ }
+ margin: 0px 2rem 15px;
+ width: 100%;
+}
+
+.comments-list {
+ margin-top: 30px;
+ position: relative;
+}
+
+.comments-main {
+ margin-left: 1rem;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+}
+
+.comment-main-level {
+ margin-left: -30px;
+}
+
+/**
+ * Lineas / Detalles
+ -----------------------*/
+
+.comments-list {
+ &:before {
+ content: '';
+ width: 2px;
+ height: 100%;
+ background: #c7cacb;
+ position: absolute;
+ /* left: 2%; /\* 100/2 centra la línea con la imagen avatar *\/ */
+ left: 2px;
+ top: 0;
+ }
+ &:after {
+ content: '';
+ width: 7px;
+ height: 7px;
+ border: 3px solid #dee1e3;
+ -webkit-border-radius: 50%;
+ -moz-border-radius: 50%;
+ border-radius: 50%;
+ }
+}
+
+.reply-list {
+ margin-left: -15px;
+ &:before, &:after {
+ display: none;
+ }
+ li:before {
+ content: '';
+ width: 60px;
+ height: 2px;
+ background: #c7cacb;
+ position: absolute;
+ top: 25px;
+ left: -55px;
+ }
+}
+
+/* End Líneas
+ ------------------------*/
+
+.comments-list li {
+ margin-bottom: 15px;
+ position: relative;
+ &:after {
+ content: '';
+ display: block;
+ clear: both;
+ height: 0px;
+ width: 0px;
+ }
+}
+
+.reply-list {
+ padding-left: 88px;
+ clear: both;
+ margin-top: 15px;
+}
+
+/*---------------------
+ Avatar
+ ----------------------- */
+
+.comments-list .comment-avatar {
+ width: 65px;
+ height: 65px;
+ position: relative;
+ z-index: 2;
+ border: 3px solid #FFF;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+ -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+ overflow: hidden;
+ img {
+ width: 100%;
+ height: 100%;
+ }
+}
+
+.reply-list .comment-avatar {
+ width: 50px;
+ height: 50px;
+}
+
+.comment-main-level:after {
+ content: '';
+ width: 0;
+ height: 0;
+ display: block;
+ clear: both;
+}
+
+/**
+ * Caja del Comentario
+ ---------------------------*/
+
+.comments-list .comment-box {
+ width: 80%;
+ position: relative;
+ margin-left: 1rem;
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
+ -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.15);
+ &:before, &:after {
+ content: '';
+ height: 0;
+ width: 0;
+ position: absolute;
+ display: block;
+ border-width: 10px 12px 10px 0;
+ border-style: solid;
+ border-color: transparent #222;
+ top: 8px;
+ left: -11px;
+ }
+ &:before {
+ border-width: 11px 13px 11px 0;
+ border-color: transparent rgba(0, 0, 0, 0.05);
+ left: -12px;
+ }
+}
+
+.reply-list .comment-box {
+ width: 75%;
+}
+
+.comment-box {
+ .comment-head {
+ background: #222;
+ padding: 10px 12px;
+ border-bottom: 1px solid #ccc;
+ /* color de flecha */
+ overflow: hidden;
+ -webkit-border-radius: 4px 4px 0 0;
+ -moz-border-radius: 4px 4px 0 0;
+ border-radius: 4px 4px 0 0;
+ i {
+ float: right;
+ margin-left: 14px;
+ position: relative;
+ color: #A6A6A6;
+ cursor: pointer;
+ -webkit-transition: color 0.3s ease;
+ -o-transition: color 0.3s ease;
+ transition: color 0.3s ease;
+ &:hover {
+ color: red;
+ }
+ }
+ }
+ .comment-name {
+ color: #283035;
+ font-size: 14px;
+ font-weight: 700;
+ float: left;
+ margin-right: 10px;
+ a {
+ color: #007fdb;
+ }
+ }
+ .comment-head span {
+ float: left;
+ color: #999;
+ font-size: 13px;
+ position: relative;
+ }
+ .comment-content {
+ background: #333;
+ padding: 12px;
+ font-size: 15px;
+ color: #fff;
+ -webkit-border-radius: 0 0 4px 4px;
+ -moz-border-radius: 0 0 4px 4px;
+ border-radius: 0 0 4px 4px;
+ }
+ .comment-name.by-author {
+ color: #00aee6;
+ a {
+ color: #00aee6;
+ }
+ &:after {
+ content: 'autor';
+ background: #03658c;
+ color: #FFF;
+ font-size: 12px;
+ padding: 3px 5px;
+ font-weight: 700;
+ margin-left: 10px;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ }
+ }
+}
+
+/** =====================
+ * Responsive
+ ========================*/
+@media only screen and (max-width: 766px) {
+ .comments-container {
+ width: 480px;
+ }
+ .comments-list .comment-box {
+ width: 390px;
+ }
+ .reply-list .comment-box {
+ width: 320px;
+ }
+}
+
+@media only screen and (max-width: 480px) {
+ .comments-container {
+ width: 480px;
+ }
+ /* Líneas */
+ .comments-list {
+ &:before {
+ left: -13px;
+ }
+ &.reply-list {
+ margin-left: -30px;
+ }
+ &:after {
+ left: -15px;
+ position: relative;
+ }
+ }
+ /* End lineas */
+ .comment-box {
+ .comment-head, .comment-content {
+ font-size: 12px;
+ }
+ }
+ .comments-list {
+ .comment-avatar {
+ width: 35px;
+ height: 35px;
+ }
+ .comment-box {
+ max-width: 250px;
+ }
+ }
+ .reply-list .comment-box {
+ max-width: 170px;
+ }
+}
+
+@media only screen and (max-width: 360px) {
+ .comments-list {
+ .comment-avatar {
+ width: 35px;
+ height: 35px;
+ }
+ .comment-box {
+ max-width: 200px;
+ }
+ }
+ .reply-list .comment-box {
+ max-width: 120px;
+ }
+}
diff --git a/src/scss/custom/styles.scss b/src/scss/custom/styles.scss
new file mode 100644
index 0000000..43b2f8b
--- /dev/null
+++ b/src/scss/custom/styles.scss
@@ -0,0 +1,14 @@
+@charset "utf-8";
+/*!
+ * Author: jesus e.
+ * Version: 1.2
+ */
+
+// _variables.scss
+@import 'variables';
+
+// _typography.scss
+@import 'typography';
+
+// _main.scss
+@import 'main';