From 6d89cc1bd184f97162782ea70ded412fe0e2b7fd Mon Sep 17 00:00:00 2001
From: Harry Rein <hrein@edx.org>
Date: Mon, 10 Jul 2017 15:21:05 -0400
Subject: [PATCH] Updating themes for bootstrap.

LEARNER-1785

This story was to update the existing custom themes to work with the flexible bootstrap design. It also updates the red theme to more closely resemble the real implementation on openedx.
---
 .../tests/test_comprehensive_theming.py       |   2 -
 lms/static/sass/bootstrap/_footer.scss        |   2 +-
 lms/static/sass/bootstrap/_navigation.scss    |   7 +-
 lms/static/sass/bootstrap/_variables.scss     |   3 +
 ...{lms-main-bootstrap.scss => lms-main.scss} |   3 +-
 lms/static/sass/partials/README.rst           |   4 +
 .../sass/partials/bootstrap/_theme.scss       |   3 +
 lms/static/sass/shared-v2/_header.scss        |   2 +-
 lms/static/sass/shared-v2/_variables.scss     |   2 +
 lms/templates/navigation/navigation.html      |   2 +-
 lms/templates/user_dropdown.html              |   2 +-
 .../reference/bootstrap/course-skeleton.html  |   6 +-
 .../sass/partials/bootstrap/_theme.scss       |   3 +
 .../sass/partials/bootstrap/_theme.scss       |   3 +
 themes/edx.org/lms/templates/header.html      | 104 +++++++++-
 themes/red-theme/lms/static/images/logo.png   | Bin 493 -> 5288 bytes
 .../static/sass/partials/base/_variables.scss |  17 +-
 .../sass/partials/bootstrap/_theme.scss       |  13 ++
 themes/red-theme/lms/templates/header.html    | 179 +-----------------
 19 files changed, 162 insertions(+), 195 deletions(-)
 rename lms/static/sass/bootstrap/{lms-main-bootstrap.scss => lms-main.scss} (85%)
 create mode 100644 lms/static/sass/partials/README.rst
 create mode 100644 lms/static/sass/partials/bootstrap/_theme.scss
 create mode 100644 themes/edge.edx.org/lms/static/sass/partials/bootstrap/_theme.scss
 create mode 100644 themes/edx.org/lms/static/sass/partials/bootstrap/_theme.scss
 create mode 100644 themes/red-theme/lms/static/sass/partials/bootstrap/_theme.scss

diff --git a/lms/djangoapps/courseware/tests/test_comprehensive_theming.py b/lms/djangoapps/courseware/tests/test_comprehensive_theming.py
index f2e4e8137c2..29790e8dba9 100644
--- a/lms/djangoapps/courseware/tests/test_comprehensive_theming.py
+++ b/lms/djangoapps/courseware/tests/test_comprehensive_theming.py
@@ -30,8 +30,6 @@ class TestComprehensiveTheming(TestCase):
         self.assertEqual(resp.status_code, 200)
         # This string comes from footer.html
         self.assertContains(resp, "super-ugly")
-        # This string comes from header.html
-        self.assertContains(resp, "This file is only for demonstration, and is horrendous!")
 
     def test_theme_outside_repo(self):
         # Need to create a temporary theme, and defer decorating the function
