diff options
Diffstat (limited to 'src')
117 files changed, 8983 insertions, 0 deletions
diff --git a/src/fonts/opensans/latin.woff2 b/src/fonts/opensans/latin.woff2 Binary files differnew file mode 100644 index 0000000..e9f58b7 --- /dev/null +++ b/src/fonts/opensans/latin.woff2 diff --git a/src/images/channel1.png b/src/images/channel1.png Binary files differnew file mode 100644 index 0000000..d88d898 --- /dev/null +++ b/src/images/channel1.png diff --git a/src/images/channel2.png b/src/images/channel2.png Binary files differnew file mode 100644 index 0000000..b18560b --- /dev/null +++ b/src/images/channel2.png diff --git a/src/images/channel3.png b/src/images/channel3.png Binary files differnew file mode 100644 index 0000000..c0fce7c --- /dev/null +++ b/src/images/channel3.png diff --git a/src/images/favicon/favicon-16x16.png b/src/images/favicon/favicon-16x16.png Binary files differnew file mode 100644 index 0000000..f10facf --- /dev/null +++ b/src/images/favicon/favicon-16x16.png diff --git a/src/images/favicon/favicon-192x192.png b/src/images/favicon/favicon-192x192.png Binary files differnew file mode 100644 index 0000000..9a0e4ec --- /dev/null +++ b/src/images/favicon/favicon-192x192.png diff --git a/src/images/favicon/favicon-32x32.png b/src/images/favicon/favicon-32x32.png Binary files differnew file mode 100644 index 0000000..efae001 --- /dev/null +++ b/src/images/favicon/favicon-32x32.png diff --git a/src/images/favicon/favicon-96x96.png b/src/images/favicon/favicon-96x96.png Binary files differnew file mode 100644 index 0000000..e4b3054 --- /dev/null +++ b/src/images/favicon/favicon-96x96.png diff --git a/src/images/football1.png b/src/images/football1.png Binary files differnew file mode 100644 index 0000000..8d97aea --- /dev/null +++ b/src/images/football1.png diff --git a/src/images/football2.png b/src/images/football2.png Binary files differnew file mode 100644 index 0000000..4d799ec --- /dev/null +++ b/src/images/football2.png diff --git a/src/images/football3.png b/src/images/football3.png Binary files differnew file mode 100644 index 0000000..ef9ff63 --- /dev/null +++ b/src/images/football3.png 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 Binary files differnew file mode 100644 index 0000000..f5a3da6 --- /dev/null +++ b/src/images/nike.png diff --git a/src/images/profile.png b/src/images/profile.png Binary files differnew file mode 100644 index 0000000..6257a93 --- /dev/null +++ b/src/images/profile.png diff --git a/src/images/search.png b/src/images/search.png Binary files differnew file mode 100644 index 0000000..92e8113 --- /dev/null +++ b/src/images/search.png diff --git a/src/images/shakira.png b/src/images/shakira.png Binary files differnew file mode 100644 index 0000000..8a19920 --- /dev/null +++ b/src/images/shakira.png diff --git a/src/images/shakira1.png b/src/images/shakira1.png Binary files differnew file mode 100644 index 0000000..4488304 --- /dev/null +++ b/src/images/shakira1.png diff --git a/src/images/shakira2.png b/src/images/shakira2.png Binary files differnew file mode 100644 index 0000000..f0d86ee --- /dev/null +++ b/src/images/shakira2.png diff --git a/src/images/shakira3.png b/src/images/shakira3.png Binary files differnew file mode 100644 index 0000000..fb52f65 --- /dev/null +++ b/src/images/shakira3.png diff --git a/src/images/shoes.png b/src/images/shoes.png Binary files differnew file mode 100644 index 0000000..1f61aca --- /dev/null +++ b/src/images/shoes.png 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 Binary files differnew file mode 100644 index 0000000..eff5d70 --- /dev/null +++ b/src/images/video.png diff --git a/src/images/video2.png b/src/images/video2.png Binary files differnew file mode 100644 index 0000000..a824267 --- /dev/null +++ b/src/images/video2.png diff --git a/src/images/video3.png b/src/images/video3.png Binary files differnew file mode 100644 index 0000000..978d059 --- /dev/null +++ b/src/images/video3.png diff --git a/src/images/video4.png b/src/images/video4.png Binary files differnew file mode 100644 index 0000000..b5364cb --- /dev/null +++ b/src/images/video4.png diff --git a/src/images/video5.png b/src/images/video5.png Binary files differnew file mode 100644 index 0000000..05a6215 --- /dev/null +++ b/src/images/video5.png diff --git a/src/images/video6.png b/src/images/video6.png Binary files differnew file mode 100644 index 0000000..642496b --- /dev/null +++ b/src/images/video6.png 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'; |