diff --git a/.gitignore b/.gitignore
index a56dc07d82..fbf12d0f37 100644
--- a/.gitignore
+++ b/.gitignore
@@ -71,13 +71,19 @@ lms/static/css/
lms/static/sass/*.css
lms/static/sass/*.css.map
lms/static/sass/application.scss
+lms/static/sass/application-rtl.scss
lms/static/sass/application-extend1.scss
+lms/static/sass/application-extend1-rtl.scss
lms/static/sass/application-extend2.scss
+lms/static/sass/application-extend2-rtl.scss
lms/static/sass/course.scss
+lms/static/sass/course-rtl.scss
cms/static/css/
cms/static/sass/*.css
cms/static/sass/*.css.map
+
+
### Logging artifacts
log/
logs
diff --git a/cms/envs/common.py b/cms/envs/common.py
index 3e1cfe2f71..10c285045d 100644
--- a/cms/envs/common.py
+++ b/cms/envs/common.py
@@ -307,6 +307,7 @@ STATICFILES_DIRS = [
# Locale/Internationalization
TIME_ZONE = 'America/New_York' # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
LANGUAGE_CODE = 'en' # http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGES_BIDI = lms.envs.common.LANGUAGES_BIDI
LANGUAGES = lms.envs.common.LANGUAGES
LANGUAGE_DICT = dict(LANGUAGES)
@@ -369,12 +370,30 @@ PIPELINE_CSS = {
],
'output_filename': 'css/cms-style-app-extend1.css',
},
+ 'style-app-rtl': {
+ 'source_filenames': [
+ 'sass/style-app-rtl.css',
+ ],
+ 'output_filename': 'css/cms-style-app-rtl.css',
+ },
+ 'style-app-extend1-rtl': {
+ 'source_filenames': [
+ 'sass/style-app-extend1-rtl.css',
+ ],
+ 'output_filename': 'css/cms-style-app-extend1-rtl.css',
+ },
'style-xmodule': {
'source_filenames': [
'sass/style-xmodule.css',
],
'output_filename': 'css/cms-style-xmodule.css',
},
+ 'style-xmodule-rtl': {
+ 'source_filenames': [
+ 'sass/style-xmodule-rtl.css',
+ ],
+ 'output_filename': 'css/cms-style-xmodule-rtl.css',
+ },
'style-xmodule-annotations': {
'source_filenames': [
'css/vendor/ova/annotator.css',
diff --git a/cms/static/sass/_base.scss b/cms/static/sass/_base.scss
index 547d9b2e39..329ecad33f 100644
--- a/cms/static/sass/_base.scss
+++ b/cms/static/sass/_base.scss
@@ -279,25 +279,25 @@ p, ul, ol, dl {
@include clearfix();
.page-header {
- float: left;
+ @include float(left);
+ @include margin-right(flex-gutter());
width: flex-grid(6,12);
- margin-right: flex-gutter();
}
.nav-actions {
+ @include float(left);
+ @include text-align(right);
position: relative;
bottom: -($baseline*0.75);
- float: right;
width: flex-grid(6,12);
- text-align: right;
.nav-item {
display: inline-block;
vertical-align: top;
- margin-right: ($baseline/2);
+ @include margin-right($baseline/2);
&:last-child {
- margin-right: 0;
+ @include margin-right(0);
}
}
@@ -500,21 +500,21 @@ p, ul, ol, dl {
.main-column {
clear: both;
- float: left;
+ @include float(left);
width: 70%;
}
.sidebar {
- float: right;
+ @include float(right);
width: 28%;
}
.left {
- float: left;
+ @include float(left);
}
.right {
- float: right;
+ @include float(right);
}
// ====================
@@ -539,7 +539,7 @@ p, ul, ol, dl {
.item-actions {
position: absolute;
top: 5px;
- right: 5px;
+ @include right(5px);
.edit-button,
.delete-button,
diff --git a/cms/static/sass/elements/_controls.scss b/cms/static/sass/elements/_controls.scss
index f5c9eb7434..fa8eeb072c 100644
--- a/cms/static/sass/elements/_controls.scss
+++ b/cms/static/sass/elements/_controls.scss
@@ -278,7 +278,16 @@
height: ($baseline*1.2);
width: ($baseline);
margin: 0;
- background: transparent url("../img/drag-handles.png") no-repeat right center;
+
+ // CASE: right to left layout
+ @include rtl {
+ background: transparent url("../img/drag-handles.png") no-repeat left center;
+ }
+
+ // CASE: left to right layout
+ @include ltr {
+ background: transparent url("../img/drag-handles.png") no-repeat right center;
+ }
}
&.toggle-action {
diff --git a/cms/static/sass/elements/_header.scss b/cms/static/sass/elements/_header.scss
index cbe02a029b..3bfafc7d28 100644
--- a/cms/static/sass/elements/_header.scss
+++ b/cms/static/sass/elements/_header.scss
@@ -27,14 +27,14 @@
}
.wrapper-l {
- float: left;
+ @include float(left);
width: flex-grid(7,12);
}
.wrapper-r {
- float: right;
+ @include float(right);
width: flex-grid(4,12);
- text-align: right;
+ @include text-align(right);
}
.branding, .info-course, .nav-course, .nav-account, .nav-pitch {
@@ -128,8 +128,8 @@
// specific elements - course name/info
.info-course {
- margin-right: flex-gutter();
- border-right: 1px solid $gray-l4;
+ @include margin-right(flex-gutter());
+ @include border-right(1px solid $gray-l4);
padding: ($baseline*0.75) flex-gutter() ($baseline*0.75) 0;
.course-org, .course-number {
@@ -144,7 +144,7 @@
}
.course-org {
- margin-right: ($baseline/4);
+ @include margin-right($baseline/4);
}
.course-title {
@@ -184,7 +184,7 @@
padding: ($baseline*0.75) 0;
.nav-sub {
- text-align: left;
+ @include text-align(left);
}
.nav-account-help {
@@ -238,7 +238,7 @@
.branding {
width: 20%;
- margin-right: 2%;
+ @include margin-right(2%);
}
.nav-account {
@@ -263,7 +263,7 @@
.branding {
width: 20%;
- margin-right: 2%;
+ @include margin-right(2%);
}
.info-course {
diff --git a/cms/static/sass/elements/_icons.scss b/cms/static/sass/elements/_icons.scss
index 937366c003..aca138b068 100644
--- a/cms/static/sass/elements/_icons.scss
+++ b/cms/static/sass/elements/_icons.scss
@@ -12,14 +12,14 @@
.icon-inline {
display: inline-block;
vertical-align: middle;
- margin-right: ($baseline/4);
+ @include margin-right($baseline/4);
}
// ui - badges
.wrapper-ui-badge {
position: absolute;
top: -1px;
- left: ($baseline*1.5);
+ @include left($baseline*1.5);
width: 100%;
}
diff --git a/cms/static/sass/elements/_layout.scss b/cms/static/sass/elements/_layout.scss
index cc3324805c..13a755b60f 100644
--- a/cms/static/sass/elements/_layout.scss
+++ b/cms/static/sass/elements/_layout.scss
@@ -40,25 +40,25 @@
@include clearfix();
.page-header {
- float: left;
+ @include float(left);
width: flex-grid(6,12);
- margin-right: flex-gutter();
+ @include margin-right(flex-gutter());
}
.nav-actions {
position: relative;
bottom: -($baseline*0.75);
- float: right;
+ @include float(right);
width: flex-grid(6,12);
- text-align: right;
+ @include text-align(right);
.nav-item {
display: inline-block;
vertical-align: top;
- margin-right: ($baseline/2);
+ @include margin-right(($baseline/2));
&:last-child {
- margin-right: 0;
+ @include margin-right(0);
}
}
@@ -214,8 +214,8 @@
// 3/4 - 1/4 two col layout
%two-col-1 {
.content-primary {
- float: left;
- margin-right: flex-gutter();
+ @include float(left);
+ @include margin-right(flex-gutter());
width: flex-grid(9,12);
box-shadow: none;
border: 0;
@@ -223,7 +223,7 @@
}
.content-supplementary {
- float: left;
+ @include float(left);
width: flex-grid(3,12);
}
}
diff --git a/cms/static/sass/elements/_modules.scss b/cms/static/sass/elements/_modules.scss
index 183bf29a64..421f97ff29 100644
--- a/cms/static/sass/elements/_modules.scss
+++ b/cms/static/sass/elements/_modules.scss
@@ -300,7 +300,7 @@ $outline-indent-width: $baseline;
.icon {
@extend %t-icon5;
- margin-right: ($baseline/4);
+ @include margin-right($baseline/4);
}
}
diff --git a/cms/static/sass/elements/_navigation.scss b/cms/static/sass/elements/_navigation.scss
index 98932abb10..70289057ea 100644
--- a/cms/static/sass/elements/_navigation.scss
+++ b/cms/static/sass/elements/_navigation.scss
@@ -34,7 +34,7 @@ nav {
.ui-toggle-dd {
@include transition(all $tmg-f2 ease-in-out 0s);
- margin-left: ($baseline/10);
+ margin: 0 ($baseline/10);
display: inline-block;
vertical-align: middle;
}
@@ -148,7 +148,7 @@ nav {
}
.nav-sub {
- text-align: left;
+ @include text-align(left);
// ui triangle/nub
&:after {
@@ -167,20 +167,20 @@ nav {
&.ui-right {
.wrapper-nav-sub {
- left: none;
- right: 0;
+ @include left(none);
+ @include right(0);
}
.nav-sub {
// ui triangle/nub
&:after {
- right: $baseline;
+ @include right($baseline);
margin-right: -10px;
}
&:before {
- right: $baseline;
+ @include right($baseline);
margin-right: -11px;
}
}
diff --git a/cms/static/sass/elements/_sock.scss b/cms/static/sass/elements/_sock.scss
index d29077f642..05077ab7db 100644
--- a/cms/static/sass/elements/_sock.scss
+++ b/cms/static/sass/elements/_sock.scss
@@ -35,7 +35,7 @@
[class^="icon-"] {
@extend %t-icon6;
- margin-right: ($baseline/4);
+ @include margin-right($baseline/4);
}
&:hover {
@@ -84,11 +84,11 @@
@include clearfix();
.action-item {
- float: left;
- margin-right: ($baseline/2);
+ @include float(left);
+ @include margin-right($baseline/2);
&:last-child {
- margin-right: 0;
+ @include margin-right(0);
}
.action {
@@ -98,7 +98,7 @@
[class^="icon-"] {
@extend %t-icon4;
vertical-align: middle;
- margin-right: $baseline/4;
+ @include margin-right($baseline/4);
}
diff --git a/cms/static/sass/elements/_system-feedback.scss b/cms/static/sass/elements/_system-feedback.scss
index bf9ec1b05a..b1269e4ebd 100644
--- a/cms/static/sass/elements/_system-feedback.scss
+++ b/cms/static/sass/elements/_system-feedback.scss
@@ -210,7 +210,7 @@
vertical-align: middle;
width: $baseline*17.5;
border: 4px solid $black;
- text-align: left;
+ @include text-align(left);
.copy {
border-top: 4px solid $blue;
@@ -225,10 +225,10 @@
.nav-item {
display: inline-block;
- margin-right: ($baseline*0.75);
+ @include margin-right($baseline*0.75);
&:last-child {
- margin-right: 0;
+ @include margin-right(0);
}
}
@@ -437,22 +437,22 @@
.copy {
width: flex-grid(7, 12);
- margin-right: flex-gutter();
+ @include margin-right(flex-gutter());
}
.nav-actions {
width: flex-grid(4, 12);
- float: right;
+ @include float(left);
margin-top: ($baseline/4);
text-align: right;
.nav-item {
display: inline-block;
vertical-align: middle;
- margin-right: ($baseline/2);
+ @include margin-right($baseline/2);
&:last-child {
- margin-right: 0;
+ @include margin-right(0);
}
}
}
@@ -610,25 +610,25 @@
width: flex-grid(1, 12);
}
- .copy {
- width: flex-grid(7, 12);
- margin-right: flex-gutter();
- }
+ .copy {
+ width: flex-grid(7, 12);
+ @include margin-right(flex-gutter());
+ }
- .nav-actions {
- width: flex-grid(4, 12);
- float: right;
- margin-top: ($baseline/2);
- text-align: right;
+ .nav-actions {
+ width: flex-grid(4, 12);
+ @include float(left);
+ margin-top: ($baseline/2);
+ text-align: right;
- .nav-item {
- display: inline-block;
- vertical-align: middle;
- margin-right: ($baseline/2);
+ .nav-item {
+ display: inline-block;
+ vertical-align: middle;
+ @include margin-right($baseline/2);
- &:last-child {
- margin-right: 0;
- }
+ &:last-child {
+ @include margin-right(0);
+ }
.action-primary {
@extend %t-action4;
@@ -829,7 +829,7 @@ body.uxdesign.alerts {
.content-primary {
@extend %ui-window;
width: flex-grid(12, 12);
- margin-right: flex-gutter();
+ @include margin-right(flex-gutter());
padding: $baseline ($baseline*1.5);
> section {
@@ -856,9 +856,9 @@ body.uxdesign.alerts {
}
a {
- float: left;
+ @include float(left);
width: flex-grid(5, 12);
- margin-right: flex-gutter();
+ @include margin-right(flex-gutter());
}
}
}
@@ -882,7 +882,7 @@ body.uxdesign.alerts {
@include clearfix;
.alert-message {
- float: left;
+ @include float(left);
margin: 4px 0 0 0;
color: $gray-d3;
}
@@ -892,7 +892,7 @@ body.uxdesign.alerts {
}
.alert-action {
- float: right;
+ @include float(left);
&.secondary {
@include orange-button;
diff --git a/cms/static/sass/elements/_system-help.scss b/cms/static/sass/elements/_system-help.scss
index 0538bf6f7d..1bb350f4fe 100644
--- a/cms/static/sass/elements/_system-help.scss
+++ b/cms/static/sass/elements/_system-help.scss
@@ -24,17 +24,17 @@
@include clearfix();
.copy {
- float: left;
+ @include float(left);
width: flex-grid(8,12);
- margin-right: flex-gutter();
+ @include margin-right(flex-gutter());
}
.nav-introduction-supplementary {
@extend %t-copy-sub2;
- float: right;
+ @include float(right);
width: flex-grid(4,12);
display: block;
- text-align: right;
+ @include text-align(right);
.icon {
@extend %t-action3;
diff --git a/cms/static/sass/elements/_xblocks.scss b/cms/static/sass/elements/_xblocks.scss
index c75daf9b94..bd44611a74 100644
--- a/cms/static/sass/elements/_xblocks.scss
+++ b/cms/static/sass/elements/_xblocks.scss
@@ -41,7 +41,7 @@
display: inline-block;
width: 49%;
vertical-align: middle;
- text-align: right;
+ @include text-align(right);
}
}
diff --git a/cms/static/sass/style-app-extend1-rtl.scss b/cms/static/sass/style-app-extend1-rtl.scss
new file mode 100644
index 0000000000..db601f8bca
--- /dev/null
+++ b/cms/static/sass/style-app-extend1-rtl.scss
@@ -0,0 +1,62 @@
+// studio - css architecture
+// ====================
+
+// libs and resets *do not edit*
+@import 'bourbon/bourbon'; // lib - bourbon
+@import 'vendor/bi-app/bi-app-rtl'; // set the layout for right to left languages
+
+// VENDOR + REBASE *referenced/used vendor presentation and reset*
+// ====================
+@import 'reset';
+
+// BASE *default edX offerings*
+// ====================
+// base - utilities
+@import 'variables';
+@import 'mixins';
+@import 'mixins-inherited';
+
+// base - assets
+@import 'assets/fonts';
+@import 'assets/graphics'; // sprites, basic img/figure/svg styling
+@import 'assets/anims'; // animations
+
+// base - starter
+@import 'base';
+
+// base - elements
+@import 'elements/typography';
+@import 'elements/icons'; // references to icons used
+@import 'elements/controls'; // buttons, link styles, sliders, etc.
+@import 'elements/xblocks'; // studio rendering chrome for xblocks
+@import 'elements/modules'; // content module patterns
+@import 'elements/layout'; // various standard layouts
+
+// base - specific views
+@import 'views/account';
+@import 'views/assets';
+@import 'views/updates';
+@import 'views/dashboard';
+@import 'views/export';
+@import 'views/index';
+@import 'views/course-create';
+@import 'views/import';
+@import 'views/outline';
+@import 'views/settings';
+@import 'views/static-pages';
+@import 'views/unit';
+@import 'views/container';
+@import 'views/users';
+@import 'views/checklists';
+@import 'views/textbooks';
+@import 'views/export-git';
+@import 'views/group-configuration';
+
+// base - contexts
+@import 'contexts/ie'; // ie-specific rules (mostly for known/older bugs)
+
+// temp - inherited
+@import 'assets/content-types';
+
+@import 'developer'; // used for any developer-created scss that needs further polish/refactoring
+@import 'shame'; // used for any bad-form/orphaned scss
diff --git a/cms/static/sass/style-app-extend1.scss b/cms/static/sass/style-app-extend1.scss
index 924b7c114f..99460e4b29 100644
--- a/cms/static/sass/style-app-extend1.scss
+++ b/cms/static/sass/style-app-extend1.scss
@@ -1,6 +1,8 @@
// studio - css architecture
// ====================
+@import 'vendor/bi-app/bi-app-ltr'; // set the layout for left to right languages
+
// libs and resets *do not edit*
@import 'bourbon/bourbon'; // lib - bourbon
diff --git a/cms/static/sass/style-app-rtl.scss b/cms/static/sass/style-app-rtl.scss
new file mode 100644
index 0000000000..91dea8af04
--- /dev/null
+++ b/cms/static/sass/style-app-rtl.scss
@@ -0,0 +1,43 @@
+// studio - css architecture
+// ====================
+
+// libs and resets *do not edit*
+@import 'bourbon/bourbon'; // lib - bourbon
+@import 'vendor/bi-app/bi-app-rtl'; // set the layout for right to left languages
+
+// VENDOR + REBASE *referenced/used vendor presentation and reset*
+// ====================
+@import 'reset';
+
+// BASE *default edX offerings*
+// ====================
+// base - utilities
+@import 'variables';
+@import 'mixins';
+@import 'mixins-inherited';
+
+// base - assets
+@import 'assets/fonts';
+@import 'assets/graphics'; // sprites, basic img/figure/svg styling
+@import 'assets/anims'; // animations
+
+// base - starter
+@import 'base';
+
+// base - elements
+@import 'elements/typography';
+@import 'elements/icons'; // references to icons used
+@import 'elements/controls'; // buttons, link styles, sliders, etc.
+@import 'elements/modules'; // content module patterns
+@import 'elements/navigation'; // all archetypes of navigation
+@import 'elements/layout'; // various standard layouts
+@import 'elements/forms';
+@import 'elements/header';
+@import 'elements/footer';
+@import 'elements/sock';
+@import 'elements/tender-widget';
+@import 'elements/system-feedback'; // alerts, notifications, states
+@import 'elements/system-help'; // help UI
+@import 'elements/modal'; // interstitial UI, dialogs, modal windows
+@import 'elements/vendor'; // overrides to vendor-provided styling
+@import 'elements/modal-window';
diff --git a/cms/static/sass/style-app.scss b/cms/static/sass/style-app.scss
index d84d1cfd27..7e8f1b0a7f 100644
--- a/cms/static/sass/style-app.scss
+++ b/cms/static/sass/style-app.scss
@@ -1,6 +1,8 @@
// studio - css architecture
// ====================
+@import 'vendor/bi-app/bi-app-ltr'; // set the layout for left to right languages
+
// libs and resets *do not edit*
@import 'bourbon/bourbon'; // lib - bourbon
diff --git a/cms/static/sass/style-xmodule-rtl.scss b/cms/static/sass/style-xmodule-rtl.scss
new file mode 100644
index 0000000000..7c09076a5e
--- /dev/null
+++ b/cms/static/sass/style-xmodule-rtl.scss
@@ -0,0 +1,36 @@
+// studio - xmodule architecture
+// ====================
+
+// libs and resets *do not edit*
+@import 'bourbon/bourbon'; // lib - bourbon
+@import 'vendor/bi-app/bi-app-rtl'; // set the layout for right to left languages
+
+// VENDOR + REBASE *referenced/used vendor presentation and reset*
+// ====================
+@import 'reset';
+
+// BASE *default edX offerings*
+// ====================
+// base - utilities
+@import 'variables';
+@import 'mixins';
+@import 'mixins-inherited';
+
+// base - assets
+@import 'assets/fonts';
+@import 'assets/graphics'; // sprites, basic img/figure/svg styling
+@import 'assets/anims'; // animations
+
+// base - starter
+@import 'base';
+
+// base - elements
+@import 'elements/typography';
+@import 'elements/icons'; // references to icons used
+@import 'elements/controls'; // buttons, link styles, sliders, etc.
+@import 'elements/navigation'; // all archetypes of navigation
+
+// xmodule
+@import 'xmodule/modules/css/module-styles.scss';
+@import 'xmodule/descriptors/css/module-styles.scss';
+@import 'elements/xmodules'; // styling for Studio-specific contexts
diff --git a/cms/static/sass/style-xmodule.scss b/cms/static/sass/style-xmodule.scss
index 330dca99d8..684ad9ef1d 100644
--- a/cms/static/sass/style-xmodule.scss
+++ b/cms/static/sass/style-xmodule.scss
@@ -3,6 +3,7 @@
// libs and resets *do not edit*
@import 'bourbon/bourbon'; // lib - bourbon
+@import 'vendor/bi-app/bi-app-ltr'; // set the layout for left to right languages
// VENDOR + REBASE *referenced/used vendor presentation and reset*
// ====================
diff --git a/cms/static/sass/vendor/bi-app/_bi-app-ltr.scss b/cms/static/sass/vendor/bi-app/_bi-app-ltr.scss
new file mode 100755
index 0000000000..6278a31380
--- /dev/null
+++ b/cms/static/sass/vendor/bi-app/_bi-app-ltr.scss
@@ -0,0 +1,11 @@
+// ------------------------------------------
+// left to right module
+// authors:
+// twitter.com/anasnakawa
+// twitter.com/victorzamfir
+// licensed under the MIT license
+// http://www.opensource.org/licenses/mit-license.php
+// ------------------------------------------
+
+@import 'variables-ltr';
+@import 'mixins';
\ No newline at end of file
diff --git a/cms/static/sass/vendor/bi-app/_bi-app-rtl.scss b/cms/static/sass/vendor/bi-app/_bi-app-rtl.scss
new file mode 100755
index 0000000000..17b7f2e90f
--- /dev/null
+++ b/cms/static/sass/vendor/bi-app/_bi-app-rtl.scss
@@ -0,0 +1,11 @@
+// ------------------------------------------
+// right to left module
+// authors:
+// twitter.com/anasnakawa
+// twitter.com/victorzamfir
+// licensed under the MIT license
+// http://www.opensource.org/licenses/mit-license.php
+// ------------------------------------------
+
+@import 'variables-rtl';
+@import 'mixins';
\ No newline at end of file
diff --git a/cms/static/sass/vendor/bi-app/_mixins.scss b/cms/static/sass/vendor/bi-app/_mixins.scss
new file mode 100755
index 0000000000..e02d4d00ac
--- /dev/null
+++ b/cms/static/sass/vendor/bi-app/_mixins.scss
@@ -0,0 +1,294 @@
+// ------------------------------------------
+// bi app mixins
+// authors:
+// twitter.com/anasnakawa
+// twitter.com/victorzamfir
+// licensed under the MIT license
+// http://www.opensource.org/licenses/mit-license.php
+// ------------------------------------------
+
+// ------------------------------------------
+// Table of contents
+// ------------------------------------------
+// padding
+// margin
+// float
+// text align
+// clear
+// left / right
+// border
+// - width
+// - style
+// - color
+// - generic
+// - radius
+// ltr / rtl contents
+// ------------------------------------------
+
+// generic mixin for properties with values
+// (top right bottom left)
+// ------------------------------------------
+@mixin bi-app-compact($property, $top, $right, $bottom, $left) {
+ @if $bi-app-direction == ltr {
+ #{$property}: $top $right $bottom $left;
+ } @else {
+ #{$property}: $top $left $bottom $right;
+ }
+}
+
+// padding
+// ------------------------------------------
+@mixin padding-left($distance) {
+ padding-#{$bi-app-left}: $distance;
+}
+
+@mixin padding-right($distance) {
+ padding-#{$bi-app-right}: $distance;
+}
+
+@mixin padding($top, $right, $bottom, $left) {
+ @include bi-app-compact(padding, $top, $right, $bottom, $left);
+}
+
+// margin
+// ------------------------------------------
+@mixin margin-left($distance) {
+ margin-#{$bi-app-left}: $distance;
+}
+
+@mixin margin-right($distance) {
+ margin-#{$bi-app-right}: $distance;
+}
+
+@mixin margin($top, $right, $bottom, $left) {
+ @include bi-app-compact(margin, $top, $right, $bottom, $left);
+}
+
+// float
+// ------------------------------------------
+@mixin bi-app-float-left {
+ float: $bi-app-left;
+}
+
+@mixin bi-app-float-right {
+ float: $bi-app-right;
+}
+
+@mixin float($direction) {
+ @if $direction == left {
+ @include bi-app-float-left;
+ } @else if $direction == right {
+ @include bi-app-float-right;
+ } @else {
+ float: $direction;
+ }
+}
+
+// text align
+// ------------------------------------------
+@mixin bi-app-text-align-left {
+ text-align: $bi-app-left;
+}
+
+@mixin bi-app-text-align-right {
+ text-align: $bi-app-right;
+}
+
+@mixin text-align($direction) {
+ @if $direction == left {
+ @include bi-app-text-align-left;
+ } @else if $direction == right {
+ @include bi-app-text-align-right;
+ } @else {
+ text-align: $direction;
+ }
+}
+
+// clear
+// ------------------------------------------
+@mixin bi-app-clear-left {
+ clear: $bi-app-left;
+}
+
+@mixin bi-app-clear-right {
+ clear: $bi-app-right;
+}
+
+@mixin clear($direction) {
+ @if $direction == left {
+ @include bi-app-clear-left;
+ } @else if $direction == right {
+ @include bi-app-clear-right;
+ } @else {
+ clear: $direction;
+ }
+}
+
+// left / right
+// ------------------------------------------
+@mixin left($distance) {
+ @if $bi-app-direction == ltr {
+ left: $distance;
+ } @else if $bi-app-direction == rtl {
+ right: $distance;
+ }
+}
+
+@mixin right($distance) {
+ @if $bi-app-direction == ltr {
+ right: $distance;
+ } @else if $bi-app-direction == rtl {
+ left: $distance;
+ }
+}
+
+// border
+// ------------------------------------------
+
+// width
+@mixin border-left-width($width) {
+ border-#{$bi-app-left}-width: $width;
+}
+
+@mixin border-right-width($width) {
+ border-#{$bi-app-right}-width: $width;
+}
+
+@mixin border-width($top, $right, $bottom, $left) {
+ @include bi-app-compact(border-width, $top, $right, $bottom, $left);
+}
+
+// style
+@mixin border-left-style($style) {
+ border-#{$bi-app-left}-style: $style;
+}
+
+@mixin border-right-style($style) {
+ border-#{$bi-app-right}-style: $style;
+}
+
+@mixin border-style($top, $right, $bottom, $left) {
+ @include bi-app-compact(border-style, $top, $right, $bottom, $left);
+}
+
+// color
+@mixin border-left-color($color) {
+ border-#{$bi-app-left}-color: $color;
+}
+
+@mixin border-right-color($color) {
+ border-#{$bi-app-right}-color: $color;
+}
+
+@mixin border-color($top, $right, $bottom, $left) {
+ @include bi-app-compact(border-color, $top, $right, $bottom, $left);
+}
+
+// generic
+@mixin border-left($border-style) {
+ border-#{$bi-app-left}: $border-style;
+}
+
+@mixin border-right($border-style) {
+ border-#{$bi-app-right}: $border-style;
+}
+
+// radius
+@mixin border-top-left-radius($radius) {
+ -webkit-border-top-#{$bi-app-left}-radius: $radius;
+ -moz-border-top#{$bi-app-left}-radius: $radius;
+ border-top-#{$bi-app-left}-radius: $radius;
+}
+
+@mixin border-top-right-radius($radius) {
+ -webkit-border-top-#{$bi-app-right}-radius: $radius;
+ -moz-border-top#{$bi-app-right}-radius: $radius;
+ border-top-#{$bi-app-right}-radius: $radius;
+}
+
+@mixin border-bottom-left-radius($radius) {
+ -webkit-border-bottom-#{$bi-app-left}-radius: $radius;
+ -moz-border-bottom#{$bi-app-left}-radius: $radius;
+ border-bottom-#{$bi-app-left}-radius: $radius;
+}
+
+@mixin border-bottom-right-radius($radius) {
+ -webkit-border-bottom-#{$bi-app-right}-radius: $radius;
+ -moz-border-bottom#{$bi-app-right}-radius: $radius;
+ border-bottom-#{$bi-app-right}-radius: $radius;
+}
+
+@mixin border-right-radius($radius) {
+ @include border-top-right-radius($radius);
+ @include border-bottom-right-radius($radius);
+}
+
+@mixin border-left-radius($radius) {
+ @include border-top-left-radius($radius);
+ @include border-bottom-left-radius($radius);
+}
+
+@mixin border-top-radius($radius) {
+ @include border-top-left-radius($radius);
+ @include border-top-right-radius($radius);
+}
+
+@mixin border-bottom-radius($radius) {
+ @include border-bottom-left-radius($radius);
+ @include border-bottom-right-radius($radius);
+}
+
+@mixin border-radius($topLeft, $topRight: null, $bottomRight: null, $bottomLeft: null) {
+ @if $topRight != null {
+ @include border-top-left-radius($topLeft);
+ @include border-top-right-radius($topRight);
+ @include border-bottom-right-radius($bottomRight);
+ @include border-bottom-left-radius($bottomLeft);
+ } @else {
+ -webkit-border-radius: $topLeft;
+ -moz-border-radius: $topLeft;
+ -ms-border-radius: $topLeft;
+ -o-border-radius: $topLeft;
+ border-radius: $topLeft;
+ }
+}
+
+// Returns "en" or "ar", useful for image suffixes.
+// Usage: background-image: url(/img/header-#{lang()}.png);
+@function lang() {
+ @if $bi-app-direction == ltr {
+ @return 'en';
+ } @else {
+ @return 'ar';
+ }
+}
+
+// Support for "direction" declaration (renders ltr/rtl).
+// Useful for form elements as they swap the text-indent property and align the text accordingly.
+@mixin direction {
+ direction: $bi-app-direction;
+}
+
+// Inverts a percentage value. Example: 97% becames 3%.
+// Useful for background-position.
+@function bi-app-invert-percentage($percentage) {
+ @if $bi-app-direction == rtl {
+ @return 100% - $percentage;
+ } @else {
+ @return $percentage;
+ }
+}
+
+// ltr / rtl contents
+// ------------------------------------------
+@mixin ltr {
+ @if $bi-app-direction == ltr {
+ @content;
+ }
+}
+
+@mixin rtl {
+ @if $bi-app-direction == rtl {
+ @content;
+ }
+}
diff --git a/cms/static/sass/vendor/bi-app/_variables-ltr.scss b/cms/static/sass/vendor/bi-app/_variables-ltr.scss
new file mode 100755
index 0000000000..36d5a7b06e
--- /dev/null
+++ b/cms/static/sass/vendor/bi-app/_variables-ltr.scss
@@ -0,0 +1,15 @@
+// ------------------------------------------
+// left to right variables to be used by bi-app mixins
+// authors:
+// twitter.com/anasnakawa
+// twitter.com/victorzamfir
+// licensed under the MIT license
+// http://www.opensource.org/licenses/mit-license.php
+// ------------------------------------------
+
+// namespacing variables with bi-app to
+// avoid conflicting with other global variables
+$bi-app-left : left;
+$bi-app-right : right;
+$bi-app-direction : ltr;
+$bi-app-invert-direction: rtl;
\ No newline at end of file
diff --git a/cms/static/sass/vendor/bi-app/_variables-rtl.scss b/cms/static/sass/vendor/bi-app/_variables-rtl.scss
new file mode 100755
index 0000000000..7300f17863
--- /dev/null
+++ b/cms/static/sass/vendor/bi-app/_variables-rtl.scss
@@ -0,0 +1,15 @@
+// ------------------------------------------
+// right to left variables to be used by bi-app mixins
+// authors:
+// twitter.com/anasnakawa
+// twitter.com/victorzamfir
+// licensed under the MIT license
+// http://www.opensource.org/licenses/mit-license.php
+// ------------------------------------------
+
+// namespacing variables with bi-app to
+// avoid conflicting with other global variables
+$bi-app-left : right;
+$bi-app-right : left;
+$bi-app-direction : rtl;
+$bi-app-invert-direction: ltr;
\ No newline at end of file
diff --git a/cms/static/sass/views/_account.scss b/cms/static/sass/views/_account.scss
index adf68981d7..1c70554542 100644
--- a/cms/static/sass/views/_account.scss
+++ b/cms/static/sass/views/_account.scss
@@ -37,7 +37,7 @@
.action {
@extend %t-action3;
position: absolute;
- right: 0;
+ @include right(0);
top: 40%;
}
}
@@ -50,12 +50,10 @@
.content-primary, .content-supplementary {
@include box-sizing(border-box);
- float: left;
}
.content-primary {
- width: flex-grid(8, 12);
- margin-right: flex-gutter();
+ @extend .ui-col-wide;
form {
@include box-sizing(border-box);
@@ -211,7 +209,7 @@
}
.content-supplementary {
- width: flex-grid(4, 12);
+ @extend .ui-col-narrow;
.bit {
@extend %t-copy-sub1;
@@ -243,7 +241,7 @@
@extend %t-action3;
position: absolute;
top: 0;
- right: 0;
+ @include right(0);
}
}
}
diff --git a/cms/static/sass/views/_assets.scss b/cms/static/sass/views/_assets.scss
index e1df5d107f..9cc9e1dea6 100644
--- a/cms/static/sass/views/_assets.scss
+++ b/cms/static/sass/views/_assets.scss
@@ -5,16 +5,14 @@
.content-primary, .content-supplementary {
@include box-sizing(border-box);
- float: left;
}
.content-primary {
- width: flex-grid(9, 12);
- margin-right: flex-gutter();
+ @extend .ui-col-wide;
}
.content-supplementary {
- width: flex-grid(3, 12);
+ @extend .ui-col-narrow;
}
.nav-actions {
@@ -36,10 +34,10 @@
.new-button {
@extend %t-action3;
- margin-left: $baseline;
+ @include margin-left($baseline);
[class^="icon-"] {
- margin-right: ($baseline/2);
+ @include margin-right($baseline/2);
}
}
}
@@ -70,7 +68,7 @@
width: flex-grid(3, 12);
&.pagination-compact {
- text-align: right;
+ @include text-align(right);
}
&.pagination-full {
@@ -136,7 +134,7 @@
.current-page {
@extend %ui-depth1;
position: absolute;
- left: -($baseline/4);
+ @include left(-($baseline/4));
}
.page-divider {
diff --git a/cms/static/sass/views/_checklists.scss b/cms/static/sass/views/_checklists.scss
index 8a246d49f4..5246286c3a 100644
--- a/cms/static/sass/views/_checklists.scss
+++ b/cms/static/sass/views/_checklists.scss
@@ -5,12 +5,10 @@
.content-primary, .content-supplementary {
@include box-sizing(border-box);
- float: left;
}
.content-primary {
- width: flex-grid(9, 12);
- margin-right: flex-gutter();
+ @extend .ui-col-wide;
}
// checklists - general
@@ -58,15 +56,16 @@
.checklist-title {
@include transition(color $tmg-f2 ease-in-out 0s);
width: flex-grid(6, 9);
- margin: 0 flex-gutter() 0 0;
- float: left;
+ margin: 0;
+ @include margin-right(flex-gutter());
+ @include float(left);
.ui-toggle-expansion {
@include transition(all $tmg-f2 ease-in-out 0s);
@extend %t-action1;
display: inline-block;
vertical-align: middle;
- margin-right: ($baseline/2);
+ @include margin-right($baseline/2);
color: $gray-l4;
}
@@ -86,9 +85,9 @@
.checklist-status {
@extend %t-copy-sub1;
width: flex-grid(3, 9);
- float: right;
+ @include float(right);
margin-top: ($baseline/2);
- text-align: right;
+ @include text-align(right);
color: $gray-l2;
@@ -127,7 +126,7 @@
.action-primary {
@include green-button();
- float: left;
+ @include float(left);
.icon-add {
@extend %t-icon7;
@@ -141,7 +140,7 @@
@include grey-button();
@extend %t-action3;
@extend %t-regular;
- float: right;
+ @include float(right);
.icon-delete {
@extend %t-icon7;
@@ -227,15 +226,16 @@
.task-input {
display: inline-block;
vertical-align: text-top;
- float: left;
- margin: ($baseline/2) flex-gutter() 0 0;
+ @include float(left);
+ margin-top: ($baseline/2);
+ @include margin-right(flex-gutter());
}
.task-details {
@extend %t-strong;
display: inline-block;
vertical-align: text-top;
- float: left;
+ @include float(left);
width: flex-grid(6,9);
.task-name {
@@ -264,7 +264,7 @@
@include clearfix();
display: inline-block;
vertical-align: middle;
- float: right;
+ @include float(right);
width: flex-grid(2,9);
margin: ($baseline/2) 0 0 flex-gutter();
opacity: 0.0;
@@ -336,6 +336,6 @@
}
.content-supplementary {
- width: flex-grid(3, 12);
+ @extend .ui-col-narrow;
}
}
diff --git a/cms/static/sass/views/_dashboard.scss b/cms/static/sass/views/_dashboard.scss
index 167cdde7bb..fc95b229b5 100644
--- a/cms/static/sass/views/_dashboard.scss
+++ b/cms/static/sass/views/_dashboard.scss
@@ -17,16 +17,14 @@
// basic layout
.content-primary, .content-supplementary {
@include box-sizing(border-box);
- float: left;
}
.content-primary {
- width: flex-grid(9, 12);
- margin-right: flex-gutter();
+ @extend .ui-col-wide;
}
.content-supplementary {
- width: flex-grid(3, 12);
+ @extend .ui-col-narrow;
}
// ====================
@@ -439,13 +437,13 @@
.course-link {
@extend %ui-depth2;
width: flex-grid(6, 9);
- margin-right: flex-gutter();
+ @include margin-right(flex-gutter());
}
// course title
.course-title {
@extend %t-title4;
- margin: 0 ($baseline*2) ($baseline/4) 0;
+ @include margin(0, ($baseline*2), ($baseline/4), 0);
font-weight: 300;
}
@@ -486,17 +484,17 @@
@extend %ui-depth3;
position: static;
width: flex-grid(3, 9);
- text-align: right;
+ @include text-align(right);
opacity: 0;
pointer-events: none;
.action {
display: inline-block;
vertical-align: middle;
- margin-right: ($baseline/2);
+ @include margin-right($baseline/2);
&:last-child {
- margin-right: 0;
+ @include margin-right(0);
}
}
diff --git a/cms/static/sass/views/_export.scss b/cms/static/sass/views/_export.scss
index 34cef96d04..f913f6fd43 100644
--- a/cms/static/sass/views/_export.scss
+++ b/cms/static/sass/views/_export.scss
@@ -6,16 +6,14 @@
// UI: basic layout
.content-primary, .content-supplementary {
@include box-sizing(border-box);
- float: left;
}
.content-primary {
- width: flex-grid(9,12);
- margin-right: flex-gutter();
+ @extend .ui-col-wide;
}
.content-supplementary {
- width: flex-grid(3,12);
+ @extend .ui-col-narrow;
}
diff --git a/cms/static/sass/views/_import.scss b/cms/static/sass/views/_import.scss
index 106a67f00f..5539688b13 100644
--- a/cms/static/sass/views/_import.scss
+++ b/cms/static/sass/views/_import.scss
@@ -5,16 +5,14 @@
.content-primary, .content-supplementary {
@include box-sizing(border-box);
- float: left;
}
.content-primary {
- width: flex-grid(9,12);
- margin-right: flex-gutter();
+ @extend .ui-col-wide;
}
.content-supplementary {
- width: flex-grid(3,12);
+ @extend .ui-col-narrow;
}
// UI: export controls
diff --git a/cms/static/sass/views/_outline.scss b/cms/static/sass/views/_outline.scss
index e57569ac45..39a0b088ce 100644
--- a/cms/static/sass/views/_outline.scss
+++ b/cms/static/sass/views/_outline.scss
@@ -70,12 +70,10 @@
.content-primary,
.content-supplementary {
@include box-sizing(border-box);
- float: left;
}
.content-primary {
- width: flex-grid(9, 12);
- margin-right: flex-gutter();
+ @extend .ui-col-wide;
.no-content {
@extend %no-content;
@@ -83,7 +81,7 @@
}
.content-supplementary {
- width: flex-grid(3, 12);
+ @extend .ui-col-narrow;
}
@@ -297,7 +295,7 @@
}
.section-header-details {
- float: left;
+ @include float(left);
width: flex-grid(6, 9);
.icon, .wrapper-section-title {
@@ -306,7 +304,7 @@
}
.icon {
- margin-right: ($baseline/4);
+ @include margin-right($baseline/4);
}
.wrapper-section-title {
@@ -316,10 +314,10 @@
}
.section-header-actions {
- float: right;
+ @include float(right);
width: flex-grid(3, 9);
margin-top: -($baseline/4);
- text-align: right;
+ @include text-align(right);
.actions-list {
@extend %actions-list;
@@ -385,7 +383,7 @@
}
.subsection-header-details {
- float: left;
+ @include float(left);
width: flex-grid(6, 9);
.icon, .wrapper-subsection-title {
@@ -394,7 +392,7 @@
}
.icon {
- margin-right: ($baseline/4);
+ @include margin-right($baseline/4);
}
.wrapper-subsection-title {
@@ -405,10 +403,10 @@
}
.subsection-header-actions {
- float: right;
+ @include float(right);
width: flex-grid(3, 9);
margin-top: -($baseline/4);
- text-align: right;
+ @include text-align(right);
.actions-list {
@extend %actions-list;
@@ -424,7 +422,7 @@
// status
.subsection-status {
- margin: 0 0 0 $outline-indent-width;
+ @include margin(0, 0, 0, $outline-indent-width);
}
// content
@@ -467,16 +465,16 @@
}
.unit-header-details {
- float: left;
+ @include float(left);
width: flex-grid(6, 9);
margin-top: ($baseline/4);
}
.unit-header-actions {
- float: right;
+ @include float(right);
width: flex-grid(3, 9);
margin-top: -($baseline/10);
- text-align: right;
+ @include text-align(right);
.actions-list {
@extend %actions-list;
@@ -497,7 +495,7 @@
.icon {
display: inline-block;
vertical-align: middle;
- margin-right: ($baseline/2);
+ @include margin-right($baseline/2);
}
}
}
diff --git a/cms/static/sass/views/_settings.scss b/cms/static/sass/views/_settings.scss
index 0d22c1284f..1c8e0aee96 100644
--- a/cms/static/sass/views/_settings.scss
+++ b/cms/static/sass/views/_settings.scss
@@ -5,13 +5,11 @@
.content-primary, .content-supplementary {
@include box-sizing(border-box);
- float: left;
}
.content-primary {
@extend %ui-window;
- width: flex-grid(9, 12);
- margin-right: flex-gutter();
+ @extend .ui-col-wide;
padding: $baseline ($baseline*1.5);
}
@@ -67,16 +65,17 @@
.title-2 {
width: flex-grid(4, 9);
- margin: 0 flex-gutter() 0 0;
- float: left;
+ margin: 0;
+ @include margin-right(flex-gutter());
+ @include float(left);
}
.tip {
@extend %t-copy-sub2;
width: flex-grid(5, 9);
- float: right;
+ @include float(right);
margin-top: ($baseline/2);
- text-align: right;
+ @include text-align(right);
color: $gray-l2;
}
}
@@ -372,7 +371,7 @@
}
.field {
- float: left;
+ @include float(left);
width: flex-grid(3, 9);
margin-bottom: ($baseline/4);
margin-right: flex-gutter();
@@ -384,7 +383,7 @@
.tip {
position: absolute;
top: 0;
- right: 0;
+ @include right(0);
}
}
}
@@ -598,6 +597,7 @@
.grade-specific-bar {
height: 50px !important;
+ text-align: left;
}
.grades {
@@ -897,13 +897,13 @@
}
.content-supplementary {
- width: flex-grid(3, 12);
+ @extend .ui-col-narrow;
}
-
+
.wrapper-modal-window {
-
+
.validation-error-modal-content {
-
+
.error-header {
p {
strong {
@@ -911,28 +911,28 @@
}
}
}
-
+
hr {
margin: 25px 0;
}
-
+
.error-list {
.error-item {
.error-item-title {
color: $error-red;
}
-
+
.error-item-message {
width:100%;
border: none;
resize: none;
-
+
&:focus {
outline: 0;
}
}
}
- }
+ }
}
}
}
diff --git a/cms/static/sass/views/_static-pages.scss b/cms/static/sass/views/_static-pages.scss
index 2900f44ae7..5b04353791 100644
--- a/cms/static/sass/views/_static-pages.scss
+++ b/cms/static/sass/views/_static-pages.scss
@@ -203,7 +203,7 @@
position: absolute;
display: block;
top: 0;
- right: 0;
+ @include right(0);
z-index: 11;
width: 35px;
height: 100%;
@@ -238,8 +238,8 @@
.component-actions,
.course-nav-item-actions {
display: inline-block;
- float: right;
- margin-right: ($baseline*2);
+ @include float(right);
+ @include margin-right($baseline*2);
padding: 8px 0px;
vertical-align: middle;
text-align: center;
diff --git a/cms/static/sass/views/_textbooks.scss b/cms/static/sass/views/_textbooks.scss
index 47ca0b578e..08abedbb72 100644
--- a/cms/static/sass/views/_textbooks.scss
+++ b/cms/static/sass/views/_textbooks.scss
@@ -5,12 +5,10 @@
.content-primary, .content-supplementary {
@include box-sizing(border-box);
- float: left;
}
.content-primary {
- width: flex-grid(9, 12);
- margin-right: flex-gutter();
+ @extend .ui-col-wide;
.no-textbook-content {
@extend %no-content;
@@ -31,7 +29,7 @@
.textbook-title {
@extend %t-title4;
@extend %t-strong;
- margin-right: ($baseline*14);
+ @include margin-right($baseline*14);
}
.ui-toggle-expansion {
@@ -85,7 +83,7 @@
opacity: 0.0;
position: absolute;
top: $baseline;
- right: $baseline;
+ @include right($baseline);
.action {
display: inline-block;
@@ -305,9 +303,9 @@
display: block;
width: 46%;
border-bottom: none;
- margin: 0 ($baseline*0.75) 0 0;
+ @include margin(0, ($baseline*0.75), 0, 0);
padding: ($baseline/4) 0 0 0;
- float: left;
+ @include float(left);
position: relative;
input, textarea {
@@ -318,7 +316,7 @@
@extend %ui-btn-flat-outline;
position: absolute;
top: 3px;
- right: 0;
+ @include right(0);
}
}
@@ -354,6 +352,6 @@
}
}
.content-supplementary {
- width: flex-grid(3, 12);
+ @extend .ui-col-narrow;
}
}
diff --git a/cms/static/sass/views/_unit.scss b/cms/static/sass/views/_unit.scss
index 4a3467a675..9ceb0ee843 100644
--- a/cms/static/sass/views/_unit.scss
+++ b/cms/static/sass/views/_unit.scss
@@ -3,5 +3,5 @@
// .view-unit styles will go here once we split it from container
.view-unit {
-
+
}
diff --git a/cms/static/sass/views/_updates.scss b/cms/static/sass/views/_updates.scss
index 2b29a0703c..7a1a140c70 100644
--- a/cms/static/sass/views/_updates.scss
+++ b/cms/static/sass/views/_updates.scss
@@ -160,31 +160,31 @@
}
.course-handouts {
- @extend %ui-window;
- width: 30%;
- padding: 20px 30px;
- margin: 0;
- border-radius: 0 3px 3px 0;
- border-left: none;
- background: $lightGrey;
+ @extend %ui-window;
+ width: 30%;
+ padding: 20px 30px;
+ margin: 0;
+ @include border-radius(0, 3px, 3px, 0);
+ @include border-left(none);
+ background: $lightGrey;
- .title {
- @extend %t-title4;
+ .title {
+ @extend %t-title4;
@extend %t-light;
margin-bottom: 24px;
- }
+ }
- .edit-button {
- @include white-button();
+ .edit-button {
+ @include white-button;
@extend %t-action4;
@extend %t-regular;
- float: right;
+ float: right;
padding: 3px 10px 4px;
margin-left: 7px;
.edit-icon,
.delete-icon {
- margin-right: 4px;
+ @include margin-right($baseline/5);
}
}
diff --git a/cms/static/sass/views/_users.scss b/cms/static/sass/views/_users.scss
index aa2d21b038..11c89dd196 100644
--- a/cms/static/sass/views/_users.scss
+++ b/cms/static/sass/views/_users.scss
@@ -6,16 +6,14 @@
// LAYOUT: page
.content-primary, .content-supplementary {
@include box-sizing(border-box);
- float: left;
}
.content-primary {
- width: flex-grid(9, 12);
- margin-right: flex-gutter();
+ @extend .ui-col-wide;
}
.content-supplementary {
- width: flex-grid(3, 12);
+ @extend .ui-col-narrow;
}
// ELEM: content
@@ -123,7 +121,7 @@
// ELEM: item - metadata
.item-metadata {
width: flex-grid(5, 9);
- margin-right: flex-gutter();
+ @include margin-right(flex-gutter());
.user-username, .user-email {
display: inline-block;
@@ -134,7 +132,7 @@
@include transition(color $tmg-f2 ease-in-out 0s);
@extend %t-title4;
@extend %t-strong;
- margin: 0 ($baseline/2) ($baseline/10) 0;
+ @include margin(0, ($baseline/2), ($baseline/10), 0);
color: $gray-d4;
}
diff --git a/cms/templates/base.html b/cms/templates/base.html
index 11c9d320aa..97e28b3c0f 100644
--- a/cms/templates/base.html
+++ b/cms/templates/base.html
@@ -8,7 +8,12 @@
-
+<%
+ # set doc language direction
+ from django.utils.translation import get_language_bidi
+ dir_rtl = 'rtl' if get_language_bidi() else 'ltr'
+%>
+
@@ -35,7 +40,7 @@
<%block name="header_extras">%block>
-
+
<%block name="view_notes">%block>
${_("Skip to this view's content")}
@@ -341,7 +346,7 @@
% endif
-
+
<% online_help_token = self.online_help_token() if hasattr(self, 'online_help_token') else None %>
<%include file="widgets/header.html" args="online_help_token=online_help_token" />
diff --git a/cms/templates/js/asset.underscore b/cms/templates/js/asset.underscore
index e38794af77..8e86eb9594 100644
--- a/cms/templates/js/asset.underscore
+++ b/cms/templates/js/asset.underscore
@@ -14,7 +14,7 @@
<%= date_added %>
-
+
@@ -30,4 +30,4 @@
-
\ No newline at end of file
+
diff --git a/cms/templates/js/edit-chapter.underscore b/cms/templates/js/edit-chapter.underscore
index 34f42daa64..7a6e723e92 100644
--- a/cms/templates/js/edit-chapter.underscore
+++ b/cms/templates/js/edit-chapter.underscore
@@ -7,7 +7,7 @@
<%= gettext("Chapter Asset") %>
- " value="<%= asset_path %>" type="text">
+ " value="<%= asset_path %>" type="text" dir="ltr">
<%= gettext("upload a PDF file or provide the path to a Studio asset file") %>
<%= gettext("Upload PDF") %>
diff --git a/cms/templates/js/show-textbook.underscore b/cms/templates/js/show-textbook.underscore
index 1767340723..db63aaeb8e 100644
--- a/cms/templates/js/show-textbook.underscore
+++ b/cms/templates/js/show-textbook.underscore
@@ -12,7 +12,7 @@
<%= chapters.length %> PDF Chapters
<% } else if(chapters.length === 1) { %>
-
+
<%= chapters.at(0).get("asset_path") %>
<% } %>
diff --git a/cms/templates/settings.html b/cms/templates/settings.html
index bbeaad3d90..905ff06601 100644
--- a/cms/templates/settings.html
+++ b/cms/templates/settings.html
@@ -261,7 +261,7 @@ require(["domReady!", "jquery", "js/models/settings/course_details", "js/views/s
-
+
${_("Enter your YouTube video's ID (along with any restriction parameters)")}
diff --git a/cms/templates/settings_graders.html b/cms/templates/settings_graders.html
index c8687b1a8c..9c26972bb4 100644
--- a/cms/templates/settings_graders.html
+++ b/cms/templates/settings_graders.html
@@ -63,7 +63,7 @@ require(["domReady!", "jquery", "js/views/settings/grading", "js/models/settings
-
+
0
diff --git a/common/djangoapps/pipeline_mako/templates/static_content.html b/common/djangoapps/pipeline_mako/templates/static_content.html
index a4ca0eba9f..9deb58e7b6 100644
--- a/common/djangoapps/pipeline_mako/templates/static_content.html
+++ b/common/djangoapps/pipeline_mako/templates/static_content.html
@@ -1,6 +1,7 @@
<%!
from staticfiles.storage import staticfiles_storage
from pipeline_mako import compressed_css, compressed_js
+from django.utils.translation import get_language_bidi
%>
<%def name='url(file, raw=False)'><%
@@ -11,6 +12,13 @@ except:
%>${url}${"?raw" if raw else ""}%def>
<%def name='css(group, raw=False)'>
+ <%
+ rtl_group = '{}-rtl'.format(group)
+
+ if get_language_bidi() and rtl_group in settings.PIPELINE_CSS:
+ group = rtl_group
+ %>
+
% if settings.FEATURES['USE_DJANGO_PIPELINE']:
${compressed_css(group, raw=raw)}
% else:
diff --git a/common/djangoapps/util/cache.py b/common/djangoapps/util/cache.py
index 8ab1b06acd..7262fabd09 100644
--- a/common/djangoapps/util/cache.py
+++ b/common/djangoapps/util/cache.py
@@ -12,6 +12,8 @@ from django.core import cache
# If we can't find a 'general' CACHE defined in settings.py, we simply fall back
# to returning the default cache. This will happen with dev machines.
+from django.utils.translation import get_language
+
try:
cache = cache.get_cache('general')
except Exception:
@@ -45,7 +47,7 @@ def cache_if_anonymous(view_func):
# same view accessed through different domain names may
# return different things, so include the domain name in the key.
domain = str(request.META.get('HTTP_HOST')) + '.'
- cache_key = domain + "cache_if_anonymous." + request.path
+ cache_key = domain + "cache_if_anonymous." + get_language() + '.' + request.path
response = cache.get(cache_key)
if not response:
response = view_func(request, *args, **kwargs)
diff --git a/common/lib/xmodule/xmodule/css/capa/display.scss b/common/lib/xmodule/xmodule/css/capa/display.scss
index d9db33cb99..1c318b8f24 100644
--- a/common/lib/xmodule/xmodule/css/capa/display.scss
+++ b/common/lib/xmodule/xmodule/css/capa/display.scss
@@ -61,7 +61,7 @@ div.problem {
width: 100px;
label {
- float: left;
+ @include float(left);
clear: both;
margin-bottom: 5px;
@@ -81,23 +81,23 @@ div.problem {
}
.indicator_container {
- float: left;
+ @include float(left);
width: 25px;
height: 1px;
- margin-right: 15px;
+ @include margin-right(15px);
}
fieldset {
@include box-sizing(border-box);
margin: 0px 0px $baseline;
- padding-left: $baseline;
- border-left: 1px solid #ddd;
+ @include padding-left($baseline);
+ @include border-left(1px solid #ddd);
}
input[type="radio"],
input[type="checkbox"] {
- float: left;
- margin: 4px 8px 0 0;
+ @include float(left);
+ @include margin(4px, 8px, 0, 0);
}
text {
@@ -633,7 +633,8 @@ div.problem {
// padding: 8px 12px;
// margin-top: 10px;
display: inline-block;
- margin: 8px 0 0 $baseline/2;
+ margin-top: 8px;
+ @include margin-left($baseline/2);
color: #666;
font-style: italic;
-webkit-font-smoothing: antialiased;
diff --git a/common/lib/xmodule/xmodule/css/sequence/display.scss b/common/lib/xmodule/xmodule/css/sequence/display.scss
index 537461c264..9222f9dedd 100644
--- a/common/lib/xmodule/xmodule/css/sequence/display.scss
+++ b/common/lib/xmodule/xmodule/css/sequence/display.scss
@@ -276,6 +276,7 @@ nav.sequence-nav {
height: 100%;
width: 40px;
text-indent: -9999px;
+ overflow: hidden;
@include transition(all .2s $ease-in-out-quad 0s);
/* &:focus {
@@ -294,23 +295,41 @@ nav.sequence-nav {
}
&.prev {
- left: -10px;
- border-radius: 35px 0 0 35px;
+ @include left(-10px);
+ @include border-radius(35px, 0, 0, 35px);
a {
- background-image: url('../images/sequence-nav/previous-icon.png');
background-position: center 15px;
+
+ // CASE: left to right layout
+ @include ltr {
+ background-image: url('../images/sequence-nav/previous-icon.png');
+ }
+
+ // CASE: right to left layout
+ @include rtl {
+ background-image: url('../images/sequence-nav/next-icon.png');
+ }
}
}
&.next {
- right: -10px;
- border-radius: 0 35px 35px 0;
+ @include right(-10px);
+ @include border-radius(0, 35px, 35px, 0);
a {
- margin-left: 30px;
- background-image: url('../images/sequence-nav/next-icon.png');
+ @include margin-left(30px);
background-position: center 15px;
+
+ // CASE: left to right layout
+ @include ltr {
+ background-image: url('../images/sequence-nav/next-icon.png');
+ }
+
+ // CASE: right to left layout
+ @include rtl {
+ background-image: url('../images/sequence-nav/previous-icon.png');
+ }
}
}
}
@@ -334,7 +353,7 @@ nav.sequence-bottom {
display: inline-block;
li {
- float: left;
+ @include float(left);
width: 50px;
height: 44px;
border: 1px solid #ccc;
@@ -351,6 +370,7 @@ nav.sequence-bottom {
display: block;
padding: lh(.5) 4px;
text-indent: -9999px;
+ overflow: hidden;
@include transition(all .2s $ease-in-out-quad 0s);
&:hover, &:focus {
@@ -369,21 +389,39 @@ nav.sequence-bottom {
}
&.prev {
- border-radius: 35px 0 0 35px;
+ @include border-radius(35px, 0, 0, 35px);
a {
- background-image: url('../images/sequence-nav/previous-icon.png');
background-position: center 15px;
+
+ // CASE: left to right layout
+ @include ltr {
+ background-image: url('../images/sequence-nav/previous-icon.png');
+ }
+
+ // CASE: right to left layout
+ @include rtl {
+ background-image: url('../images/sequence-nav/next-icon.png');
+ }
}
}
&.next {
- border-radius: 0 35px 35px 0;
- border-left: none;
+ @include border-radius(0, 35px, 35px, 0);
+ @include border-left(none);
a {
- background-image: url('../images/sequence-nav/next-icon.png');
background-position: center 15px;
+
+ // CASE: left to right layout
+ @include ltr {
+ background-image: url('../images/sequence-nav/next-icon.png');
+ }
+
+ // CASE: right to left layout
+ @include rtl {
+ background-image: url('../images/sequence-nav/previous-icon.png');
+ }
}
}
}
diff --git a/common/lib/xmodule/xmodule/css/tabs/tabs.scss b/common/lib/xmodule/xmodule/css/tabs/tabs.scss
index 3dd0440160..bca3f3ef5e 100644
--- a/common/lib/xmodule/xmodule/css/tabs/tabs.scss
+++ b/common/lib/xmodule/xmodule/css/tabs/tabs.scss
@@ -23,7 +23,7 @@
.edit-header {
@include box-sizing(border-box);
- padding: 18px 0 18px $baseline;
+ padding: 18px $baseline;
top: 0 !important; // ugly override for second level tab override
right: 0;
background-color: $blue;
diff --git a/common/lib/xmodule/xmodule/css/video/display.scss b/common/lib/xmodule/xmodule/css/video/display.scss
index a6c5cf74a5..23261f835b 100644
--- a/common/lib/xmodule/xmodule/css/video/display.scss
+++ b/common/lib/xmodule/xmodule/css/video/display.scss
@@ -179,6 +179,7 @@ div.video {
line-height: 46px;
margin: 0;
padding: 0 0 0 15px;
+ overflow: hidden;
text-indent: -9999px;
-webkit-font-smoothing: antialiased;
box-shadow: 1px 0 0 #555, inset 1px 0 0 #555;
diff --git a/common/static/sass/_mixins.scss b/common/static/sass/_mixins.scss
index ff3e1a56ad..101d2874c1 100644
--- a/common/static/sass/_mixins.scss
+++ b/common/static/sass/_mixins.scss
@@ -87,6 +87,20 @@
width: 100%;
}
+// layout placeholders
+.ui-col-wide {
+ width: flex-grid(9, 12);
+ @include margin-right(flex-gutter());
+ @include float(left);
+}
+
+.ui-col-narrow {
+ width: flex-grid(3, 12);
+ @include float(left);
+}
+
+
+
// extends - UI - window
%ui-window {
@include clearfix();
diff --git a/conf/locale/config.yaml b/conf/locale/config.yaml
index f833ef8664..38d4947aa8 100644
--- a/conf/locale/config.yaml
+++ b/conf/locale/config.yaml
@@ -86,6 +86,7 @@ locales:
dummy_locales:
- eo
- fake2
+ - en@rtl
# Directories we don't search for strings.
ignore_dirs:
diff --git a/lms/djangoapps/courseware/tests/test_i18n.py b/lms/djangoapps/courseware/tests/test_i18n.py
index 22331c4399..88843689cb 100644
--- a/lms/djangoapps/courseware/tests/test_i18n.py
+++ b/lms/djangoapps/courseware/tests/test_i18n.py
@@ -17,7 +17,7 @@ class I18nTestCase(TestCase):
self.assertIn('', response.content)
self.assertEqual(response['Content-Language'], 'en')
self.assertTrue(re.search('', response.content))
-
+
def test_esperanto(self):
response = self.client.get('/', HTTP_ACCEPT_LANGUAGE='eo')
self.assertIn('', response.content)
diff --git a/lms/envs/common.py b/lms/envs/common.py
index 755dd8ef3d..c57ff34565 100644
--- a/lms/envs/common.py
+++ b/lms/envs/common.py
@@ -671,11 +671,14 @@ FAVICON_PATH = 'images/favicon.ico'
# Locale/Internationalization
TIME_ZONE = 'America/New_York' # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
LANGUAGE_CODE = 'en' # http://www.i18nguy.com/unicode/language-identifiers.html
+# these languages display right to left
+LANGUAGES_BIDI = ("en@rtl", "he", "ar", "fa", "ur", "fa-ir")
# Sourced from http://www.localeplanet.com/icu/ and wikipedia
LANGUAGES = (
('en', u'English'),
- ('eo', u'Dummy Language (Esperanto)'), # Dummy language used for testing
+ ('en@rtl', u'English (right-to-left)'),
+ ('eo', u'Dummy Language (Esperanto)'), # Dummy languaged used for testing
('fake2', u'Fake translations'), # Another dummy language for testing (not pushed to prod)
('am', u'አማርኛ'), # Amharic
@@ -1066,6 +1069,25 @@ PIPELINE_CSS = {
],
'output_filename': 'css/lms-style-app-extend2.css',
},
+ 'style-app-rtl': {
+ 'source_filenames': [
+ 'sass/application-rtl.css',
+ 'sass/ie-rtl.css'
+ ],
+ 'output_filename': 'css/lms-style-app-rtl.css',
+ },
+ 'style-app-extend1-rtl': {
+ 'source_filenames': [
+ 'sass/application-extend1-rtl.css',
+ ],
+ 'output_filename': 'css/lms-style-app-extend1-rtl.css',
+ },
+ 'style-app-extend2-rtl': {
+ 'source_filenames': [
+ 'sass/application-extend2-rtl.css',
+ ],
+ 'output_filename': 'css/lms-style-app-extend2-rtl.css',
+ },
'style-course-vendor': {
'source_filenames': [
'js/vendor/CodeMirror/codemirror.css',
@@ -1081,6 +1103,13 @@ PIPELINE_CSS = {
],
'output_filename': 'css/lms-style-course.css',
},
+ 'style-course-rtl': {
+ 'source_filenames': [
+ 'sass/course-rtl.css',
+ 'xmodule/modules.css',
+ ],
+ 'output_filename': 'css/lms-style-course-rtl.css',
+ },
'style-xmodule-annotations': {
'source_filenames': [
'css/vendor/ova/annotator.css',
diff --git a/lms/static/sass/application-extend1-rtl.scss.mako b/lms/static/sass/application-extend1-rtl.scss.mako
new file mode 100644
index 0000000000..d27c97d0c4
--- /dev/null
+++ b/lms/static/sass/application-extend1-rtl.scss.mako
@@ -0,0 +1,61 @@
+## NOTE: This Sass infrastructure is redundant, but needed in order to address an IE9 rule limit within CSS - http://blogs.msdn.com/b/ieinternals/archive/2011/05/14/10164546.aspx
+
+// lms - css application architecture (platform)
+// ====================
+
+// libs and resets *do not edit*
+@import 'bourbon/bourbon'; // lib - bourbon
+@import 'vendor/bi-app/bi-app-rtl'; // set the layout for right to left languages
+
+// BASE *default edX offerings*
+// ====================
+
+// base - utilities
+@import 'base/reset';
+@import 'base/variables';
+@import 'base/mixins';
+
+## THEMING
+## -------
+## Set up this file to import an edX theme library if the environment
+## indicates that a theme should be used. The assumption is that the
+## theme resides outside of this main edX repository, in a directory
+## called themes//, with its base Sass file in
+## themes//static/sass/_.scss. That one entry
+## point can be used to @import in as many other things as needed.
+% if env["FEATURES"].get("USE_CUSTOM_THEME", False):
+ // import theme's Sass overrides
+ @import '${env.get('THEME_NAME')}';
+% endif
+
+@import 'base/base';
+
+// base - assets
+@import 'base/font_face';
+@import 'base/extends';
+@import 'base/animations';
+
+// base - starter
+@import 'base/base';
+
+// base - elements
+@import 'elements/typography';
+@import 'elements/controls';
+
+// shared - platform
+@import 'multicourse/home';
+@import 'multicourse/dashboard';
+@import 'multicourse/account';
+@import 'multicourse/courses';
+@import 'multicourse/course_about';
+@import 'multicourse/jobs';
+@import 'multicourse/media-kit';
+@import 'multicourse/about_pages';
+@import 'multicourse/press_release';
+@import 'multicourse/error-pages';
+@import 'multicourse/help';
+@import 'multicourse/edge';
+
+@import 'developer'; // used for any developer-created scss that needs further polish/refactoring
+@import 'shame'; // used for any bad-form/orphaned scss
+## NOTE: needed here for cascade and dependency purposes, but not a great permanent solution
diff --git a/lms/static/sass/application-extend1.scss.mako b/lms/static/sass/application-extend1.scss.mako
index 88af68783f..dd184fb6be 100644
--- a/lms/static/sass/application-extend1.scss.mako
+++ b/lms/static/sass/application-extend1.scss.mako
@@ -1,11 +1,11 @@
## NOTE: This Sass infrastructure is redundant, but needed in order to address an IE9 rule limit within CSS - http://blogs.msdn.com/b/ieinternals/archive/2011/05/14/10164546.aspx
-
// lms - css application architecture (platform)
// ====================
// libs and resets *do not edit*
@import 'bourbon/bourbon'; // lib - bourbon
+@import 'vendor/bi-app/bi-app-ltr'; // set the layout for left to right languages
// BASE *default edX offerings*
// ====================
diff --git a/lms/static/sass/application-extend2-rtl.scss.mako b/lms/static/sass/application-extend2-rtl.scss.mako
new file mode 100644
index 0000000000..7535f6a7c4
--- /dev/null
+++ b/lms/static/sass/application-extend2-rtl.scss.mako
@@ -0,0 +1,69 @@
+## NOTE: This Sass infrastructure is redundant, but needed in order to address an IE9 rule limit within CSS - http://blogs.msdn.com/b/ieinternals/archive/2011/05/14/10164546.aspx
+
+// lms - css application architecture (platform)
+// ====================
+
+// libs and resets *do not edit*
+@import 'bourbon/bourbon'; // lib - bourbon
+@import 'vendor/bi-app/bi-app-rtl'; // set the layout for right to left languages
+
+// BASE *default edX offerings*
+// ====================
+
+// base - utilities
+@import 'base/reset';
+@import 'base/variables';
+@import 'base/mixins';
+
+## THEMING
+## -------
+## Set up this file to import an edX theme library if the environment
+## indicates that a theme should be used. The assumption is that the
+## theme resides outside of this main edX repository, in a directory
+## called themes//, with its base Sass file in
+## themes//static/sass/_.scss. That one entry
+## point can be used to @import in as many other things as needed.
+% if env["FEATURES"].get("USE_CUSTOM_THEME", False):
+ // import theme's Sass overrides
+ @import '${env.get('THEME_NAME')}';
+% endif
+
+@import 'base/base';
+
+// base - assets
+@import 'base/font_face';
+@import 'base/extends';
+@import 'base/animations';
+
+// base - starter
+@import 'base/base';
+
+// base - elements
+@import 'elements/typography';
+@import 'elements/controls';
+@import 'elements/system-feedback';
+
+// base - specific views
+@import 'views/verification';
+@import 'views/shoppingcart';
+
+// applications
+@import "discussion/utilities/variables";
+@import "discussion/mixins";
+@import 'discussion/discussion'; // Process old file after definitions but before everything else
+@import "discussion/elements/actions";
+@import "discussion/elements/editor";
+@import "discussion/elements/labels";
+@import "discussion/elements/navigation";
+@import "discussion/views/thread";
+@import "discussion/views/create-edit-post";
+@import "discussion/views/response";
+@import 'discussion/utilities/developer';
+@import 'discussion/utilities/shame';
+
+@import 'news';
+
+// temp - shame and developer
+@import 'developer'; // used for any developer-created scss that needs further polish/refactoring
+@import 'shame'; // used for any bad-form/orphaned scss
+## NOTE: needed here for cascade and dependency purposes, but not a great permanent solution
diff --git a/lms/static/sass/application-extend2.scss.mako b/lms/static/sass/application-extend2.scss.mako
index d3094326d0..0ea4e21259 100644
--- a/lms/static/sass/application-extend2.scss.mako
+++ b/lms/static/sass/application-extend2.scss.mako
@@ -1,11 +1,11 @@
## NOTE: This Sass infrastructure is redundant, but needed in order to address an IE9 rule limit within CSS - http://blogs.msdn.com/b/ieinternals/archive/2011/05/14/10164546.aspx
-
// lms - css application architecture (platform)
// ====================
// libs and resets *do not edit*
@import 'bourbon/bourbon'; // lib - bourbon
+@import 'vendor/bi-app/bi-app-ltr'; // set the layout for left to right languages
// BASE *default edX offerings*
// ====================
diff --git a/lms/static/sass/application-rtl.scss.mako b/lms/static/sass/application-rtl.scss.mako
new file mode 100644
index 0000000000..2336fe85c0
--- /dev/null
+++ b/lms/static/sass/application-rtl.scss.mako
@@ -0,0 +1,57 @@
+## Note: This Sass infrastructure is repeated in application-extend1 and application-extend2, but needed in order to address an IE9 rule limit within CSS - http://blogs.msdn.com/b/ieinternals/archive/2011/05/14/10164546.aspx
+
+// lms - css application architecture
+// ====================
+
+// libs and resets *do not edit*
+@import 'bourbon/bourbon'; // lib - bourbon
+@import 'vendor/bi-app/bi-app-rtl'; // set the layout for right to left languages
+
+// BASE *default edX offerings*
+// ====================
+
+// base - utilities
+@import 'base/reset';
+@import 'base/variables';
+@import 'base/mixins';
+
+## THEMING
+## -------
+## Set up this file to import an edX theme library if the environment
+## indicates that a theme should be used. The assumption is that the
+## theme resides outside of this main edX repository, in a directory
+## called themes//, with its base Sass file in
+## themes//static/sass/_.scss. That one entry
+## point can be used to @import in as many other things as needed.
+% if env["FEATURES"].get("USE_CUSTOM_THEME", False):
+ // import theme's Sass overrides
+ @import '${env.get('THEME_NAME')}';
+% endif
+
+@import 'base/base';
+
+// base - assets
+@import 'base/font_face';
+@import 'base/extends';
+@import 'base/animations';
+
+// base - starter
+@import 'base/base';
+
+// base - elements
+@import 'elements/typography';
+@import 'elements/controls';
+
+// shared - course
+@import 'shared/forms';
+@import 'shared/footer';
+@import 'shared/header';
+@import 'shared/course_object';
+@import 'shared/course_filter';
+@import 'shared/modal';
+@import 'shared/activation_messages';
+@import 'shared/unsubscribe';
+
+@import 'developer'; // used for any developer-created scss that needs further polish/refactoring
+@import 'shame'; // used for any bad-form/orphaned scss
+## NOTE: needed here for cascade and dependency purposes, but not a great permanent solution
diff --git a/lms/static/sass/application.scss.mako b/lms/static/sass/application.scss.mako
index 5365ec52ac..80a8e95a83 100644
--- a/lms/static/sass/application.scss.mako
+++ b/lms/static/sass/application.scss.mako
@@ -5,6 +5,7 @@
// libs and resets *do not edit*
@import 'bourbon/bourbon'; // lib - bourbon
+@import 'vendor/bi-app/bi-app-ltr'; // set the layout for left to right languages
// BASE *default edX offerings*
// ====================
diff --git a/lms/static/sass/base/_mixins.scss b/lms/static/sass/base/_mixins.scss
index f6cbd3ce5f..0cbca47152 100644
--- a/lms/static/sass/base/_mixins.scss
+++ b/lms/static/sass/base/_mixins.scss
@@ -54,7 +54,6 @@
// ====================
-
// extends - UI - used for page/view-level wrappers (for centering/grids)
%ui-wrapper {
@include clearfix();
diff --git a/lms/static/sass/base/_variables.scss b/lms/static/sass/base/_variables.scss
index 2cb199f4c7..a54a4687c7 100644
--- a/lms/static/sass/base/_variables.scss
+++ b/lms/static/sass/base/_variables.scss
@@ -1,3 +1,5 @@
+// lms variables
+
// base
$baseline: 20px;
diff --git a/lms/static/sass/course-rtl.scss.mako b/lms/static/sass/course-rtl.scss.mako
new file mode 100644
index 0000000000..05eaee88e8
--- /dev/null
+++ b/lms/static/sass/course-rtl.scss.mako
@@ -0,0 +1,77 @@
+@import 'bourbon/bourbon';
+@import 'vendor/bi-app/bi-app-rtl'; // set the layout for right to left languages
+
+@import 'base/reset';
+@import 'base/font_face';
+@import 'base/variables';
+@import 'base/mixins';
+
+## THEMING
+## -------
+## Set up this file to import an edX theme library if the environment
+## indicates that a theme should be used. The assumption is that the
+## theme resides outside of this main edX repository, in a directory
+## called themes//, with its base Sass file in
+## themes//static/sass/_.scss. That one entry
+## point can be used to @import in as many other things as needed.
+% if env["FEATURES"].get("USE_CUSTOM_THEME", False):
+ // import theme's Sass overrides
+ @import '${env.get('THEME_NAME')}';
+% endif
+
+@import 'base/base';
+@import 'base/extends';
+@import 'base/animations';
+@import 'shared/tooltips';
+
+// base - elements
+@import 'elements/typography';
+@import 'elements/controls';
+
+// Course base / layout styles
+@import 'course/layout/courseware_header';
+@import 'course/layout/footer';
+@import 'course/base/mixins';
+@import 'course/base/base';
+@import 'course/base/extends';
+@import 'xmodule/modules/css/module-styles.scss';
+
+// courseware
+@import 'course/courseware/courseware';
+@import 'course/courseware/sidebar';
+@import 'course/courseware/amplifier';
+@import 'course/layout/calculator';
+@import 'course/layout/timer';
+@import 'course/layout/chat';
+
+// course-specific courseware (all styles in these files should be gated by a
+// course-specific class). This should be replaced with a better way of
+// providing course-specific styling.
+@import "course/courseware/courses/_cs188.scss";
+
+// wiki
+@import "course/wiki/basic-html";
+@import "course/wiki/sidebar";
+@import "course/wiki/create";
+@import "course/wiki/wiki";
+@import "course/wiki/table";
+
+// pages
+@import "course/info";
+@import "course/syllabus"; // TODO arjun replace w/ custom tabs, see courseware/courses.py
+@import "course/textbook";
+@import "course/profile";
+@import "course/gradebook";
+@import "course/tabs";
+@import "course/staff_grading";
+@import "course/rubric";
+@import "course/open_ended_grading";
+
+// instructor
+@import "course/instructor/instructor";
+@import "course/instructor/instructor_2";
+@import "course/instructor/email";
+@import "xmodule/descriptors/css/module-styles.scss";
+
+// discussion
+@import "course/discussion/form-wmd-toolbar";
diff --git a/lms/static/sass/course.scss.mako b/lms/static/sass/course.scss.mako
index 5a9c18a918..eb35050fe9 100644
--- a/lms/static/sass/course.scss.mako
+++ b/lms/static/sass/course.scss.mako
@@ -1,4 +1,5 @@
@import 'bourbon/bourbon';
+@import 'vendor/bi-app/bi-app-ltr'; // set the layout for left to right languages
@import 'base/reset';
@import 'base/font_face';
diff --git a/lms/static/sass/course/_info.scss b/lms/static/sass/course/_info.scss
index eaea329131..ae38f34279 100644
--- a/lms/static/sass/course/_info.scss
+++ b/lms/static/sass/course/_info.scss
@@ -80,7 +80,7 @@ div.info-wrapper {
section.handouts {
@extend .sidebar;
border-radius: 0 4px 4px 0;
- border-left: 1px solid #ddd;
+ @include border-left(1px solid #ddd);
box-shadow: none;
font-size: 14px;
diff --git a/lms/static/sass/course/_profile.scss b/lms/static/sass/course/_profile.scss
index fc1253f915..d5acd15d36 100644
--- a/lms/static/sass/course/_profile.scss
+++ b/lms/static/sass/course/_profile.scss
@@ -141,7 +141,7 @@
margin-bottom: lh();
h1 {
- float: left;
+ @include float(left);
font-size: 1em;
font-weight: 100;
margin: 0;
@@ -188,7 +188,7 @@
}
h2 {
- border-right: 1px dashed #ddd;
+ @include border-right(1px dashed #ddd);
@include box-sizing(border-box);
display: table-cell;
letter-spacing: 0;
@@ -201,7 +201,7 @@
.sections {
display: table-cell;
- padding-left: flex-gutter(9);
+ @include padding-left(flex-gutter(9));
width: flex-grid(7, 9);
> div {
diff --git a/lms/static/sass/course/base/_base.scss b/lms/static/sass/course/base/_base.scss
index 0363936c8c..30b5cfaed7 100644
--- a/lms/static/sass/course/base/_base.scss
+++ b/lms/static/sass/course/base/_base.scss
@@ -6,7 +6,7 @@ body {
}
body, h1, h2, h3, h4, h5, h6, p, p a:link, p a:visited, a, label {
- text-align: left;
+ @include text-align(left);
font-family: $sans-serif;
}
@@ -49,7 +49,7 @@ form {
form.choicegroup {
label {
clear: both;
- float: left;
+ @include float(left);
}
}
diff --git a/lms/static/sass/course/base/_extends.scss b/lms/static/sass/course/base/_extends.scss
index b9fa8f7ef6..1425a9efc4 100644
--- a/lms/static/sass/course/base/_extends.scss
+++ b/lms/static/sass/course/base/_extends.scss
@@ -1,6 +1,6 @@
h1.top-header {
border-bottom: 1px solid $border-color-2;
- text-align: left;
+ @include text-align(left);
font-size: em(24);
font-weight: 100;
padding-bottom: lh();
diff --git a/lms/static/sass/course/base/_mixins.scss b/lms/static/sass/course/base/_mixins.scss
index 766b656afb..3c220ac7f0 100644
--- a/lms/static/sass/course/base/_mixins.scss
+++ b/lms/static/sass/course/base/_mixins.scss
@@ -1,3 +1,4 @@
+
@mixin blue-button {
display: block;
height: 35px;
@@ -54,4 +55,4 @@
&:hover, &:focus {
background: -webkit-linear-gradient(top, #888, #666);
}
-}
\ No newline at end of file
+}
diff --git a/lms/static/sass/course/courseware/_courseware.scss b/lms/static/sass/course/courseware/_courseware.scss
index 03b6d743bf..b1fb86cdb4 100644
--- a/lms/static/sass/course/courseware/_courseware.scss
+++ b/lms/static/sass/course/courseware/_courseware.scss
@@ -23,7 +23,7 @@ html.video-fullscreen{
.instructor-info-action {
@extend %t-copy-sub2;
- float: right;
+ @include float(right);
margin-left: ($baseline/2);
padding: ($baseline/4) ($baseline/2);
border-radius: ($baseline/4);
diff --git a/lms/static/sass/course/courseware/_sidebar.scss b/lms/static/sass/course/courseware/_sidebar.scss
index 12588657b3..885d54e886 100644
--- a/lms/static/sass/course/courseware/_sidebar.scss
+++ b/lms/static/sass/course/courseware/_sidebar.scss
@@ -1,8 +1,8 @@
.course-index {
@extend .sidebar;
@extend .tran;
- border-radius: 3px 0 0 3px;
- border-right: 1px solid $border-color-2;
+ @include border-right(1px solid $border-color-2);
+ @include border-radius(3px, 0, 0, 3px);
#open_close_accordion {
display: none;
@@ -47,7 +47,7 @@
a {
border-radius: 0;
box-shadow: none;
- padding-left: 19px;
+ @include padding-left(19px);
color: $link-color;
}
@@ -61,9 +61,22 @@
}
span.ui-icon {
- left: 0;
- background-image: url("/static/images/ui-icons_222222_256x240.png");
+ @include left(0);
opacity: 0.3;
+ background-image: url("/static/images/ui-icons_222222_256x240.png"); // jQuery UI sprite
+
+ &.ui-icon-triangle-1-e {
+
+ // CASE: left to right layout
+ @include ltr {
+ background-position: -32px -16px; // jQuery UI east arrow position
+ }
+
+ // CASE: right to left layout
+ @include rtl {
+ background-position: -96px -16px; // jQuery UI west arrow position
+ }
+ }
}
}
}
diff --git a/lms/static/sass/course/instructor/_instructor.scss b/lms/static/sass/course/instructor/_instructor.scss
index 03211f7b45..278c36bd13 100644
--- a/lms/static/sass/course/instructor/_instructor.scss
+++ b/lms/static/sass/course/instructor/_instructor.scss
@@ -185,3 +185,8 @@
}
+.rtl .instructor-dashboard-wrapper .beta-button-wrapper,
+.rtl .instructor-dashboard-wrapper .studio-edit-link {
+ left: 2em;
+ right: auto;
+}
diff --git a/lms/static/sass/course/instructor/_instructor_2.scss b/lms/static/sass/course/instructor/_instructor_2.scss
index 7ae6a4fc6e..6bc0618bdd 100644
--- a/lms/static/sass/course/instructor/_instructor_2.scss
+++ b/lms/static/sass/course/instructor/_instructor_2.scss
@@ -785,7 +785,6 @@ section.instructor-dashboard-content-2 {
.info {
@include box-sizing(border-box);
padding: ($baseline/2);
-
border: 1px solid $light-gray;
color: $lighter-base-font-color;
line-height: 1.3em;
@@ -833,7 +832,7 @@ section.instructor-dashboard-content-2 {
input[type="button"].add {
@include idashbutton($blue);
position: absolute;
- right: $baseline;
+ @include right($baseline);
}
}
@@ -1621,3 +1620,8 @@ input[name="subject"] {
}
}
+.rtl .instructor-dashboard-wrapper-2 .olddash-button-wrapper,
+.rtl .instructor-dashboard-wrapper-2 .studio-edit-link {
+ left: 2em;
+ right: auto;
+}
diff --git a/lms/static/sass/course/layout/_courseware_header.scss b/lms/static/sass/course/layout/_courseware_header.scss
index 7b60475182..1539ec8444 100644
--- a/lms/static/sass/course/layout/_courseware_header.scss
+++ b/lms/static/sass/course/layout/_courseware_header.scss
@@ -16,10 +16,10 @@ nav.course-material {
@include border-top-radius(4px);
@include clearfix;
padding: 28px 0 10px 0;
- margin-left: 10px;
+ @include margin-left(10px);
li {
- float: left;
+ @include float(left);
list-style: none;
margin-right: 6px;
@@ -120,7 +120,7 @@ header.global.slim {
h1.logo {
margin: 0 10px 0 13px;
- padding-right: 20px;
+ @include padding-right(20px);
&:before {
@extend %faded-vertical-divider;
@@ -128,7 +128,7 @@ header.global.slim {
display: block;
height: 35px;
position: absolute;
- right: 3px;
+ @include right(3px);
top: 0;
width: 1px;
}
@@ -156,7 +156,7 @@ header.global.slim {
h2 {
display: block;
width: 700px;
- float: left;
+ @include float(left);
font-size: 0.9em;
font-weight: 600;
color: $lighter-base-font-color;
diff --git a/lms/static/sass/course/layout/_courseware_subnav.scss b/lms/static/sass/course/layout/_courseware_subnav.scss
index eaffa28668..003424c969 100644
--- a/lms/static/sass/course/layout/_courseware_subnav.scss
+++ b/lms/static/sass/course/layout/_courseware_subnav.scss
@@ -18,7 +18,7 @@ nav.course-material {
padding: 10px 0 0 0;
li {
- float: left;
+ @include float(left);
list-style: none;
a {
diff --git a/lms/static/sass/discussion/_discussion.scss b/lms/static/sass/discussion/_discussion.scss
index db9cd944f5..492d605e47 100644
--- a/lms/static/sass/discussion/_discussion.scss
+++ b/lms/static/sass/discussion/_discussion.scss
@@ -3,15 +3,16 @@
body.discussion {
.course-tabs .right {
- float: right;
+ @include float(right);
.new-post-btn {
@include blue-button;
- margin-right: 4px;
+ @include margin-right(4px);
}
.new-post-icon {
- margin: 8px 7px 0 0;
+ margin-top: 8px;
+ @include margin-right(7px);
font-size: 16px;
vertical-align: middle;
color: $white;
@@ -241,7 +242,7 @@ body.discussion {
}
.discussion-column {
- float: right;
+ @include float(right);
@include box-sizing(border-box);
width: 68%;
max-width: 800px;
@@ -368,7 +369,7 @@ body.discussion {
.notification-checkbox {
display: inline-block;
padding: $baseline/4 0 $baseline/2 0;
- margin-right: $baseline/2;
+ @include margin-right($baseline/2);
border-radius: 5px;
border: 1px solid gray;
@@ -376,7 +377,7 @@ body.discussion {
display: inline-block;
text-align: center;
vertical-align: middle;
- margin-left: $baseline/2;
+ @include margin-left($baseline/2);
}
.icon {
@@ -531,6 +532,13 @@ body.discussion {
border-radius: 3px 3px 0 0;
padding: $baseline;
background-color: $white;
+
+ .response-body {
+ ol, ul { // Fix up the RTL-only _reset.scss, but only in specific places
+ @include padding-left(40px);
+ @include padding-right(0);
+ }
+ }
}
.posted-by {
font-weight: 700;
@@ -549,11 +557,21 @@ body.discussion {
padding: 0 18px;
width: 100%;
box-shadow: 0 1px 1px $shadow-l1;
- text-align: left;
+ @include text-align(left);
font-size: 13px;
+ .icon-reply:before { // flip the icon for RTL
+ @include ltr {
+ content: "\f112"; // FA icon arrow to the left
+ }
+
+ @include rtl {
+ content: "\f064"; // FA icon arrow to the right
+ }
+ }
+
span.add-response-btn-text {
- padding-left: ($baseline/5);
+ @include padding-left($baseline/5);
}
}
}
@@ -638,7 +656,7 @@ body.discussion {
.discussion-submit-post {
@include blue-button;
- float: left;
+ @include float(left);
}
.wmd-button {
@@ -674,7 +692,17 @@ body.discussion {
padding-left: ($baseline*1.5);
width: 100%;
box-shadow: 0 1px 1px $shadow-l1;
- text-align: left;
+ @include text-align(left);
+
+ .icon-reply:before {
+ @include ltr {
+ content: "\f112"; // FA icon arrow to the left
+ }
+
+ @include rtl {
+ content: "\f064"; // FA icon arrow to the right
+ }
+ }
&:hover, &:focus {
@include linear-gradient(top, $white 35%, #ddd);
@@ -706,7 +734,7 @@ body.discussion {
display: inline-block;
position: relative;
top: 5px;
- margin-right: 6px;
+ @include margin-right(6px);
width: 21px;
height: 19px;
background: url(../images/show-hide-discussion-icon.png) no-repeat;
@@ -716,7 +744,7 @@ body.discussion {
.new-post-btn {
display: inline-block;
- float: right;
+ @include float(right);
}
section.discussion {
@@ -895,9 +923,10 @@ body.discussion {
float: left;
width: 16px;
height: 17px;
- margin: 8px 7px 0 0;
+ margin-top: 8px;
+ @include margin-right(7px);
font-size: 16px;
- padding-right: $baseline/2;
+ @include padding-right($baseline/2);
vertical-align: middle;
color: $white;
}
diff --git a/lms/static/sass/discussion/_mixins.scss b/lms/static/sass/discussion/_mixins.scss
index 0e463cb71f..26f173f542 100644
--- a/lms/static/sass/discussion/_mixins.scss
+++ b/lms/static/sass/discussion/_mixins.scss
@@ -89,7 +89,7 @@
@mixin discussion-wmd-preview-label {
padding-top: 3px;
- padding-left: 5px;
+ @include padding-left(5px);
width: 100%;
color: #bbb;
text-transform: uppercase;
@@ -100,6 +100,11 @@
padding: 10px 20px;
width: 100%;
color: #333;
+
+ ol, ul { // Fix up the RTL-only _reset.scss, but only in specific places
+ @include padding-left(40px);
+ @include padding-right(0);
+ }
}
@-webkit-keyframes fadeIn {
@@ -130,11 +135,11 @@
color: $color;
.icon {
- margin-right: ($baseline/5);
+ @include margin-right($baseline/5);
}
&:last-child {
- margin-right: 0;
+ @include margin-right(0);
}
&.is-hidden {
diff --git a/lms/static/sass/discussion/elements/_actions.scss b/lms/static/sass/discussion/elements/_actions.scss
index 76afecdfe2..5a8ff68a03 100644
--- a/lms/static/sass/discussion/elements/_actions.scss
+++ b/lms/static/sass/discussion/elements/_actions.scss
@@ -8,7 +8,7 @@
.response-actions-list,
.comment-actions-list {
@extend %ui-no-list;
- text-align: right;
+ @include text-align(right);
.actions-item {
@include box-sizing(border-box);
@@ -58,7 +58,7 @@
&:after,
&:before {
bottom: 100%;
- right: 3px;
+ @include right(3px);
border: solid transparent;
content: " ";
height: 0;
@@ -71,7 +71,7 @@
border-color: $transparent;
border-bottom-color: $white;
border-width: 6px;
- margin-right: 1px;
+ @include margin-right(1px);
}
&:before {
@@ -254,7 +254,7 @@
display: block;
padding: ($baseline/10) 0;
white-space: nowrap;
- text-align: right;
+ @include text-align(right);
color: $gray-l1;
&:hover, &:focus {
diff --git a/lms/static/sass/discussion/elements/_navigation.scss b/lms/static/sass/discussion/elements/_navigation.scss
index 1eb002911d..48b18d8a0f 100644
--- a/lms/static/sass/discussion/elements/_navigation.scss
+++ b/lms/static/sass/discussion/elements/_navigation.scss
@@ -3,7 +3,7 @@
.forum-nav {
@include box-sizing(border-box);
- float: left;
+ @include float(left);
position: relative;
width: 31%;
border: 1px solid #aaa;
@@ -34,7 +34,7 @@
.icon {
@include font-size(14);
- margin-right: ($baseline/4);
+ @include margin-right($baseline/4);
}
}
@@ -43,7 +43,7 @@
}
.forum-nav-browse-drop-arrow {
- margin-left: ($baseline/4);
+ @include margin-left($baseline/4);
}
.forum-nav-search {
@@ -60,7 +60,7 @@
position: absolute;
margin-top: -6px;
top: 50%;
- right: ($baseline/4 + 1px + $baseline / 4); // Wrapper padding + border + input padding
+ @include right($baseline/4 + 1px + $baseline / 4); // Wrapper padding + border + input padding
}
.forum-nav-search-input {
@@ -115,7 +115,7 @@
}
.forum-nav-browse-title .icon {
- margin-right: ($baseline/2);
+ @include margin-right($baseline/2);
}
// -------------------
@@ -135,14 +135,14 @@
@include box-sizing(border-box);
display: inline-block;
width: 50%;
- text-align: left;
+ @include text-align(left);
}
.forum-nav-filter-cohort, .forum-nav-sort {
@include box-sizing(border-box);
display: inline-block;
width: 50%;
- text-align: right;
+ @include text-align(right);
}
%forum-nav-select {
@@ -200,6 +200,13 @@
.icon {
@include font-size(14);
+
+ &:before {
+
+ @include rtl {
+ @include transform(scale(-1, 1)); // RTL for font awesome question mark
+ }
+ }
}
.icon-comments {
@@ -223,7 +230,7 @@
.forum-nav-thread-wrapper-2 {
@extend %forum-nav-thread-wrapper;
width: 13%;
- text-align: right;
+ @include text-align(right);
}
.forum-nav-thread-title {
@@ -251,7 +258,7 @@
@extend %forum-nav-thread-wrapper-2-content;
@extend %t-weight4;
position: relative;
- margin-left: ($baseline/4);
+ @include margin-left($baseline/4);
margin-bottom: ($baseline/4); // Because tail is position: absolute
border-radius: 2px;
padding: ($baseline/10) ($baseline/5);
@@ -264,12 +271,12 @@
display: block;
position: absolute;
bottom: (-$baseline/4);
- right: ($baseline/4);
+ @include right($baseline/4);
width: 0;
height: 0;
border-style: solid;
- border-width: 0 ($baseline/4) ($baseline/4) 0;
- border-color: transparent $gray-l3 transparent transparent;
+ @include border-width(0, ($baseline/4), ($baseline/4), 0);
+ @include border-color(transparent, $gray-l3, transparent, transparent);
}
&.is-unread {
diff --git a/lms/static/sass/discussion/views/_create-edit-post.scss b/lms/static/sass/discussion/views/_create-edit-post.scss
index d02cf6002e..3b96976252 100644
--- a/lms/static/sass/discussion/views/_create-edit-post.scss
+++ b/lms/static/sass/discussion/views/_create-edit-post.scss
@@ -46,7 +46,7 @@
.field-help {
@include box-sizing(border-box);
display: inline-block;
- padding-left: $baseline;
+ @include padding-left($baseline);
width: 50%;
font-size: 12px;
}
@@ -131,7 +131,7 @@
.post-option {
@include box-sizing(border-box);
display: inline-block;
- margin-right: $baseline;
+ @include margin-right($baseline);
border: 1px solid transparent;
border-radius: 3px;
padding: ($baseline/2);
diff --git a/lms/static/sass/discussion/views/_thread.scss b/lms/static/sass/discussion/views/_thread.scss
index 4106cf1378..ee0f0071d3 100644
--- a/lms/static/sass/discussion/views/_thread.scss
+++ b/lms/static/sass/discussion/views/_thread.scss
@@ -17,7 +17,7 @@ body.discussion, .discussion-module {
.post-header-actions {
display: inline-block;
- float: right;
+ @include float(right);
vertical-align: middle;
width: flex-grid(3,12);
}
@@ -44,7 +44,7 @@ body.discussion, .discussion-module {
.response-header-actions {
width: flex-grid(3,12);
- float: right;
+ @include float(right);
}
}
diff --git a/lms/static/sass/multicourse/_account.scss b/lms/static/sass/multicourse/_account.scss
index 39aa9cba39..0c4243dce7 100644
--- a/lms/static/sass/multicourse/_account.scss
+++ b/lms/static/sass/multicourse/_account.scss
@@ -123,16 +123,16 @@
// CASE: normal typographical headings
h1 {
@extend %heading-2;
+ @include text-align(left);
margin-bottom: $baseline;
padding-bottom: $baseline;
- text-align: left;
}
// CASE: marketing/imageery-based headings
.title {
position: absolute;
top: ($baseline*2.5);
- left:($baseline*1.5);
+ @include left($baseline*1.5);
.title-super, .title-sub {
@extend %t-weight1;
@@ -149,7 +149,7 @@
.title-sub {
@include font-size(20);
- margin-left: ($baseline*2);
+ @include margin-left($baseline*2);
text-transform: lowercase;
color: $header-graphic-sub-color;
}
@@ -197,14 +197,14 @@
}
.content {
- margin-right: ($baseline*2);
+ @include float(left);
+ @include margin-right($baseline*2);
width: 600px;
- float: left;
}
aside {
+ @include float(left);
width: 280px;
- float: left;
p, ol, ul {
font-size: 14px !important;
@@ -273,10 +273,10 @@
margin: 0 0 $baseline 0;
.field {
+ @include float(left);
+ @include margin(0, ($baseline*1.5), 0, 0);
display: block;
- float: left;
border-bottom: none;
- margin: 0 ($baseline*1.5) 0 0;
padding-bottom: 0;
input, textarea {
@@ -336,7 +336,7 @@
.tip {
position: absolute;
top: 0;
- right: 0;
+ @include right(0);
}
}
@@ -378,7 +378,7 @@
input[type="checkbox"] {
display: inline-block;
width: auto;
- margin-right: ($baseline/4);
+ @include margin-right($baseline/4);
}
label {
@@ -702,7 +702,7 @@
h2 {
@extend %heading-2;
- text-align: left;
+ @include text-align(left);
}
}
diff --git a/lms/static/sass/multicourse/_course_about.scss b/lms/static/sass/multicourse/_course_about.scss
index b6188b300e..ecd7426ba4 100644
--- a/lms/static/sass/multicourse/_course_about.scss
+++ b/lms/static/sass/multicourse/_course_about.scss
@@ -295,7 +295,7 @@
}
.details {
- float: left;
+ @include float(left);
margin-right: flex-gutter();
width: flex-grid(8);
font: normal 1em/1.6em $serif;
@@ -384,7 +384,7 @@
.course-sidebar {
@include box-sizing(border-box);
- float: left;
+ @include float(left);
width: flex-grid(4);
> section {
diff --git a/lms/static/sass/multicourse/_courses.scss b/lms/static/sass/multicourse/_courses.scss
index fe4c4d62a1..092fab4c20 100644
--- a/lms/static/sass/multicourse/_courses.scss
+++ b/lms/static/sass/multicourse/_courses.scss
@@ -42,14 +42,14 @@
.logo {
display: inline-block;
+ @include border-right(1px solid $light-gray);
height: 80px;
- margin-right: 30px;
- padding-right: 30px;
+ @include margin-right(30px);
+ @include padding-right(30px);
position: relative;
vertical-align: middle;
&::after {
- @extend %faded-vertical-divider;
content: "";
display: block;
height: 80px;
diff --git a/lms/static/sass/multicourse/_dashboard.scss b/lms/static/sass/multicourse/_dashboard.scss
index 50be4fc573..f25c8147ce 100644
--- a/lms/static/sass/multicourse/_dashboard.scss
+++ b/lms/static/sass/multicourse/_dashboard.scss
@@ -6,8 +6,9 @@
padding: ($baseline*2) 0 0 0;
.profile-sidebar {
- float: left;
- margin-right: flex-gutter();
+ background: transparent;
+ @include float(left);
+ @include margin-right(flex-gutter());
width: flex-grid(3);
background: transparent;
box-shadow: 0 0 1px $shadow-l1;
@@ -278,7 +279,7 @@
// course listings
.my-courses {
- float: left;
+ @include float(left);
margin: 0px;
width: flex-grid(9);
@@ -355,7 +356,7 @@
@include transition(all 0.15s linear 0s);
overflow: hidden;
position: relative;
- float: left;
+ @include float(left);
height: 100%;
max-height: 100%;
width: 200px;
@@ -374,7 +375,7 @@
.info {
@include clearfix;
- padding: 0 10px 0 230px;
+ @include padding(0, 10px, 0, 230px);
> hgroup {
padding: 0;
@@ -393,7 +394,7 @@
.date-block {
position: absolute;
top: 0;
- right: 0;
+ @include right(0);
font-family: $sans-serif;
font-size: 13px;
font-style: italic;
@@ -451,7 +452,7 @@
@include box-sizing(border-box);
border-radius: 3px;
display: block;
- float: left;
+ @include float(left);
font: normal 15px/1.6rem $sans-serif;
letter-spacing: 0;
padding: 6px 32px 7px;
@@ -888,7 +889,7 @@
}
a.unenroll {
- float: right;
+ @include float(right);
display: block;
font-style: italic;
color: $lighter-base-font-color;
@@ -903,7 +904,7 @@
a.email-settings {
@extend a.unenroll;
- margin-right: 10px;
+ @include margin-right(10px);
}
}
diff --git a/lms/static/sass/multicourse/_error-pages.scss b/lms/static/sass/multicourse/_error-pages.scss
index 629a33891f..1854ff8103 100644
--- a/lms/static/sass/multicourse/_error-pages.scss
+++ b/lms/static/sass/multicourse/_error-pages.scss
@@ -1,13 +1,13 @@
section.outside-app {
@extend .container;
- text-align: left;
+ @include text-align(left);
padding: 80px 0;
h1 {
@extend h2;
margin-bottom: 40px;
}
-
+
p {
max-width: 600px;
margin: 0 auto;
diff --git a/lms/static/sass/shared/_course_object.scss b/lms/static/sass/shared/_course_object.scss
index b234086e1d..ddda7b9d2f 100644
--- a/lms/static/sass/shared/_course_object.scss
+++ b/lms/static/sass/shared/_course_object.scss
@@ -5,11 +5,11 @@
.university-column {
width: flex-grid(4);
- margin-right: flex-gutter();
+ @include margin-right(flex-gutter());
float: left;
&:nth-child(3n+3) {
- margin-right: 0;
+ @include margin-right(0);
}
}
@@ -21,11 +21,11 @@
.courses-listing-item {
width: flex-grid(4);
- margin-right: flex-gutter();
- float: left;
+ @include margin-right(flex-gutter());
+ @include float(left);
&:nth-child(3n+3) {
- margin-right: 0;
+ @include margin-right(0);
}
}
}
diff --git a/lms/static/sass/shared/_footer.scss b/lms/static/sass/shared/_footer.scss
index 8a7717c825..9b477ca363 100644
--- a/lms/static/sass/shared/_footer.scss
+++ b/lms/static/sass/shared/_footer.scss
@@ -32,16 +32,16 @@
// colophon
.colophon {
- margin-right: flex-gutter();
+ @include margin-right(flex-gutter());
width: flex-grid(8,12);
- float: left;
+ @include float(left);
.nav-colophon {
@include clearfix();
margin: $footer_margin;
li {
- float: left;
+ @include float(left);
margin-right: ($baseline*0.75);
a {
@@ -102,12 +102,12 @@
margin: -2px 0 8px 0;
font-size: em(11);
color: $gray-l2;
- text-align: left;
+ @include text-align(left);
}
.nav-legal {
@include clearfix();
- text-align: left;
+ @include text-align(left);
li {
display: inline-block;
@@ -154,10 +154,11 @@
// platform Open edX logo and link
.powered-by {
+ @include float(right);
width: flex-grid(3,12);
display: inline-block;
vertical-align: bottom;
- text-align: right;
+ @include text-align(right);
a {
display: inline-block;
diff --git a/lms/static/sass/shared/_header.scss b/lms/static/sass/shared/_header.scss
index 912f1e81a8..33f7b7771f 100644
--- a/lms/static/sass/shared/_header.scss
+++ b/lms/static/sass/shared/_header.scss
@@ -17,8 +17,8 @@ header.global {
}
h1.logo {
- float: left;
- margin: -2px 39px 0px 0px;
+ @include float(left);
+ @include margin(-2px, 39px, 0, 0);
position: relative;
a {
@@ -27,11 +27,11 @@ header.global {
}
.left {
- float: left;
+ @include float(left);
}
.guest {
- float: right;
+ @include float(right);
}
> li {
@@ -104,12 +104,12 @@ header.global {
}
.user {
- float: right;
+ @include float(right);
margin-top: 4px;
> .primary {
display: block;
- float: left;
+ @include float(left);
margin: 0px;
position: relative;
@@ -120,14 +120,14 @@ header.global {
&:last-child {
> a {
- border-radius: 0 4px 4px 0;
- border-left: none;
+ @include border-radius(0, 4px, 4px, 0);
+ @include border-left(none);
padding: 5px 8px 7px 8px;
&.shopping-cart {
border-radius: 4px;
border: 1px solid $border-color-2;
- margin-right: 10px;
+ @include margin-right(10px);
padding-bottom: 6px;
}
}
@@ -135,7 +135,7 @@ header.global {
}
a.user-link {
- padding: 6px 12px 8px 35px;
+ @include padding(6px, 12px, 8px, 35px);
position: relative;
text-transform: none;
font-size: 14px;
@@ -145,9 +145,15 @@ header.global {
.avatar {
@include background-image(url('../images/small-header-home-icon.png'));
background-repeat: no-repeat;
+
+ // CASE: right to left layout
+ @include rtl {
+ background-position: top right;
+ }
+
height: 26px;
display: inline-block;
- left: 8px;
+ @include left(8px);
opacity: 0.5;
overflow: hidden;
position: absolute;
@@ -171,7 +177,7 @@ header.global {
display: none;
padding: 5px 10px;
position: absolute;
- right: 0px;
+ @include right(0px);
top: 34px;
width: 170px;
z-index: 3;
@@ -194,7 +200,7 @@ header.global {
height: 0px;
position: absolute;
@include transform(rotate(-45deg));
- right: 12px;
+ @include right(12px);
top: -6px;
width: 0px;
}
@@ -236,7 +242,7 @@ header.global {
.nav-global {
margin-top: ($baseline/2);
list-style: none;
- float: left;
+ @include float(left);
li,
div {
@@ -279,7 +285,7 @@ header.global {
}
.nav-courseware {
- float: right;
+ @include float(right);
margin-top: ($baseline/4);
list-style: none;
@@ -394,7 +400,7 @@ header.global-new {
}
.primary {
- margin-right: 5px;
+ @include margin-right(5px);
> a {
@include background-image($button-bg-image);
@@ -415,7 +421,7 @@ header.global-new {
vertical-align: middle;
&:last-child {
- margin-right: 0px;
+ @include margin-right(0);
}
&:hover, &:focus, &:active {
@@ -430,13 +436,13 @@ header.global-new {
> .primary {
display: block;
- float: left;
- margin: 0px;
+ @include float(left);
+ margin: 0;
position: relative;
> a {
margin: 0px;
- @include border-right-radius(0px);
+ @include border-right-radius(0);
}
&:last-child {
@@ -456,7 +462,7 @@ header.global-new {
}
a.user-link {
- padding: 6px 12px 8px 35px;
+ @include padding(6px, 12px, 8px, 35px);
position: relative;
text-transform: none;
font-size: 14px;
@@ -468,7 +474,7 @@ header.global-new {
background-repeat: no-repeat;
height: 26px;
display: inline-block;
- left: 8px;
+ @include left(8px);
opacity: 0.5;
overflow: hidden;
position: absolute;
@@ -492,7 +498,7 @@ header.global-new {
display: none;
padding: 5px 10px;
position: absolute;
- right: 0px;
+ @include right(0);
top: 34px;
width: 170px;
z-index: 3;
@@ -515,7 +521,7 @@ header.global-new {
height: 0px;
position: absolute;
@include transform(rotate(-45deg));
- right: 12px;
+ @include right(12px);
top: -6px;
width: 0px;
}
diff --git a/lms/static/sass/vendor/bi-app/_bi-app-ltr.scss b/lms/static/sass/vendor/bi-app/_bi-app-ltr.scss
new file mode 100755
index 0000000000..6278a31380
--- /dev/null
+++ b/lms/static/sass/vendor/bi-app/_bi-app-ltr.scss
@@ -0,0 +1,11 @@
+// ------------------------------------------
+// left to right module
+// authors:
+// twitter.com/anasnakawa
+// twitter.com/victorzamfir
+// licensed under the MIT license
+// http://www.opensource.org/licenses/mit-license.php
+// ------------------------------------------
+
+@import 'variables-ltr';
+@import 'mixins';
\ No newline at end of file
diff --git a/lms/static/sass/vendor/bi-app/_bi-app-rtl.scss b/lms/static/sass/vendor/bi-app/_bi-app-rtl.scss
new file mode 100755
index 0000000000..17b7f2e90f
--- /dev/null
+++ b/lms/static/sass/vendor/bi-app/_bi-app-rtl.scss
@@ -0,0 +1,11 @@
+// ------------------------------------------
+// right to left module
+// authors:
+// twitter.com/anasnakawa
+// twitter.com/victorzamfir
+// licensed under the MIT license
+// http://www.opensource.org/licenses/mit-license.php
+// ------------------------------------------
+
+@import 'variables-rtl';
+@import 'mixins';
\ No newline at end of file
diff --git a/lms/static/sass/vendor/bi-app/_mixins.scss b/lms/static/sass/vendor/bi-app/_mixins.scss
new file mode 100755
index 0000000000..353999671d
--- /dev/null
+++ b/lms/static/sass/vendor/bi-app/_mixins.scss
@@ -0,0 +1,294 @@
+// ------------------------------------------
+// bi app mixins
+// authors:
+// twitter.com/anasnakawa
+// twitter.com/victorzamfir
+// licensed under the MIT license
+// http://www.opensource.org/licenses/mit-license.php
+// ------------------------------------------
+
+// ------------------------------------------
+// Table of contents
+// ------------------------------------------
+// padding
+// margin
+// float
+// text align
+// clear
+// left / right
+// border
+// - width
+// - style
+// - color
+// - generic
+// - radius
+// ltr / rtl contents
+// ------------------------------------------
+
+// generic mixin for properties with values
+// (top right bottom left)
+// ------------------------------------------
+@mixin bi-app-compact($property, $top, $right, $bottom, $left) {
+ @if $bi-app-direction == ltr {
+ #{$property}: $top $right $bottom $left;
+ } @else {
+ #{$property}: $top $left $bottom $right;
+ }
+}
+
+// padding
+// ------------------------------------------
+@mixin padding-left($distance) {
+ padding-#{$bi-app-left}: $distance;
+}
+
+@mixin padding-right($distance) {
+ padding-#{$bi-app-right}: $distance;
+}
+
+@mixin padding($top, $right, $bottom, $left) {
+ @include bi-app-compact(padding, $top, $right, $bottom, $left);
+}
+
+// margin
+// ------------------------------------------
+@mixin margin-left($distance) {
+ margin-#{$bi-app-left}: $distance;
+}
+
+@mixin margin-right($distance) {
+ margin-#{$bi-app-right}: $distance;
+}
+
+@mixin margin($top, $right, $bottom, $left) {
+ @include bi-app-compact(margin, $top, $right, $bottom, $left);
+}
+
+// float
+// ------------------------------------------
+@mixin bi-app-float-left {
+ float: $bi-app-left;
+}
+
+@mixin bi-app-float-right {
+ float: $bi-app-right;
+}
+
+@mixin float($direction) {
+ @if $direction == left {
+ @include bi-app-float-left;
+ } @else if $direction == right {
+ @include bi-app-float-right;
+ } @else {
+ float: $direction;
+ }
+}
+
+// text align
+// ------------------------------------------
+@mixin bi-app-text-align-left {
+ text-align: $bi-app-left;
+}
+
+@mixin bi-app-text-align-right {
+ text-align: $bi-app-right;
+}
+
+@mixin text-align($direction) {
+ @if $direction == left {
+ @include bi-app-text-align-left;
+ } @else if $direction == right {
+ @include bi-app-text-align-right;
+ } @else {
+ text-align: $direction;
+ }
+}
+
+// clear
+// ------------------------------------------
+@mixin bi-app-clear-left {
+ clear: $bi-app-left;
+}
+
+@mixin bi-app-clear-right {
+ clear: $bi-app-right;
+}
+
+@mixin clear($direction) {
+ @if $direction == left {
+ @include bi-app-clear-left;
+ } @else if $direction == right {
+ @include bi-app-clear-right;
+ } @else {
+ clear: $direction;
+ }
+}
+
+// left / right
+// ------------------------------------------
+@mixin left($distance) {
+ @if $bi-app-direction == ltr {
+ left: $distance;
+ } @else if $bi-app-direction == rtl {
+ right: $distance;
+ }
+}
+
+@mixin right($distance) {
+ @if $bi-app-direction == ltr {
+ right: $distance;
+ } @else if $bi-app-direction == rtl {
+ left: $distance;
+ }
+}
+
+// border
+// ------------------------------------------
+
+// width
+@mixin border-left-width($width) {
+ border-#{$bi-app-left}-width: $width;
+}
+
+@mixin border-right-width($width) {
+ border-#{$bi-app-right}-width: $width;
+}
+
+@mixin border-width($top, $right, $bottom, $left) {
+ @include bi-app-compact(border-width, $top, $right, $bottom, $left);
+}
+
+// style
+@mixin border-left-style($style) {
+ border-#{$bi-app-left}-style: $style;
+}
+
+@mixin border-right-style($style) {
+ border-#{$bi-app-right}-style: $style;
+}
+
+@mixin border-style($top, $right, $bottom, $left) {
+ @include bi-app-compact(border-style, $top, $right, $bottom, $left);
+}
+
+// color
+@mixin border-left-color($color) {
+ border-#{$bi-app-left}-color: $color;
+}
+
+@mixin border-right-color($color) {
+ border-#{$bi-app-right}-color: $color;
+}
+
+@mixin border-color($top, $right, $bottom, $left) {
+ @include bi-app-compact(border-color, $top, $right, $bottom, $left);
+}
+
+// generic
+@mixin border-left($border-style) {
+ border-#{$bi-app-left}: $border-style;
+}
+
+@mixin border-right($border-style) {
+ border-#{$bi-app-right}: $border-style;
+}
+
+// radius
+@mixin border-top-left-radius($radius) {
+ -webkit-border-top-#{$bi-app-left}-radius: $radius;
+ -moz-border-top#{$bi-app-left}-radius: $radius;
+ border-top-#{$bi-app-left}-radius: $radius;
+}
+
+@mixin border-top-right-radius($radius) {
+ -webkit-border-top-#{$bi-app-right}-radius: $radius;
+ -moz-border-top#{$bi-app-right}-radius: $radius;
+ border-top-#{$bi-app-right}-radius: $radius;
+}
+
+@mixin border-bottom-left-radius($radius) {
+ -webkit-border-bottom-#{$bi-app-left}-radius: $radius;
+ -moz-border-bottom#{$bi-app-left}-radius: $radius;
+ border-bottom-#{$bi-app-left}-radius: $radius;
+}
+
+@mixin border-bottom-right-radius($radius) {
+ -webkit-border-bottom-#{$bi-app-right}-radius: $radius;
+ -moz-border-bottom#{$bi-app-right}-radius: $radius;
+ border-bottom-#{$bi-app-right}-radius: $radius;
+}
+
+@mixin border-right-radius($radius) {
+ @include border-top-right-radius($radius);
+ @include border-bottom-right-radius($radius);
+}
+
+@mixin border-left-radius($radius) {
+ @include border-top-left-radius($radius);
+ @include border-bottom-left-radius($radius);
+}
+
+@mixin border-top-radius($radius) {
+ @include border-top-left-radius($radius);
+ @include border-top-right-radius($radius);
+}
+
+@mixin border-bottom-radius($radius) {
+ @include border-bottom-left-radius($radius);
+ @include border-bottom-right-radius($radius);
+}
+
+@mixin border-radius($topLeft, $topRight: null, $bottomRight: null, $bottomLeft: null) {
+ @if $topRight != null {
+ @include border-top-left-radius($topLeft);
+ @include border-top-right-radius($topRight);
+ @include border-bottom-right-radius($bottomRight);
+ @include border-bottom-left-radius($bottomLeft);
+ } @else {
+ -webkit-border-radius: $topLeft;
+ -moz-border-radius: $topLeft;
+ -ms-border-radius: $topLeft;
+ -o-border-radius: $topLeft;
+ border-radius: $topLeft;
+ }
+}
+
+// Returns "en" or "ar", useful for image suffixes.
+// Usage: background-image: url(/img/header-#{lang()}.png);
+@function lang() {
+ @if $bi-app-direction == ltr {
+ @return 'en';
+ } @else {
+ @return 'ar';
+ }
+}
+
+// Support for "direction" declaration (renders ltr/rtl).
+// Useful for form elements as they swap the text-indent property and align the text accordingly.
+@mixin direction {
+ direction: $bi-app-direction;
+}
+
+// Inverts a percentage value. Example: 97% becames 3%.
+// Useful for background-position.
+@function bi-app-invert-percentage($percentage) {
+ @if $bi-app-direction == rtl {
+ @return 100% - $percentage;
+ } @else {
+ @return $percentage;
+ }
+}
+
+// ltr / rtl contents
+// ------------------------------------------
+@mixin ltr {
+ @if $bi-app-direction == ltr {
+ @content;
+ }
+}
+
+@mixin rtl {
+ @if $bi-app-direction == rtl {
+ @content;
+ }
+}
diff --git a/lms/static/sass/vendor/bi-app/_variables-ltr.scss b/lms/static/sass/vendor/bi-app/_variables-ltr.scss
new file mode 100755
index 0000000000..36d5a7b06e
--- /dev/null
+++ b/lms/static/sass/vendor/bi-app/_variables-ltr.scss
@@ -0,0 +1,15 @@
+// ------------------------------------------
+// left to right variables to be used by bi-app mixins
+// authors:
+// twitter.com/anasnakawa
+// twitter.com/victorzamfir
+// licensed under the MIT license
+// http://www.opensource.org/licenses/mit-license.php
+// ------------------------------------------
+
+// namespacing variables with bi-app to
+// avoid conflicting with other global variables
+$bi-app-left : left;
+$bi-app-right : right;
+$bi-app-direction : ltr;
+$bi-app-invert-direction: rtl;
\ No newline at end of file
diff --git a/lms/static/sass/vendor/bi-app/_variables-rtl.scss b/lms/static/sass/vendor/bi-app/_variables-rtl.scss
new file mode 100755
index 0000000000..7300f17863
--- /dev/null
+++ b/lms/static/sass/vendor/bi-app/_variables-rtl.scss
@@ -0,0 +1,15 @@
+// ------------------------------------------
+// right to left variables to be used by bi-app mixins
+// authors:
+// twitter.com/anasnakawa
+// twitter.com/victorzamfir
+// licensed under the MIT license
+// http://www.opensource.org/licenses/mit-license.php
+// ------------------------------------------
+
+// namespacing variables with bi-app to
+// avoid conflicting with other global variables
+$bi-app-left : right;
+$bi-app-right : left;
+$bi-app-direction : rtl;
+$bi-app-invert-direction: ltr;
\ No newline at end of file
diff --git a/lms/templates/main.html b/lms/templates/main.html
index 68573776ff..51649afed1 100644
--- a/lms/templates/main.html
+++ b/lms/templates/main.html
@@ -3,7 +3,12 @@
-
+<%
+ # set doc language direction
+ from django.utils.translation import get_language_bidi
+ dir_rtl = 'rtl' if get_language_bidi() else 'ltr'
+%>
+
<%! from django.utils.translation import ugettext as _ %>
@@ -117,20 +122,27 @@
-
- #content%block>">${_("Skip to this view's content")}
+
+
+
#content%block>">${_("Skip to this view's content")}
- <%include file="mathjax_accessible.html" />
+ <%include file="mathjax_accessible.html" />
- <%include file="${header_file}" />
+ % if not suppress_toplevel_navigation:
+ <%include file="${header_file}" />
+ %endif
+
+
+ ${self.body()}
+ <%block name="bodyextra"/>
+
+
+ % if not suppress_toplevel_navigation:
+ <%include file="${footer_file}" />
+ % endif
-
- ${self.body()}
- <%block name="bodyextra"/>
- <%include file="${footer_file}" />
-
% if not disable_courseware_js:
<%static:js group='application'/>