diff --git a/lms/static/sass/bootstrap/_footer.scss b/lms/static/sass/bootstrap/_footer.scss
index 035f4c11f50..2efbc43d814 100644
--- a/lms/static/sass/bootstrap/_footer.scss
+++ b/lms/static/sass/bootstrap/_footer.scss
@@ -4,7 +4,7 @@
 .wrapper-footer {
   box-shadow: 0 -1px 5px 0 $black-t0;
   border-top: 1px solid $navbar-light-disabled-color;
-  background-color: $body-bg;
+  background-color: $footer-bg;
   margin-top: $baseline/2;
   padding: $baseline;
   font-family: $font-family-sans-serif;
diff --git a/lms/static/sass/bootstrap/_navigation.scss b/lms/static/sass/bootstrap/_navigation.scss
index 7564c70bcc6..055d8d0eca8 100644
--- a/lms/static/sass/bootstrap/_navigation.scss
+++ b/lms/static/sass/bootstrap/_navigation.scss
@@ -2,6 +2,7 @@
 .navigation-container {
   border-bottom: 1px solid $brand-primary;
   text-decoration: none;
+  background-color: $header-bg;
 
   &.slim {
     border-bottom: 1px solid $inverse-color;
@@ -29,7 +30,7 @@
     .nav-item {
       margin: 0 $baseline 0 0;
       font-weight: $font-weight-normal;
-      font-family: $font-family-sans-serif;
+      font-family: $font-family-base;
       text-transform: uppercase;
       list-style: none;
 
@@ -47,7 +48,7 @@
         display: none;
       }
 
-      @media (max-width: map-get($grid-breakpoints,lg)) {
+      @media (max-width: map-get($grid-breakpoints,md)) {
         &.nav-item-open-collapsed, &.nav-item-open-collapsed-only {
           display: initial;
           margin: $baseline/4 $baseline/2;
@@ -73,7 +74,7 @@
     }
 
     .navbar-right .nav-item {
-      @media (min-width: map-get($grid-breakpoints,lg)) {
+      @media (min-width: map-get($grid-breakpoints,md)) {
         .nav-link {
           text-transform: none;
           color: $brand-inverse;
diff --git a/lms/static/sass/bootstrap/_variables.scss b/lms/static/sass/bootstrap/_variables.scss
index a6c93c59908..043f6343d92 100644
--- a/lms/static/sass/bootstrap/_variables.scss
+++ b/lms/static/sass/bootstrap/_variables.scss
@@ -48,6 +48,9 @@ $black-t3:  rgba($black, 0.75) !default;
 $light-grey-transparent: rgba(200,200,200, 0) !default;
 $light-grey-solid: rgba(200,200,200, 1) !default;
 
+$header-bg: $white !default;
+$footer-bg: $white !default;
+
 // ----------------------------
 // #TYPOGRAPHY
 // ----------------------------
diff --git a/lms/static/sass/bootstrap/lms-main-bootstrap.scss b/lms/static/sass/bootstrap/lms-main.scss
similarity index 85%
rename from lms/static/sass/bootstrap/lms-main-bootstrap.scss
rename to lms/static/sass/bootstrap/lms-main.scss
index 1b5298c5d6e..8b2059f028a 100644
--- a/lms/static/sass/bootstrap/lms-main-bootstrap.scss
+++ b/lms/static/sass/bootstrap/lms-main.scss
@@ -3,7 +3,7 @@
 // -----------------------------
 
 // Bootstrap theme
-@import 'edx-bootstrap/sass/open-edx/theme';
+@import 'bootstrap/theme';
 @import 'bootstrap/scss/bootstrap';
 
 // Variables
@@ -13,4 +13,3 @@
 @import 'footer';
 @import 'navigation';
 @import 'layouts';
-
diff --git a/lms/static/sass/partials/README.rst b/lms/static/sass/partials/README.rst
new file mode 100644
index 00000000000..914165caef5
--- /dev/null
+++ b/lms/static/sass/partials/README.rst
@@ -0,0 +1,4 @@
+Any partials in this directory can be overridden by a theme by matching
+the directory structure as in lms/static/sass/partials.
+
+As an example, look at the red-theme.
\ No newline at end of file
diff --git a/lms/static/sass/partials/bootstrap/_theme.scss b/lms/static/sass/partials/bootstrap/_theme.scss
new file mode 100644
index 00000000000..98a8e97205c
--- /dev/null
+++ b/lms/static/sass/partials/bootstrap/_theme.scss
@@ -0,0 +1,3 @@
+// Default bootstrap theming
+
+@import 'edx-bootstrap/sass/open-edx/theme';
diff --git a/lms/static/sass/shared-v2/_header.scss b/lms/static/sass/shared-v2/_header.scss
index 6885484cc3d..bf769628741 100644
--- a/lms/static/sass/shared-v2/_header.scss
+++ b/lms/static/sass/shared-v2/_header.scss
@@ -5,7 +5,7 @@
     box-sizing: border-box;
     position: relative;
     width: 100%;
-    border-bottom: 1px solid $gray-l1;
+    border-bottom: 1px solid $header-border-color;
     box-shadow: 0 1px 5px 0 $shadow-l1;
     background: $header-bg;
 
diff --git a/lms/static/sass/shared-v2/_variables.scss b/lms/static/sass/shared-v2/_variables.scss
index 34a2cd7b9ae..5ea9424aaee 100644
--- a/lms/static/sass/shared-v2/_variables.scss
+++ b/lms/static/sass/shared-v2/_variables.scss
@@ -42,6 +42,8 @@ $black-t3:  rgba($black, 0.75) !default;
 $light-grey-transparent: rgba(200,200,200, 0) !default;
 $light-grey-solid: rgba(200,200,200, 1) !default;
 
+$header-border-color: $gray-l1 !default;
+
 // ----------------------------
 // #TYPOGRAPHY
 // ----------------------------
diff --git a/lms/templates/navigation/navigation.html b/lms/templates/navigation/navigation.html
index 6afa7b455eb..d3389465f53 100644
--- a/lms/templates/navigation/navigation.html
+++ b/lms/templates/navigation/navigation.html
@@ -51,7 +51,7 @@ site_status_msg = get_site_status_msg(course_id)
 
 % if uses_bootstrap:
   <header class="navigation-container header-global ${"slim" if course else ""}">
-    <nav class="navbar navbar-toggleable-md navbar-light">
+    <nav class="navbar navbar-toggleable-sm navbar-light">
       <button class="navbar-toggler navbar-toggler-right mt-2" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
         <span class="navbar-toggler-icon"></span>
       </button>
diff --git a/lms/templates/user_dropdown.html b/lms/templates/user_dropdown.html
index b0c40c10eb0..3ac2099b1ec 100644
--- a/lms/templates/user_dropdown.html
+++ b/lms/templates/user_dropdown.html
@@ -31,7 +31,7 @@ from openedx.core.djangoapps.user_api.accounts.image_helpers import get_profile_
             <a class="dropdown-item" href="${reverse('logout')}">${_("Sign Out")}</a>
         </ul>
     </li>
-    <li class="nav-item nav-item-open-collapsed-only"><a href="${reverse('dashboard')}">${_("Dashboard")}</a></li>
+    <li class="nav-item nav-item-open-collapsed-only collapse"><a href="${reverse('dashboard')}">${_("Dashboard")}</a></li>
     <li class="nav-item nav-item-open-collapsed-only"><a href="${reverse('learner_profile', kwargs={'username': self.real_user.username})}">${_("Profile")}</a></li>
     <li class="nav-item nav-item-open-collapsed-only"><a href="${reverse('account_settings')}">${_("Account")}</a></li>
     <li class="nav-item nav-item-open-collapsed-only"><a href="${reverse('logout')}">${_("Sign Out")}</a></li>
diff --git a/lms/templates/ux/reference/bootstrap/course-skeleton.html b/lms/templates/ux/reference/bootstrap/course-skeleton.html
index b8bcba98106..7eae185815d 100644
--- a/lms/templates/ux/reference/bootstrap/course-skeleton.html
+++ b/lms/templates/ux/reference/bootstrap/course-skeleton.html
@@ -1,5 +1,5 @@
 ## Override the default styles_version to use Bootstrap
-<%! main_css = "css/bootstrap/lms-main-bootstrap.css" %>
+<%! main_css = "css/bootstrap/lms-main.css" %>
 
 <%page expression_filter="h"/>
 <%inherit file="/main.html" />
@@ -39,7 +39,9 @@
                         <input type="text" class="form-control" placeholder="Search" aria-label="Search"/>
                         <span class="input-group-addon" id="basic-addon2">Search</span>
                     </div>
-                    <button class="btn btn-primary col-4">Click Me!</button>
+                    <a href="#">
+                        <div class="btn btn-primary">Click Me!!</div>
+                    </a>
                 </div>
             </div>
         </div>
diff --git a/themes/edge.edx.org/lms/static/sass/partials/bootstrap/_theme.scss b/themes/edge.edx.org/lms/static/sass/partials/bootstrap/_theme.scss
new file mode 100644
index 00000000000..e3637f6f4af
--- /dev/null
+++ b/themes/edge.edx.org/lms/static/sass/partials/bootstrap/_theme.scss
@@ -0,0 +1,3 @@
+// Override theming for edx.org bootstrap
+
+@import 'edx-bootstrap/sass/edx/theme';
diff --git a/themes/edx.org/lms/static/sass/partials/bootstrap/_theme.scss b/themes/edx.org/lms/static/sass/partials/bootstrap/_theme.scss
new file mode 100644
index 00000000000..e3637f6f4af
--- /dev/null
+++ b/themes/edx.org/lms/static/sass/partials/bootstrap/_theme.scss
@@ -0,0 +1,3 @@
+// Override theming for edx.org bootstrap
+
+@import 'edx-bootstrap/sass/edx/theme';
diff --git a/themes/edx.org/lms/templates/header.html b/themes/edx.org/lms/templates/header.html
index 9be3a19a0f3..e2a601ef120 100644
--- a/themes/edx.org/lms/templates/header.html
+++ b/themes/edx.org/lms/templates/header.html
@@ -44,18 +44,113 @@ site_status_msg = get_site_status_msg(course_id)
 % endif
 </%block>
 
-% if uses_pattern_library:
+% if uses_bootstrap:
+<header class="navigation-container header-global ${"slim" if course and not disable_courseware_header else ""}" aria-label="Main" role="banner">
+% elif uses_pattern_library:
 <header class="header-global ${"slim" if course and not disable_courseware_header else ""}" aria-label="Main" role="banner">
 % else:
 <header class="${"header-global slim" if course and not disable_courseware_header else "header-global-new"}" aria-label="Main" role="banner">
 % endif
-  <div class="${"rwd" if responsive else ""} wrapper-header nav-container">
 
+% if uses_bootstrap:
+  <nav class="navbar navbar-toggleable-md navbar-light" aria-label="${_('Main')}">
+    <button class="navbar-toggler navbar-toggler-right mt-2" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
+      <span class="navbar-toggler-icon"></span>
+    </button>
+    <h1 class="hd logo-header">
+      <div class="logo">
+        <a class="navbar-brand" href="${marketing_link('ROOT')}" itemprop="url">
+          <img src="${static.url("images/logo.png")}" alt="${_("{platform_name} Home Page").format(platform_name=static.get_platform_name())}" itemprop="logo" />
+        </a>
+      </div>
+      % if course and not disable_courseware_header:
+        <div class="course-header">
+          <span class="provider">${course.display_org_with_default}:</span>
+          <span class="course-number">${course.display_number_with_default}</span>
+          <span class="course-name">${course.display_name_with_default}</span>
+        </div>
+      % endif
+    </h1>
+    % if user.is_authenticated():
+      <div class="collapse navbar-collapse" id="navbarSupportedContent">
+        % if not course or disable_courseware_header:
+          % if not nav_hidden or show_program_listing:
+            <ul class="navbar-nav mr-auto">
+                % if not nav_hidden:
+                  <li class="nav-item mt-2 nav-item-open-collapsed nav-global-01">
+                    <a class="nav-link" href="${marketing_link('HOW_IT_WORKS')}">${_("How it Works")}</a>
+                  </li>
+                  <li class="nav-item mt-2 nav-item-open-collapsed nav-global-02">
+                    <a class="nav-link" href="${marketing_link('COURSES')}">${_("Find Courses")}</a>
+                  </li>
+                  <li class="nav-item mt-2 nav-item-open-collapsed nav-global-03">
+                    <a class="nav-link" href="${marketing_link('SCHOOLS')}">${_("Schools & Partners")}</a>
+                  </li>
+                % endif
+                % if show_program_listing:
+                  <li class="nav-item mt-2 nav-item-open-collapsed">
+                    <a class="${'active' if reverse('dashboard') == request.path else ''} nav-link" href="${reverse('dashboard')}">
+                      ${_("Courses")}
+                    </a>
+                  </li>
+                  <li class="nav-item mt-2 nav-item-open-collapsed">
+                    <a class="${'active' if reverse('program_listing_view') in request.path else ''} nav-link" href="${reverse('program_listing_view')}">
+                      ${_("Programs")}
+                    </a>
+                  </li>
+                  % endif
+                </ul>
+          % endif
+        % endif
+        <ul class="navbar-nav navbar-right">
+          % if should_display_shopping_cart_func(): # see shoppingcart.context_processor.user_has_cart_context_processor
+            <a role="button" class="nav-item-open-collapsed btn-shopping-cart btn btn-secondary mr-3" href="${reverse('shoppingcart.views.show_cart')}">
+              <span class="icon fa fa-shopping-cart" aria-hidden="true"></span> ${_("Shopping Cart")}
+            </a>
+          % endif
+          <li class="nav-item mt-2 nav-item-open-collapsed">
+            <a href="${get_online_help_info(online_help_token)['doc_url']}"
+             target="_blank"
+             class="nav-link">${_("Help")}</a>
+          </li>
+          <%include file="user_dropdown.html"/>
+          </ul>
+        </div>
+    % else:
+      <div class="collapse navbar-collapse" id="navbarSupportedContent" aria-label="${_('Account')}" >
+        <ul class="navbar-nav mr-auto"></ul>
+        <ul class="navbar-nav">
+          <li class="nav-item">
+            % if not settings.FEATURES['DISABLE_LOGIN_BUTTON'] and not combined_login_and_register:
+              % if course and settings.FEATURES.get('RESTRICT_ENROLL_BY_REG_METHOD') and course.enrollment_domain:
+                <a class="btn btn-primary mt-2" href="${reverse('course-specific-login', args=[course.id.to_deprecated_string()])}${login_query()}">${_("Sign in")}</a>
+              % else:
+                <a class="btn btn-primary mt-2" href="/login${login_query()}">${_("Sign in")}</a>
+              % endif
+            % endif
+          </li>
+          % if not settings.FEATURES['DISABLE_LOGIN_BUTTON'] and not combined_login_and_register:
+            % if course and settings.FEATURES.get('RESTRICT_ENROLL_BY_REG_METHOD') and course.enrollment_domain:
+            <li class="nav-item">
+              <a class="nav-link mt-2" href="${reverse('course-specific-register', args=[course.id.to_deprecated_string()])}">${_("Register")}</a>
+            </li>
+            % elif static.get_value('ALLOW_PUBLIC_ACCOUNT_CREATION', settings.FEATURES.get('ALLOW_PUBLIC_ACCOUNT_CREATION')):
+            <li>
+              <a class="nav-link mt-2" href="/register">${_("Register")}</a>
+            </li>
+            % endif
+          % endif
+        </ul>
+      </div>
+    % endif
+  </nav>
+% else:
+  <div class="${"rwd" if responsive else ""} wrapper-header nav-container">
     <h1 class="hd logo-header">
       <div class="logo">
         <a href="${marketing_link('ROOT')}" itemprop="url">
           <%block name="navigation_logo">
-              <img src="${static.url("images/logo.png")}" alt="${_("{platform_name} Home Page").format(platform_name=static.get_platform_name())}" itemprop="logo" />
+            <img src="${static.url("images/logo.png")}" alt="${_("{platform_name} Home Page").format(platform_name=static.get_platform_name())}" itemprop="logo" />
           </%block>
         </a>
       </div>
@@ -119,7 +214,6 @@ site_status_msg = get_site_status_msg(course_id)
           </li>
         </ul>
       % endif
-
     % else:
       <nav aria-label="${_('Account')}" class="nav-account-management">
         <div class="right nav-courseware list-inline">
@@ -130,7 +224,6 @@ site_status_msg = get_site_status_msg(course_id)
               % else:
                 <a class="btn btn-login" href="/login${login_query()}">${_("Sign in")}</a>
               % endif
-
             % endif
           </div>
           % if not settings.FEATURES['DISABLE_LOGIN_BUTTON'] and not combined_login_and_register:
@@ -148,6 +241,7 @@ site_status_msg = get_site_status_msg(course_id)
       </nav>
     % endif
   </div>
+% endif
 </header>
 % if course:
 <!--[if lte IE 9]>
diff --git a/themes/red-theme/lms/static/images/logo.png b/themes/red-theme/lms/static/images/logo.png
index 5efc6b63a436b749addf0c7a978f9cb78ba03eab..77f0f2ba043a03c62b8520ca4b7baa7a02e177e7 100644
GIT binary patch
literal 5288
zcmY*dbyyV6)~1(`Ub>bA>Fx$4B&DRAWu<dL8kFvqZb6BqJEglpKw4^PBt+Vazk9#?
zecwFKnK^UjJ@0$Y{4sw_q{i!4xY(4~NJvPyN{Vt?PpjgS@nB*+&9&JQhe$|hxVEyg
z8cMRVAPqO?x3&&YBqWj8SRE4^Y8{|d8_b%4aYEZcAk@7?8uvMFvaUcueQV(As*qEv
zlF$-(&+6)AB7Jy5gum^fKwVzLkM|%8*!Q*RJ&5HO{<2g(_ebpKOLHI=sru_+jlJm4
zhZ*Ah8Mdu8YtR$Fi=5M3-;);WQ}n%-GX2y<ATnuYB_|o*CM-NYLXtfpBs`xCqd-rS
zhTWu86-7uL$Fsp`UAD*9?EAOX$GnOr1sW2NE1hNCZV66AJo3*kI-~E9eQp!!qz?>f
zuPpbPcxC#yeVTtj7J6Y)0kO7kw>dUvBhYoU?IO|$;>Y^06`tMkR?nN|tJxiv?d=p=
zW_hgU*SMToJmxue+k{>?_I{bn$dd{=wJ^S87krNRq1mTWmXxP(kGW~@=-)`av7DNf
zNGOewu(Fm}^_lQg&KSN7DC^8Cs%VI!4?u(nU2tr2MobDLMzp&Z%gd7cv%BB*H3=G?
zpNpe)MYbAco(;O)Icn#gBX$l1Ge>>B<?e6Wy%n$g-SR|__x<)RLQ**a_r+-`!6bdb
z5rG8?FRl=qk2NdG1gI2tlsig+TuGnsjJUT<96#?(syrhTo}*JCJ-q#(mH$VsF52yV
zl>tV%W=yR55@*Z7;f-eh1esr+U#L*|hrmwUIxKXSbe`}IY&CsULMs*-jCImQo6=xB
z3_f55kRr;g;4K*yqD$gjtUhDByR#?dacIaa_@;THp3N#;Du}d}@;(kuItx834>g7m
zO9yZWqewGRfQY^aPnz;6T_w8mA%nf6B-E~wscVU?PHz{L9pp_Vgy$dHWB9c`XUVUM
z*0<%G|KVp-HP&8$bKo_GF^sa_p__Ev517>$?{f%iHf~bnwCYXVnB5%S^Ifsu+ZAmD
zZtI;jxeXeQwbiQj9y#d4Jas4?F}6s5PG|H-_S0Oro^9*lD+HttXCSIBO(YDQx$qR=
zY3R3hH@XzBW98tN!I$Cn939O5EDr-6<NhQ5<Ng!=-6klB;-fiRoj<r-=wN08S9TYa
zhU>nh-sDZz`>FPDWqJk&5?WHX9-$wa7JTQ-&oCh`H5WgmRvg}u=5gmr(%?bpcE8*i
zcXH_>N8Z(-T&g|l=)Bo?NnxeYbygGUd_f$;C~FmyBJ}2Wv))Ak_@nxcmMwv{xHfTV
z&D;z8@Vd|M@*Pp`?rFZ2I@M|&%s|%sQ4D6qoDOlvNjz0%k}WB#gxFFu5B4HT$is$I
z<7~9UmmCeL&`;Mc<1e%L+VF{uxL#%7J?rX}K0CVO+Kj75N~M1PVUWRzd~yV^hAwgu
zvQ)d=O_QkThqE#F`{?THEuUAw!`%K#9}JG*eBU4}p7VA6)O}t`=1)12b!;GVex9F>
zhWVrO)BAwsqG$j^LLwvjYsl7lGf&S4vVrXzeRq8|RWXROBbSAhvn7<v%hBZtjf5oO
zCHCYxLftJuUXBh<FflJl@IMH#C;xAl8w~mf;%+Yq)>qR2$vV41L4sTYTs&YYY!C<}
z;b!$#OiNDTKj}|9NwAH(yNeh%x2LBkmnT1$vzs+Huc)XfHxC~-A0Ouvf)nQL<Zj``
z=>%i=H_89-$U$KcH(M8XTW2TGUtSAKXAgHtF!-;~f5*S;bhmx`ze-N9|FregAot%B
zZeA`P?*DQ>rAqvbimAKVLZ6iX@=Nhb{Db^|vH$2uaQ_wmKgImJ(|@8*tx91_aR2w(
zq_9<cm<^DS@K%)MUc9kEKQ{DrF_EWOuS0mBj;lFcIAs<o*=A*8N4W#(M3A=~Ifsh0
zfp2Ib)7^=D`8;C1oP~w*GA`seU^b2V2h^1C;3{3@=wchfB@C4;6s1go4(~M>9b*4<
z*;m~+lgXTa7&>6Fyi#X9dGh;V!ujjN)$(fZqVK*W#u~(&lp^6X`?9sFrBuK|WoS%R
zwB<b5w=SOfn)`=^QnCgn+Ef4|a)ud4y1zu{sY(Ff@V*aP&s@t^sdz(5Y2HR`F(V|q
zQhR|-qQK{m{c1Jb6R7$T^(EszOL;<`=p7$qI22)L=#dQGsnzPE^zeCX>AyYe_`Q1y
z8N*`-Qz*VPZuS$qc~77yKEg(8H8z!*#ZabO%p)|RKT`J&_jHtrqOQlsWzv~Te_r#r
z*CXhDnJ8r5k{rFy;bf18G+?(}=dGQ2<>bA5&B#IVZT3OGVG(>Dk#w|MTYA4YwRWWO
z=k;KNr{0^%Lz<ON&R-wGorF<C<qOvc^);mZNW3%%2w(t6;=n-v$GBvb=D4{+`Ad8k
zHSxqzJJd4KPKbwi%gSiu$G}i3!zz1~PwLN()Eq6xp0_YoDR!lJeP(322di_K(VA3m
z*Y_tbwOIEbQciAVt_?|uqnu$)e5)<_!11^Pr>>(BKfF6(K`1Z%?vULzU(cICl~mvH
zT|W@JA@hvIG)K43Bm#cRNRQ%XSb{@5YFfoAbQV4#*cG<<llsb^ug`AWvrT7^P$GKj
zIVNGx*Xgdvsa~`k`<_TKr+G7;woY2#UD4>9)Sp)$Mfxy5XHlIPUB7-|WNA8DW&=GA
ztu5o!&}lGUc(&`s1>2tt^%>~HzYT$L@lzm?7<BVz?YJ4t!d9Ekdu0O!06uizf9BYm
zDr=q64kqAy?HafZJ?^YDE!?}6H{MiZL+oH*wv=ptAWdV6L!s3Nl=M=K47mb#jmb`W
z#P_@d(vnA|?0ip>)2=$#WN~}M_M{XC34jR~(1AHBr-$z?kvBM1dIHC9<TVAkMy=?{
zO|F?^U~Ja7X7VzcuM(j>LvX)|U)0W?KGnZ-try_8zlvjG2_s71qay_)LJ(u~SJA-n
zYf`kvQseov7|gRhL%&4G+L!#7iVW4p$k4b`-pSvClIy-wS+r(2Nv8RfAGkEzu3;%%
z@3UhC1)-yrcim;@-kkP@JCW}&A#pq;K`-@73=+7Nu}wgLl@MyNJ(L#XP#x$D#D71y
z<2Qb1z4t?H_^J3$yi`VDg*Cje(De*z$MH^9PB)8YkI6D>Bbp2ul#Nf%_P!V;pR@zJ
zkmv4ZthRy-UQ=@#kL&&?H*7^NY2z4&6@;J|uyhoL-&q>?U;F}n>35^a+rwaXS=?;O
zXR;9)CfU}oMTT!ADv`f6UAsspWVbhOz+E_pT2o|&!`n2Pq~&HTY>_p<%+rgFhS74B
zsNEi^@yJ?8FVDY#x2v-)cU>f{SWcHaae|&#mM@iRNj$EKYL(A_Uw<H{ov|qvCK$4{
ziLz~9+#11J_utsG@xN#w1Os}pXyn1Aw3_bskxRfwP;Z*U@>Ps}JJ?X$Q|HjY+U$l0
zvQxCIev5*`iiyNTG0V2g{n$<!YmBq52N;y^#M>xFp)Hf>01o{GC6|^x2DESl%=Y6}
zSSN{q!+9bke1h3<8m}tvcD`)>8gKg8&;FWl8^{(N^~O7lD5LpHX=XO>;5r`w;PiO2
zAWo<J+GV8~aa^Gy&2GPh?_pqzJA@pTF(6w6vFpBe%jSG7<@qoo+-BOt`TSC@Hvea+
zN@W>)m3?PzyM${Lxo+ReSTLdTG?j$2k&{HOP1LtJGyh>ud=3&9A;-cJ{UTyYDzc%n
z07*Z*MA?41G1X+*)*(t>x?W?Q2HE*o`}ywisbI!SS5{W<oOG<i*ZU%50s$#Uk-INt
zL><nbDo)0faa=$~S)(mi<p|t8s)NjoeB`n<Tkk5QjL(U;`5gP%shXHTpqB@G6O=7B
zu;pcoB<^7f8MVD+WF1MkIk?FY+#ANZRCEYfs|^{}3^h<oVqA{fQ2<Z#F=%?2J}6l?
zVB8kIg9Mko(jBhN&M!cp`5AacgvCsgj>NOfrZT74A8H0sWsddZhbYgMBHR^g{gMi8
ztR(Bgt%!yNw&>CHQ%dYbAmWxeZOCIR<$Ld;IWoxBgyV1`V9<_z#4iH<-222O;#5sh
zGndokv#9w{cA$>)sDUm|;-nPlY?o-#$XjoLL9ixlfW%S#4?nUQk6z>e7r?cl5i#ES
zD`bc;EMy0(J;pC8F~Tf{Kz8Tt?@BuZO-e`&Uzw5E1*<!<T3+Xe25Qwdi*0EW*bf?e
znb*m2xoDI<{C7DdmXRV6tk^M%b`y0Y5h&c>H<xZiK8yJ18uElLq*eP_bV3eyyMviO
zfCfEj7J6fl1q7feVir2lxvr}v1s6Wg4UOtBc@D6N$xs@#lH{D@UmSybQmsrU1h=*Z
zf{0<cTLXT${(5$HQMcG(qm)}P%V?ma<}w?*VKF<3m&J?Xesp%%nvql>XPH6_etD#5
zs-OVympgA{3aN^PNVE&hGEr<4tuLK<zrFkFRP|+`9)^Smr5|tdw2HAXDO=bHy@sGN
z;#s_)wxQ1mQQnrl9e?8+D-t6jawrk*P106jXc>>K!)h0u0zsVu?@17-VU847y)#Qo
ztT;`wF!33-Xx^<$_JLLOMQGfMNiTijr3sLz&44#eHHgJ`A;xfI)(Hd)_nx3WY;qiB
z3|Ol;DKt^U*Dke3w64H!*iZ(I&0oGqOFbXyU)jgiPi@FUgln&M+JE7hpEBuDN}G?$
z2dZFW^zzo=wvN+MJ_4@j_yqDuIZIMjFpFJ8>e1&8i^jQf>6DNAALzY~wNOM0aa5<0
zP(HDaQ(GHVez6Z{WEUlTL0hUbW6XPffY^5zPV+B)r5ocae-x3j2Iwa4p&xM(SC%qe
zo%;wqQVaR!qIS8x+Jzde;Ax)6AWo#GZEPYCI8<|fH<RItU994$;GQ`&4j(pVUy%Im
z?}+*-h9>CKqdKio2S_PhS7{tToi1Y28+UYg92_kAICb!GtGBA7eYoMg4XjU`$bgbR
zb4?#|8s_ApO631Z@=mxy!gJq7+uAxWN2v-B6hOV7;#L&-TgV2`ebM;C<#Kwq=IDn~
zpRIr3pF`b+8ndx<+dL9uFIKVfFS6{}K0Q9?RaOHEd8;Ab9y_1aDsAH(VJ6n$@`OV0
z4l5dr!(kC2(y)_x<}koJVk}F=oX(xI#F`VyugFt5ybLe7sJpivs1i>p4dogyblG4f
zfm=#V72nn0vzSaTEZAr5K15UlT$Pp4rkU0pnA+jn6!kJ!_cZ%+T^I)(Y}?(oJ#j`(
zz7w#c^^CVm1M~$kB{o+wKR{T%Tv1R&2E-_E1V47G9xGghN_YfKdAs<ij(mU8Tpbgg
z=w{rY7d1!9RDYuNHR%ZLDXr8s+phsbb9x>DM6aIm<GhYuQ+;-gUxlWocLuy{lLH6$
z?YwI+b;%BJ#9Bcs3()p%rTH>^eTCGVzze(U9#;of<x=k3vB+G<`}|G$w|?U3R+ban
zBIFH(<&Q<y>k~%v8ytCJ*xSGb3H02>SAh?+4}f=n4s%zArjjcm7LCv21%oADrJ~X?
z4^dDp<t{ZL@DeV-iF^jP#${FP;<>j{+1I4!^NMo@{7|KBITSYu;XGfF4rj!w93Cs!
zZI2Be>{J3M-H`PR@V#4nT$qQx3JZ*%)rfM_9Q>l4xL@28ohW7@s-LL5J2drmz~^f9
zvB{{apdj=Vo|Ipqh>VR!>uPZ{6YOtPaW;MW{oP}gyf!H_!7Qq_jZR9u#dBAV7V3ps
zAuIgiljiK22l<vDoDsT-DYc=oVw3guhx(CFl`4L=U5*9!oULbBSF$$U3XUNi(bR(3
z=@Gy=Hd7b3t-I|77wGQdPu&C<0=91Y(6@8F0WN|S0`0iRvg3+%=L9{;cVJFEnr9hr
z2=DX+`Uz9P&VvHd#xfd;q}Z55{zsth8<-yk1j2lwxAh?D8Ne!8U$+P<VRqWzEdjoN
zSx|p5K<8g=cNVEvl6htOEuy~U`slgyj``-)D+}X-UuYD-KS?PlOls3McIKG$c$P%h
zqeCBr=@wmPNdi?igX0q_Kk=wGV<D-;3pEDn$J?2`Xv34$MG&L;mC{elAStVQhGZ=P
zViV+l^#<0)8SsW*i0DtSvjnp7i@B|nVXW;b<Z6|CPYim=bxC#d4Z+>o+PF_lCvH}i
z-G(CmitbH=qKW~>#K!bqH2xXjWr!K*Pf*;4_{5B|67T@;>=vLp`OMjVdy4MXEbv#;
z=t+wQcPaKEW@)Yf6_cARyfIEsk8{wP=h|gNns9K2)BVj>7uQhV{vBwD)C&_YEb&?@
zf;6A0Q&48_CpKGq%4B*x>($=w$Kc@o!Wqa=fm`>LRY?zbLf`lAQRU7KF-;t|R+grR
z6so$rzKxQAR>Vk@DQ*uY4nM!X^U`+<zaiK6><9GiT{1rT&Z8T-CV>GSzhTbColuoH
z_fV+%XW!ad9wnvug0b=yZ94AgoPvXC7!QHHMX_srR`?LK5_u4dhU2uwz-1ml?H>VD
z<*;bI$T%BRQ1!giQ&^|&9wi&2#$}bxSYyR196^hc3!yHlXZH5=6A(1~w6ARMecaxt
zsB?_MscRamOuf#6XB`Gu=K<igzm1D;H`Otj{$uGjey!a6j6R+T#innv$eamPq#&l#
zu2|ZFzWF@4eA$wr(*RE)(~4oH@?d~S>Ej`C?%R_lWB$6)+U(UzC+ceN0prz$G%PEv
zI~iRKp$hhKzP-fZZ2I-bonHsJZF%!;bbeEd8LD<g?uA5lDtTz?9C;^_`#-;LpYK(l
z?uX)d+{#Kq`DmyNtO*icUwPd^gIJ>8F*6^sbO)uxc1k4oQ5Pc#D-p<Zx7A!6o24tD
ze9OS&br$bqLcv~-{*k7t4DX=f;~|U=AsMSQ*;`>m*O{eJun-(fChM)rQE*}YiG=+C
pdNsIEJm4nLyk346INlYAEKAXG*Bl6!|NCX2B>!5j@}+suzW~150Js1E

delta 468
zcmV;_0W1EfDeVK0BYy$3Nkl<Zc-rmSp^m~p6op|RHFbamheV)RU62S8EC#g!48b8W
zSOo8Y<t-3A0uO-0ku*T=o+cFyVP+|%?al7F$!AzI`9s)FX9^q+hr{9gqq!6uXu>ya
z;Rt@{2;1;)O>oj)&R5}5gerKjf&*Mahww8Gs!&WbOdVDrF@LR~o<bNGMj$bb!2M*H
z3T!|U+Cb$4VH}u&Bs2pjX&eva!@LA>8XzCmcsI@*Bqj4V;`BgL(u*5s36ip9j5tG(
zlnq~vGXcrS<b^n0kc@PHi_-?lSlbe(29mLwDUJ)06Zc7+5=c%;&jKxS477L>Xpm!|
z!DE~<NY2U+&wo0SGbb8otRT=h5~!mfP$wGbsvyuc63AB&$dB%^M2UL1#}XynAW&aX
zpgtDWQWU5a1X?Q!w8o;QiULi8Kzl`j_E^+TQJ`HA=&UHv8H+k83Umqr-4zA8V^KFn
zfo}W;*`4?sWVhpgF}o?BgX~&-lD2cX7c=v@o44!meNB*^!#9d%1HO~CEAdprtj2RO
zvo23o&4xUiH|z0shgpO7gDm%hc*D$a!;E(nO?MPI91e%`cjgBqKM)cI*kh9b0000<
KMNUMnLSTZ^b;*$c

diff --git a/themes/red-theme/lms/static/sass/partials/base/_variables.scss b/themes/red-theme/lms/static/sass/partials/base/_variables.scss
index c869ff98567..c32bb594714 100755
--- a/themes/red-theme/lms/static/sass/partials/base/_variables.scss
+++ b/themes/red-theme/lms/static/sass/partials/base/_variables.scss
@@ -1,5 +1,14 @@
-@import 'lms/static/sass/partials/base/variables';
+// Color overrides
+$white: rgb(255,255,255);
+$red: #d9534f !default;
+
+$footer-bg: $white;
+$header-bg: $white;
+$header-border-color: $red;
 
-$header-bg: rgb(250,0,0);
-$footer-bg: rgb(250,0,0);
-$container-bg: rgb(250,0,0);
+$base-font-color: $red;
+$link-color: $red;
+$lms-active-color: $red;
+$lms-label-color: $red;
+
+@import 'lms/static/sass/partials/base/variables';
diff --git a/themes/red-theme/lms/static/sass/partials/bootstrap/_theme.scss b/themes/red-theme/lms/static/sass/partials/bootstrap/_theme.scss
new file mode 100644
index 00000000000..7fb54069546
--- /dev/null
+++ b/themes/red-theme/lms/static/sass/partials/bootstrap/_theme.scss
@@ -0,0 +1,13 @@
+// Sample red theme to demonstrate SASS overrides
+
+// Theme colors
+//
+// Note: define colors needed by your theme first
+$red: #d9534f !default;
+$brand-primary: $red;
+
+// Theme fonts
+$font-family-sans-serif: cursive;
+
+// Initialize the Open edX bootstrap theme
+@import 'edx-bootstrap/sass/open-edx/theme';
diff --git a/themes/red-theme/lms/templates/header.html b/themes/red-theme/lms/templates/header.html
index 2e4078370d1..54fc310317a 100755
--- a/themes/red-theme/lms/templates/header.html
+++ b/themes/red-theme/lms/templates/header.html
@@ -1,175 +1,8 @@
 ## mako
+<!--
+To override this page, add a navigation.html file in the following
+location: {your_theme}/lms/templates/navigation/navigation.html
+-->
+<%page expression_filter="h" args="online_help_token"/>
 <%namespace name='static' file='static_content.html'/>
-<%namespace file='main.html' import="login_query"/>
-<%!
-from django.core.urlresolvers import reverse
-from django.utils.translation import ugettext as _
-from openedx.core.djangolib.markup import HTML
-
-# App that handles subdomain specific branding
-import branding
-# app that handles site status messages
-from status.status import get_site_status_msg
-
-from lms.djangoapps.ccx.overrides import get_current_ccx
-%>
-
-## Provide a hook for themes to inject branding on top.
-<%block name="navigation_top" />
-
-<%block>
-<%
-try:
-    course_id = course.id.to_deprecated_string()
-except:
-    # can't figure out a better way to get at a possibly-defined course var
-    course_id = None
-site_status_msg = get_site_status_msg(course_id)
-%>
-% if site_status_msg:
-<div class="site-status">
-  <div class="inner-wrapper">
-    <span class="white-error-icon"></span>
-    <p>${site_status_msg}</p>
-  </div>
-</div>
-% endif
-</%block>
-
-  <header id="global-navigation" class="header-global ${"slim" if course else ""}" >
-    <!-- This file is only for demonstration, and is horrendous! -->
-    <nav aria-label="${_('Global')}">
-    <h1 class="logo">
-      <a href="${marketing_link('ROOT')}">
-        <%block name="navigation_logo">
-            <img src="${static.url("images/logo.png")}" alt="${_("{platform_name} Home Page").format(platform_name=static.get_platform_name())}"/>
-        </%block>
-      </a>
-    </h1>
-
-    % if course:
-    <h2><span class="provider">${course.display_org_with_default | h}:</span>
-      ${course.display_number_with_default | h}
-      <%
-        display_name = course.display_name_with_default_escaped
-        if settings.FEATURES.get('CUSTOM_COURSES_EDX', False):
-          ccx = get_current_ccx(course.id)
-          if ccx:
-            display_name = ccx.display_name
-      %>
-      ${display_name}</h2>
-    % endif
-
-    % if user.is_authenticated():
-    <ol class="left nav-global authenticated">
-      <%block name="navigation_global_links_authenticated">
-        % if settings.FEATURES.get('COURSES_ARE_BROWSABLE') and not show_program_listing:
-          <li class="nav-global-01">
-            <a href="${marketing_link('COURSES')}">${_('Find Courses')}</a>
-          </li>
-        % endif
-        %if settings.FEATURES.get('ENABLE_SYSADMIN_DASHBOARD','') and user.is_staff:
-          <li>
-            ## Translators: This is short for "System administration".
-            <a href="${reverse('sysadmin')}">${_("Sysadmin")}</a>
-          </li>
-        %endif
-        % if show_program_listing:
-          <li class="tab-nav-item">
-            <a class="${'active ' if reverse('dashboard') == request.path else ''}tab-nav-link" href="${reverse('dashboard')}">
-              ${_("Courses")}
-            </a>
-          </li>
-          <li class="tab-nav-item">
-            <a class="${'active ' if reverse('program_listing_view') in request.path else ''}tab-nav-link" href="${reverse('program_listing_view')}">
-              ${_("Programs")}
-            </a>
-          </li>
-        % endif
-      </%block>
-    </ol>
-    <ol class="user">
-      <li class="primary">
-        <a href="${reverse('dashboard')}" class="user-link">
-          <span class="icon fa fa-home" aria-hidden="true"></span>
-          <span class="sr">${_("Dashboard for:")}</span>
-          <div>
-          ${user.username}
-          </div>
-        </a>
-      </li>
-      <li class="primary">
-        <a href="#" class="dropdown" aria-haspopup="true" aria-expanded="false"><span class="sr">${_("More options dropdown")}</span><span class="fa fa-sort-desc" aria-hidden="true"></span></a>
-        <ul class="dropdown-menu" aria-label="More Options" role="menu">
-          <%block name="navigation_dropdown_menu_links" >
-            <li><a href="${reverse('account_settings')}">${_("Account Settings")}</a></li>
-            <li><a href="${reverse('learner_profile', kwargs={'username': user.username})}">${_("My Profile")}</a></li>
-          </%block>
-          <li><a href="${reverse('logout')}" role="menuitem">${_("Sign Out")}</a></li>
-        </ul>
-      </li>
-    </ol>
-      % if should_display_shopping_cart_func(): # see shoppingcart.context_processor.user_has_cart_context_processor
-        <ol class="user">
-          <li class="primary">
-            <a class="shopping-cart" href="${reverse('shoppingcart.views.show_cart')}">
-              <span class="icon fa fa-shopping-cart" aria-hidden="true"></span> ${_("Shopping Cart")}
-            </a>
-          </li>
-        </ol>
-      % endif
-    % else:
-    <ol class="left nav-global">
-      <%block name="navigation_global_links">
-        % if static.get_value('ENABLE_MKTG_SITE', settings.FEATURES.get('ENABLE_MKTG_SITE', False)):
-          <li class="nav-global-01">
-            <a href="${marketing_link('HOW_IT_WORKS')}">${_("How it Works")}</a>
-          </li>
-          % if settings.FEATURES.get('COURSES_ARE_BROWSABLE'):
-            <li class="nav-global-02">
-              <a href="${marketing_link('COURSES')}">${_("Courses")}</a>
-            </li>
-          % endif
-          <li class="nav-global-03">
-            <a href="${marketing_link('SCHOOLS')}">${_("Schools")}</a>
-          </li>
-        % endif
-      </%block>
-      % if not settings.FEATURES['DISABLE_LOGIN_BUTTON']:
-        % if course and settings.FEATURES.get('RESTRICT_ENROLL_BY_REG_METHOD') and course.enrollment_domain:
-          <li class="nav-global-04">
-            <a class="btn btn-neutral btn-register" href="${reverse('course-specific-register', args=[course.id.to_deprecated_string()])}">${_("Register Now")}</a>
-          </li>
-        % else:
-          <li class="nav-global-04">
-            <a class="btn btn-neutral btn-register" href="/register">${_("Register Now")}</a>
-          </li>
-        % endif
-      % endif
-    </ol>
-
-    <ol class="right nav-courseware">
-    <li class="nav-courseware-01">
-      % if not settings.FEATURES['DISABLE_LOGIN_BUTTON']:
-          % if course and settings.FEATURES.get('RESTRICT_ENROLL_BY_REG_METHOD') and course.enrollment_domain:
-          <a class="btn btn-brand btn-login" href="${reverse('course-specific-login', args=[course.id.to_deprecated_string()])}${login_query()}">${_("Sign in")}</a>
-          % else:
-          <a class="btn btn-brand btn-login" href="/login${login_query()}">${_("Sign in")}</a>
-          % endif
-      % endif
-    </li>
-    </ol>
-    % endif
-  </nav>
-</header>
-% if course:
-<!--[if lte IE 8]>
-<div class="ie-banner" aria-hidden="true">${_(HTML('<strong>Warning:</strong> Your browser is not fully supported. We strongly recommend using {chrome_link} or {ff_link}.')).format(chrome_link='<a href="https://www.google.com/intl/en/chrome/browser/" target="_blank">Chrome</a>', ff_link='<a href="http://www.mozilla.org/en-US/firefox/new/" target="_blank">Firefox</a>')}</div>
-<![endif]-->
-% endif
-
-%if not user.is_authenticated():
-  <%include file="forgot_password_modal.html" />
-%endif
-
-<%include file="help_modal.html"/>
+<%include file="${static.get_template_path(relative_path='navigation/navigation.html')}"  args="online_help_token=online_help_token"  />
-- 
GitLab