diff --git a/.gitignore b/.gitignore
index 5efa7bbb5ca..84265b76eb8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -83,3 +83,4 @@ build-indep-stamp
configure-stamp
*_flymake.js
engine/storage/integration-test/test-output
+ui/stylesheets/*.css
\ No newline at end of file
diff --git a/ui/index.jsp b/ui/index.jsp
index 848adce88ed..ed1ff3f6e55 100644
--- a/ui/index.jsp
+++ b/ui/index.jsp
@@ -29,14 +29,7 @@ under the License.
-
-
-
-
-
-
+
diff --git a/ui/stylesheets/lib/_animate.scss b/ui/stylesheets/lib/_animate.scss
new file mode 100644
index 00000000000..f35a0141163
--- /dev/null
+++ b/ui/stylesheets/lib/_animate.scss
@@ -0,0 +1,3263 @@
+@charset "UTF-8";
+/*
+Animate.css - http://daneden.me/animate
+Licensed under the MIT license
+
+Copyright (c) 2013 Daniel Eden
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+body { /* Addresses a small issue in webkit: http://bit.ly/NEdoDq */
+ -webkit-backface-visibility: hidden;
+}
+.animated {
+ -webkit-animation-duration: 1s;
+ -moz-animation-duration: 1s;
+ -o-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-fill-mode: both;
+ -moz-animation-fill-mode: both;
+ -o-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+
+.animated.hinge {
+ -webkit-animation-duration: 2s;
+ -moz-animation-duration: 2s;
+ -o-animation-duration: 2s;
+ animation-duration: 2s;
+}
+
+@-webkit-keyframes flash {
+ 0%, 50%, 100% {opacity: 1;}
+ 25%, 75% {opacity: 0;}
+}
+
+@-moz-keyframes flash {
+ 0%, 50%, 100% {opacity: 1;}
+ 25%, 75% {opacity: 0;}
+}
+
+@-o-keyframes flash {
+ 0%, 50%, 100% {opacity: 1;}
+ 25%, 75% {opacity: 0;}
+}
+
+@keyframes flash {
+ 0%, 50%, 100% {opacity: 1;}
+ 25%, 75% {opacity: 0;}
+}
+
+.animated.flash {
+ -webkit-animation-name: flash;
+ -moz-animation-name: flash;
+ -o-animation-name: flash;
+ animation-name: flash;
+}
+@-webkit-keyframes shake {
+ 0%, 100% {-webkit-transform: translateX(0);}
+ 10%, 30%, 50%, 70%, 90% {-webkit-transform: translateX(-10px);}
+ 20%, 40%, 60%, 80% {-webkit-transform: translateX(10px);}
+}
+
+@-moz-keyframes shake {
+ 0%, 100% {-moz-transform: translateX(0);}
+ 10%, 30%, 50%, 70%, 90% {-moz-transform: translateX(-10px);}
+ 20%, 40%, 60%, 80% {-moz-transform: translateX(10px);}
+}
+
+@-o-keyframes shake {
+ 0%, 100% {-o-transform: translateX(0);}
+ 10%, 30%, 50%, 70%, 90% {-o-transform: translateX(-10px);}
+ 20%, 40%, 60%, 80% {-o-transform: translateX(10px);}
+}
+
+@keyframes shake {
+ 0%, 100% {transform: translateX(0);}
+ 10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);}
+ 20%, 40%, 60%, 80% {transform: translateX(10px);}
+}
+
+.animated.shake {
+ -webkit-animation-name: shake;
+ -moz-animation-name: shake;
+ -o-animation-name: shake;
+ animation-name: shake;
+}
+@-webkit-keyframes bounce {
+ 0%, 20%, 50%, 80%, 100% {-webkit-transform: translateY(0);}
+ 40% {-webkit-transform: translateY(-30px);}
+ 60% {-webkit-transform: translateY(-15px);}
+}
+
+@-moz-keyframes bounce {
+ 0%, 20%, 50%, 80%, 100% {-moz-transform: translateY(0);}
+ 40% {-moz-transform: translateY(-30px);}
+ 60% {-moz-transform: translateY(-15px);}
+}
+
+@-o-keyframes bounce {
+ 0%, 20%, 50%, 80%, 100% {-o-transform: translateY(0);}
+ 40% {-o-transform: translateY(-30px);}
+ 60% {-o-transform: translateY(-15px);}
+}
+@keyframes bounce {
+ 0%, 20%, 50%, 80%, 100% {transform: translateY(0);}
+ 40% {transform: translateY(-30px);}
+ 60% {transform: translateY(-15px);}
+}
+
+.animated.bounce {
+ -webkit-animation-name: bounce;
+ -moz-animation-name: bounce;
+ -o-animation-name: bounce;
+ animation-name: bounce;
+}
+@-webkit-keyframes tada {
+ 0% {-webkit-transform: scale(1);}
+ 10%, 20% {-webkit-transform: scale(0.9) rotate(-3deg);}
+ 30%, 50%, 70%, 90% {-webkit-transform: scale(1.1) rotate(3deg);}
+ 40%, 60%, 80% {-webkit-transform: scale(1.1) rotate(-3deg);}
+ 100% {-webkit-transform: scale(1) rotate(0);}
+}
+
+@-moz-keyframes tada {
+ 0% {-moz-transform: scale(1);}
+ 10%, 20% {-moz-transform: scale(0.9) rotate(-3deg);}
+ 30%, 50%, 70%, 90% {-moz-transform: scale(1.1) rotate(3deg);}
+ 40%, 60%, 80% {-moz-transform: scale(1.1) rotate(-3deg);}
+ 100% {-moz-transform: scale(1) rotate(0);}
+}
+
+@-o-keyframes tada {
+ 0% {-o-transform: scale(1);}
+ 10%, 20% {-o-transform: scale(0.9) rotate(-3deg);}
+ 30%, 50%, 70%, 90% {-o-transform: scale(1.1) rotate(3deg);}
+ 40%, 60%, 80% {-o-transform: scale(1.1) rotate(-3deg);}
+ 100% {-o-transform: scale(1) rotate(0);}
+}
+
+@keyframes tada {
+ 0% {transform: scale(1);}
+ 10%, 20% {transform: scale(0.9) rotate(-3deg);}
+ 30%, 50%, 70%, 90% {transform: scale(1.1) rotate(3deg);}
+ 40%, 60%, 80% {transform: scale(1.1) rotate(-3deg);}
+ 100% {transform: scale(1) rotate(0);}
+}
+
+.animated.tada {
+ -webkit-animation-name: tada;
+ -moz-animation-name: tada;
+ -o-animation-name: tada;
+ animation-name: tada;
+}
+@-webkit-keyframes swing {
+ 20%, 40%, 60%, 80%, 100% { -webkit-transform-origin: top center; }
+ 20% { -webkit-transform: rotate(15deg); }
+ 40% { -webkit-transform: rotate(-10deg); }
+ 60% { -webkit-transform: rotate(5deg); }
+ 80% { -webkit-transform: rotate(-5deg); }
+ 100% { -webkit-transform: rotate(0deg); }
+}
+
+@-moz-keyframes swing {
+ 20% { -moz-transform: rotate(15deg); }
+ 40% { -moz-transform: rotate(-10deg); }
+ 60% { -moz-transform: rotate(5deg); }
+ 80% { -moz-transform: rotate(-5deg); }
+ 100% { -moz-transform: rotate(0deg); }
+}
+
+@-o-keyframes swing {
+ 20% { -o-transform: rotate(15deg); }
+ 40% { -o-transform: rotate(-10deg); }
+ 60% { -o-transform: rotate(5deg); }
+ 80% { -o-transform: rotate(-5deg); }
+ 100% { -o-transform: rotate(0deg); }
+}
+
+@keyframes swing {
+ 20% { transform: rotate(15deg); }
+ 40% { transform: rotate(-10deg); }
+ 60% { transform: rotate(5deg); }
+ 80% { transform: rotate(-5deg); }
+ 100% { transform: rotate(0deg); }
+}
+
+.animated.swing {
+ -webkit-transform-origin: top center;
+ -moz-transform-origin: top center;
+ -o-transform-origin: top center;
+ transform-origin: top center;
+ -webkit-animation-name: swing;
+ -moz-animation-name: swing;
+ -o-animation-name: swing;
+ animation-name: swing;
+}
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes wobble {
+ 0% { -webkit-transform: translateX(0%); }
+ 15% { -webkit-transform: translateX(-25%) rotate(-5deg); }
+ 30% { -webkit-transform: translateX(20%) rotate(3deg); }
+ 45% { -webkit-transform: translateX(-15%) rotate(-3deg); }
+ 60% { -webkit-transform: translateX(10%) rotate(2deg); }
+ 75% { -webkit-transform: translateX(-5%) rotate(-1deg); }
+ 100% { -webkit-transform: translateX(0%); }
+}
+
+@-moz-keyframes wobble {
+ 0% { -moz-transform: translateX(0%); }
+ 15% { -moz-transform: translateX(-25%) rotate(-5deg); }
+ 30% { -moz-transform: translateX(20%) rotate(3deg); }
+ 45% { -moz-transform: translateX(-15%) rotate(-3deg); }
+ 60% { -moz-transform: translateX(10%) rotate(2deg); }
+ 75% { -moz-transform: translateX(-5%) rotate(-1deg); }
+ 100% { -moz-transform: translateX(0%); }
+}
+
+@-o-keyframes wobble {
+ 0% { -o-transform: translateX(0%); }
+ 15% { -o-transform: translateX(-25%) rotate(-5deg); }
+ 30% { -o-transform: translateX(20%) rotate(3deg); }
+ 45% { -o-transform: translateX(-15%) rotate(-3deg); }
+ 60% { -o-transform: translateX(10%) rotate(2deg); }
+ 75% { -o-transform: translateX(-5%) rotate(-1deg); }
+ 100% { -o-transform: translateX(0%); }
+}
+
+@keyframes wobble {
+ 0% { transform: translateX(0%); }
+ 15% { transform: translateX(-25%) rotate(-5deg); }
+ 30% { transform: translateX(20%) rotate(3deg); }
+ 45% { transform: translateX(-15%) rotate(-3deg); }
+ 60% { transform: translateX(10%) rotate(2deg); }
+ 75% { transform: translateX(-5%) rotate(-1deg); }
+ 100% { transform: translateX(0%); }
+}
+
+.animated.wobble {
+ -webkit-animation-name: wobble;
+ -moz-animation-name: wobble;
+ -o-animation-name: wobble;
+ animation-name: wobble;
+}
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes pulse {
+ 0% { -webkit-transform: scale(1); }
+ 50% { -webkit-transform: scale(1.1); }
+ 100% { -webkit-transform: scale(1); }
+}
+@-moz-keyframes pulse {
+ 0% { -moz-transform: scale(1); }
+ 50% { -moz-transform: scale(1.1); }
+ 100% { -moz-transform: scale(1); }
+}
+@-o-keyframes pulse {
+ 0% { -o-transform: scale(1); }
+ 50% { -o-transform: scale(1.1); }
+ 100% { -o-transform: scale(1); }
+}
+@keyframes pulse {
+ 0% { transform: scale(1); }
+ 50% { transform: scale(1.1); }
+ 100% { transform: scale(1); }
+}
+
+.animated.pulse {
+ -webkit-animation-name: pulse;
+ -moz-animation-name: pulse;
+ -o-animation-name: pulse;
+ animation-name: pulse;
+}
+@-webkit-keyframes flip {
+ 0% {
+ -webkit-transform: perspective(400px) rotateY(0);
+ -webkit-animation-timing-function: ease-out;
+ }
+ 40% {
+ -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg);
+ -webkit-animation-timing-function: ease-out;
+ }
+ 50% {
+ -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
+ -webkit-animation-timing-function: ease-in;
+ }
+ 80% {
+ -webkit-transform: perspective(400px) rotateY(360deg) scale(.95);
+ -webkit-animation-timing-function: ease-in;
+ }
+ 100% {
+ -webkit-transform: perspective(400px) scale(1);
+ -webkit-animation-timing-function: ease-in;
+ }
+}
+@-moz-keyframes flip {
+ 0% {
+ -moz-transform: perspective(400px) rotateY(0);
+ -moz-animation-timing-function: ease-out;
+ }
+ 40% {
+ -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg);
+ -moz-animation-timing-function: ease-out;
+ }
+ 50% {
+ -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
+ -moz-animation-timing-function: ease-in;
+ }
+ 80% {
+ -moz-transform: perspective(400px) rotateY(360deg) scale(.95);
+ -moz-animation-timing-function: ease-in;
+ }
+ 100% {
+ -moz-transform: perspective(400px) scale(1);
+ -moz-animation-timing-function: ease-in;
+ }
+}
+@-o-keyframes flip {
+ 0% {
+ -o-transform: perspective(400px) rotateY(0);
+ -o-animation-timing-function: ease-out;
+ }
+ 40% {
+ -o-transform: perspective(400px) translateZ(150px) rotateY(170deg);
+ -o-animation-timing-function: ease-out;
+ }
+ 50% {
+ -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
+ -o-animation-timing-function: ease-in;
+ }
+ 80% {
+ -o-transform: perspective(400px) rotateY(360deg) scale(.95);
+ -o-animation-timing-function: ease-in;
+ }
+ 100% {
+ -o-transform: perspective(400px) scale(1);
+ -o-animation-timing-function: ease-in;
+ }
+}
+@keyframes flip {
+ 0% {
+ transform: perspective(400px) rotateY(0);
+ animation-timing-function: ease-out;
+ }
+ 40% {
+ transform: perspective(400px) translateZ(150px) rotateY(170deg);
+ animation-timing-function: ease-out;
+ }
+ 50% {
+ transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
+ animation-timing-function: ease-in;
+ }
+ 80% {
+ transform: perspective(400px) rotateY(360deg) scale(.95);
+ animation-timing-function: ease-in;
+ }
+ 100% {
+ transform: perspective(400px) scale(1);
+ animation-timing-function: ease-in;
+ }
+}
+
+.animated.flip {
+ -webkit-backface-visibility: visible !important;
+ -webkit-animation-name: flip;
+ -moz-backface-visibility: visible !important;
+ -moz-animation-name: flip;
+ -o-backface-visibility: visible !important;
+ -o-animation-name: flip;
+ backface-visibility: visible !important;
+ animation-name: flip;
+}
+@-webkit-keyframes flipInX {
+ 0% {
+ -webkit-transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotateX(-10deg);
+ }
+
+ 70% {
+ -webkit-transform: perspective(400px) rotateX(10deg);
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+}
+@-moz-keyframes flipInX {
+ 0% {
+ -moz-transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ -moz-transform: perspective(400px) rotateX(-10deg);
+ }
+
+ 70% {
+ -moz-transform: perspective(400px) rotateX(10deg);
+ }
+
+ 100% {
+ -moz-transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+}
+@-o-keyframes flipInX {
+ 0% {
+ -o-transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ -o-transform: perspective(400px) rotateX(-10deg);
+ }
+
+ 70% {
+ -o-transform: perspective(400px) rotateX(10deg);
+ }
+
+ 100% {
+ -o-transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+}
+@keyframes flipInX {
+ 0% {
+ transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ transform: perspective(400px) rotateX(-10deg);
+ }
+
+ 70% {
+ transform: perspective(400px) rotateX(10deg);
+ }
+
+ 100% {
+ transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+}
+
+.animated.flipInX {
+ -webkit-backface-visibility: visible !important;
+ -webkit-animation-name: flipInX;
+ -moz-backface-visibility: visible !important;
+ -moz-animation-name: flipInX;
+ -o-backface-visibility: visible !important;
+ -o-animation-name: flipInX;
+ backface-visibility: visible !important;
+ animation-name: flipInX;
+}
+@-webkit-keyframes flipOutX {
+ 0% {
+ -webkit-transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+ 100% {
+ -webkit-transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+}
+
+@-moz-keyframes flipOutX {
+ 0% {
+ -moz-transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+ 100% {
+ -moz-transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+}
+
+@-o-keyframes flipOutX {
+ 0% {
+ -o-transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+ 100% {
+ -o-transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes flipOutX {
+ 0% {
+ transform: perspective(400px) rotateX(0deg);
+ opacity: 1;
+ }
+ 100% {
+ transform: perspective(400px) rotateX(90deg);
+ opacity: 0;
+ }
+}
+
+.animated.flipOutX {
+ -webkit-animation-name: flipOutX;
+ -webkit-backface-visibility: visible !important;
+ -moz-animation-name: flipOutX;
+ -moz-backface-visibility: visible !important;
+ -o-animation-name: flipOutX;
+ -o-backface-visibility: visible !important;
+ animation-name: flipOutX;
+ backface-visibility: visible !important;
+}
+@-webkit-keyframes flipInY {
+ 0% {
+ -webkit-transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotateY(-10deg);
+ }
+
+ 70% {
+ -webkit-transform: perspective(400px) rotateY(10deg);
+ }
+
+ 100% {
+ -webkit-transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+}
+@-moz-keyframes flipInY {
+ 0% {
+ -moz-transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ -moz-transform: perspective(400px) rotateY(-10deg);
+ }
+
+ 70% {
+ -moz-transform: perspective(400px) rotateY(10deg);
+ }
+
+ 100% {
+ -moz-transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+}
+@-o-keyframes flipInY {
+ 0% {
+ -o-transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ -o-transform: perspective(400px) rotateY(-10deg);
+ }
+
+ 70% {
+ -o-transform: perspective(400px) rotateY(10deg);
+ }
+
+ 100% {
+ -o-transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+}
+@keyframes flipInY {
+ 0% {
+ transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+
+ 40% {
+ transform: perspective(400px) rotateY(-10deg);
+ }
+
+ 70% {
+ transform: perspective(400px) rotateY(10deg);
+ }
+
+ 100% {
+ transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+}
+
+.animated.flipInY {
+ -webkit-backface-visibility: visible !important;
+ -webkit-animation-name: flipInY;
+ -moz-backface-visibility: visible !important;
+ -moz-animation-name: flipInY;
+ -o-backface-visibility: visible !important;
+ -o-animation-name: flipInY;
+ backface-visibility: visible !important;
+ animation-name: flipInY;
+}
+@-webkit-keyframes flipOutY {
+ 0% {
+ -webkit-transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+ 100% {
+ -webkit-transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+}
+@-moz-keyframes flipOutY {
+ 0% {
+ -moz-transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+ 100% {
+ -moz-transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+}
+@-o-keyframes flipOutY {
+ 0% {
+ -o-transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+ 100% {
+ -o-transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+}
+@keyframes flipOutY {
+ 0% {
+ transform: perspective(400px) rotateY(0deg);
+ opacity: 1;
+ }
+ 100% {
+ transform: perspective(400px) rotateY(90deg);
+ opacity: 0;
+ }
+}
+
+.animated.flipOutY {
+ -webkit-backface-visibility: visible !important;
+ -webkit-animation-name: flipOutY;
+ -moz-backface-visibility: visible !important;
+ -moz-animation-name: flipOutY;
+ -o-backface-visibility: visible !important;
+ -o-animation-name: flipOutY;
+ backface-visibility: visible !important;
+ animation-name: flipOutY;
+}
+@-webkit-keyframes fadeIn {
+ 0% {opacity: 0;}
+ 100% {opacity: 1;}
+}
+
+@-moz-keyframes fadeIn {
+ 0% {opacity: 0;}
+ 100% {opacity: 1;}
+}
+
+@-o-keyframes fadeIn {
+ 0% {opacity: 0;}
+ 100% {opacity: 1;}
+}
+
+@keyframes fadeIn {
+ 0% {opacity: 0;}
+ 100% {opacity: 1;}
+}
+
+.animated.fadeIn {
+ -webkit-animation-name: fadeIn;
+ -moz-animation-name: fadeIn;
+ -o-animation-name: fadeIn;
+ animation-name: fadeIn;
+}
+@-webkit-keyframes fadeInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ }
+}
+
+@-moz-keyframes fadeInUp {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -moz-transform: translateY(0);
+ }
+}
+
+@-o-keyframes fadeInUp {
+ 0% {
+ opacity: 0;
+ -o-transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -o-transform: translateY(0);
+ }
+}
+
+@keyframes fadeInUp {
+ 0% {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animated.fadeInUp {
+ -webkit-animation-name: fadeInUp;
+ -moz-animation-name: fadeInUp;
+ -o-animation-name: fadeInUp;
+ animation-name: fadeInUp;
+}
+@-webkit-keyframes fadeInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ }
+}
+
+@-moz-keyframes fadeInDown {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -moz-transform: translateY(0);
+ }
+}
+
+@-o-keyframes fadeInDown {
+ 0% {
+ opacity: 0;
+ -o-transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -o-transform: translateY(0);
+ }
+}
+
+@keyframes fadeInDown {
+ 0% {
+ opacity: 0;
+ transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animated.fadeInDown {
+ -webkit-animation-name: fadeInDown;
+ -moz-animation-name: fadeInDown;
+ -o-animation-name: fadeInDown;
+ animation-name: fadeInDown;
+}
+@-webkit-keyframes fadeInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ }
+}
+
+@-moz-keyframes fadeInLeft {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -moz-transform: translateX(0);
+ }
+}
+
+@-o-keyframes fadeInLeft {
+ 0% {
+ opacity: 0;
+ -o-transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -o-transform: translateX(0);
+ }
+}
+
+@keyframes fadeInLeft {
+ 0% {
+ opacity: 0;
+ transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+}
+
+.animated.fadeInLeft {
+ -webkit-animation-name: fadeInLeft;
+ -moz-animation-name: fadeInLeft;
+ -o-animation-name: fadeInLeft;
+ animation-name: fadeInLeft;
+}
+@-webkit-keyframes fadeInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ }
+}
+
+@-moz-keyframes fadeInRight {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -moz-transform: translateX(0);
+ }
+}
+
+@-o-keyframes fadeInRight {
+ 0% {
+ opacity: 0;
+ -o-transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ -o-transform: translateX(0);
+ }
+}
+
+@keyframes fadeInRight {
+ 0% {
+ opacity: 0;
+ transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+}
+
+.animated.fadeInRight {
+ -webkit-animation-name: fadeInRight;
+ -moz-animation-name: fadeInRight;
+ -o-animation-name: fadeInRight;
+ animation-name: fadeInRight;
+}
+@-webkit-keyframes fadeInUpBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ }
+}
+
+@-moz-keyframes fadeInUpBig {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateY(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -moz-transform: translateY(0);
+ }
+}
+
+@-o-keyframes fadeInUpBig {
+ 0% {
+ opacity: 0;
+ -o-transform: translateY(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -o-transform: translateY(0);
+ }
+}
+
+@keyframes fadeInUpBig {
+ 0% {
+ opacity: 0;
+ transform: translateY(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animated.fadeInUpBig {
+ -webkit-animation-name: fadeInUpBig;
+ -moz-animation-name: fadeInUpBig;
+ -o-animation-name: fadeInUpBig;
+ animation-name: fadeInUpBig;
+}
+@-webkit-keyframes fadeInDownBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ }
+}
+
+@-moz-keyframes fadeInDownBig {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateY(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -moz-transform: translateY(0);
+ }
+}
+
+@-o-keyframes fadeInDownBig {
+ 0% {
+ opacity: 0;
+ -o-transform: translateY(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -o-transform: translateY(0);
+ }
+}
+
+@keyframes fadeInDownBig {
+ 0% {
+ opacity: 0;
+ transform: translateY(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.animated.fadeInDownBig {
+ -webkit-animation-name: fadeInDownBig;
+ -moz-animation-name: fadeInDownBig;
+ -o-animation-name: fadeInDownBig;
+ animation-name: fadeInDownBig;
+}
+@-webkit-keyframes fadeInLeftBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ }
+}
+@-moz-keyframes fadeInLeftBig {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateX(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -moz-transform: translateX(0);
+ }
+}
+@-o-keyframes fadeInLeftBig {
+ 0% {
+ opacity: 0;
+ -o-transform: translateX(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -o-transform: translateX(0);
+ }
+}
+@keyframes fadeInLeftBig {
+ 0% {
+ opacity: 0;
+ transform: translateX(-2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+}
+
+.animated.fadeInLeftBig {
+ -webkit-animation-name: fadeInLeftBig;
+ -moz-animation-name: fadeInLeftBig;
+ -o-animation-name: fadeInLeftBig;
+ animation-name: fadeInLeftBig;
+}
+@-webkit-keyframes fadeInRightBig {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ }
+}
+
+@-moz-keyframes fadeInRightBig {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateX(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -moz-transform: translateX(0);
+ }
+}
+
+@-o-keyframes fadeInRightBig {
+ 0% {
+ opacity: 0;
+ -o-transform: translateX(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ -o-transform: translateX(0);
+ }
+}
+
+@keyframes fadeInRightBig {
+ 0% {
+ opacity: 0;
+ transform: translateX(2000px);
+ }
+
+ 100% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+}
+
+.animated.fadeInRightBig {
+ -webkit-animation-name: fadeInRightBig;
+ -moz-animation-name: fadeInRightBig;
+ -o-animation-name: fadeInRightBig;
+ animation-name: fadeInRightBig;
+}
+@-webkit-keyframes fadeOut {
+ 0% {opacity: 1;}
+ 100% {opacity: 0;}
+}
+
+@-moz-keyframes fadeOut {
+ 0% {opacity: 1;}
+ 100% {opacity: 0;}
+}
+
+@-o-keyframes fadeOut {
+ 0% {opacity: 1;}
+ 100% {opacity: 0;}
+}
+
+@keyframes fadeOut {
+ 0% {opacity: 1;}
+ 100% {opacity: 0;}
+}
+
+.animated.fadeOut {
+ -webkit-animation-name: fadeOut;
+ -moz-animation-name: fadeOut;
+ -o-animation-name: fadeOut;
+ animation-name: fadeOut;
+}
+@-webkit-keyframes fadeOutUp {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-20px);
+ }
+}
+@-moz-keyframes fadeOutUp {
+ 0% {
+ opacity: 1;
+ -moz-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateY(-20px);
+ }
+}
+@-o-keyframes fadeOutUp {
+ 0% {
+ opacity: 1;
+ -o-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateY(-20px);
+ }
+}
+@keyframes fadeOutUp {
+ 0% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateY(-20px);
+ }
+}
+
+.animated.fadeOutUp {
+ -webkit-animation-name: fadeOutUp;
+ -moz-animation-name: fadeOutUp;
+ -o-animation-name: fadeOutUp;
+ animation-name: fadeOutUp;
+}
+@-webkit-keyframes fadeOutDown {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(20px);
+ }
+}
+
+@-moz-keyframes fadeOutDown {
+ 0% {
+ opacity: 1;
+ -moz-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateY(20px);
+ }
+}
+
+@-o-keyframes fadeOutDown {
+ 0% {
+ opacity: 1;
+ -o-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateY(20px);
+ }
+}
+
+@keyframes fadeOutDown {
+ 0% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+}
+
+.animated.fadeOutDown {
+ -webkit-animation-name: fadeOutDown;
+ -moz-animation-name: fadeOutDown;
+ -o-animation-name: fadeOutDown;
+ animation-name: fadeOutDown;
+}
+@-webkit-keyframes fadeOutLeft {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-20px);
+ }
+}
+
+@-moz-keyframes fadeOutLeft {
+ 0% {
+ opacity: 1;
+ -moz-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateX(-20px);
+ }
+}
+
+@-o-keyframes fadeOutLeft {
+ 0% {
+ opacity: 1;
+ -o-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateX(-20px);
+ }
+}
+
+@keyframes fadeOutLeft {
+ 0% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateX(-20px);
+ }
+}
+
+.animated.fadeOutLeft {
+ -webkit-animation-name: fadeOutLeft;
+ -moz-animation-name: fadeOutLeft;
+ -o-animation-name: fadeOutLeft;
+ animation-name: fadeOutLeft;
+}
+@-webkit-keyframes fadeOutRight {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(20px);
+ }
+}
+
+@-moz-keyframes fadeOutRight {
+ 0% {
+ opacity: 1;
+ -moz-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateX(20px);
+ }
+}
+
+@-o-keyframes fadeOutRight {
+ 0% {
+ opacity: 1;
+ -o-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateX(20px);
+ }
+}
+
+@keyframes fadeOutRight {
+ 0% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateX(20px);
+ }
+}
+
+.animated.fadeOutRight {
+ -webkit-animation-name: fadeOutRight;
+ -moz-animation-name: fadeOutRight;
+ -o-animation-name: fadeOutRight;
+ animation-name: fadeOutRight;
+}
+@-webkit-keyframes fadeOutUpBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ }
+}
+
+@-moz-keyframes fadeOutUpBig {
+ 0% {
+ opacity: 1;
+ -moz-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateY(-2000px);
+ }
+}
+
+@-o-keyframes fadeOutUpBig {
+ 0% {
+ opacity: 1;
+ -o-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateY(-2000px);
+ }
+}
+
+@keyframes fadeOutUpBig {
+ 0% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateY(-2000px);
+ }
+}
+
+.animated.fadeOutUpBig {
+ -webkit-animation-name: fadeOutUpBig;
+ -moz-animation-name: fadeOutUpBig;
+ -o-animation-name: fadeOutUpBig;
+ animation-name: fadeOutUpBig;
+}
+@-webkit-keyframes fadeOutDownBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ }
+}
+
+@-moz-keyframes fadeOutDownBig {
+ 0% {
+ opacity: 1;
+ -moz-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateY(2000px);
+ }
+}
+
+@-o-keyframes fadeOutDownBig {
+ 0% {
+ opacity: 1;
+ -o-transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateY(2000px);
+ }
+}
+
+@keyframes fadeOutDownBig {
+ 0% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateY(2000px);
+ }
+}
+
+.animated.fadeOutDownBig {
+ -webkit-animation-name: fadeOutDownBig;
+ -moz-animation-name: fadeOutDownBig;
+ -o-animation-name: fadeOutDownBig;
+ animation-name: fadeOutDownBig;
+}
+@-webkit-keyframes fadeOutLeftBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ }
+}
+
+@-moz-keyframes fadeOutLeftBig {
+ 0% {
+ opacity: 1;
+ -moz-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateX(-2000px);
+ }
+}
+
+@-o-keyframes fadeOutLeftBig {
+ 0% {
+ opacity: 1;
+ -o-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateX(-2000px);
+ }
+}
+
+@keyframes fadeOutLeftBig {
+ 0% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateX(-2000px);
+ }
+}
+
+.animated.fadeOutLeftBig {
+ -webkit-animation-name: fadeOutLeftBig;
+ -moz-animation-name: fadeOutLeftBig;
+ -o-animation-name: fadeOutLeftBig;
+ animation-name: fadeOutLeftBig;
+}
+@-webkit-keyframes fadeOutRightBig {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ }
+}
+@-moz-keyframes fadeOutRightBig {
+ 0% {
+ opacity: 1;
+ -moz-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateX(2000px);
+ }
+}
+@-o-keyframes fadeOutRightBig {
+ 0% {
+ opacity: 1;
+ -o-transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateX(2000px);
+ }
+}
+@keyframes fadeOutRightBig {
+ 0% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateX(2000px);
+ }
+}
+
+.animated.fadeOutRightBig {
+ -webkit-animation-name: fadeOutRightBig;
+ -moz-animation-name: fadeOutRightBig;
+ -o-animation-name: fadeOutRightBig;
+ animation-name: fadeOutRightBig;
+}
+@-webkit-keyframes bounceIn {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale(.3);
+ }
+
+ 50% {
+ opacity: 1;
+ -webkit-transform: scale(1.05);
+ }
+
+ 70% {
+ -webkit-transform: scale(.9);
+ }
+
+ 100% {
+ -webkit-transform: scale(1);
+ }
+}
+
+@-moz-keyframes bounceIn {
+ 0% {
+ opacity: 0;
+ -moz-transform: scale(.3);
+ }
+
+ 50% {
+ opacity: 1;
+ -moz-transform: scale(1.05);
+ }
+
+ 70% {
+ -moz-transform: scale(.9);
+ }
+
+ 100% {
+ -moz-transform: scale(1);
+ }
+}
+
+@-o-keyframes bounceIn {
+ 0% {
+ opacity: 0;
+ -o-transform: scale(.3);
+ }
+
+ 50% {
+ opacity: 1;
+ -o-transform: scale(1.05);
+ }
+
+ 70% {
+ -o-transform: scale(.9);
+ }
+
+ 100% {
+ -o-transform: scale(1);
+ }
+}
+
+@keyframes bounceIn {
+ 0% {
+ opacity: 0;
+ transform: scale(.3);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: scale(1.05);
+ }
+
+ 70% {
+ transform: scale(.9);
+ }
+
+ 100% {
+ transform: scale(1);
+ }
+}
+
+.animated.bounceIn {
+ -webkit-animation-name: bounceIn;
+ -moz-animation-name: bounceIn;
+ -o-animation-name: bounceIn;
+ animation-name: bounceIn;
+}
+@-webkit-keyframes bounceInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateY(-30px);
+ }
+
+ 80% {
+ -webkit-transform: translateY(10px);
+ }
+
+ 100% {
+ -webkit-transform: translateY(0);
+ }
+}
+@-moz-keyframes bounceInUp {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateY(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -moz-transform: translateY(-30px);
+ }
+
+ 80% {
+ -moz-transform: translateY(10px);
+ }
+
+ 100% {
+ -moz-transform: translateY(0);
+ }
+}
+
+@-o-keyframes bounceInUp {
+ 0% {
+ opacity: 0;
+ -o-transform: translateY(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -o-transform: translateY(-30px);
+ }
+
+ 80% {
+ -o-transform: translateY(10px);
+ }
+
+ 100% {
+ -o-transform: translateY(0);
+ }
+}
+
+@keyframes bounceInUp {
+ 0% {
+ opacity: 0;
+ transform: translateY(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ transform: translateY(-30px);
+ }
+
+ 80% {
+ transform: translateY(10px);
+ }
+
+ 100% {
+ transform: translateY(0);
+ }
+}
+
+.animated.bounceInUp {
+ -webkit-animation-name: bounceInUp;
+ -moz-animation-name: bounceInUp;
+ -o-animation-name: bounceInUp;
+ animation-name: bounceInUp;
+}
+@-webkit-keyframes bounceInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateY(30px);
+ }
+
+ 80% {
+ -webkit-transform: translateY(-10px);
+ }
+
+ 100% {
+ -webkit-transform: translateY(0);
+ }
+}
+
+@-moz-keyframes bounceInDown {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateY(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -moz-transform: translateY(30px);
+ }
+
+ 80% {
+ -moz-transform: translateY(-10px);
+ }
+
+ 100% {
+ -moz-transform: translateY(0);
+ }
+}
+
+@-o-keyframes bounceInDown {
+ 0% {
+ opacity: 0;
+ -o-transform: translateY(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -o-transform: translateY(30px);
+ }
+
+ 80% {
+ -o-transform: translateY(-10px);
+ }
+
+ 100% {
+ -o-transform: translateY(0);
+ }
+}
+
+@keyframes bounceInDown {
+ 0% {
+ opacity: 0;
+ transform: translateY(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ transform: translateY(30px);
+ }
+
+ 80% {
+ transform: translateY(-10px);
+ }
+
+ 100% {
+ transform: translateY(0);
+ }
+}
+
+.animated.bounceInDown {
+ -webkit-animation-name: bounceInDown;
+ -moz-animation-name: bounceInDown;
+ -o-animation-name: bounceInDown;
+ animation-name: bounceInDown;
+}
+@-webkit-keyframes bounceInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateX(30px);
+ }
+
+ 80% {
+ -webkit-transform: translateX(-10px);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0);
+ }
+}
+
+@-moz-keyframes bounceInLeft {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateX(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -moz-transform: translateX(30px);
+ }
+
+ 80% {
+ -moz-transform: translateX(-10px);
+ }
+
+ 100% {
+ -moz-transform: translateX(0);
+ }
+}
+
+@-o-keyframes bounceInLeft {
+ 0% {
+ opacity: 0;
+ -o-transform: translateX(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -o-transform: translateX(30px);
+ }
+
+ 80% {
+ -o-transform: translateX(-10px);
+ }
+
+ 100% {
+ -o-transform: translateX(0);
+ }
+}
+
+@keyframes bounceInLeft {
+ 0% {
+ opacity: 0;
+ transform: translateX(-2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ transform: translateX(30px);
+ }
+
+ 80% {
+ transform: translateX(-10px);
+ }
+
+ 100% {
+ transform: translateX(0);
+ }
+}
+
+.animated.bounceInLeft {
+ -webkit-animation-name: bounceInLeft;
+ -moz-animation-name: bounceInLeft;
+ -o-animation-name: bounceInLeft;
+ animation-name: bounceInLeft;
+}
+@-webkit-keyframes bounceInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translateX(-30px);
+ }
+
+ 80% {
+ -webkit-transform: translateX(10px);
+ }
+
+ 100% {
+ -webkit-transform: translateX(0);
+ }
+}
+
+@-moz-keyframes bounceInRight {
+ 0% {
+ opacity: 0;
+ -moz-transform: translateX(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -moz-transform: translateX(-30px);
+ }
+
+ 80% {
+ -moz-transform: translateX(10px);
+ }
+
+ 100% {
+ -moz-transform: translateX(0);
+ }
+}
+
+@-o-keyframes bounceInRight {
+ 0% {
+ opacity: 0;
+ -o-transform: translateX(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ -o-transform: translateX(-30px);
+ }
+
+ 80% {
+ -o-transform: translateX(10px);
+ }
+
+ 100% {
+ -o-transform: translateX(0);
+ }
+}
+
+@keyframes bounceInRight {
+ 0% {
+ opacity: 0;
+ transform: translateX(2000px);
+ }
+
+ 60% {
+ opacity: 1;
+ transform: translateX(-30px);
+ }
+
+ 80% {
+ transform: translateX(10px);
+ }
+
+ 100% {
+ transform: translateX(0);
+ }
+}
+
+.animated.bounceInRight {
+ -webkit-animation-name: bounceInRight;
+ -moz-animation-name: bounceInRight;
+ -o-animation-name: bounceInRight;
+ animation-name: bounceInRight;
+}
+@-webkit-keyframes bounceOut {
+ 0% {
+ -webkit-transform: scale(1);
+ }
+
+ 25% {
+ -webkit-transform: scale(.95);
+ }
+
+ 50% {
+ opacity: 1;
+ -webkit-transform: scale(1.1);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(.3);
+ }
+}
+
+@-moz-keyframes bounceOut {
+ 0% {
+ -moz-transform: scale(1);
+ }
+
+ 25% {
+ -moz-transform: scale(.95);
+ }
+
+ 50% {
+ opacity: 1;
+ -moz-transform: scale(1.1);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: scale(.3);
+ }
+}
+
+@-o-keyframes bounceOut {
+ 0% {
+ -o-transform: scale(1);
+ }
+
+ 25% {
+ -o-transform: scale(.95);
+ }
+
+ 50% {
+ opacity: 1;
+ -o-transform: scale(1.1);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: scale(.3);
+ }
+}
+
+@keyframes bounceOut {
+ 0% {
+ transform: scale(1);
+ }
+
+ 25% {
+ transform: scale(.95);
+ }
+
+ 50% {
+ opacity: 1;
+ transform: scale(1.1);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: scale(.3);
+ }
+}
+
+.animated.bounceOut {
+ -webkit-animation-name: bounceOut;
+ -moz-animation-name: bounceOut;
+ -o-animation-name: bounceOut;
+ animation-name: bounceOut;
+}
+@-webkit-keyframes bounceOutUp {
+ 0% {
+ -webkit-transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-2000px);
+ }
+}
+
+@-moz-keyframes bounceOutUp {
+ 0% {
+ -moz-transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -moz-transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateY(-2000px);
+ }
+}
+
+@-o-keyframes bounceOutUp {
+ 0% {
+ -o-transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -o-transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateY(-2000px);
+ }
+}
+
+@keyframes bounceOutUp {
+ 0% {
+ transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ transform: translateY(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateY(-2000px);
+ }
+}
+
+.animated.bounceOutUp {
+ -webkit-animation-name: bounceOutUp;
+ -moz-animation-name: bounceOutUp;
+ -o-animation-name: bounceOutUp;
+ animation-name: bounceOutUp;
+}
+@-webkit-keyframes bounceOutDown {
+ 0% {
+ -webkit-transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(2000px);
+ }
+}
+
+@-moz-keyframes bounceOutDown {
+ 0% {
+ -moz-transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -moz-transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateY(2000px);
+ }
+}
+
+@-o-keyframes bounceOutDown {
+ 0% {
+ -o-transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -o-transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateY(2000px);
+ }
+}
+
+@keyframes bounceOutDown {
+ 0% {
+ transform: translateY(0);
+ }
+
+ 20% {
+ opacity: 1;
+ transform: translateY(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateY(2000px);
+ }
+}
+
+.animated.bounceOutDown {
+ -webkit-animation-name: bounceOutDown;
+ -moz-animation-name: bounceOutDown;
+ -o-animation-name: bounceOutDown;
+ animation-name: bounceOutDown;
+}
+@-webkit-keyframes bounceOutLeft {
+ 0% {
+ -webkit-transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-2000px);
+ }
+}
+
+@-moz-keyframes bounceOutLeft {
+ 0% {
+ -moz-transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -moz-transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateX(-2000px);
+ }
+}
+
+@-o-keyframes bounceOutLeft {
+ 0% {
+ -o-transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -o-transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateX(-2000px);
+ }
+}
+
+@keyframes bounceOutLeft {
+ 0% {
+ transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ transform: translateX(20px);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateX(-2000px);
+ }
+}
+
+.animated.bounceOutLeft {
+ -webkit-animation-name: bounceOutLeft;
+ -moz-animation-name: bounceOutLeft;
+ -o-animation-name: bounceOutLeft;
+ animation-name: bounceOutLeft;
+}
+@-webkit-keyframes bounceOutRight {
+ 0% {
+ -webkit-transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -webkit-transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(2000px);
+ }
+}
+
+@-moz-keyframes bounceOutRight {
+ 0% {
+ -moz-transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -moz-transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateX(2000px);
+ }
+}
+
+@-o-keyframes bounceOutRight {
+ 0% {
+ -o-transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ -o-transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateX(2000px);
+ }
+}
+
+@keyframes bounceOutRight {
+ 0% {
+ transform: translateX(0);
+ }
+
+ 20% {
+ opacity: 1;
+ transform: translateX(-20px);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateX(2000px);
+ }
+}
+
+.animated.bounceOutRight {
+ -webkit-animation-name: bounceOutRight;
+ -moz-animation-name: bounceOutRight;
+ -o-animation-name: bounceOutRight;
+ animation-name: bounceOutRight;
+}
+@-webkit-keyframes rotateIn {
+ 0% {
+ -webkit-transform-origin: center center;
+ -webkit-transform: rotate(-200deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: center center;
+ -webkit-transform: rotate(0);
+ opacity: 1;
+ }
+}
+@-moz-keyframes rotateIn {
+ 0% {
+ -moz-transform-origin: center center;
+ -moz-transform: rotate(-200deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -moz-transform-origin: center center;
+ -moz-transform: rotate(0);
+ opacity: 1;
+ }
+}
+@-o-keyframes rotateIn {
+ 0% {
+ -o-transform-origin: center center;
+ -o-transform: rotate(-200deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -o-transform-origin: center center;
+ -o-transform: rotate(0);
+ opacity: 1;
+ }
+}
+@keyframes rotateIn {
+ 0% {
+ transform-origin: center center;
+ transform: rotate(-200deg);
+ opacity: 0;
+ }
+
+ 100% {
+ transform-origin: center center;
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+.animated.rotateIn {
+ -webkit-animation-name: rotateIn;
+ -moz-animation-name: rotateIn;
+ -o-animation-name: rotateIn;
+ animation-name: rotateIn;
+}
+@-webkit-keyframes rotateInUpLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ -webkit-transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@-moz-keyframes rotateInUpLeft {
+ 0% {
+ -moz-transform-origin: left bottom;
+ -moz-transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -moz-transform-origin: left bottom;
+ -moz-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@-o-keyframes rotateInUpLeft {
+ 0% {
+ -o-transform-origin: left bottom;
+ -o-transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -o-transform-origin: left bottom;
+ -o-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInUpLeft {
+ 0% {
+ transform-origin: left bottom;
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ transform-origin: left bottom;
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+.animated.rotateInUpLeft {
+ -webkit-animation-name: rotateInUpLeft;
+ -moz-animation-name: rotateInUpLeft;
+ -o-animation-name: rotateInUpLeft;
+ animation-name: rotateInUpLeft;
+}
+@-webkit-keyframes rotateInDownLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ -webkit-transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@-moz-keyframes rotateInDownLeft {
+ 0% {
+ -moz-transform-origin: left bottom;
+ -moz-transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -moz-transform-origin: left bottom;
+ -moz-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@-o-keyframes rotateInDownLeft {
+ 0% {
+ -o-transform-origin: left bottom;
+ -o-transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -o-transform-origin: left bottom;
+ -o-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInDownLeft {
+ 0% {
+ transform-origin: left bottom;
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ transform-origin: left bottom;
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+.animated.rotateInDownLeft {
+ -webkit-animation-name: rotateInDownLeft;
+ -moz-animation-name: rotateInDownLeft;
+ -o-animation-name: rotateInDownLeft;
+ animation-name: rotateInDownLeft;
+}
+@-webkit-keyframes rotateInUpRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ -webkit-transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@-moz-keyframes rotateInUpRight {
+ 0% {
+ -moz-transform-origin: right bottom;
+ -moz-transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -moz-transform-origin: right bottom;
+ -moz-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@-o-keyframes rotateInUpRight {
+ 0% {
+ -o-transform-origin: right bottom;
+ -o-transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -o-transform-origin: right bottom;
+ -o-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInUpRight {
+ 0% {
+ transform-origin: right bottom;
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ transform-origin: right bottom;
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+.animated.rotateInUpRight {
+ -webkit-animation-name: rotateInUpRight;
+ -moz-animation-name: rotateInUpRight;
+ -o-animation-name: rotateInUpRight;
+ animation-name: rotateInUpRight;
+}
+@-webkit-keyframes rotateInDownRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ -webkit-transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@-moz-keyframes rotateInDownRight {
+ 0% {
+ -moz-transform-origin: right bottom;
+ -moz-transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -moz-transform-origin: right bottom;
+ -moz-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@-o-keyframes rotateInDownRight {
+ 0% {
+ -o-transform-origin: right bottom;
+ -o-transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ -o-transform-origin: right bottom;
+ -o-transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInDownRight {
+ 0% {
+ transform-origin: right bottom;
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+
+ 100% {
+ transform-origin: right bottom;
+ transform: rotate(0);
+ opacity: 1;
+ }
+}
+
+.animated.rotateInDownRight {
+ -webkit-animation-name: rotateInDownRight;
+ -moz-animation-name: rotateInDownRight;
+ -o-animation-name: rotateInDownRight;
+ animation-name: rotateInDownRight;
+}
+@-webkit-keyframes rotateOut {
+ 0% {
+ -webkit-transform-origin: center center;
+ -webkit-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: center center;
+ -webkit-transform: rotate(200deg);
+ opacity: 0;
+ }
+}
+
+@-moz-keyframes rotateOut {
+ 0% {
+ -moz-transform-origin: center center;
+ -moz-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -moz-transform-origin: center center;
+ -moz-transform: rotate(200deg);
+ opacity: 0;
+ }
+}
+
+@-o-keyframes rotateOut {
+ 0% {
+ -o-transform-origin: center center;
+ -o-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -o-transform-origin: center center;
+ -o-transform: rotate(200deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOut {
+ 0% {
+ transform-origin: center center;
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ transform-origin: center center;
+ transform: rotate(200deg);
+ opacity: 0;
+ }
+}
+
+.animated.rotateOut {
+ -webkit-animation-name: rotateOut;
+ -moz-animation-name: rotateOut;
+ -o-animation-name: rotateOut;
+ animation-name: rotateOut;
+}
+@-webkit-keyframes rotateOutUpLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ -webkit-transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+@-moz-keyframes rotateOutUpLeft {
+ 0% {
+ -moz-transform-origin: left bottom;
+ -moz-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -moz-transform-origin: left bottom;
+ -moz-transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+@-o-keyframes rotateOutUpLeft {
+ 0% {
+ -o-transform-origin: left bottom;
+ -o-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -o-transform-origin: left bottom;
+ -o-transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutUpLeft {
+ 0% {
+ transform-origin: left bottom;
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ transform-origin: left bottom;
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+.animated.rotateOutUpLeft {
+ -webkit-animation-name: rotateOutUpLeft;
+ -moz-animation-name: rotateOutUpLeft;
+ -o-animation-name: rotateOutUpLeft;
+ animation-name: rotateOutUpLeft;
+}
+@-webkit-keyframes rotateOutDownLeft {
+ 0% {
+ -webkit-transform-origin: left bottom;
+ -webkit-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: left bottom;
+ -webkit-transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+@-moz-keyframes rotateOutDownLeft {
+ 0% {
+ -moz-transform-origin: left bottom;
+ -moz-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -moz-transform-origin: left bottom;
+ -moz-transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+@-o-keyframes rotateOutDownLeft {
+ 0% {
+ -o-transform-origin: left bottom;
+ -o-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -o-transform-origin: left bottom;
+ -o-transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutDownLeft {
+ 0% {
+ transform-origin: left bottom;
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ transform-origin: left bottom;
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+.animated.rotateOutDownLeft {
+ -webkit-animation-name: rotateOutDownLeft;
+ -moz-animation-name: rotateOutDownLeft;
+ -o-animation-name: rotateOutDownLeft;
+ animation-name: rotateOutDownLeft;
+}
+@-webkit-keyframes rotateOutUpRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ -webkit-transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+@-moz-keyframes rotateOutUpRight {
+ 0% {
+ -moz-transform-origin: right bottom;
+ -moz-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -moz-transform-origin: right bottom;
+ -moz-transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+@-o-keyframes rotateOutUpRight {
+ 0% {
+ -o-transform-origin: right bottom;
+ -o-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -o-transform-origin: right bottom;
+ -o-transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutUpRight {
+ 0% {
+ transform-origin: right bottom;
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ transform-origin: right bottom;
+ transform: rotate(90deg);
+ opacity: 0;
+ }
+}
+
+.animated.rotateOutUpRight {
+ -webkit-animation-name: rotateOutUpRight;
+ -moz-animation-name: rotateOutUpRight;
+ -o-animation-name: rotateOutUpRight;
+ animation-name: rotateOutUpRight;
+}
+@-webkit-keyframes rotateOutDownRight {
+ 0% {
+ -webkit-transform-origin: right bottom;
+ -webkit-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -webkit-transform-origin: right bottom;
+ -webkit-transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+@-moz-keyframes rotateOutDownRight {
+ 0% {
+ -moz-transform-origin: right bottom;
+ -moz-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -moz-transform-origin: right bottom;
+ -moz-transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+@-o-keyframes rotateOutDownRight {
+ 0% {
+ -o-transform-origin: right bottom;
+ -o-transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ -o-transform-origin: right bottom;
+ -o-transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutDownRight {
+ 0% {
+ transform-origin: right bottom;
+ transform: rotate(0);
+ opacity: 1;
+ }
+
+ 100% {
+ transform-origin: right bottom;
+ transform: rotate(-90deg);
+ opacity: 0;
+ }
+}
+
+.animated.rotateOutDownRight {
+ -webkit-animation-name: rotateOutDownRight;
+ -moz-animation-name: rotateOutDownRight;
+ -o-animation-name: rotateOutDownRight;
+ animation-name: rotateOutDownRight;
+}
+@-webkit-keyframes hinge {
+ 0% { -webkit-transform: rotate(0); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; }
+ 20%, 60% { -webkit-transform: rotate(80deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; }
+ 40% { -webkit-transform: rotate(60deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; }
+ 80% { -webkit-transform: rotate(60deg) translateY(0); opacity: 1; -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; }
+ 100% { -webkit-transform: translateY(700px); opacity: 0; }
+}
+
+@-moz-keyframes hinge {
+ 0% { -moz-transform: rotate(0); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; }
+ 20%, 60% { -moz-transform: rotate(80deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; }
+ 40% { -moz-transform: rotate(60deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; }
+ 80% { -moz-transform: rotate(60deg) translateY(0); opacity: 1; -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; }
+ 100% { -moz-transform: translateY(700px); opacity: 0; }
+}
+
+@-o-keyframes hinge {
+ 0% { -o-transform: rotate(0); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; }
+ 20%, 60% { -o-transform: rotate(80deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; }
+ 40% { -o-transform: rotate(60deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; }
+ 80% { -o-transform: rotate(60deg) translateY(0); opacity: 1; -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; }
+ 100% { -o-transform: translateY(700px); opacity: 0; }
+}
+
+@keyframes hinge {
+ 0% { transform: rotate(0); transform-origin: top left; animation-timing-function: ease-in-out; }
+ 20%, 60% { transform: rotate(80deg); transform-origin: top left; animation-timing-function: ease-in-out; }
+ 40% { transform: rotate(60deg); transform-origin: top left; animation-timing-function: ease-in-out; }
+ 80% { transform: rotate(60deg) translateY(0); opacity: 1; transform-origin: top left; animation-timing-function: ease-in-out; }
+ 100% { transform: translateY(700px); opacity: 0; }
+}
+
+.animated.hinge {
+ -webkit-animation-name: hinge;
+ -moz-animation-name: hinge;
+ -o-animation-name: hinge;
+ animation-name: hinge;
+}
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes rollIn {
+ 0% { opacity: 0; -webkit-transform: translateX(-100%) rotate(-120deg); }
+ 100% { opacity: 1; -webkit-transform: translateX(0px) rotate(0deg); }
+}
+
+@-moz-keyframes rollIn {
+ 0% { opacity: 0; -moz-transform: translateX(-100%) rotate(-120deg); }
+ 100% { opacity: 1; -moz-transform: translateX(0px) rotate(0deg); }
+}
+
+@-o-keyframes rollIn {
+ 0% { opacity: 0; -o-transform: translateX(-100%) rotate(-120deg); }
+ 100% { opacity: 1; -o-transform: translateX(0px) rotate(0deg); }
+}
+
+@keyframes rollIn {
+ 0% { opacity: 0; transform: translateX(-100%) rotate(-120deg); }
+ 100% { opacity: 1; transform: translateX(0px) rotate(0deg); }
+}
+
+.animated.rollIn {
+ -webkit-animation-name: rollIn;
+ -moz-animation-name: rollIn;
+ -o-animation-name: rollIn;
+ animation-name: rollIn;
+}
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes rollOut {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0px) rotate(0deg);
+ }
+
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(100%) rotate(120deg);
+ }
+}
+
+@-moz-keyframes rollOut {
+ 0% {
+ opacity: 1;
+ -moz-transform: translateX(0px) rotate(0deg);
+ }
+
+ 100% {
+ opacity: 0;
+ -moz-transform: translateX(100%) rotate(120deg);
+ }
+}
+
+@-o-keyframes rollOut {
+ 0% {
+ opacity: 1;
+ -o-transform: translateX(0px) rotate(0deg);
+ }
+
+ 100% {
+ opacity: 0;
+ -o-transform: translateX(100%) rotate(120deg);
+ }
+}
+
+@keyframes rollOut {
+ 0% {
+ opacity: 1;
+ transform: translateX(0px) rotate(0deg);
+ }
+
+ 100% {
+ opacity: 0;
+ transform: translateX(100%) rotate(120deg);
+ }
+}
+
+.animated.rollOut {
+ -webkit-animation-name: rollOut;
+ -moz-animation-name: rollOut;
+ -o-animation-name: rollOut;
+ animation-name: rollOut;
+}
+
+/* originally authored by Angelo Rohit - https://github.com/angelorohit */
+
+@-webkit-keyframes lightSpeedIn {
+ 0% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; }
+ 60% { -webkit-transform: translateX(-20%) skewX(30deg); opacity: 1; }
+ 80% { -webkit-transform: translateX(0%) skewX(-15deg); opacity: 1; }
+ 100% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; }
+}
+
+@-moz-keyframes lightSpeedIn {
+ 0% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; }
+ 60% { -moz-transform: translateX(-20%) skewX(30deg); opacity: 1; }
+ 80% { -moz-transform: translateX(0%) skewX(-15deg); opacity: 1; }
+ 100% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; }
+}
+
+@-o-keyframes lightSpeedIn {
+ 0% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; }
+ 60% { -o-transform: translateX(-20%) skewX(30deg); opacity: 1; }
+ 80% { -o-transform: translateX(0%) skewX(-15deg); opacity: 1; }
+ 100% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; }
+}
+
+@keyframes lightSpeedIn {
+ 0% { transform: translateX(100%) skewX(-30deg); opacity: 0; }
+ 60% { transform: translateX(-20%) skewX(30deg); opacity: 1; }
+ 80% { transform: translateX(0%) skewX(-15deg); opacity: 1; }
+ 100% { transform: translateX(0%) skewX(0deg); opacity: 1; }
+}
+
+.animated.lightSpeedIn {
+ -webkit-animation-name: lightSpeedIn;
+ -moz-animation-name: lightSpeedIn;
+ -o-animation-name: lightSpeedIn;
+ animation-name: lightSpeedIn;
+
+ -webkit-animation-timing-function: ease-out;
+ -moz-animation-timing-function: ease-out;
+ -o-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+}
+
+.animated.lightSpeedIn {
+ -webkit-animation-duration: 0.5s;
+ -moz-animation-duration: 0.5s;
+ -o-animation-duration: 0.5s;
+ animation-duration: 0.5s;
+}
+
+/* originally authored by Angelo Rohit - https://github.com/angelorohit */
+
+@-webkit-keyframes lightSpeedOut {
+ 0% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; }
+ 100% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; }
+}
+
+@-moz-keyframes lightSpeedOut {
+ 0% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; }
+ 100% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; }
+}
+
+@-o-keyframes lightSpeedOut {
+ 0% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; }
+ 100% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; }
+}
+
+@keyframes lightSpeedOut {
+ 0% { transform: translateX(0%) skewX(0deg); opacity: 1; }
+ 100% { transform: translateX(100%) skewX(-30deg); opacity: 0; }
+}
+
+.animated.lightSpeedOut {
+ -webkit-animation-name: lightSpeedOut;
+ -moz-animation-name: lightSpeedOut;
+ -o-animation-name: lightSpeedOut;
+ animation-name: lightSpeedOut;
+
+ -webkit-animation-timing-function: ease-in;
+ -moz-animation-timing-function: ease-in;
+ -o-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+}
+
+.animated.lightSpeedOut {
+ -webkit-animation-duration: 0.25s;
+ -moz-animation-duration: 0.25s;
+ -o-animation-duration: 0.25s;
+ animation-duration: 0.25s;
+}
+
+/* originally authored by Angelo Rohit - https://github.com/angelorohit */
+
+@-webkit-keyframes wiggle {
+ 0% { -webkit-transform: skewX(9deg); }
+ 10% { -webkit-transform: skewX(-8deg); }
+ 20% { -webkit-transform: skewX(7deg); }
+ 30% { -webkit-transform: skewX(-6deg); }
+ 40% { -webkit-transform: skewX(5deg); }
+ 50% { -webkit-transform: skewX(-4deg); }
+ 60% { -webkit-transform: skewX(3deg); }
+ 70% { -webkit-transform: skewX(-2deg); }
+ 80% { -webkit-transform: skewX(1deg); }
+ 90% { -webkit-transform: skewX(0deg); }
+ 100% { -webkit-transform: skewX(0deg); }
+}
+
+@-moz-keyframes wiggle {
+ 0% { -moz-transform: skewX(9deg); }
+ 10% { -moz-transform: skewX(-8deg); }
+ 20% { -moz-transform: skewX(7deg); }
+ 30% { -moz-transform: skewX(-6deg); }
+ 40% { -moz-transform: skewX(5deg); }
+ 50% { -moz-transform: skewX(-4deg); }
+ 60% { -moz-transform: skewX(3deg); }
+ 70% { -moz-transform: skewX(-2deg); }
+ 80% { -moz-transform: skewX(1deg); }
+ 90% { -moz-transform: skewX(0deg); }
+ 100% { -moz-transform: skewX(0deg); }
+}
+
+@-o-keyframes wiggle {
+ 0% { -o-transform: skewX(9deg); }
+ 10% { -o-transform: skewX(-8deg); }
+ 20% { -o-transform: skewX(7deg); }
+ 30% { -o-transform: skewX(-6deg); }
+ 40% { -o-transform: skewX(5deg); }
+ 50% { -o-transform: skewX(-4deg); }
+ 60% { -o-transform: skewX(3deg); }
+ 70% { -o-transform: skewX(-2deg); }
+ 80% { -o-transform: skewX(1deg); }
+ 90% { -o-transform: skewX(0deg); }
+ 100% { -o-transform: skewX(0deg); }
+}
+
+@keyframes wiggle {
+ 0% { transform: skewX(9deg); }
+ 10% { transform: skewX(-8deg); }
+ 20% { transform: skewX(7deg); }
+ 30% { transform: skewX(-6deg); }
+ 40% { transform: skewX(5deg); }
+ 50% { transform: skewX(-4deg); }
+ 60% { transform: skewX(3deg); }
+ 70% { transform: skewX(-2deg); }
+ 80% { transform: skewX(1deg); }
+ 90% { transform: skewX(0deg); }
+ 100% { transform: skewX(0deg); }
+}
+
+.animated.wiggle {
+ -webkit-animation-name: wiggle;
+ -moz-animation-name: wiggle;
+ -o-animation-name: wiggle;
+ animation-name: wiggle;
+
+ -webkit-animation-timing-function: ease-in;
+ -moz-animation-timing-function: ease-in;
+ -o-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+}
+
+.animated.wiggle {
+ -webkit-animation-duration: 0.75s;
+ -moz-animation-duration: 0.75s;
+ -o-animation-duration: 0.75s;
+ animation-duration: 0.75s;
+}
\ No newline at end of file
diff --git a/ui/stylesheets/lib/_normalize.scss b/ui/stylesheets/lib/_normalize.scss
new file mode 100644
index 00000000000..6adf56e7985
--- /dev/null
+++ b/ui/stylesheets/lib/_normalize.scss
@@ -0,0 +1,396 @@
+/*! normalize.css v2.1.2 | MIT License | git.io/normalize */
+
+/* ==========================================================================
+ HTML5 display definitions
+ ========================================================================== */
+
+/**
+ * Correct `block` display not defined in IE 8/9.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+ display: block;
+}
+
+/**
+ * Correct `inline-block` display not defined in IE 8/9.
+ */
+
+audio,
+canvas,
+video {
+ display: inline-block;
+}
+
+/**
+ * Prevent modern browsers from displaying `audio` without controls.
+ * Remove excess height in iOS 5 devices.
+ */
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+[hidden] {
+ display: none;
+}
+
+/* ==========================================================================
+ Base
+ ========================================================================== */
+
+/**
+ * 1. Set default font family to sans-serif.
+ * 2. Prevent iOS text size adjust after orientation change, without disabling
+ * user zoom.
+ */
+
+html {
+ font-family: sans-serif; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+}
+
+/**
+ * Remove default margin.
+ */
+
+body {
+ margin: 0;
+}
+
+/* ==========================================================================
+ Links
+ ========================================================================== */
+
+/**
+ * Address `outline` inconsistency between Chrome and other browsers.
+ */
+
+a:focus {
+ outline: thin dotted;
+}
+
+/**
+ * Improve readability when focused and also mouse hovered in all browsers.
+ */
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+/* ==========================================================================
+ Typography
+ ========================================================================== */
+
+/**
+ * Address variable `h1` font-size and margin within `section` and `article`
+ * contexts in Firefox 4+, Safari 5, and Chrome.
+ */
+
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/**
+ * Address styling not present in IE 8/9, Safari 5, and Chrome.
+ */
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+/**
+ * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
+ */
+
+b,
+strong {
+ font-weight: bold;
+}
+
+/**
+ * Address styling not present in Safari 5 and Chrome.
+ */
+
+dfn {
+ font-style: italic;
+}
+
+/**
+ * Address differences between Firefox and other browsers.
+ */
+
+hr {
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ height: 0;
+}
+
+/**
+ * Address styling not present in IE 8/9.
+ */
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+/**
+ * Correct font family set oddly in Safari 5 and Chrome.
+ */
+
+code,
+kbd,
+pre,
+samp {
+ font-family: monospace, serif;
+ font-size: 1em;
+}
+
+/**
+ * Improve readability of pre-formatted text in all browsers.
+ */
+
+pre {
+ white-space: pre-wrap;
+}
+
+/**
+ * Set consistent quote types.
+ */
+
+q {
+ quotes: "\201C" "\201D" "\2018" "\2019";
+}
+
+/**
+ * Address inconsistent and variable font size in all browsers.
+ */
+
+small {
+ font-size: 80%;
+}
+
+/**
+ * Prevent `sub` and `sup` affecting `line-height` in all browsers.
+ */
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+/* ==========================================================================
+ Embedded content
+ ========================================================================== */
+
+/**
+ * Remove border when inside `a` element in IE 8/9.
+ */
+
+img {
+ border: 0;
+}
+
+/**
+ * Correct overflow displayed oddly in IE 9.
+ */
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+/* ==========================================================================
+ Figures
+ ========================================================================== */
+
+/**
+ * Address margin not present in IE 8/9 and Safari 5.
+ */
+
+figure {
+ margin: 0;
+}
+
+/* ==========================================================================
+ Forms
+ ========================================================================== */
+
+/**
+ * Define consistent border, margin, and padding.
+ */
+
+fieldset {
+ border: 1px solid #c0c0c0;
+ margin: 0 2px;
+ padding: 0.35em 0.625em 0.75em;
+}
+
+/**
+ * 1. Correct `color` not being inherited in IE 8/9.
+ * 2. Remove padding so people aren't caught out if they zero out fieldsets.
+ */
+
+legend {
+ border: 0; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * 1. Correct font family not being inherited in all browsers.
+ * 2. Correct font size not being inherited in all browsers.
+ * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
+ */
+
+button,
+input,
+select,
+textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 2 */
+ margin: 0; /* 3 */
+}
+
+/**
+ * Address Firefox 4+ setting `line-height` on `input` using `!important` in
+ * the UA stylesheet.
+ */
+
+button,
+input {
+ line-height: normal;
+}
+
+/**
+ * Address inconsistent `text-transform` inheritance for `button` and `select`.
+ * All other form control elements do not inherit `text-transform` values.
+ * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
+ * Correct `select` style inheritance in Firefox 4+ and Opera.
+ */
+
+button,
+select {
+ text-transform: none;
+}
+
+/**
+ * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+ * and `video` controls.
+ * 2. Correct inability to style clickable `input` types in iOS.
+ * 3. Improve usability and consistency of cursor style between image-type
+ * `input` and others.
+ */
+
+button,
+html input[type="button"], /* 1 */
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; /* 2 */
+ cursor: pointer; /* 3 */
+}
+
+/**
+ * Re-set default cursor for disabled elements.
+ */
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+/**
+ * 1. Address box sizing set to `content-box` in IE 8/9.
+ * 2. Remove excess padding in IE 8/9.
+ */
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+}
+
+/**
+ * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
+ * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
+ * (include `-moz` to future-proof).
+ */
+
+input[type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box; /* 2 */
+ box-sizing: content-box;
+}
+
+/**
+ * Remove inner padding and search cancel button in Safari 5 and Chrome
+ * on OS X.
+ */
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/**
+ * Remove inner padding and border in Firefox 4+.
+ */
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+/**
+ * 1. Remove default vertical scrollbar in IE 8/9.
+ * 2. Improve readability and alignment in all browsers.
+ */
+
+textarea {
+ overflow: auto; /* 1 */
+ vertical-align: top; /* 2 */
+}
+
+/* ==========================================================================
+ Tables
+ ========================================================================== */
+
+/**
+ * Remove most spacing between table cells.
+ */
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
diff --git a/ui/stylesheets/lib/bourbon/_bourbon-deprecated-upcoming.scss b/ui/stylesheets/lib/bourbon/_bourbon-deprecated-upcoming.scss
new file mode 100644
index 00000000000..5332496d82e
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/_bourbon-deprecated-upcoming.scss
@@ -0,0 +1,13 @@
+//************************************************************************//
+// These mixins/functions are deprecated
+// They will be removed in the next MAJOR version release
+//************************************************************************//
+@mixin box-shadow ($shadows...) {
+ @include prefixer(box-shadow, $shadows, spec);
+ @warn "box-shadow is deprecated and will be removed in the next major version release";
+}
+
+@mixin background-size ($lengths...) {
+ @include prefixer(background-size, $lengths, spec);
+ @warn "background-size is deprecated and will be removed in the next major version release";
+}
diff --git a/ui/stylesheets/lib/bourbon/_bourbon.scss b/ui/stylesheets/lib/bourbon/_bourbon.scss
new file mode 100644
index 00000000000..53fbca877f0
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/_bourbon.scss
@@ -0,0 +1,59 @@
+// Custom Helpers
+@import "helpers/deprecated-webkit-gradient";
+@import "helpers/gradient-positions-parser";
+@import "helpers/linear-positions-parser";
+@import "helpers/radial-arg-parser";
+@import "helpers/radial-positions-parser";
+@import "helpers/render-gradients";
+@import "helpers/shape-size-stripper";
+
+// Custom Functions
+@import "functions/compact";
+@import "functions/flex-grid";
+@import "functions/grid-width";
+@import "functions/linear-gradient";
+@import "functions/modular-scale";
+@import "functions/px-to-em";
+@import "functions/radial-gradient";
+@import "functions/tint-shade";
+@import "functions/transition-property-name";
+
+// CSS3 Mixins
+@import "css3/animation";
+@import "css3/appearance";
+@import "css3/backface-visibility";
+@import "css3/background";
+@import "css3/background-image";
+@import "css3/border-image";
+@import "css3/border-radius";
+@import "css3/box-sizing";
+@import "css3/columns";
+@import "css3/flex-box";
+@import "css3/font-face";
+@import "css3/hidpi-media-query";
+@import "css3/image-rendering";
+@import "css3/inline-block";
+@import "css3/keyframes";
+@import "css3/linear-gradient";
+@import "css3/perspective";
+@import "css3/radial-gradient";
+@import "css3/transform";
+@import "css3/transition";
+@import "css3/user-select";
+@import "css3/placeholder";
+
+// Addons & other mixins
+@import "addons/button";
+@import "addons/clearfix";
+@import "addons/font-family";
+@import "addons/hide-text";
+@import "addons/html5-input-types";
+@import "addons/position";
+@import "addons/prefixer";
+@import "addons/retina-image";
+@import "addons/size";
+@import "addons/timing-functions";
+@import "addons/triangle";
+
+// Soon to be deprecated Mixins
+@import "bourbon-deprecated-upcoming";
diff --git a/ui/stylesheets/lib/bourbon/addons/_button.scss b/ui/stylesheets/lib/bourbon/addons/_button.scss
new file mode 100644
index 00000000000..3ae393c090f
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/addons/_button.scss
@@ -0,0 +1,273 @@
+@mixin button ($style: simple, $base-color: #4294f0) {
+
+ @if type-of($style) == color {
+ $base-color: $style;
+ $style: simple;
+ }
+
+ // Grayscale button
+ @if $base-color == grayscale($base-color) {
+ @if $style == simple {
+ @include simple($base-color, $grayscale: true);
+ }
+
+ @else if $style == shiny {
+ @include shiny($base-color, $grayscale: true);
+ }
+
+ @else if $style == pill {
+ @include pill($base-color, $grayscale: true);
+ }
+ }
+
+ // Colored button
+ @else {
+ @if $style == simple {
+ @include simple($base-color);
+ }
+
+ @else if $style == shiny {
+ @include shiny($base-color);
+ }
+
+ @else if $style == pill {
+ @include pill($base-color);
+ }
+ }
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+}
+
+
+// Simple Button
+//************************************************************************//
+@mixin simple($base-color, $grayscale: false) {
+ $color: hsl(0, 0, 100%);
+ $border: adjust-color($base-color, $saturation: 9%, $lightness: -14%);
+ $inset-shadow: adjust-color($base-color, $saturation: -8%, $lightness: 15%);
+ $stop-gradient: adjust-color($base-color, $saturation: 9%, $lightness: -11%);
+ $text-shadow: adjust-color($base-color, $saturation: 15%, $lightness: -18%);
+
+ @if lightness($base-color) > 70% {
+ $color: hsl(0, 0, 20%);
+ $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%);
+ }
+
+ @if $grayscale == true {
+ $border: grayscale($border);
+ $inset-shadow: grayscale($inset-shadow);
+ $stop-gradient: grayscale($stop-gradient);
+ $text-shadow: grayscale($text-shadow);
+ }
+
+ border: 1px solid $border;
+ border-radius: 3px;
+ box-shadow: inset 0 1px 0 0 $inset-shadow;
+ color: $color;
+ display: inline-block;
+ font-size: 11px;
+ font-weight: bold;
+ @include linear-gradient ($base-color, $stop-gradient);
+ padding: 7px 18px;
+ text-decoration: none;
+ text-shadow: 0 1px 0 $text-shadow;
+ background-clip: padding-box;
+
+ &:hover:not(:disabled) {
+ $base-color-hover: adjust-color($base-color, $saturation: -4%, $lightness: -5%);
+ $inset-shadow-hover: adjust-color($base-color, $saturation: -7%, $lightness: 5%);
+ $stop-gradient-hover: adjust-color($base-color, $saturation: 8%, $lightness: -14%);
+
+ @if $grayscale == true {
+ $base-color-hover: grayscale($base-color-hover);
+ $inset-shadow-hover: grayscale($inset-shadow-hover);
+ $stop-gradient-hover: grayscale($stop-gradient-hover);
+ }
+
+ box-shadow: inset 0 1px 0 0 $inset-shadow-hover;
+ cursor: pointer;
+ @include linear-gradient ($base-color-hover, $stop-gradient-hover);
+ }
+
+ &:active:not(:disabled) {
+ $border-active: adjust-color($base-color, $saturation: 9%, $lightness: -14%);
+ $inset-shadow-active: adjust-color($base-color, $saturation: 7%, $lightness: -17%);
+
+ @if $grayscale == true {
+ $border-active: grayscale($border-active);
+ $inset-shadow-active: grayscale($inset-shadow-active);
+ }
+
+ border: 1px solid $border-active;
+ box-shadow: inset 0 0 8px 4px $inset-shadow-active, inset 0 0 8px 4px $inset-shadow-active, 0 1px 1px 0 #eee;
+ }
+}
+
+
+// Shiny Button
+//************************************************************************//
+@mixin shiny($base-color, $grayscale: false) {
+ $color: hsl(0, 0, 100%);
+ $border: adjust-color($base-color, $red: -117, $green: -111, $blue: -81);
+ $border-bottom: adjust-color($base-color, $red: -126, $green: -127, $blue: -122);
+ $fourth-stop: adjust-color($base-color, $red: -79, $green: -70, $blue: -46);
+ $inset-shadow: adjust-color($base-color, $red: 37, $green: 29, $blue: 12);
+ $second-stop: adjust-color($base-color, $red: -56, $green: -50, $blue: -33);
+ $text-shadow: adjust-color($base-color, $red: -140, $green: -141, $blue: -114);
+ $third-stop: adjust-color($base-color, $red: -86, $green: -75, $blue: -48);
+
+ @if lightness($base-color) > 70% {
+ $color: hsl(0, 0, 20%);
+ $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%);
+ }
+
+ @if $grayscale == true {
+ $border: grayscale($border);
+ $border-bottom: grayscale($border-bottom);
+ $fourth-stop: grayscale($fourth-stop);
+ $inset-shadow: grayscale($inset-shadow);
+ $second-stop: grayscale($second-stop);
+ $text-shadow: grayscale($text-shadow);
+ $third-stop: grayscale($third-stop);
+ }
+
+ border: 1px solid $border;
+ border-bottom: 1px solid $border-bottom;
+ border-radius: 5px;
+ box-shadow: inset 0 1px 0 0 $inset-shadow;
+ color: $color;
+ display: inline-block;
+ font-size: 14px;
+ font-weight: bold;
+ @include linear-gradient(top, $base-color 0%, $second-stop 50%, $third-stop 50%, $fourth-stop 100%);
+ padding: 8px 20px;
+ text-align: center;
+ text-decoration: none;
+ text-shadow: 0 -1px 1px $text-shadow;
+
+ &:hover:not(:disabled) {
+ $first-stop-hover: adjust-color($base-color, $red: -13, $green: -15, $blue: -18);
+ $second-stop-hover: adjust-color($base-color, $red: -66, $green: -62, $blue: -51);
+ $third-stop-hover: adjust-color($base-color, $red: -93, $green: -85, $blue: -66);
+ $fourth-stop-hover: adjust-color($base-color, $red: -86, $green: -80, $blue: -63);
+
+ @if $grayscale == true {
+ $first-stop-hover: grayscale($first-stop-hover);
+ $second-stop-hover: grayscale($second-stop-hover);
+ $third-stop-hover: grayscale($third-stop-hover);
+ $fourth-stop-hover: grayscale($fourth-stop-hover);
+ }
+
+ cursor: pointer;
+ @include linear-gradient(top, $first-stop-hover 0%,
+ $second-stop-hover 50%,
+ $third-stop-hover 50%,
+ $fourth-stop-hover 100%);
+ }
+
+ &:active:not(:disabled) {
+ $inset-shadow-active: adjust-color($base-color, $red: -111, $green: -116, $blue: -122);
+
+ @if $grayscale == true {
+ $inset-shadow-active: grayscale($inset-shadow-active);
+ }
+
+ box-shadow: inset 0 0 20px 0 $inset-shadow-active, 0 1px 0 #fff;
+ }
+}
+
+
+// Pill Button
+//************************************************************************//
+@mixin pill($base-color, $grayscale: false) {
+ $color: hsl(0, 0, 100%);
+ $border-bottom: adjust-color($base-color, $hue: 8, $saturation: -11%, $lightness: -26%);
+ $border-sides: adjust-color($base-color, $hue: 4, $saturation: -21%, $lightness: -21%);
+ $border-top: adjust-color($base-color, $hue: -1, $saturation: -30%, $lightness: -15%);
+ $inset-shadow: adjust-color($base-color, $hue: -1, $saturation: -1%, $lightness: 7%);
+ $stop-gradient: adjust-color($base-color, $hue: 8, $saturation: 14%, $lightness: -10%);
+ $text-shadow: adjust-color($base-color, $hue: 5, $saturation: -19%, $lightness: -15%);
+
+ @if lightness($base-color) > 70% {
+ $color: hsl(0, 0, 20%);
+ $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%);
+ }
+
+ @if $grayscale == true {
+ $border-bottom: grayscale($border-bottom);
+ $border-sides: grayscale($border-sides);
+ $border-top: grayscale($border-top);
+ $inset-shadow: grayscale($inset-shadow);
+ $stop-gradient: grayscale($stop-gradient);
+ $text-shadow: grayscale($text-shadow);
+ }
+
+ border: 1px solid $border-top;
+ border-color: $border-top $border-sides $border-bottom;
+ border-radius: 16px;
+ box-shadow: inset 0 1px 0 0 $inset-shadow, 0 1px 2px 0 #b3b3b3;
+ color: $color;
+ display: inline-block;
+ font-size: 11px;
+ font-weight: normal;
+ line-height: 1;
+ @include linear-gradient ($base-color, $stop-gradient);
+ padding: 5px 16px;
+ text-align: center;
+ text-decoration: none;
+ text-shadow: 0 -1px 1px $text-shadow;
+ background-clip: padding-box;
+
+ &:hover:not(:disabled) {
+ $base-color-hover: adjust-color($base-color, $lightness: -4.5%);
+ $border-bottom: adjust-color($base-color, $hue: 8, $saturation: 13.5%, $lightness: -32%);
+ $border-sides: adjust-color($base-color, $hue: 4, $saturation: -2%, $lightness: -27%);
+ $border-top: adjust-color($base-color, $hue: -1, $saturation: -17%, $lightness: -21%);
+ $inset-shadow-hover: adjust-color($base-color, $saturation: -1%, $lightness: 3%);
+ $stop-gradient-hover: adjust-color($base-color, $hue: 8, $saturation: -4%, $lightness: -15.5%);
+ $text-shadow-hover: adjust-color($base-color, $hue: 5, $saturation: -5%, $lightness: -22%);
+
+ @if $grayscale == true {
+ $base-color-hover: grayscale($base-color-hover);
+ $border-bottom: grayscale($border-bottom);
+ $border-sides: grayscale($border-sides);
+ $border-top: grayscale($border-top);
+ $inset-shadow-hover: grayscale($inset-shadow-hover);
+ $stop-gradient-hover: grayscale($stop-gradient-hover);
+ $text-shadow-hover: grayscale($text-shadow-hover);
+ }
+
+ border: 1px solid $border-top;
+ border-color: $border-top $border-sides $border-bottom;
+ box-shadow: inset 0 1px 0 0 $inset-shadow-hover;
+ cursor: pointer;
+ @include linear-gradient ($base-color-hover, $stop-gradient-hover);
+ text-shadow: 0 -1px 1px $text-shadow-hover;
+ background-clip: padding-box;
+ }
+
+ &:active:not(:disabled) {
+ $active-color: adjust-color($base-color, $hue: 4, $saturation: -12%, $lightness: -10%);
+ $border-active: adjust-color($base-color, $hue: 6, $saturation: -2.5%, $lightness: -30%);
+ $border-bottom-active: adjust-color($base-color, $hue: 11, $saturation: 6%, $lightness: -31%);
+ $inset-shadow-active: adjust-color($base-color, $hue: 9, $saturation: 2%, $lightness: -21.5%);
+ $text-shadow-active: adjust-color($base-color, $hue: 5, $saturation: -12%, $lightness: -21.5%);
+
+ @if $grayscale == true {
+ $active-color: grayscale($active-color);
+ $border-active: grayscale($border-active);
+ $border-bottom-active: grayscale($border-bottom-active);
+ $inset-shadow-active: grayscale($inset-shadow-active);
+ $text-shadow-active: grayscale($text-shadow-active);
+ }
+
+ background: $active-color;
+ border: 1px solid $border-active;
+ border-bottom: 1px solid $border-bottom-active;
+ box-shadow: inset 0 0 6px 3px $inset-shadow-active, 0 1px 0 0 #fff;
+ text-shadow: 0 -1px 1px $text-shadow-active;
+ }
+}
diff --git a/ui/stylesheets/lib/bourbon/addons/_clearfix.scss b/ui/stylesheets/lib/bourbon/addons/_clearfix.scss
new file mode 100644
index 00000000000..ca9903cf02e
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/addons/_clearfix.scss
@@ -0,0 +1,29 @@
+// Micro clearfix provides an easy way to contain floats without adding additional markup
+//
+// Example usage:
+//
+// // Contain all floats within .wrapper
+// .wrapper {
+// @include clearfix;
+// .content,
+// .sidebar {
+// float : left;
+// }
+// }
+
+@mixin clearfix {
+ *zoom: 1;
+
+ &:before,
+ &:after {
+ content: " ";
+ display: table;
+ }
+
+ &:after {
+ clear: both;
+ }
+}
+
+// Acknowledgements
+// Micro clearfix: [Nicolas Gallagher](http://nicolasgallagher.com/micro-clearfix-hack/)
diff --git a/ui/stylesheets/lib/bourbon/addons/_font-family.scss b/ui/stylesheets/lib/bourbon/addons/_font-family.scss
new file mode 100644
index 00000000000..df8a80ddfcf
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/addons/_font-family.scss
@@ -0,0 +1,5 @@
+$georgia: Georgia, Cambria, "Times New Roman", Times, serif;
+$helvetica: "Helvetica Neue", Helvetica, Arial, sans-serif;
+$lucida-grande: "Lucida Grande", Tahoma, Verdana, Arial, sans-serif;
+$monospace: "Bitstream Vera Sans Mono", Consolas, Courier, monospace;
+$verdana: Verdana, Geneva, sans-serif;
diff --git a/ui/stylesheets/lib/bourbon/addons/_hide-text.scss b/ui/stylesheets/lib/bourbon/addons/_hide-text.scss
new file mode 100644
index 00000000000..68d4bf86cb2
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/addons/_hide-text.scss
@@ -0,0 +1,5 @@
+@mixin hide-text {
+ color: transparent;
+ font: 0/0 a;
+ text-shadow: none;
+}
diff --git a/ui/stylesheets/lib/bourbon/addons/_html5-input-types.scss b/ui/stylesheets/lib/bourbon/addons/_html5-input-types.scss
new file mode 100644
index 00000000000..b184382d910
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/addons/_html5-input-types.scss
@@ -0,0 +1,56 @@
+//************************************************************************//
+// Generate a variable ($all-text-inputs) with a list of all html5
+// input types that have a text-based input, excluding textarea.
+// http://diveintohtml5.org/forms.html
+//************************************************************************//
+$inputs-list: 'input[type="email"]',
+ 'input[type="number"]',
+ 'input[type="password"]',
+ 'input[type="search"]',
+ 'input[type="tel"]',
+ 'input[type="text"]',
+ 'input[type="url"]',
+
+ // Webkit & Gecko may change the display of these in the future
+ 'input[type="color"]',
+ 'input[type="date"]',
+ 'input[type="datetime"]',
+ 'input[type="datetime-local"]',
+ 'input[type="month"]',
+ 'input[type="time"]',
+ 'input[type="week"]';
+
+$unquoted-inputs-list: ();
+@each $input-type in $inputs-list {
+ $unquoted-inputs-list: append($unquoted-inputs-list, unquote($input-type), comma);
+}
+
+$all-text-inputs: $unquoted-inputs-list;
+
+
+// Hover Pseudo-class
+//************************************************************************//
+$all-text-inputs-hover: ();
+@each $input-type in $unquoted-inputs-list {
+ $input-type-hover: $input-type + ":hover";
+ $all-text-inputs-hover: append($all-text-inputs-hover, $input-type-hover, comma);
+}
+
+// Focus Pseudo-class
+//************************************************************************//
+$all-text-inputs-focus: ();
+@each $input-type in $unquoted-inputs-list {
+ $input-type-focus: $input-type + ":focus";
+ $all-text-inputs-focus: append($all-text-inputs-focus, $input-type-focus, comma);
+}
+
+// You must use interpolation on the variable:
+// #{$all-text-inputs}
+// #{$all-text-inputs-hover}
+// #{$all-text-inputs-focus}
+
+// Example
+//************************************************************************//
+// #{$all-text-inputs}, textarea {
+// border: 1px solid red;
+// }
diff --git a/ui/stylesheets/lib/bourbon/addons/_position.scss b/ui/stylesheets/lib/bourbon/addons/_position.scss
new file mode 100644
index 00000000000..faad1cae50a
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/addons/_position.scss
@@ -0,0 +1,42 @@
+@mixin position ($position: relative, $coordinates: 0 0 0 0) {
+
+ @if type-of($position) == list {
+ $coordinates: $position;
+ $position: relative;
+ }
+
+ $top: nth($coordinates, 1);
+ $right: nth($coordinates, 2);
+ $bottom: nth($coordinates, 3);
+ $left: nth($coordinates, 4);
+
+ position: $position;
+
+ @if $top == auto {
+ top: $top;
+ }
+ @else if not(unitless($top)) {
+ top: $top;
+ }
+
+ @if $right == auto {
+ right: $right;
+ }
+ @else if not(unitless($right)) {
+ right: $right;
+ }
+
+ @if $bottom == auto {
+ bottom: $bottom;
+ }
+ @else if not(unitless($bottom)) {
+ bottom: $bottom;
+ }
+
+ @if $left == auto {
+ left: $left;
+ }
+ @else if not(unitless($left)) {
+ left: $left;
+ }
+}
diff --git a/ui/stylesheets/lib/bourbon/addons/_prefixer.scss b/ui/stylesheets/lib/bourbon/addons/_prefixer.scss
new file mode 100644
index 00000000000..6bfd23a1dd5
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/addons/_prefixer.scss
@@ -0,0 +1,49 @@
+//************************************************************************//
+// Example: @include prefixer(border-radius, $radii, webkit ms spec);
+//************************************************************************//
+$prefix-for-webkit: true !default;
+$prefix-for-mozilla: true !default;
+$prefix-for-microsoft: true !default;
+$prefix-for-opera: true !default;
+$prefix-for-spec: true !default; // required for keyframe mixin
+
+@mixin prefixer ($property, $value, $prefixes) {
+ @each $prefix in $prefixes {
+ @if $prefix == webkit {
+ @if $prefix-for-webkit {
+ -webkit-#{$property}: $value;
+ }
+ }
+ @else if $prefix == moz {
+ @if $prefix-for-mozilla {
+ -moz-#{$property}: $value;
+ }
+ }
+ @else if $prefix == ms {
+ @if $prefix-for-microsoft {
+ -ms-#{$property}: $value;
+ }
+ }
+ @else if $prefix == o {
+ @if $prefix-for-opera {
+ -o-#{$property}: $value;
+ }
+ }
+ @else if $prefix == spec {
+ @if $prefix-for-spec {
+ #{$property}: $value;
+ }
+ }
+ @else {
+ @warn "Unrecognized prefix: #{$prefix}";
+ }
+ }
+}
+
+@mixin disable-prefix-for-all() {
+ $prefix-for-webkit: false;
+ $prefix-for-mozilla: false;
+ $prefix-for-microsoft: false;
+ $prefix-for-opera: false;
+ $prefix-for-spec: false;
+}
diff --git a/ui/stylesheets/lib/bourbon/addons/_retina-image.scss b/ui/stylesheets/lib/bourbon/addons/_retina-image.scss
new file mode 100644
index 00000000000..a84b6faebc1
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/addons/_retina-image.scss
@@ -0,0 +1,32 @@
+@mixin retina-image($filename, $background-size, $extension: png, $retina-filename: null, $asset-pipeline: false) {
+ @if $asset-pipeline {
+ background-image: image-url("#{$filename}.#{$extension}");
+ }
+ @else {
+ background-image: url("#{$filename}.#{$extension}");
+ }
+
+ @include hidpi {
+
+ @if $asset-pipeline {
+ @if $retina-filename {
+ background-image: image-url("#{$retina-filename}.#{$extension}");
+ }
+ @else {
+ background-image: image-url("#{$filename}@2x.#{$extension}");
+ }
+ }
+
+ @else {
+ @if $retina-filename {
+ background-image: url("#{$retina-filename}.#{$extension}");
+ }
+ @else {
+ background-image: url("#{$filename}@2x.#{$extension}");
+ }
+ }
+
+ background-size: $background-size;
+
+ }
+}
diff --git a/ui/stylesheets/lib/bourbon/addons/_size.scss b/ui/stylesheets/lib/bourbon/addons/_size.scss
new file mode 100644
index 00000000000..342e41b79f1
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/addons/_size.scss
@@ -0,0 +1,44 @@
+@mixin size($size) {
+ @if length($size) == 1 {
+ @if $size == auto {
+ width: $size;
+ height: $size;
+ }
+
+ @else if unitless($size) {
+ width: $size + px;
+ height: $size + px;
+ }
+
+ @else if not(unitless($size)) {
+ width: $size;
+ height: $size;
+ }
+ }
+
+ // Width x Height
+ @if length($size) == 2 {
+ $width: nth($size, 1);
+ $height: nth($size, 2);
+
+ @if $width == auto {
+ width: $width;
+ }
+ @else if not(unitless($width)) {
+ width: $width;
+ }
+ @else if unitless($width) {
+ width: $width + px;
+ }
+
+ @if $height == auto {
+ height: $height;
+ }
+ @else if not(unitless($height)) {
+ height: $height;
+ }
+ @else if unitless($height) {
+ height: $height + px;
+ }
+ }
+}
diff --git a/ui/stylesheets/lib/bourbon/addons/_timing-functions.scss b/ui/stylesheets/lib/bourbon/addons/_timing-functions.scss
new file mode 100644
index 00000000000..51b24109149
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/addons/_timing-functions.scss
@@ -0,0 +1,32 @@
+// CSS cubic-bezier timing functions. Timing functions courtesy of jquery.easie (github.com/jaukia/easie)
+// Timing functions are the same as demo'ed here: http://jqueryui.com/demos/effect/easing.html
+
+// EASE IN
+$ease-in-quad: cubic-bezier(0.550, 0.085, 0.680, 0.530);
+$ease-in-cubic: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+$ease-in-quart: cubic-bezier(0.895, 0.030, 0.685, 0.220);
+$ease-in-quint: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+$ease-in-sine: cubic-bezier(0.470, 0.000, 0.745, 0.715);
+$ease-in-expo: cubic-bezier(0.950, 0.050, 0.795, 0.035);
+$ease-in-circ: cubic-bezier(0.600, 0.040, 0.980, 0.335);
+$ease-in-back: cubic-bezier(0.600, -0.280, 0.735, 0.045);
+
+// EASE OUT
+$ease-out-quad: cubic-bezier(0.250, 0.460, 0.450, 0.940);
+$ease-out-cubic: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+$ease-out-quart: cubic-bezier(0.165, 0.840, 0.440, 1.000);
+$ease-out-quint: cubic-bezier(0.230, 1.000, 0.320, 1.000);
+$ease-out-sine: cubic-bezier(0.390, 0.575, 0.565, 1.000);
+$ease-out-expo: cubic-bezier(0.190, 1.000, 0.220, 1.000);
+$ease-out-circ: cubic-bezier(0.075, 0.820, 0.165, 1.000);
+$ease-out-back: cubic-bezier(0.175, 0.885, 0.320, 1.275);
+
+// EASE IN OUT
+$ease-in-out-quad: cubic-bezier(0.455, 0.030, 0.515, 0.955);
+$ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1.000);
+$ease-in-out-quart: cubic-bezier(0.770, 0.000, 0.175, 1.000);
+$ease-in-out-quint: cubic-bezier(0.860, 0.000, 0.070, 1.000);
+$ease-in-out-sine: cubic-bezier(0.445, 0.050, 0.550, 0.950);
+$ease-in-out-expo: cubic-bezier(1.000, 0.000, 0.000, 1.000);
+$ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.150, 0.860);
+$ease-in-out-back: cubic-bezier(0.680, -0.550, 0.265, 1.550);
diff --git a/ui/stylesheets/lib/bourbon/addons/_triangle.scss b/ui/stylesheets/lib/bourbon/addons/_triangle.scss
new file mode 100644
index 00000000000..0e02aca2ca5
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/addons/_triangle.scss
@@ -0,0 +1,45 @@
+@mixin triangle ($size, $color, $direction) {
+ height: 0;
+ width: 0;
+
+ @if ($direction == up) or ($direction == down) or ($direction == right) or ($direction == left) {
+ border-color: transparent;
+ border-style: solid;
+ border-width: $size / 2;
+
+ @if $direction == up {
+ border-bottom-color: $color;
+
+ } @else if $direction == right {
+ border-left-color: $color;
+
+ } @else if $direction == down {
+ border-top-color: $color;
+
+ } @else if $direction == left {
+ border-right-color: $color;
+ }
+ }
+
+ @else if ($direction == up-right) or ($direction == up-left) {
+ border-top: $size solid $color;
+
+ @if $direction == up-right {
+ border-left: $size solid transparent;
+
+ } @else if $direction == up-left {
+ border-right: $size solid transparent;
+ }
+ }
+
+ @else if ($direction == down-right) or ($direction == down-left) {
+ border-bottom: $size solid $color;
+
+ @if $direction == down-right {
+ border-left: $size solid transparent;
+
+ } @else if $direction == down-left {
+ border-right: $size solid transparent;
+ }
+ }
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_animation.scss b/ui/stylesheets/lib/bourbon/css3/_animation.scss
new file mode 100644
index 00000000000..08c3dbf157c
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_animation.scss
@@ -0,0 +1,52 @@
+// http://www.w3.org/TR/css3-animations/#the-animation-name-property-
+// Each of these mixins support comma separated lists of values, which allows different transitions for individual properties to be described in a single style rule. Each value in the list corresponds to the value at that same position in the other properties.
+
+// Official animation shorthand property.
+@mixin animation ($animations...) {
+ @include prefixer(animation, $animations, webkit moz spec);
+}
+
+// Individual Animation Properties
+@mixin animation-name ($names...) {
+ @include prefixer(animation-name, $names, webkit moz spec);
+}
+
+
+@mixin animation-duration ($times...) {
+ @include prefixer(animation-duration, $times, webkit moz spec);
+}
+
+
+@mixin animation-timing-function ($motions...) {
+// ease | linear | ease-in | ease-out | ease-in-out
+ @include prefixer(animation-timing-function, $motions, webkit moz spec);
+}
+
+
+@mixin animation-iteration-count ($values...) {
+// infinite |
+ @include prefixer(animation-iteration-count, $values, webkit moz spec);
+}
+
+
+@mixin animation-direction ($directions...) {
+// normal | alternate
+ @include prefixer(animation-direction, $directions, webkit moz spec);
+}
+
+
+@mixin animation-play-state ($states...) {
+// running | paused
+ @include prefixer(animation-play-state, $states, webkit moz spec);
+}
+
+
+@mixin animation-delay ($times...) {
+ @include prefixer(animation-delay, $times, webkit moz spec);
+}
+
+
+@mixin animation-fill-mode ($modes...) {
+// none | forwards | backwards | both
+ @include prefixer(animation-fill-mode, $modes, webkit moz spec);
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_appearance.scss b/ui/stylesheets/lib/bourbon/css3/_appearance.scss
new file mode 100644
index 00000000000..3eb16e45de7
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_appearance.scss
@@ -0,0 +1,3 @@
+@mixin appearance ($value) {
+ @include prefixer(appearance, $value, webkit moz ms o spec);
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_backface-visibility.scss b/ui/stylesheets/lib/bourbon/css3/_backface-visibility.scss
new file mode 100644
index 00000000000..1161fe60dd1
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_backface-visibility.scss
@@ -0,0 +1,6 @@
+//************************************************************************//
+// Backface-visibility mixin
+//************************************************************************//
+@mixin backface-visibility($visibility) {
+ @include prefixer(backface-visibility, $visibility, webkit spec);
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_background-image.scss b/ui/stylesheets/lib/bourbon/css3/_background-image.scss
new file mode 100644
index 00000000000..17016b91b9c
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_background-image.scss
@@ -0,0 +1,48 @@
+//************************************************************************//
+// Background-image property for adding multiple background images with
+// gradients, or for stringing multiple gradients together.
+//************************************************************************//
+
+@mixin background-image($images...) {
+ background-image: _add-prefix($images, webkit);
+ background-image: _add-prefix($images);
+}
+
+@function _add-prefix($images, $vendor: false) {
+ $images-prefixed: ();
+ $gradient-positions: false;
+ @for $i from 1 through length($images) {
+ $type: type-of(nth($images, $i)); // Get type of variable - List or String
+
+ // If variable is a list - Gradient
+ @if $type == list {
+ $gradient-type: nth(nth($images, $i), 1); // linear or radial
+ $gradient-pos: null;
+ $gradient-args: null;
+
+ @if ($gradient-type == linear) or ($gradient-type == radial) {
+ $gradient-pos: nth(nth($images, $i), 2); // Get gradient position
+ $gradient-args: nth(nth($images, $i), 3); // Get actual gradient (red, blue)
+ }
+ @else {
+ $gradient-args: nth(nth($images, $i), 2); // Get actual gradient (red, blue)
+ }
+
+ $gradient-positions: _gradient-positions-parser($gradient-type, $gradient-pos);
+ $gradient: _render-gradients($gradient-positions, $gradient-args, $gradient-type, $vendor);
+ $images-prefixed: append($images-prefixed, $gradient, comma);
+ }
+ // If variable is a string - Image
+ @else if $type == string {
+ $images-prefixed: join($images-prefixed, nth($images, $i), comma);
+ }
+ }
+ @return $images-prefixed;
+}
+
+//Examples:
+ //@include background-image(linear-gradient(top, orange, red));
+ //@include background-image(radial-gradient(50% 50%, cover circle, orange, red));
+ //@include background-image(url("/images/a.png"), linear-gradient(orange, red));
+ //@include background-image(url("image.png"), linear-gradient(orange, red), url("image.png"));
+ //@include background-image(linear-gradient(hsla(0, 100%, 100%, 0.25) 0%, hsla(0, 100%, 100%, 0.08) 50%, transparent 50%), linear-gradient(orange, red));
diff --git a/ui/stylesheets/lib/bourbon/css3/_background.scss b/ui/stylesheets/lib/bourbon/css3/_background.scss
new file mode 100644
index 00000000000..766d5d32247
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_background.scss
@@ -0,0 +1,103 @@
+//************************************************************************//
+// Background property for adding multiple backgrounds using shorthand
+// notation.
+//************************************************************************//
+
+@mixin background(
+ $background-1 , $background-2: false,
+ $background-3: false, $background-4: false,
+ $background-5: false, $background-6: false,
+ $background-7: false, $background-8: false,
+ $background-9: false, $background-10: false,
+ $fallback: false
+) {
+ $backgrounds: compact($background-1, $background-2,
+ $background-3, $background-4,
+ $background-5, $background-6,
+ $background-7, $background-8,
+ $background-9, $background-10);
+
+ $fallback-color: false;
+ @if (type-of($fallback) == color) or ($fallback == "transparent") {
+ $fallback-color: $fallback;
+ }
+ @else {
+ $fallback-color: _extract-background-color($backgrounds);
+ }
+
+ @if $fallback-color {
+ background-color: $fallback-color;
+ }
+ background: _background-add-prefix($backgrounds, webkit);
+ background: _background-add-prefix($backgrounds);
+}
+
+@function _extract-background-color($backgrounds) {
+ $final-bg-layer: nth($backgrounds, length($backgrounds));
+ @if type-of($final-bg-layer) == list {
+ @for $i from 1 through length($final-bg-layer) {
+ $value: nth($final-bg-layer, $i);
+ @if type-of($value) == color {
+ @return $value;
+ }
+ }
+ }
+ @return false;
+}
+
+@function _background-add-prefix($backgrounds, $vendor: false) {
+ $backgrounds-prefixed: ();
+
+ @for $i from 1 through length($backgrounds) {
+ $shorthand: nth($backgrounds, $i); // Get member for current index
+ $type: type-of($shorthand); // Get type of variable - List (gradient) or String (image)
+
+ // If shorthand is a list (gradient)
+ @if $type == list {
+ $first-member: nth($shorthand, 1); // Get first member of shorthand
+
+ // Linear Gradient
+ @if index(linear radial, nth($first-member, 1)) {
+ $gradient-type: nth($first-member, 1); // linear || radial
+ $gradient-args: false;
+ $gradient-positions: false;
+ $shorthand-start: false;
+ @if type-of($first-member) == list { // Linear gradient plus additional shorthand values - lg(red,orange)repeat,...
+ $gradient-positions: nth($first-member, 2);
+ $gradient-args: nth($first-member, 3);
+ $shorthand-start: 2;
+ }
+ @else { // Linear gradient only - lg(red,orange),...
+ $gradient-positions: nth($shorthand, 2);
+ $gradient-args: nth($shorthand, 3); // Get gradient (red, blue)
+ }
+
+ $gradient-positions: _gradient-positions-parser($gradient-type, $gradient-positions);
+ $gradient: _render-gradients($gradient-positions, $gradient-args, $gradient-type, $vendor);
+
+ // Append any additional shorthand args to gradient
+ @if $shorthand-start {
+ @for $j from $shorthand-start through length($shorthand) {
+ $gradient: join($gradient, nth($shorthand, $j), space);
+ }
+ }
+ $backgrounds-prefixed: append($backgrounds-prefixed, $gradient, comma);
+ }
+ // Image with additional properties
+ @else {
+ $backgrounds-prefixed: append($backgrounds-prefixed, $shorthand, comma);
+ }
+ }
+ // If shorthand is a simple string (color or image)
+ @else if $type == string {
+ $backgrounds-prefixed: join($backgrounds-prefixed, $shorthand, comma);
+ }
+ }
+ @return $backgrounds-prefixed;
+}
+
+//Examples:
+ //@include background(linear-gradient(top, orange, red));
+ //@include background(radial-gradient(circle at 40% 40%, orange, red));
+ //@include background(url("/images/a.png") no-repeat, linear-gradient(orange, red));
+ //@include background(url("image.png") center center, linear-gradient(orange, red), url("image.png"));
diff --git a/ui/stylesheets/lib/bourbon/css3/_border-image.scss b/ui/stylesheets/lib/bourbon/css3/_border-image.scss
new file mode 100644
index 00000000000..1fff212df8a
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_border-image.scss
@@ -0,0 +1,55 @@
+@mixin border-image($images) {
+ -webkit-border-image: _border-add-prefix($images, webkit);
+ -moz-border-image: _border-add-prefix($images, moz);
+ -o-border-image: _border-add-prefix($images, o);
+ border-image: _border-add-prefix($images);
+}
+
+@function _border-add-prefix($images, $vendor: false) {
+ $border-image: null;
+ $images-type: type-of(nth($images, 1));
+ $first-var: nth(nth($images, 1), 1); // Get type of Gradient (Linear || radial)
+
+ // If input is a gradient
+ @if $images-type == string {
+ @if ($first-var == "linear") or ($first-var == "radial") {
+ $gradient-type: nth($images, 1); // Get type of gradient (linear || radial)
+ $gradient-pos: nth($images, 2); // Get gradient position
+ $gradient-args: nth($images, 3); // Get actual gradient (red, blue)
+ $gradient-positions: _gradient-positions-parser($gradient-type, $gradient-pos);
+ $border-image: _render-gradients($gradient-positions, $gradient-args, $gradient-type, $vendor);
+ }
+ // If input is a URL
+ @else {
+ $border-image: $images;
+ }
+ }
+ // If input is gradient or url + additional args
+ @else if $images-type == list {
+ $type: type-of(nth($images, 1)); // Get type of variable - List or String
+
+ // If variable is a list - Gradient
+ @if $type == list {
+ $gradient: nth($images, 1);
+ $gradient-type: nth($gradient, 1); // Get type of gradient (linear || radial)
+ $gradient-pos: nth($gradient, 2); // Get gradient position
+ $gradient-args: nth($gradient, 3); // Get actual gradient (red, blue)
+ $gradient-positions: _gradient-positions-parser($gradient-type, $gradient-pos);
+ $border-image: _render-gradients($gradient-positions, $gradient-args, $gradient-type, $vendor);
+
+ @for $i from 2 through length($images) {
+ $border-image: append($border-image, nth($images, $i));
+ }
+ }
+ }
+ @return $border-image;
+}
+
+//Examples:
+// @include border-image(url("image.png"));
+// @include border-image(url("image.png") 20 stretch);
+// @include border-image(linear-gradient(45deg, orange, yellow));
+// @include border-image(linear-gradient(45deg, orange, yellow) stretch);
+// @include border-image(linear-gradient(45deg, orange, yellow) 20 30 40 50 stretch round);
+// @include border-image(radial-gradient(top, cover, orange, yellow, orange));
+
diff --git a/ui/stylesheets/lib/bourbon/css3/_border-radius.scss b/ui/stylesheets/lib/bourbon/css3/_border-radius.scss
new file mode 100644
index 00000000000..7c171901090
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_border-radius.scss
@@ -0,0 +1,22 @@
+//************************************************************************//
+// Shorthand Border-radius mixins
+//************************************************************************//
+@mixin border-top-radius($radii) {
+ @include prefixer(border-top-left-radius, $radii, spec);
+ @include prefixer(border-top-right-radius, $radii, spec);
+}
+
+@mixin border-bottom-radius($radii) {
+ @include prefixer(border-bottom-left-radius, $radii, spec);
+ @include prefixer(border-bottom-right-radius, $radii, spec);
+}
+
+@mixin border-left-radius($radii) {
+ @include prefixer(border-top-left-radius, $radii, spec);
+ @include prefixer(border-bottom-left-radius, $radii, spec);
+}
+
+@mixin border-right-radius($radii) {
+ @include prefixer(border-top-right-radius, $radii, spec);
+ @include prefixer(border-bottom-right-radius, $radii, spec);
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_box-sizing.scss b/ui/stylesheets/lib/bourbon/css3/_box-sizing.scss
new file mode 100644
index 00000000000..f07e1d412e3
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_box-sizing.scss
@@ -0,0 +1,4 @@
+@mixin box-sizing ($box) {
+// content-box | border-box | inherit
+ @include prefixer(box-sizing, $box, webkit moz spec);
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_columns.scss b/ui/stylesheets/lib/bourbon/css3/_columns.scss
new file mode 100644
index 00000000000..42274a4eebb
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_columns.scss
@@ -0,0 +1,47 @@
+@mixin columns($arg: auto) {
+// ||
+ @include prefixer(columns, $arg, webkit moz spec);
+}
+
+@mixin column-count($int: auto) {
+// auto || integer
+ @include prefixer(column-count, $int, webkit moz spec);
+}
+
+@mixin column-gap($length: normal) {
+// normal || length
+ @include prefixer(column-gap, $length, webkit moz spec);
+}
+
+@mixin column-fill($arg: auto) {
+// auto || length
+ @include prefixer(columns-fill, $arg, webkit moz spec);
+}
+
+@mixin column-rule($arg) {
+// || ||
+ @include prefixer(column-rule, $arg, webkit moz spec);
+}
+
+@mixin column-rule-color($color) {
+ @include prefixer(column-rule-color, $color, webkit moz spec);
+}
+
+@mixin column-rule-style($style: none) {
+// none | hidden | dashed | dotted | double | groove | inset | inset | outset | ridge | solid
+ @include prefixer(column-rule-style, $style, webkit moz spec);
+}
+
+@mixin column-rule-width ($width: none) {
+ @include prefixer(column-rule-width, $width, webkit moz spec);
+}
+
+@mixin column-span($arg: none) {
+// none || all
+ @include prefixer(column-span, $arg, webkit moz spec);
+}
+
+@mixin column-width($length: auto) {
+// auto || length
+ @include prefixer(column-width, $length, webkit moz spec);
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_flex-box.scss b/ui/stylesheets/lib/bourbon/css3/_flex-box.scss
new file mode 100644
index 00000000000..3e741e66966
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_flex-box.scss
@@ -0,0 +1,52 @@
+// CSS3 Flexible Box Model and property defaults
+
+// Custom shorthand notation for flexbox
+@mixin box($orient: inline-axis, $pack: start, $align: stretch) {
+ @include display-box;
+ @include box-orient($orient);
+ @include box-pack($pack);
+ @include box-align($align);
+}
+
+@mixin display-box {
+ display: -webkit-box;
+ display: -moz-box;
+ display: box;
+}
+
+@mixin box-orient($orient: inline-axis) {
+// horizontal|vertical|inline-axis|block-axis|inherit
+ @include prefixer(box-orient, $orient, webkit moz spec);
+}
+
+@mixin box-pack($pack: start) {
+// start|end|center|justify
+ @include prefixer(box-pack, $pack, webkit moz spec);
+}
+
+@mixin box-align($align: stretch) {
+// start|end|center|baseline|stretch
+ @include prefixer(box-align, $align, webkit moz spec);
+}
+
+@mixin box-direction($direction: normal) {
+// normal|reverse|inherit
+ @include prefixer(box-direction, $direction, webkit moz spec);
+}
+
+@mixin box-lines($lines: single) {
+// single|multiple
+ @include prefixer(box-lines, $lines, webkit moz spec);
+}
+
+@mixin box-ordinal-group($int: 1) {
+ @include prefixer(box-ordinal-group, $int, webkit moz spec);
+}
+
+@mixin box-flex($value: 0.0) {
+ @include prefixer(box-flex, $value, webkit moz spec);
+}
+
+@mixin box-flex-group($int: 1) {
+ @include prefixer(box-flex-group, $int, webkit moz spec);
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_font-face.scss b/ui/stylesheets/lib/bourbon/css3/_font-face.scss
new file mode 100644
index 00000000000..029ee8fe88c
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_font-face.scss
@@ -0,0 +1,23 @@
+// Order of the includes matters, and it is: normal, bold, italic, bold+italic.
+
+@mixin font-face($font-family, $file-path, $weight: normal, $style: normal, $asset-pipeline: false ) {
+ @font-face {
+ font-family: $font-family;
+ font-weight: $weight;
+ font-style: $style;
+
+ @if $asset-pipeline == true {
+ src: font-url('#{$file-path}.eot');
+ src: font-url('#{$file-path}.eot?#iefix') format('embedded-opentype'),
+ font-url('#{$file-path}.woff') format('woff'),
+ font-url('#{$file-path}.ttf') format('truetype'),
+ font-url('#{$file-path}.svg##{$font-family}') format('svg');
+ } @else {
+ src: url('#{$file-path}.eot');
+ src: url('#{$file-path}.eot?#iefix') format('embedded-opentype'),
+ url('#{$file-path}.woff') format('woff'),
+ url('#{$file-path}.ttf') format('truetype'),
+ url('#{$file-path}.svg##{$font-family}') format('svg');
+ }
+ }
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_hidpi-media-query.scss b/ui/stylesheets/lib/bourbon/css3/_hidpi-media-query.scss
new file mode 100644
index 00000000000..111e4009b5a
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_hidpi-media-query.scss
@@ -0,0 +1,10 @@
+// HiDPI mixin. Default value set to 1.3 to target Google Nexus 7 (http://bjango.com/articles/min-device-pixel-ratio/)
+@mixin hidpi($ratio: 1.3) {
+ @media only screen and (-webkit-min-device-pixel-ratio: $ratio),
+ only screen and (min--moz-device-pixel-ratio: $ratio),
+ only screen and (-o-min-device-pixel-ratio: #{$ratio}/1),
+ only screen and (min-resolution: #{round($ratio*96)}dpi),
+ only screen and (min-resolution: #{$ratio}dppx) {
+ @content;
+ }
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_image-rendering.scss b/ui/stylesheets/lib/bourbon/css3/_image-rendering.scss
new file mode 100644
index 00000000000..abc7ee1aa47
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_image-rendering.scss
@@ -0,0 +1,13 @@
+@mixin image-rendering ($mode:optimizeQuality) {
+
+ @if ($mode == optimize-contrast) {
+ image-rendering: -moz-crisp-edges;
+ image-rendering: -o-crisp-edges;
+ image-rendering: -webkit-optimize-contrast;
+ image-rendering: optimize-contrast;
+ }
+
+ @else {
+ image-rendering: $mode;
+ }
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_inline-block.scss b/ui/stylesheets/lib/bourbon/css3/_inline-block.scss
new file mode 100644
index 00000000000..3272a0010b3
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_inline-block.scss
@@ -0,0 +1,8 @@
+// Legacy support for inline-block in IE7 (maybe IE6)
+@mixin inline-block {
+ display: inline-block;
+ vertical-align: baseline;
+ zoom: 1;
+ *display: inline;
+ *vertical-align: auto;
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_keyframes.scss b/ui/stylesheets/lib/bourbon/css3/_keyframes.scss
new file mode 100644
index 00000000000..dca61f2a074
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_keyframes.scss
@@ -0,0 +1,43 @@
+// Adds keyframes blocks for supported prefixes, removing redundant prefixes in the block's content
+@mixin keyframes($name) {
+ $original-prefix-for-webkit: $prefix-for-webkit;
+ $original-prefix-for-mozilla: $prefix-for-mozilla;
+ $original-prefix-for-microsoft: $prefix-for-microsoft;
+ $original-prefix-for-opera: $prefix-for-opera;
+ $original-prefix-for-spec: $prefix-for-spec;
+
+ @if $original-prefix-for-webkit {
+ @include disable-prefix-for-all();
+ $prefix-for-webkit: true;
+ @-webkit-keyframes #{$name} {
+ @content;
+ }
+ }
+ @if $original-prefix-for-mozilla {
+ @include disable-prefix-for-all();
+ $prefix-for-mozilla: true;
+ @-moz-keyframes #{$name} {
+ @content;
+ }
+ }
+ @if $original-prefix-for-opera {
+ @include disable-prefix-for-all();
+ $prefix-for-opera: true;
+ @-o-keyframes #{$name} {
+ @content;
+ }
+ }
+ @if $original-prefix-for-spec {
+ @include disable-prefix-for-all();
+ $prefix-for-spec: true;
+ @keyframes #{$name} {
+ @content;
+ }
+ }
+
+ $prefix-for-webkit: $original-prefix-for-webkit;
+ $prefix-for-mozilla: $original-prefix-for-mozilla;
+ $prefix-for-microsoft: $original-prefix-for-microsoft;
+ $prefix-for-opera: $original-prefix-for-opera;
+ $prefix-for-spec: $original-prefix-for-spec;
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_linear-gradient.scss b/ui/stylesheets/lib/bourbon/css3/_linear-gradient.scss
new file mode 100644
index 00000000000..d5b687b00cb
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_linear-gradient.scss
@@ -0,0 +1,41 @@
+@mixin linear-gradient($pos, $G1, $G2: false,
+ $G3: false, $G4: false,
+ $G5: false, $G6: false,
+ $G7: false, $G8: false,
+ $G9: false, $G10: false,
+ $deprecated-pos1: left top,
+ $deprecated-pos2: left bottom,
+ $fallback: false) {
+ // Detect what type of value exists in $pos
+ $pos-type: type-of(nth($pos, 1));
+ $pos-spec: null;
+ $pos-degree: null;
+
+ // If $pos is missing from mixin, reassign vars and add default position
+ @if ($pos-type == color) or (nth($pos, 1) == "transparent") {
+ $G10: $G9; $G9: $G8; $G8: $G7; $G7: $G6; $G6: $G5;
+ $G5: $G4; $G4: $G3; $G3: $G2; $G2: $G1; $G1: $pos;
+ $pos: null;
+ }
+
+ @if $pos {
+ $positions: _linear-positions-parser($pos);
+ $pos-degree: nth($positions, 1);
+ $pos-spec: nth($positions, 2);
+ }
+
+ $full: compact($G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10);
+
+ // Set $G1 as the default fallback color
+ $fallback-color: nth($G1, 1);
+
+ // If $fallback is a color use that color as the fallback color
+ @if (type-of($fallback) == color) or ($fallback == "transparent") {
+ $fallback-color: $fallback;
+ }
+
+ background-color: $fallback-color;
+ background-image: _deprecated-webkit-gradient(linear, $deprecated-pos1, $deprecated-pos2, $full); // Safari <= 5.0
+ background-image: -webkit-linear-gradient($pos-degree $full); // Safari 5.1+, Chrome
+ background-image: unquote("linear-gradient(#{$pos-spec}#{$full})");
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_perspective.scss b/ui/stylesheets/lib/bourbon/css3/_perspective.scss
new file mode 100644
index 00000000000..0e4deb80f3c
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_perspective.scss
@@ -0,0 +1,8 @@
+@mixin perspective($depth: none) {
+ // none |
+ @include prefixer(perspective, $depth, webkit moz spec);
+}
+
+@mixin perspective-origin($value: 50% 50%) {
+ @include prefixer(perspective-origin, $value, webkit moz spec);
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_placeholder.scss b/ui/stylesheets/lib/bourbon/css3/_placeholder.scss
new file mode 100644
index 00000000000..22fd92b4f23
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_placeholder.scss
@@ -0,0 +1,29 @@
+$placeholders: '-webkit-input-placeholder',
+ '-moz-placeholder',
+ '-ms-input-placeholder';
+
+@mixin placeholder {
+ @each $placeholder in $placeholders {
+ @if $placeholder == "-webkit-input-placeholder" {
+ &::#{$placeholder} {
+ @content;
+ }
+ }
+ @else if $placeholder == "-moz-placeholder" {
+ // FF 18-
+ &:#{$placeholder} {
+ @content;
+ }
+
+ // FF 19+
+ &::#{$placeholder} {
+ @content;
+ }
+ }
+ @else {
+ &:#{$placeholder} {
+ @content;
+ }
+ }
+ }
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_radial-gradient.scss b/ui/stylesheets/lib/bourbon/css3/_radial-gradient.scss
new file mode 100644
index 00000000000..e87b45a5a1a
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_radial-gradient.scss
@@ -0,0 +1,44 @@
+// Requires Sass 3.1+
+@mixin radial-gradient($G1, $G2,
+ $G3: false, $G4: false,
+ $G5: false, $G6: false,
+ $G7: false, $G8: false,
+ $G9: false, $G10: false,
+ $pos: null,
+ $shape-size: null,
+ $deprecated-pos1: center center,
+ $deprecated-pos2: center center,
+ $deprecated-radius1: 0,
+ $deprecated-radius2: 460,
+ $fallback: false) {
+
+ $data: _radial-arg-parser($G1, $G2, $pos, $shape-size);
+ $G1: nth($data, 1);
+ $G2: nth($data, 2);
+ $pos: nth($data, 3);
+ $shape-size: nth($data, 4);
+
+ $full: compact($G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10);
+
+ // Strip deprecated cover/contain for spec
+ $shape-size-spec: _shape-size-stripper($shape-size);
+
+ // Set $G1 as the default fallback color
+ $first-color: nth($full, 1);
+ $fallback-color: nth($first-color, 1);
+
+ @if (type-of($fallback) == color) or ($fallback == "transparent") {
+ $fallback-color: $fallback;
+ }
+
+ // Add Commas and spaces
+ $shape-size: if($shape-size, '#{$shape-size}, ', null);
+ $pos: if($pos, '#{$pos}, ', null);
+ $pos-spec: if($pos, 'at #{$pos}', null);
+ $shape-size-spec: if(($shape-size-spec != ' ') and ($pos == null), '#{$shape-size-spec}, ', '#{$shape-size-spec} ');
+
+ background-color: $fallback-color;
+ background-image: _deprecated-webkit-gradient(radial, $deprecated-pos1, $deprecated-pos2, $full, $deprecated-radius1, $deprecated-radius2); // Safari <= 5.0 && IOS 4
+ background-image: -webkit-radial-gradient(unquote(#{$pos}#{$shape-size}#{$full}));
+ background-image: unquote("radial-gradient(#{$shape-size-spec}#{$pos-spec}#{$full})");
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_transform.scss b/ui/stylesheets/lib/bourbon/css3/_transform.scss
new file mode 100644
index 00000000000..8cc35963d55
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_transform.scss
@@ -0,0 +1,15 @@
+@mixin transform($property: none) {
+// none |
+ @include prefixer(transform, $property, webkit moz ms o spec);
+}
+
+@mixin transform-origin($axes: 50%) {
+// x-axis - left | center | right | length | %
+// y-axis - top | center | bottom | length | %
+// z-axis - length
+ @include prefixer(transform-origin, $axes, webkit moz ms o spec);
+}
+
+@mixin transform-style ($style: flat) {
+ @include prefixer(transform-style, $style, webkit moz ms o spec);
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_transition.scss b/ui/stylesheets/lib/bourbon/css3/_transition.scss
new file mode 100644
index 00000000000..180cde6c8a4
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_transition.scss
@@ -0,0 +1,34 @@
+// Shorthand mixin. Supports multiple parentheses-deliminated values for each variable.
+// Example: @include transition (all, 2.0s, ease-in-out);
+// @include transition ((opacity, width), (1.0s, 2.0s), ease-in, (0, 2s));
+// @include transition ($property:(opacity, width), $delay: (1.5s, 2.5s));
+
+@mixin transition ($properties...) {
+ @if length($properties) >= 1 {
+ @include prefixer(transition, $properties, webkit moz spec);
+ }
+
+ @else {
+ $properties: all 0.15s ease-out 0;
+ @include prefixer(transition, $properties, webkit moz spec);
+ }
+}
+
+@mixin transition-property ($properties...) {
+ -webkit-transition-property: transition-property-names($properties, 'webkit');
+ -moz-transition-property: transition-property-names($properties, 'moz');
+ transition-property: transition-property-names($properties, false);
+}
+
+@mixin transition-duration ($times...) {
+ @include prefixer(transition-duration, $times, webkit moz spec);
+}
+
+@mixin transition-timing-function ($motions...) {
+// ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier()
+ @include prefixer(transition-timing-function, $motions, webkit moz spec);
+}
+
+@mixin transition-delay ($times...) {
+ @include prefixer(transition-delay, $times, webkit moz spec);
+}
diff --git a/ui/stylesheets/lib/bourbon/css3/_user-select.scss b/ui/stylesheets/lib/bourbon/css3/_user-select.scss
new file mode 100644
index 00000000000..1380aa8baa9
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/css3/_user-select.scss
@@ -0,0 +1,3 @@
+@mixin user-select($arg: none) {
+ @include prefixer(user-select, $arg, webkit moz ms spec);
+}
diff --git a/ui/stylesheets/lib/bourbon/functions/_compact.scss b/ui/stylesheets/lib/bourbon/functions/_compact.scss
new file mode 100644
index 00000000000..871500e3394
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/functions/_compact.scss
@@ -0,0 +1,11 @@
+// Remove `false` values from a list
+
+@function compact($vars...) {
+ $list: ();
+ @each $var in $vars {
+ @if $var {
+ $list: append($list, $var, comma);
+ }
+ }
+ @return $list;
+}
diff --git a/ui/stylesheets/lib/bourbon/functions/_flex-grid.scss b/ui/stylesheets/lib/bourbon/functions/_flex-grid.scss
new file mode 100644
index 00000000000..3bbd8665732
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/functions/_flex-grid.scss
@@ -0,0 +1,39 @@
+// Flexible grid
+@function flex-grid($columns, $container-columns: $fg-max-columns) {
+ $width: $columns * $fg-column + ($columns - 1) * $fg-gutter;
+ $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
+ @return percentage($width / $container-width);
+}
+
+// Flexible gutter
+@function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) {
+ $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
+ @return percentage($gutter / $container-width);
+}
+
+// The $fg-column, $fg-gutter and $fg-max-columns variables must be defined in your base stylesheet to properly use the flex-grid function.
+// This function takes the fluid grid equation (target / context = result) and uses columns to help define each.
+//
+// The calculation presumes that your column structure will be missing the last gutter:
+//
+// -- column -- gutter -- column -- gutter -- column
+//
+// $fg-column: 60px; // Column Width
+// $fg-gutter: 25px; // Gutter Width
+// $fg-max-columns: 12; // Total Columns For Main Container
+//
+// div {
+// width: flex-grid(4); // returns (315px / 995px) = 31.65829%;
+// margin-left: flex-gutter(); // returns (25px / 995px) = 2.51256%;
+//
+// p {
+// width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%;
+// float: left;
+// margin: flex-gutter(4); // returns (25px / 315px) = 7.936508%;
+// }
+//
+// blockquote {
+// float: left;
+// width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%;
+// }
+// }
\ No newline at end of file
diff --git a/ui/stylesheets/lib/bourbon/functions/_grid-width.scss b/ui/stylesheets/lib/bourbon/functions/_grid-width.scss
new file mode 100644
index 00000000000..8e63d83d602
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/functions/_grid-width.scss
@@ -0,0 +1,13 @@
+@function grid-width($n) {
+ @return $n * $gw-column + ($n - 1) * $gw-gutter;
+}
+
+// The $gw-column and $gw-gutter variables must be defined in your base stylesheet to properly use the grid-width function.
+//
+// $gw-column: 100px; // Column Width
+// $gw-gutter: 40px; // Gutter Width
+//
+// div {
+// width: grid-width(4); // returns 520px;
+// margin-left: $gw-gutter; // returns 40px;
+// }
diff --git a/ui/stylesheets/lib/bourbon/functions/_linear-gradient.scss b/ui/stylesheets/lib/bourbon/functions/_linear-gradient.scss
new file mode 100644
index 00000000000..c8454d83f08
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/functions/_linear-gradient.scss
@@ -0,0 +1,13 @@
+@function linear-gradient($pos, $gradients...) {
+ $type: linear;
+ $pos-type: type-of(nth($pos, 1));
+
+ // if $pos doesn't exist, fix $gradient
+ @if ($pos-type == color) or (nth($pos, 1) == "transparent") {
+ $gradients: zip($pos $gradients);
+ $pos: false;
+ }
+
+ $type-gradient: $type, $pos, $gradients;
+ @return $type-gradient;
+}
diff --git a/ui/stylesheets/lib/bourbon/functions/_modular-scale.scss b/ui/stylesheets/lib/bourbon/functions/_modular-scale.scss
new file mode 100644
index 00000000000..dddccb52241
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/functions/_modular-scale.scss
@@ -0,0 +1,40 @@
+@function modular-scale($value, $increment, $ratio) {
+ @if $increment > 0 {
+ @for $i from 1 through $increment {
+ $value: ($value * $ratio);
+ }
+ }
+
+ @if $increment < 0 {
+ $increment: abs($increment);
+ @for $i from 1 through $increment {
+ $value: ($value / $ratio);
+ }
+ }
+
+ @return $value;
+}
+
+// div {
+// Increment Up GR with positive value
+// font-size: modular-scale(14px, 1, 1.618); // returns: 22.652px
+//
+// Increment Down GR with negative value
+// font-size: modular-scale(14px, -1, 1.618); // returns: 8.653px
+//
+// Can be used with ceil(round up) or floor(round down)
+// font-size: floor( modular-scale(14px, 1, 1.618) ); // returns: 22px
+// font-size: ceil( modular-scale(14px, 1, 1.618) ); // returns: 23px
+// }
+//
+// modularscale.com
+
+@function golden-ratio($value, $increment) {
+ @return modular-scale($value, $increment, 1.618)
+}
+
+// div {
+// font-size: golden-ratio(14px, 1); // returns: 22.652px
+// }
+//
+// goldenratiocalculator.com
diff --git a/ui/stylesheets/lib/bourbon/functions/_px-to-em.scss b/ui/stylesheets/lib/bourbon/functions/_px-to-em.scss
new file mode 100644
index 00000000000..2eb1031c60e
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/functions/_px-to-em.scss
@@ -0,0 +1,8 @@
+// Convert pixels to ems
+// eg. for a relational value of 12px write em(12) when the parent is 16px
+// if the parent is another value say 24px write em(12, 24)
+
+@function em($pxval, $base: 16) {
+ @return ($pxval / $base) * 1em;
+}
+
diff --git a/ui/stylesheets/lib/bourbon/functions/_radial-gradient.scss b/ui/stylesheets/lib/bourbon/functions/_radial-gradient.scss
new file mode 100644
index 00000000000..75584060d2a
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/functions/_radial-gradient.scss
@@ -0,0 +1,23 @@
+// This function is required and used by the background-image mixin.
+@function radial-gradient($G1, $G2,
+ $G3: false, $G4: false,
+ $G5: false, $G6: false,
+ $G7: false, $G8: false,
+ $G9: false, $G10: false,
+ $pos: null,
+ $shape-size: null) {
+
+ $data: _radial-arg-parser($G1, $G2, $pos, $shape-size);
+ $G1: nth($data, 1);
+ $G2: nth($data, 2);
+ $pos: nth($data, 3);
+ $shape-size: nth($data, 4);
+
+ $type: radial;
+ $gradient: compact($G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10);
+
+ $type-gradient: $type, $shape-size $pos, $gradient;
+ @return $type-gradient;
+}
+
+
diff --git a/ui/stylesheets/lib/bourbon/functions/_tint-shade.scss b/ui/stylesheets/lib/bourbon/functions/_tint-shade.scss
new file mode 100644
index 00000000000..f7172004ac6
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/functions/_tint-shade.scss
@@ -0,0 +1,9 @@
+// Add percentage of white to a color
+@function tint($color, $percent){
+ @return mix(white, $color, $percent);
+}
+
+// Add percentage of black to a color
+@function shade($color, $percent){
+ @return mix(black, $color, $percent);
+}
diff --git a/ui/stylesheets/lib/bourbon/functions/_transition-property-name.scss b/ui/stylesheets/lib/bourbon/functions/_transition-property-name.scss
new file mode 100644
index 00000000000..54cd4228112
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/functions/_transition-property-name.scss
@@ -0,0 +1,22 @@
+// Return vendor-prefixed property names if appropriate
+// Example: transition-property-names((transform, color, background), moz) -> -moz-transform, color, background
+//************************************************************************//
+@function transition-property-names($props, $vendor: false) {
+ $new-props: ();
+
+ @each $prop in $props {
+ $new-props: append($new-props, transition-property-name($prop, $vendor), comma);
+ }
+
+ @return $new-props;
+}
+
+@function transition-property-name($prop, $vendor: false) {
+ // put other properties that need to be prefixed here aswell
+ @if $vendor and $prop == transform {
+ @return unquote('-'+$vendor+'-'+$prop);
+ }
+ @else {
+ @return $prop;
+ }
+}
\ No newline at end of file
diff --git a/ui/stylesheets/lib/bourbon/helpers/_deprecated-webkit-gradient.scss b/ui/stylesheets/lib/bourbon/helpers/_deprecated-webkit-gradient.scss
new file mode 100644
index 00000000000..cd17e2832da
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/helpers/_deprecated-webkit-gradient.scss
@@ -0,0 +1,39 @@
+// Render Deprecated Webkit Gradient - Linear || Radial
+//************************************************************************//
+@function _deprecated-webkit-gradient($type,
+ $deprecated-pos1, $deprecated-pos2,
+ $full,
+ $deprecated-radius1: false, $deprecated-radius2: false) {
+ $gradient-list: ();
+ $gradient: false;
+ $full-length: length($full);
+ $percentage: false;
+ $gradient-type: $type;
+
+ @for $i from 1 through $full-length {
+ $gradient: nth($full, $i);
+
+ @if length($gradient) == 2 {
+ $color-stop: color-stop(nth($gradient, 2), nth($gradient, 1));
+ $gradient-list: join($gradient-list, $color-stop, comma);
+ }
+ @else if $gradient != null {
+ @if $i == $full-length {
+ $percentage: 100%;
+ }
+ @else {
+ $percentage: ($i - 1) * (100 / ($full-length - 1)) + "%";
+ }
+ $color-stop: color-stop(unquote($percentage), $gradient);
+ $gradient-list: join($gradient-list, $color-stop, comma);
+ }
+ }
+
+ @if $type == radial {
+ $gradient: -webkit-gradient(radial, $deprecated-pos1, $deprecated-radius1, $deprecated-pos2, $deprecated-radius2, $gradient-list);
+ }
+ @else if $type == linear {
+ $gradient: -webkit-gradient(linear, $deprecated-pos1, $deprecated-pos2, $gradient-list);
+ }
+ @return $gradient;
+}
diff --git a/ui/stylesheets/lib/bourbon/helpers/_gradient-positions-parser.scss b/ui/stylesheets/lib/bourbon/helpers/_gradient-positions-parser.scss
new file mode 100644
index 00000000000..07d30b6cf95
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/helpers/_gradient-positions-parser.scss
@@ -0,0 +1,13 @@
+@function _gradient-positions-parser($gradient-type, $gradient-positions) {
+ @if $gradient-positions
+ and ($gradient-type == linear)
+ and (type-of($gradient-positions) != color) {
+ $gradient-positions: _linear-positions-parser($gradient-positions);
+ }
+ @else if $gradient-positions
+ and ($gradient-type == radial)
+ and (type-of($gradient-positions) != color) {
+ $gradient-positions: _radial-positions-parser($gradient-positions);
+ }
+ @return $gradient-positions;
+}
diff --git a/ui/stylesheets/lib/bourbon/helpers/_linear-positions-parser.scss b/ui/stylesheets/lib/bourbon/helpers/_linear-positions-parser.scss
new file mode 100644
index 00000000000..d26383edce1
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/helpers/_linear-positions-parser.scss
@@ -0,0 +1,61 @@
+@function _linear-positions-parser($pos) {
+ $type: type-of(nth($pos, 1));
+ $spec: null;
+ $degree: null;
+ $side: null;
+ $corner: null;
+ $length: length($pos);
+ // Parse Side and corner positions
+ @if ($length > 1) {
+ @if nth($pos, 1) == "to" { // Newer syntax
+ $side: nth($pos, 2);
+
+ @if $length == 2 { // eg. to top
+ // Swap for backwards compatability
+ $degree: _position-flipper(nth($pos, 2));
+ }
+ @else if $length == 3 { // eg. to top left
+ $corner: nth($pos, 3);
+ }
+ }
+ @else if $length == 2 { // Older syntax ("top left")
+ $side: _position-flipper(nth($pos, 1));
+ $corner: _position-flipper(nth($pos, 2));
+ }
+
+ @if ("#{$side} #{$corner}" == "left top") or ("#{$side} #{$corner}" == "top left") {
+ $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
+ }
+ @else if ("#{$side} #{$corner}" == "right top") or ("#{$side} #{$corner}" == "top right") {
+ $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
+ }
+ @else if ("#{$side} #{$corner}" == "right bottom") or ("#{$side} #{$corner}" == "bottom right") {
+ $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
+ }
+ @else if ("#{$side} #{$corner}" == "left bottom") or ("#{$side} #{$corner}" == "bottom left") {
+ $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
+ }
+ $spec: to $side $corner;
+ }
+ @else if $length == 1 {
+ // Swap for backwards compatability
+ @if $type == string {
+ $degree: $pos;
+ $spec: to _position-flipper($pos);
+ }
+ @else {
+ $degree: -270 - $pos; //rotate the gradient opposite from spec
+ $spec: $pos;
+ }
+ }
+ $degree: unquote($degree + ",");
+ $spec: unquote($spec + ",");
+ @return $degree $spec;
+}
+
+@function _position-flipper($pos) {
+ @return if($pos == left, right, null)
+ if($pos == right, left, null)
+ if($pos == top, bottom, null)
+ if($pos == bottom, top, null);
+}
diff --git a/ui/stylesheets/lib/bourbon/helpers/_radial-arg-parser.scss b/ui/stylesheets/lib/bourbon/helpers/_radial-arg-parser.scss
new file mode 100644
index 00000000000..3466695bdfb
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/helpers/_radial-arg-parser.scss
@@ -0,0 +1,69 @@
+@function _radial-arg-parser($G1, $G2, $pos, $shape-size) {
+ @each $value in $G1, $G2 {
+ $first-val: nth($value, 1);
+ $pos-type: type-of($first-val);
+ $spec-at-index: null;
+
+ // Determine if spec was passed to mixin
+ @if type-of($value) == list {
+ $spec-at-index: if(index($value, at), index($value, at), false);
+ }
+ @if $spec-at-index {
+ @if $spec-at-index > 1 {
+ @for $i from 1 through ($spec-at-index - 1) {
+ $shape-size: $shape-size nth($value, $i);
+ }
+ @for $i from ($spec-at-index + 1) through length($value) {
+ $pos: $pos nth($value, $i);
+ }
+ }
+ @else if $spec-at-index == 1 {
+ @for $i from ($spec-at-index + 1) through length($value) {
+ $pos: $pos nth($value, $i);
+ }
+ }
+ $G1: false;
+ }
+
+ // If not spec calculate correct values
+ @else {
+ @if ($pos-type != color) or ($first-val != "transparent") {
+ @if ($pos-type == number)
+ or ($first-val == "center")
+ or ($first-val == "top")
+ or ($first-val == "right")
+ or ($first-val == "bottom")
+ or ($first-val == "left") {
+
+ $pos: $value;
+
+ @if $pos == $G1 {
+ $G1: false;
+ }
+ }
+
+ @else if
+ ($first-val == "ellipse")
+ or ($first-val == "circle")
+ or ($first-val == "closest-side")
+ or ($first-val == "closest-corner")
+ or ($first-val == "farthest-side")
+ or ($first-val == "farthest-corner")
+ or ($first-val == "contain")
+ or ($first-val == "cover") {
+
+ $shape-size: $value;
+
+ @if $value == $G1 {
+ $G1: false;
+ }
+
+ @else if $value == $G2 {
+ $G2: false;
+ }
+ }
+ }
+ }
+ }
+ @return $G1, $G2, $pos, $shape-size;
+}
diff --git a/ui/stylesheets/lib/bourbon/helpers/_radial-positions-parser.scss b/ui/stylesheets/lib/bourbon/helpers/_radial-positions-parser.scss
new file mode 100644
index 00000000000..6a5b4777781
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/helpers/_radial-positions-parser.scss
@@ -0,0 +1,18 @@
+@function _radial-positions-parser($gradient-pos) {
+ $shape-size: nth($gradient-pos, 1);
+ $pos: nth($gradient-pos, 2);
+ $shape-size-spec: _shape-size-stripper($shape-size);
+
+ $pre-spec: unquote(if($pos, "#{$pos}, ", null))
+ unquote(if($shape-size, "#{$shape-size},", null));
+ $pos-spec: if($pos, "at #{$pos}", null);
+
+ $spec: "#{$shape-size-spec} #{$pos-spec}";
+
+ // Add comma
+ @if ($spec != ' ') {
+ $spec: "#{$spec},"
+ }
+
+ @return $pre-spec $spec;
+}
diff --git a/ui/stylesheets/lib/bourbon/helpers/_render-gradients.scss b/ui/stylesheets/lib/bourbon/helpers/_render-gradients.scss
new file mode 100644
index 00000000000..5765676838d
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/helpers/_render-gradients.scss
@@ -0,0 +1,26 @@
+// User for linear and radial gradients within background-image or border-image properties
+
+@function _render-gradients($gradient-positions, $gradients, $gradient-type, $vendor: false) {
+ $pre-spec: null;
+ $spec: null;
+ $vendor-gradients: null;
+ @if $gradient-type == linear {
+ @if $gradient-positions {
+ $pre-spec: nth($gradient-positions, 1);
+ $spec: nth($gradient-positions, 2);
+ }
+ }
+ @else if $gradient-type == radial {
+ $pre-spec: nth($gradient-positions, 1);
+ $spec: nth($gradient-positions, 2);
+ }
+
+ @if $vendor {
+ $vendor-gradients: -#{$vendor}-#{$gradient-type}-gradient(#{$pre-spec} $gradients);
+ }
+ @else if $vendor == false {
+ $vendor-gradients: "#{$gradient-type}-gradient(#{$spec} #{$gradients})";
+ $vendor-gradients: unquote($vendor-gradients);
+ }
+ @return $vendor-gradients;
+}
diff --git a/ui/stylesheets/lib/bourbon/helpers/_shape-size-stripper.scss b/ui/stylesheets/lib/bourbon/helpers/_shape-size-stripper.scss
new file mode 100644
index 00000000000..ee5eda42205
--- /dev/null
+++ b/ui/stylesheets/lib/bourbon/helpers/_shape-size-stripper.scss
@@ -0,0 +1,10 @@
+@function _shape-size-stripper($shape-size) {
+ $shape-size-spec: null;
+ @each $value in $shape-size {
+ @if ($value == "cover") or ($value == "contain") {
+ $value: null;
+ }
+ $shape-size-spec: "#{$shape-size-spec} #{$value}";
+ }
+ @return $shape-size-spec;
+}
diff --git a/ui/stylesheets/lib/neat/_neat-helpers.scss b/ui/stylesheets/lib/neat/_neat-helpers.scss
new file mode 100644
index 00000000000..86021b1bffb
--- /dev/null
+++ b/ui/stylesheets/lib/neat/_neat-helpers.scss
@@ -0,0 +1,8 @@
+// Functions
+@import "functions/private";
+@import "functions/new-breakpoint";
+@import "functions/px-to-em";
+
+// Settings
+@import "settings/grid";
+@import "settings/visual-grid";
diff --git a/ui/stylesheets/lib/neat/_neat.scss b/ui/stylesheets/lib/neat/_neat.scss
new file mode 100644
index 00000000000..cb5876b82db
--- /dev/null
+++ b/ui/stylesheets/lib/neat/_neat.scss
@@ -0,0 +1,21 @@
+// Bourbon Neat
+// MIT Licensed
+// Copyright (c) 2012-2013 thoughtbot, inc.
+
+// Helpers
+@import "neat-helpers";
+
+// Grid
+@import "grid/private";
+@import "grid/reset";
+@import "grid/grid";
+@import "grid/omega";
+@import "grid/outer-container";
+@import "grid/span-columns";
+@import "grid/row";
+@import "grid/shift";
+@import "grid/pad";
+@import "grid/fill-parent";
+@import "grid/media";
+@import "grid/to-deprecate";
+@import "grid/visual-grid";
diff --git a/ui/stylesheets/lib/neat/functions/_new-breakpoint.scss b/ui/stylesheets/lib/neat/functions/_new-breakpoint.scss
new file mode 100644
index 00000000000..d89dcd101b2
--- /dev/null
+++ b/ui/stylesheets/lib/neat/functions/_new-breakpoint.scss
@@ -0,0 +1,16 @@
+@function new-breakpoint($query:$feature $value $columns, $total-columns: $grid-columns) {
+
+ @if length($query) == 1 {
+ $query: $default-feature nth($query, 1) $total-columns;
+ }
+
+ @else if length($query) == 2 or length($query) == 4 {
+ $query: append($query, $total-columns);
+ }
+
+ @if not belongs-to($query, $visual-grid-breakpoints) {
+ $visual-grid-breakpoints: append($visual-grid-breakpoints, $query, comma);
+ }
+
+ @return $query;
+}
diff --git a/ui/stylesheets/lib/neat/functions/_private.scss b/ui/stylesheets/lib/neat/functions/_private.scss
new file mode 100644
index 00000000000..136a6ff3a16
--- /dev/null
+++ b/ui/stylesheets/lib/neat/functions/_private.scss
@@ -0,0 +1,107 @@
+// Checks if a number is even
+@function is-even($int) {
+ @if $int%2 == 0 {
+ @return true;
+ }
+
+ @return false;
+}
+
+// Checks if an element belongs to a list
+@function belongs-to($tested-item, $list) {
+ @each $item in $list {
+ @if $item == $tested-item {
+ @return true;
+ }
+ }
+
+ @return false;
+}
+
+// Contains display value
+@function contains-display-value($query) {
+ @if belongs-to(table, $query) or belongs-to(block, $query) or belongs-to(inline-block, $query) or belongs-to(inline, $query) {
+ @return true;
+ }
+
+ @return false;
+}
+
+// Parses the first argument of span-columns()
+@function container-span($span: $span) {
+ @if length($span) == 3 {
+ $container-columns: nth($span, 3);
+ @return $container-columns;
+ }
+
+ @else if length($span) == 2 {
+ $container-columns: nth($span, 2);
+ @return $container-columns;
+ }
+
+ @else {
+ @return $grid-columns;
+ }
+}
+
+// Generates a striped background
+@function gradient-stops($grid-columns, $color: $visual-grid-color) {
+ $transparent: rgba(0,0,0,0);
+
+ $column-width: flex-grid(1, $grid-columns);
+ $gutter-width: flex-gutter($grid-columns);
+ $column-offset: $column-width;
+
+ $values: ($transparent 0, $color 0);
+
+ @for $i from 1 to $grid-columns*2 {
+ @if is-even($i) {
+ $values: append($values, $transparent $column-offset);
+ $values: append($values, $color $column-offset);
+ $column-offset: $column-offset + $column-width;
+ }
+
+ @else {
+ $values: append($values, $color $column-offset);
+ $values: append($values, $transparent $column-offset);
+ $column-offset: $column-offset + $gutter-width;
+ }
+ }
+
+ @return $values;
+}
+
+// Layout direction
+@function get-direction($layout, $default) {
+ $direction: nil;
+
+ @if $layout == LTR or $layout == RTL {
+ $direction: direction-from-layout($layout);
+ } @else {
+ $direction: direction-from-layout($default);
+ }
+
+ @return $direction;
+}
+
+@function direction-from-layout($layout) {
+ $direction: nil;
+
+ @if $layout == LTR {
+ $direction: right;
+ } @else {
+ $direction: left;
+ }
+
+ @return $direction;
+}
+
+@function get-opposite-direction($direction) {
+ $opposite-direction: left;
+
+ @if $direction == left {
+ $opposite-direction: right;
+ }
+
+ @return $opposite-direction;
+}
diff --git a/ui/stylesheets/lib/neat/functions/_px-to-em.scss b/ui/stylesheets/lib/neat/functions/_px-to-em.scss
new file mode 100644
index 00000000000..058e51e8b51
--- /dev/null
+++ b/ui/stylesheets/lib/neat/functions/_px-to-em.scss
@@ -0,0 +1,3 @@
+@function em($pxval, $base: 16) {
+ @return ($pxval / $base) * 1em;
+}
diff --git a/ui/stylesheets/lib/neat/grid/_fill-parent.scss b/ui/stylesheets/lib/neat/grid/_fill-parent.scss
new file mode 100644
index 00000000000..859c97790bf
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_fill-parent.scss
@@ -0,0 +1,7 @@
+@mixin fill-parent() {
+ width: 100%;
+
+ @if $border-box-sizing == false {
+ @include box-sizing(border-box);
+ }
+}
diff --git a/ui/stylesheets/lib/neat/grid/_grid.scss b/ui/stylesheets/lib/neat/grid/_grid.scss
new file mode 100644
index 00000000000..e074b6c536c
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_grid.scss
@@ -0,0 +1,5 @@
+@if $border-box-sizing == true {
+ * {
+ @include box-sizing(border-box);
+ }
+}
diff --git a/ui/stylesheets/lib/neat/grid/_media.scss b/ui/stylesheets/lib/neat/grid/_media.scss
new file mode 100644
index 00000000000..7c9872fb521
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_media.scss
@@ -0,0 +1,51 @@
+@mixin media($query:$feature $value $columns, $total-columns: $grid-columns) {
+
+ @if length($query) == 1 {
+ @media screen and ($default-feature: nth($query, 1)) {
+ $default-grid-columns: $grid-columns;
+ $grid-columns: $total-columns;
+ @content;
+ $grid-columns: $default-grid-columns;
+ }
+ }
+
+ @else if length($query) == 2 {
+ @media screen and (nth($query, 1): nth($query, 2)) {
+ $default-grid-columns: $grid-columns;
+ $grid-columns: $total-columns;
+ @content;
+ $grid-columns: $default-grid-columns;
+ }
+ }
+
+ @else if length($query) == 3 {
+ @media screen and (nth($query, 1): nth($query, 2)) {
+ $default-grid-columns: $grid-columns;
+ $grid-columns: nth($query, 3);
+ @content;
+ $grid-columns: $default-grid-columns;
+ }
+ }
+
+ @else if length($query) == 4 {
+ @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) {
+ $default-grid-columns: $grid-columns;
+ $grid-columns: $total-columns;
+ @content;
+ $grid-columns: $default-grid-columns;
+ }
+ }
+
+ @else if length($query) == 5 {
+ @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) {
+ $default-grid-columns: $grid-columns;
+ $grid-columns: nth($query, 5);
+ @content;
+ $grid-columns: $default-grid-columns;
+ }
+ }
+
+ @else {
+ @warn "Wrong number of arguments for breakpoint(). Read the documentation for more details.";
+ }
+}
diff --git a/ui/stylesheets/lib/neat/grid/_omega.scss b/ui/stylesheets/lib/neat/grid/_omega.scss
new file mode 100644
index 00000000000..902459bcbce
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_omega.scss
@@ -0,0 +1,79 @@
+// Remove last element gutter
+@mixin omega($query: block, $direction: default) {
+ $table: if(belongs-to(table, $query), true, false);
+ $auto: if(belongs-to(auto, $query), true, false);
+
+ @if $direction != default {
+ @warn "The omega mixin will no longer take a $direction argument. To change the layout direction, use row($direction) or set $default-layout-direction instead."
+ } @else {
+ $direction: get-direction($layout-direction, $default-layout-direction);
+ }
+
+ @if length($query) == 1 {
+ @if $auto {
+ &:last-child {
+ margin-#{$direction}: 0;
+ }
+ }
+
+ @else if contains-display-value($query) {
+ @if $table {
+ padding-#{$direction}: 0;
+ }
+
+ @else {
+ margin-#{$direction}: 0;
+ }
+ }
+
+ @else {
+ @include nth-child($query, $direction);
+ }
+ }
+
+ @else if length($query) == 2 {
+ @if $table {
+ @if $auto {
+ &:last-child {
+ padding-#{$direction}: 0;
+ }
+ }
+
+ @else {
+ &:nth-child(#{nth($query, 1)}) {
+ padding-#{$direction}: 0;
+ }
+ }
+ }
+
+ @else {
+ @if $auto {
+ &:last-child {
+ margin-#{$direction}: 0;
+ }
+ }
+
+ @else {
+ @include nth-child(nth($query, 1), $direction);
+ }
+ }
+ }
+
+ @else {
+ @warn "Too many arguments passed to the omega() mixin."
+ }
+}
+
+@mixin nth-child($query, $direction) {
+ $opposite-direction: get-opposite-direction($direction);
+
+ &:nth-child(#{$query}) {
+ margin-#{$direction}: 0;
+ }
+
+ @if type-of($query) == number {
+ &:nth-child(#{$query}+1) {
+ clear: $opposite-direction;
+ }
+ }
+}
diff --git a/ui/stylesheets/lib/neat/grid/_outer-container.scss b/ui/stylesheets/lib/neat/grid/_outer-container.scss
new file mode 100644
index 00000000000..22c541f4553
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_outer-container.scss
@@ -0,0 +1,8 @@
+@mixin outer-container {
+ @include clearfix;
+ max-width: $max-width;
+ margin: {
+ left: auto;
+ right: auto;
+ }
+}
diff --git a/ui/stylesheets/lib/neat/grid/_pad.scss b/ui/stylesheets/lib/neat/grid/_pad.scss
new file mode 100644
index 00000000000..3ef5d80e45b
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_pad.scss
@@ -0,0 +1,8 @@
+@mixin pad($padding: flex-gutter()) {
+ $padding-list: null;
+ @each $value in $padding {
+ $value: if($value == 'default', flex-gutter(), $value);
+ $padding-list: join($padding-list, $value);
+ }
+ padding: $padding-list;
+}
diff --git a/ui/stylesheets/lib/neat/grid/_private.scss b/ui/stylesheets/lib/neat/grid/_private.scss
new file mode 100644
index 00000000000..acd1b5b74d6
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_private.scss
@@ -0,0 +1,21 @@
+$parent-columns: $grid-columns !default;
+$fg-column: $column;
+$fg-gutter: $gutter;
+$fg-max-columns: $grid-columns;
+$container-display-table: false !default;
+$layout-direction: nil !default;
+
+@function flex-grid($columns, $container-columns: $fg-max-columns) {
+ $width: $columns * $fg-column + ($columns - 1) * $fg-gutter;
+ $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
+ @return percentage($width / $container-width);
+}
+
+@function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) {
+ $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
+ @return percentage($gutter / $container-width);
+}
+
+@function grid-width($n) {
+ @return $n * $gw-column + ($n - 1) * $gw-gutter;
+}
diff --git a/ui/stylesheets/lib/neat/grid/_reset.scss b/ui/stylesheets/lib/neat/grid/_reset.scss
new file mode 100644
index 00000000000..f670019e4b4
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_reset.scss
@@ -0,0 +1,12 @@
+@mixin reset-display {
+ $container-display-table: false;
+}
+
+@mixin reset-layout-direction {
+ $layout-direction: $default-layout-direction;
+}
+
+@mixin reset-all {
+ @include reset-display;
+ @include reset-layout-direction;
+}
diff --git a/ui/stylesheets/lib/neat/grid/_row.scss b/ui/stylesheets/lib/neat/grid/_row.scss
new file mode 100644
index 00000000000..582603dd015
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_row.scss
@@ -0,0 +1,17 @@
+@mixin row($display: block, $direction: $default-layout-direction) {
+ @include clearfix;
+ $layout-direction: $direction;
+
+ @if $display == table {
+ display: table;
+ @include fill-parent;
+ table-layout: fixed;
+ $container-display-table: true;
+ }
+
+ @else {
+ display: block;
+ $container-display-table: false;
+ }
+}
+
diff --git a/ui/stylesheets/lib/neat/grid/_shift.scss b/ui/stylesheets/lib/neat/grid/_shift.scss
new file mode 100644
index 00000000000..e39208ef0de
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_shift.scss
@@ -0,0 +1,10 @@
+@mixin shift($n-columns: 1) {
+
+ $direction: get-direction($layout-direction, $default-layout-direction);
+ $opposite-direction: get-opposite-direction($direction);
+
+ margin-#{$opposite-direction}: $n-columns * flex-grid(1, $parent-columns) + $n-columns * flex-gutter($parent-columns);
+
+ // Reset nesting context
+ $parent-columns: $grid-columns;
+}
diff --git a/ui/stylesheets/lib/neat/grid/_span-columns.scss b/ui/stylesheets/lib/neat/grid/_span-columns.scss
new file mode 100644
index 00000000000..97902d62c44
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_span-columns.scss
@@ -0,0 +1,45 @@
+@mixin span-columns($span: $columns of $container-columns, $display: block) {
+
+ $columns: nth($span, 1);
+ $container-columns: container-span($span);
+ $display-table: false;
+
+ $direction: get-direction($layout-direction, $default-layout-direction);
+ $opposite-direction: get-opposite-direction($direction);
+
+ @if $container-columns != $grid-columns {
+ $parent-columns: $container-columns;
+ } @else {
+ $parent-columns: $grid-columns;
+ }
+
+ @if $container-display-table == true {
+ $display-table: true;
+ } @else if $display == table {
+ $display-table: true;
+ } @else {
+ $display-table: false;
+ }
+
+ @if $display-table {
+ display: table-cell;
+ padding-#{$direction}: flex-gutter($container-columns);
+ width: flex-grid($columns, $container-columns) + flex-gutter($container-columns);
+
+ &:last-child {
+ width: flex-grid($columns, $container-columns);
+ padding-#{$direction}: 0;
+ }
+ }
+
+ @else {
+ display: block;
+ float: #{$opposite-direction};
+ margin-#{$direction}: flex-gutter($container-columns);
+ width: flex-grid($columns, $container-columns);
+
+ &:last-child {
+ margin-#{$direction}: 0;
+ }
+ }
+}
diff --git a/ui/stylesheets/lib/neat/grid/_to-deprecate.scss b/ui/stylesheets/lib/neat/grid/_to-deprecate.scss
new file mode 100644
index 00000000000..d0a681fd12e
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_to-deprecate.scss
@@ -0,0 +1,57 @@
+@mixin breakpoint($query:$feature $value $columns, $total-columns: $grid-columns) {
+ @warn "The breakpoint() mixin was renamed to media() in Neat 1.0. Please update your project with the new syntax before the next version bump.";
+
+ @if length($query) == 1 {
+ @media screen and ($default-feature: nth($query, 1)) {
+ $default-grid-columns: $grid-columns;
+ $grid-columns: $total-columns;
+ @content;
+ $grid-columns: $default-grid-columns;
+ }
+ }
+
+ @else if length($query) == 2 {
+ @media screen and (nth($query, 1): nth($query, 2)) {
+ $default-grid-columns: $grid-columns;
+ $grid-columns: $total-columns;
+ @content;
+ $grid-columns: $default-grid-columns;
+ }
+ }
+
+ @else if length($query) == 3 {
+ @media screen and (nth($query, 1): nth($query, 2)) {
+ $default-grid-columns: $grid-columns;
+ $grid-columns: nth($query, 3);
+ @content;
+ $grid-columns: $default-grid-columns;
+ }
+ }
+
+ @else if length($query) == 4 {
+ @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) {
+ $default-grid-columns: $grid-columns;
+ $grid-columns: $total-columns;
+ @content;
+ $grid-columns: $default-grid-columns;
+ }
+ }
+
+ @else if length($query) == 5 {
+ @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) {
+ $default-grid-columns: $grid-columns;
+ $grid-columns: nth($query, 5);
+ @content;
+ $grid-columns: $default-grid-columns;
+ }
+ }
+
+ @else {
+ @warn "Wrong number of arguments for breakpoint(). Read the documentation for more details.";
+ }
+}
+
+@mixin nth-omega($nth, $display: block, $direction: default) {
+ @warn "The nth-omega() mixin is deprecated. Please use omega() instead.";
+ @include omega($nth $display, $direction);
+}
diff --git a/ui/stylesheets/lib/neat/grid/_visual-grid.scss b/ui/stylesheets/lib/neat/grid/_visual-grid.scss
new file mode 100644
index 00000000000..1c822fd3220
--- /dev/null
+++ b/ui/stylesheets/lib/neat/grid/_visual-grid.scss
@@ -0,0 +1,41 @@
+@mixin grid-column-gradient($values...) {
+ background-image: deprecated-webkit-gradient(linear, left top, left bottom, $values);
+ background-image: -webkit-linear-gradient(left, $values);
+ background-image: -moz-linear-gradient(left, $values);
+ background-image: -ms-linear-gradient(left, $values);
+ background-image: -o-linear-gradient(left, $values);
+ background-image: unquote("linear-gradient(left, #{$values})");
+}
+
+@if $visual-grid == true or $visual-grid == yes {
+ body:before {
+ content: '';
+ display: inline-block;
+ @include grid-column-gradient(gradient-stops($grid-columns));
+ height: 100%;
+ left: 0;
+ margin: 0 auto;
+ max-width: $max-width;
+ opacity: $visual-grid-opacity;
+ position: fixed;
+ right: 0;
+ width: 100%;
+ pointer-events: none;
+
+ @if $visual-grid-index == back {
+ z-index: -1;
+ }
+
+ @else if $visual-grid-index == front {
+ z-index: 9999;
+ }
+
+ @each $breakpoint in $visual-grid-breakpoints {
+ @if $breakpoint != nil {
+ @include media($breakpoint) {
+ @include grid-column-gradient(gradient-stops($grid-columns));
+ }
+ }
+ }
+ }
+}
diff --git a/ui/stylesheets/lib/neat/settings/_grid.scss b/ui/stylesheets/lib/neat/settings/_grid.scss
new file mode 100644
index 00000000000..f1dcda47804
--- /dev/null
+++ b/ui/stylesheets/lib/neat/settings/_grid.scss
@@ -0,0 +1,7 @@
+$column: golden-ratio(1em, 3) !default; // Column width
+$gutter: golden-ratio(1em, 1) !default; // Gutter between each two columns
+$grid-columns: 12 !default; // Total number of columns in the grid
+$max-width: em(1088) !default; // Max-width of the outer container
+$border-box-sizing: true !default; // Makes all elements have a border-box layout
+$default-feature: min-width; // Default @media feature for the breakpoint() mixin
+$default-layout-direction: LTR !default;
diff --git a/ui/stylesheets/lib/neat/settings/_visual-grid.scss b/ui/stylesheets/lib/neat/settings/_visual-grid.scss
new file mode 100644
index 00000000000..611c2b37274
--- /dev/null
+++ b/ui/stylesheets/lib/neat/settings/_visual-grid.scss
@@ -0,0 +1,5 @@
+$visual-grid: false !default; // Display the base grid
+$visual-grid-color: #EEE !default;
+$visual-grid-index: back !default; // Show grid behind content (back) or overlay it over the content (front)
+$visual-grid-opacity: 0.4 !default;
+$visual-grid-breakpoints: () !default;