changeset 6428:8bd7a637cea0

template: use Bootstrap compatible navbar markup Based on work from Andrew Shadura <andrew@shadura.me>. Further modified by Mads Kiilerich.
author domruf <dominikruf@gmail.com>
date Tue, 20 Sep 2016 19:03:37 +0200
parents 71acaf87e5a2
children d94e87f92a47
files kallithea/public/css/contextbar.css kallithea/public/css/style.css kallithea/templates/base/base.html kallithea/templates/base/root.html kallithea/tests/functional/test_admin_settings.py
diffstat 5 files changed, 157 insertions(+), 154 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/public/css/contextbar.css	Wed Sep 21 19:58:44 2016 +0200
+++ b/kallithea/public/css/contextbar.css	Tue Sep 20 19:03:37 2016 +0200
@@ -48,20 +48,20 @@
     min-height: 36px;
 }
 
-#content #context-bar h2 {
+#content #context-bar .navbar-header {
     display: inline-block;
     color: #FFF;
     margin: 8px 20px 3px;
     padding-bottom: 2px;
 }
 
-#header #header-inner #quick a,
+nav.navbar #quick a,
 #content #context-bar,
 #content #context-bar a {
     color: #FFFFFF;
 }
 
-#header #header-inner #quick a:hover,
+nav.navbar #quick a:hover,
 #content #context-bar a:hover {
     text-decoration: none;
 }
@@ -77,16 +77,19 @@
     margin: 0;
 }
 
+ul.navbar-nav,
 ul.horizontal-list {
     display: block;
 }
 
+ul.navbar-nav > li,
 ul.horizontal-list > li {
     float: left;
     position: relative;
 }
 
-#header #header-inner #quick ul,
+nav.navbar #quick ul,
+ul.navbar-nav > li ul,
 ul.horizontal-list > li ul {
     position: absolute;
     display: none;
@@ -94,13 +97,15 @@
     z-index: 999;
 }
 
-#header #header-inner #quick li ul li,
+nav.navbar #quick li ul li,
+ul.navbar-nav ul li,
 ul.horizontal-list ul li {
     position: relative;
     border-bottom: 1px solid rgba(0,0,0,0.1);
     border-top: 1px solid rgba(255,255,255,0.1);
 }
 
+ul.navbar-nav > li ul ul,
 ul.horizontal-list > li ul ul {
     position: absolute;
     right: 100%;
@@ -111,7 +116,8 @@
     overflow-y: auto;
 }
 
-#header #header-inner #quick ul a,
+nav.navbar #quick ul a,
+ul.navbar-nav li a,
 ul.horizontal-list li a {
     white-space: nowrap;
 }
@@ -129,7 +135,7 @@
     font-size: 1.4em;
 }
 
-#header #header-inner #quick ul,
+nav.navbar #quick ul,
 #revision-changer,
 #context-pages,
 #context-pages ul {
@@ -137,7 +143,7 @@
     background: linear-gradient(to bottom, #577632 0%, #577632 100%); /* W3C */
 }
 
-#header #header-inner #quick a,
+nav.navbar #quick a,
 #context-actions a,
 #context-pages a {
     background-repeat: no-repeat;
@@ -180,14 +186,14 @@
 }
 
 ul.dropdown-menu li a:focus,
-#header #header-inner #quick li:hover,
+nav.navbar #quick li:hover,
 #revision-changer:hover,
 #context-pages li:hover,
 #context-actions li:hover,
 #content #context-actions li:hover,
-#header #header-inner #quick li.current,
-#header #header-inner #quick li a.menu_link:focus,
-#context-pages li.current {
+nav.navbar #quick li.active,
+nav.navbar #quick li a.menu_link:focus,
+#context-pages li.active {
     background: #6388ad; /* Old browsers */
     background: linear-gradient(to bottom, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.1) 100%); /* W3C */
 }
@@ -225,27 +231,27 @@
     margin-right: 5px;
 }
 
-#header #header-inner #quick li,
+nav.navbar #quick li,
 #content #context-pages li {
     border-right: 1px solid rgba(0,0,0,0.1);
     border-left: 1px solid rgba(255,255,255,0.1);
     padding: 0;
 }
 
-#header #header-inner #quick li:last-child,
+nav.navbar #quick li:last-child,
 #content #context-pages li:last-child {
     border-right: none;
 }
 
-#header #header-inner #quick > li:first-child {
+nav.navbar #quick > li:first-child {
     border-left: none;
 }
 
-#header #header-inner #quick > li:first-child > a {
+nav.navbar #quick > li:first-child > a {
     border-radius: 4px 0 0 4px;
 }
 
-#header #header-inner #quick a,
+nav.navbar #quick a,
 #context-pages a,
 #context-pages .dropdown-menu a {
     display: block;
@@ -253,17 +259,17 @@
     line-height: 35px;
 }
 
-#header #header-inner #quick a.thin,
+nav.navbar #quick a.thin,
 #context-pages a.thin,
 #context-pages .dropdown-menu a.thin {
     line-height: 28px !important;
 }
 
-#header #header-inner #quick a#quick_login_link {
+nav.navbar #quick a#quick_login_link {
     padding-left: 0px;
 }
 
-#header #header-inner #quick a {
+nav.navbar #quick a {
     overflow: hidden;
 }
 #context-pages a.dropdown-toggle:after {
--- a/kallithea/public/css/style.css	Wed Sep 21 19:58:44 2016 +0200
+++ b/kallithea/public/css/style.css	Tue Sep 20 19:03:37 2016 +0200
@@ -265,25 +265,33 @@
     visibility: visible;
 }
 
-#header #logo {
+nav.navbar #logo {
     padding-left: 10px;
 }
 
-div.header img {
+#content nav.navbar #logo {
+    padding-left: inherit;
+}
+
+nav.navbar #logo .navbar-brand img {
     padding-top: 5px;
-}
-
-#header #logo div.header,
-#header #logo div.branding {
+    margin-right: 5px;
+}
+
+nav.navbar #logo .navbar-brand {
     font-size: 20px;
     color: white;
     float: left;
     height: 44px;
     line-height: 44px;
-    margin-right: 5px;
-}
-
-#header ul#logged-user {
+}
+
+#content nav.navbar #logo .navbar-brand {
+    height: inherit;
+    line-height: inherit;
+}
+
+nav.navbar ul#logged-user {
     margin-bottom: 5px !important;
     border-radius: 0px 0px 8px 8px;
     height: 37px;
@@ -293,7 +301,7 @@
     box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
 }
 
-#header ul#logged-user li {
+nav.navbar ul#logged-user li {
     list-style: none;
     float: left;
     margin: 8px 0 0;
@@ -301,58 +309,42 @@
     border-left: 1px solid #576622;
 }
 
-#header ul#logged-user li.first {
+nav.navbar ul#logged-user li.first {
     border-left: none;
     margin: 4px;
 }
 
-#header ul#logged-user li.first div.gravatar {
+nav.navbar ul#logged-user li.first div.gravatar {
     margin-top: -2px;
 }
 
-#header ul#logged-user li.first div.account {
+nav.navbar ul#logged-user li.first div.account {
     padding-top: 4px;
     float: left;
 }
 
-#header ul#logged-user li.last {
+nav.navbar ul#logged-user li.last {
     border-right: none;
 }
 
-#header ul#logged-user li a {
+nav.navbar ul#logged-user li a {
     color: #fff;
     font-weight: 700;
     text-decoration: none;
 }
 
-#header ul#logged-user li a:hover {
+nav.navbar ul#logged-user li a:hover {
     text-decoration: underline;
 }
 
-#header ul#logged-user li.highlight a {
+nav.navbar ul#logged-user li.highlight a {
     color: #fff;
 }
 
-#header ul#logged-user li.highlight a:hover {
+nav.navbar ul#logged-user li.highlight a:hover {
     color: #FFF;
 }
-#header-dd {
-    clear: both;
-    position: fixed !important;
-    background-color: #577632;
-    opacity: 0.01;
-    cursor: pointer;
-    min-height: 10px;
-    width: 100% !important;
-    border-radius: 0px 0px 4px 4px;
-}
-
-#header-dd:hover {
-    opacity: 0.2;
-    transition: opacity 0.5s ease-in-out;
-}
-
-#header #header-inner {
+nav.navbar {
     min-height: 44px;
     clear: both;
     position: relative;
@@ -365,19 +357,14 @@
     box-shadow: 0 2px 2px rgba(0, 0, 0, 0.6);
     border-radius: 0px 0px 4px 4px;
 }
-#header #header-inner.hover {
-    width: 100% !important;
-    border-radius: 0px 0px 0px 0px;
-    position: fixed !important;
-    z-index: 10000;
-}
-
-.header-pos-fix, .anchor {
+
+.header-pos-fix,
+.anchor {
     margin-top: -46px;
     padding-top: 46px;
 }
 
-#header #header-inner #home a {
+nav.navbar #home a {
     height: 40px;
     width: 46px;
     display: block;
@@ -386,32 +373,32 @@
     padding: 0;
 }
 
-#header #header-inner #home a:hover {
+nav.navbar #home a:hover {
     background-position: 0 -40px;
 }
 
-#header #header-inner #logo {
+nav.navbar #logo {
     float: left;
     position: absolute;
 }
 
-#header #header-inner #logo h1 {
+nav.navbar #logo h1 {
     color: #FFF;
     font-size: 20px;
     margin: 12px 0 0 13px;
     padding: 0;
 }
 
-#header #header-inner #logo a {
+nav.navbar #logo a {
     color: #fff;
     text-decoration: none;
 }
 
-#header #header-inner #logo a:hover {
+nav.navbar #logo a:hover {
     color: #bfe3ff;
 }
 
-#header #header-inner #quick {
+nav.navbar #quick {
     position: relative;
     float: right;
     list-style-type: none;
@@ -421,63 +408,59 @@
     border-radius: 4px;
 }
 
-#header #header-inner #quick li span.short {
+nav.navbar #quick li span.short {
     padding: 9px 6px 8px 6px;
 }
 
-#header #header-inner #quick li span {
+nav.navbar #quick li span {
     display: inline;
     margin: 0;
 }
 
-#header #header-inner #quick li span.normal {
+nav.navbar #quick li span.normal {
     border: none;
     padding: 10px 12px 8px;
 }
 
-#header #header-inner #quick li .icon {
+nav.navbar #quick li .icon {
     border-left: none;
     padding-left: 10px;
-}
-
-#header #header-inner #quick li .icon_short {
-    top: 0;
-    left: 0;
-    border-left: none;
-    border-right: 1px solid #2e5c89;
-    padding: 8px 6px 4px;
-}
-
-#header #header-inner #quick li .icon img,
-#header #header-inner #quick li .icon_short img {
+    display: inline;
+}
+
+nav.navbar #quick li .icon img {
     vertical-align: middle;
     margin-bottom: 2px;
 }
 
-#header #header-inner #quick ul.repo_switcher {
+nav.navbar #quick ul.repo_switcher {
     max-height: 275px;
     overflow-x: hidden;
     overflow-y: auto;
 }
 
-#header #header-inner #quick ul.repo_switcher li.qfilter_rs {
+nav.navbar #quick ul.repo_switcher li.qfilter_rs {
     padding: 2px 3px;
     padding-right: 17px;
 }
 
-#header #header-inner #quick ul.repo_switcher li.qfilter_rs input {
+nav.navbar #quick ul.repo_switcher li.qfilter_rs input {
     width: 100%;
     border-radius: 10px;
     padding: 2px 7px;
 }
 
-#header #header-inner #quick .repo_switcher_type {
+nav.navbar #quick .repo_switcher_type {
     position: absolute;
     left: 0;
     top: 9px;
     margin: 0px 2px 0px 2px;
 }
 
+.navbar-toggle {
+    display: none;
+}
+
 .groups_breadcrumbs a {
     color: #fff;
 }
@@ -522,6 +505,7 @@
     margin: 0 60px 10px 290px;
 }
 
+#content nav.navbar,
 #content div.panel {
     clear: both;
     background: #fff;
@@ -2906,7 +2890,7 @@
     border-radius: 2px;
 }
 
-#header, #content, #footer {
+nav.navbar, #content, #footer {
     min-width: 978px;
 }
 
@@ -3114,7 +3098,7 @@
 }
 
 img,
-#header #header-inner #quick li a:hover span.normal,
+nav.navbar #quick li a:hover span.normal,
 #clone_url,
 #clone_url_id
 {
@@ -3125,7 +3109,7 @@
     vertical-align: bottom;
 }
 
-#header ul#logged-user,
+nav.navbar ul#logged-user,
 #content div.panel div.panel-heading ul.links,
 #content div.panel div.message div.dismiss,
 #content div.panel div.traffic div.legend ul {
@@ -3134,8 +3118,8 @@
     padding: 0;
 }
 
-#header #header-inner #home,
-#header #header-inner #logo,
+nav.navbar #home,
+nav.navbar #logo,
 #content div.panel ul.left,
 #content div.panel ol.left,
 div#commit_history,
@@ -3143,7 +3127,7 @@
     float: left;
 }
 
-#header #header-inner #quick li #quick_login,
+nav.navbar #quick li #quick_login,
 #content #left #menu ul.closed,
 #content #left #menu li ul.collapsed,
 .yui-tt-shadow {
@@ -3161,12 +3145,16 @@
     content: ' \23f7';           /* triangle-down */
 }
 
+.branch-switcher .select2-choice,
 .repo-switcher .select2-choice {
     padding: 0px 8px 1px !important;
     display: block;
     height: 100%;
 }
 
+.branch-switcher .select2-container,
+.branch-switcher .select2-choice,
+.branch-switcher .select2-choice span,
 .repo-switcher .select2-container,
 .repo-switcher .select2-choice,
 .repo-switcher .select2-choice span {
@@ -3176,16 +3164,19 @@
     color: #FFFFFF !important;
 }
 
+.branch-switcher .select2-arrow,
 .repo-switcher .select2-arrow {
     display: none !important;
 }
 
+.branch-switcher-dropdown.select2-drop.select2-drop-active,
 .repo-switcher-dropdown.select2-drop.select2-drop-active {
     box-shadow: none;
     color: #fff;
     background-color: #576622;
 }
 
+.branch-switcher-dropdown.select2-drop.select2-drop-active .select2-results .select2-highlighted,
 .repo-switcher-dropdown.select2-drop.select2-drop-active .select2-results .select2-highlighted {
     background-color: #6388ad;
 }
--- a/kallithea/templates/base/base.html	Wed Sep 21 19:58:44 2016 +0200
+++ b/kallithea/templates/base/base.html	Tue Sep 20 19:03:37 2016 +0200
@@ -93,8 +93,9 @@
 <%def name="repo_context_bar(current=None, rev=None)">
   <% rev = None if rev == 'tip' else rev %>
   <!--- CONTEXT BAR -->
-  <div id="context-bar" class="panel panel-primary">
-      <h2>
+  <nav id="context-bar" class="navbar navbar-inverse">
+    <div class="navbar-header" id="logo">
+      <div class="navbar-brand">
         ${repotag(c.db_repo)}
 
         ## public/private
@@ -104,27 +105,28 @@
           <i class="icon-globe"></i>
         %endif
         %for group in c.db_repo.groups_with_parents:
-          ${h.link_to(group.name, url('repos_group_home', group_name=group.group_name))}
+          ${h.link_to(group.name, url('repos_group_home', group_name=group.group_name), class_='navbar-link')}
           &raquo;
         %endfor
-        ${h.link_to(c.db_repo.just_name, url('summary_home', repo_name=c.db_repo.repo_name))}
+        ${h.link_to(c.db_repo.just_name, url('summary_home', repo_name=c.db_repo.repo_name), class_='navbar-link')}
 
         %if current == 'createfork':
          - ${_('Create Fork')}
         %endif
-      </h2>
-      <ul id="context-pages" class="horizontal-list">
-        <li class="${'current' if current == 'summary' else ''}" data-context="summary"><a href="${h.url('summary_home', repo_name=c.repo_name)}"><i class="icon-doc-text"></i> ${_('Summary')}</a></li>
+      </div>
+    </div>
+    <ul id="context-pages" class="nav navbar-nav navbar-right navbar-collapse collapse">
+        <li class="${'active' if current == 'summary' else ''}" data-context="summary"><a href="${h.url('summary_home', repo_name=c.repo_name)}"><i class="icon-doc-text"></i> ${_('Summary')}</a></li>
         %if rev:
-        <li class="${'current' if current == 'changelog' else ''}" data-context="changelog"><a href="${h.url('changelog_file_home', repo_name=c.repo_name, revision=rev, f_path='')}"><i class="icon-clock"></i> ${_('Changelog')}</a></li>
+        <li class="${'active' if current == 'changelog' else ''}" data-context="changelog"><a href="${h.url('changelog_file_home', repo_name=c.repo_name, revision=rev, f_path='')}"><i class="icon-clock"></i> ${_('Changelog')}</a></li>
         %else:
-        <li class="${'current' if current == 'changelog' else ''}" data-context="changelog"><a href="${h.url('changelog_home', repo_name=c.repo_name)}"><i class="icon-clock"></i> ${_('Changelog')}</a></li>
+        <li class="${'active' if current == 'changelog' else ''}" data-context="changelog"><a href="${h.url('changelog_home', repo_name=c.repo_name)}"><i class="icon-clock"></i> ${_('Changelog')}</a></li>
         %endif
-        <li class="${'current' if current == 'files' else ''}" data-context="files"><a href="${h.url('files_home', repo_name=c.repo_name, revision=rev or 'tip')}"><i class="icon-doc-inv"></i> ${_('Files')}</a></li>
-        <li class="${'current' if current == 'switch-to' else ''}" data-context="switch-to">
+        <li class="${'active' if current == 'files' else ''}" data-context="files"><a href="${h.url('files_home', repo_name=c.repo_name, revision=rev or 'tip')}"><i class="icon-doc-inv"></i> ${_('Files')}</a></li>
+        <li class="${'active' if current == 'switch-to' else ''}" data-context="switch-to">
           <input id="branch_switcher" name="branch_switcher" type="hidden">
         </li>
-        <li class="${'current' if current == 'options' else ''} dropdown" data-context="options">
+        <li class="${'active' if current == 'options' else ''} dropdown" data-context="options">
              %if h.HasRepoPermissionAny('repository.admin')(c.repo_name):
                <a href="${h.url('edit_repo',repo_name=c.repo_name)}" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false" aria-haspopup="true"><i class="icon-wrench"></i> ${_('Options')} <i class="caret"></i></a>
              %else:
@@ -153,9 +155,9 @@
               ## also it feels like a job for the controller
               %if c.authuser.username != 'default':
                   <li>
-                   <a class="${'following' if c.repository_following else 'follow'}" onclick="toggleFollowingRepo(this, ${c.db_repo.repo_id});">
-                    <span class="show-follow"><i class="icon-heart-empty"></i> ${_('Follow')}</span>
-                    <span class="show-following"><i class="icon-heart"></i> ${_('Unfollow')}</span>
+                   <a href="#" class="${'following' if c.repository_following else 'follow'}" onclick="toggleFollowingRepo(this, ${c.db_repo.repo_id});">
+                    <span class="show-follow ${'hidden' if c.repository_following else ''}"><i class="icon-heart-empty"></i> ${_('Follow')}</span>
+                    <span class="show-following ${'' if c.repository_following else 'hidden'}"><i class="icon-heart"></i> ${_('Unfollow')}</span>
                    </a>
                   </li>
                   <li><a href="${h.url('repo_fork_home',repo_name=c.repo_name)}"><i class="icon-git-pull-request"></i> ${_('Fork')}</a></li>
@@ -163,21 +165,21 @@
               %endif
              </ul>
         </li>
-        <li class="${'current' if current == 'showpullrequest' else ''}" data-context="showpullrequest">
+        <li class="${'active' if current == 'showpullrequest' else ''}" data-context="showpullrequest">
           <a href="${h.url('pullrequest_show_all',repo_name=c.repo_name)}" title="${_('Show Pull Requests for %s') % c.repo_name}"> <i class="icon-git-pull-request"></i> ${_('Pull Requests')}
             %if c.repository_pull_requests:
               <span class="badge">${c.repository_pull_requests}</span>
             %endif
           </a>
         </li>
-      </ul>
-  </div>
+    </ul>
+  </nav>
   <script type="text/javascript">
     $(document).ready(function() {
       var bcache = {};
 
       $("#branch_switcher").select2({
-          placeholder: '<i class="icon-exchange"></i> ${_('Switch To')} <span class="caret"></span>',
+          placeholder: '<span class="navbar-text"> <i class="icon-exchange"></i> ${_('Switch To')} <span class="caret"></span></span>',
           dropdownAutoWidth: true,
           sortResults: prefixFirstSort,
           formatResult: function(obj) {
@@ -191,13 +193,13 @@
           },
           escapeMarkup: function(m) {
               // don't escape our custom placeholder
-              if (m.substr(0, 29) == '<i class="icon-exchange"></i>') {
+              if (m.substr(0, 25) == '<span class="navbar-text"') {
                   return m;
               }
 
               return Select2.util.escapeMarkup(m);
           },
-          containerCssClass: "repo-switcher",
+          containerCssClass: "branch-switcher",
           dropdownCssClass: "repo-switcher-dropdown",
           query: function(query) {
               var key = 'cache';
@@ -248,7 +250,7 @@
 
       $("#branch_switcher").on('select2-selecting', function(e) {
           e.preventDefault();
-          var context = $('#context-bar .current').data('context');
+          var context = $('#context-bar .active').data('context');
           if (context == 'files') {
               window.location = pyroutes.url('files_home', {
                   'repo_name': REPO_NAME,
@@ -274,27 +276,27 @@
 </%def>
 
 <%def name="menu(current=None)">
-  <ul id="quick" class="horizontal-list">
+  <ul id="quick" class="nav navbar-nav navbar-right">
     <!-- repo switcher -->
-    <li class="${'current' if current == 'repositories' else ''}">
+    <li class="${'active' if current == 'repositories' else ''}">
       <input id="repo_switcher" name="repo_switcher" type="hidden">
     </li>
 
     ##ROOT MENU
     %if c.authuser.username != 'default':
-      <li class="${'current' if current == 'journal' else ''}">
+      <li class="${'active' if current == 'journal' else ''}">
         <a class="menu_link" title="${_('Show recent activity')}"  href="${h.url('journal')}">
           <i class="icon-book"></i> ${_('Journal')}
         </a>
       </li>
     %else:
-      <li class="${'current' if current == 'journal' else ''}">
+      <li class="${'active' if current == 'journal' else ''}">
         <a class="menu_link" title="${_('Public journal')}"  href="${h.url('public_journal')}">
           <i class="icon-book"></i> ${_('Public journal')}
         </a>
       </li>
     %endif
-      <li class="${'current' if current == 'gists' else ''} dropdown">
+      <li class="${'active' if current == 'gists' else ''} dropdown">
         <a class="menu_link dropdown-toggle" data-toggle="dropdown" role="button" title="${_('Show public gists')}"  href="${h.url('gists')}">
           <i class="icon-clippy"></i> ${_('Gists')} <span class="caret"></span>
         </a>
@@ -307,20 +309,20 @@
             %endif
           </ul>
       </li>
-    <li class="${'current' if current == 'search' else ''}">
+    <li class="${'active' if current == 'search' else ''}">
         <a class="menu_link" title="${_('Search in repositories')}"  href="${h.url('search')}">
           <i class="icon-search"></i> ${_('Search')}
         </a>
     </li>
     % if h.HasPermissionAny('hg.admin')('access admin main page'):
-      <li class="${'current' if current == 'admin' else ''} dropdown">
+      <li class="${'active' if current == 'admin' else ''} dropdown">
         <a class="menu_link dropdown-toggle" data-toggle="dropdown" role="button" title="${_('Admin')}" href="${h.url('admin_home')}">
           <i class="icon-gear"></i> ${_('Admin')} <span class="caret"></span>
         </a>
         ${admin_menu()}
       </li>
     % elif c.authuser.repositories_admin or c.authuser.repository_groups_admin or c.authuser.user_groups_admin:
-    <li class="${'current' if current == 'admin' else ''} dropdown">
+    <li class="${'active' if current == 'admin' else ''} dropdown">
         <a class="menu_link dropdown-toggle" data-toggle="dropdown" role="button" title="${_('Admin')}">
           <i class="icon-gear"></i> ${_('Admin')}
         </a>
@@ -330,7 +332,7 @@
     </li>
     % endif
 
-    <li class="${'current' if current == 'my_pullrequests' else ''}">
+    <li class="${'active' if current == 'my_pullrequests' else ''}">
       <a class="menu_link" title="${_('My Pull Requests')}" href="${h.url('my_pullrequests')}">
         <i class="icon-git-pull-request"></i> ${_('My Pull Requests')}
         %if c.my_pr_count != 0:
@@ -349,7 +351,7 @@
           href="#"
         %endif
       >
-          ${h.gravatar_div(c.authuser.email, size=20, div_class="icon", div_style="display:inline", div_aria_hidden="true")}
+          ${h.gravatar_div(c.authuser.email, size=20, div_class="icon")}
           %if c.authuser.username != 'default':
             <span class="menu_link_user">${c.authuser.username}</span>
             %if c.unread_notifications != 0:
@@ -360,8 +362,8 @@
           %endif
       </a>
 
-      <div class="user-menu" role="menu">
-        <div id="quick_login" role="form" aria-describedby="quick_login_h" aria-hidden="true" class="dropdown-menu">
+      <div class="dropdown-menu user-menu" role="menu">
+        <div id="quick_login" role="form" aria-describedby="quick_login_h" aria-hidden="true" class="container-fluid">
           %if c.authuser.username == 'default' or c.authuser.user_id is None:
             <h4 id="quick_login_h">${_('Login to Your Account')}</h4>
             ${h.form(h.url('login_home', came_from=request.path_qs))}
@@ -399,20 +401,18 @@
             </div>
             ${h.end_form()}
           %else:
-            <div class="pull-left links_left">
+            <div class="pull-left">
                 ${h.gravatar_div(c.authuser.email, size=48, div_class="big_gravatar")}
-                <div class="full_name">${c.authuser.full_name_or_username}</div>
+                <b class="full_name">${c.authuser.full_name_or_username}</b>
                 <div class="email">${c.authuser.email}</div>
             </div>
-            <div class="pull-right links_right" id="quick_login_h">
-            <ol class="links">
-              <li><a href="${h.url('notifications')}">${_('Notifications')}: ${c.unread_notifications}</a></li>
-              <li>${h.link_to(_('My Account'),h.url('my_account'))}</li>
+            <div class="pull-right list-group text-right">
+              <a class="list-group-item" href="${h.url('notifications')}">${_('Notifications')}: ${c.unread_notifications}</a>
+              ${h.link_to(_('My Account'),h.url('my_account'),class_='list-group-item')}
               %if not c.authuser.is_external_auth:
                 ## Cannot log out if using external (container) authentication.
-                <li class="logout">${h.link_to(_('Log Out'), h.url('logout_home'))}</li>
+                ${h.link_to(_('Log Out'), h.url('logout_home'),class_='list-group-item')}
               %endif
-            </ol>
             </div>
           %endif
         </div>
@@ -456,7 +456,7 @@
             }
 
             $("#repo_switcher").select2({
-                placeholder: '<i class="icon-database"></i> ${_('Repositories')} <span class="caret"></span>',
+                placeholder: '<span class="navbar-text"><i class="icon-database"></i> ${_('Repositories')} <span class="caret"></span></span>',
                 dropdownAutoWidth: true,
                 sortResults: prefixFirstSort,
                 formatResult: format,
@@ -468,7 +468,7 @@
                 dropdownCssClass: "repo-switcher-dropdown",
                 escapeMarkup: function(m){
                     // don't escape our custom placeholder
-                    if(m.substr(0,29) == '<i class="icon-database"></i>'){
+                    if(m.substr(0,55) == '<span class="navbar-text"><i class="icon-database"></i>'){
                         return m;
                     }
 
--- a/kallithea/templates/base/root.html	Wed Sep 21 19:58:44 2016 +0200
+++ b/kallithea/templates/base/root.html	Tue Sep 20 19:03:37 2016 +0200
@@ -105,21 +105,27 @@
         <%block name="head_extra"/>
     </head>
     <body>
-      <div id="header">
-        <div id="header-inner" class="title">
-          <div id="logo">
-            <a href="${h.url('home')}" style="display: block;">
-              <div class="header">
-                <img src="${h.url('/images/kallithea-logo.svg')}" alt="Kallithea"/>
-              </div>
-              %if c.site_name:
-                <div class="branding">${c.site_name}</div>
-              %endif
+      <nav class="navbar navbar-inverse">
+        <div>
+          <div class="navbar-header" id="logo">
+            <a class="navbar-brand" href="${h.url('home')}">
+                <img class="pull-left" src="${h.url('/images/kallithea-logo.svg')}" alt="Kallithea"/>
+                  %if c.site_name:
+                    <span class="branding">${c.site_name}</span>
+                  %endif
             </a>
+            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false">
+              <span class="sr-only">Toggle navigation</span>
+              <span class="icon-bar"></span>
+              <span class="icon-bar"></span>
+              <span class="icon-bar"></span>
+            </button>
           </div>
-          <%block name="header_menu"/>
+          <div id="navbar" class="navbar-collapse collapse">
+            <%block name="header_menu"/>
+          </div>
         </div>
-      </div>
+      </nav>
 
       ${next.body()}
 
--- a/kallithea/tests/functional/test_admin_settings.py	Wed Sep 21 19:58:44 2016 +0200
+++ b/kallithea/tests/functional/test_admin_settings.py	Tue Sep 20 19:03:37 2016 +0200
@@ -174,4 +174,4 @@
             assert Setting.get_app_settings()['title'] == new_title.decode('utf-8')
 
             response = response.follow()
-            response.mustcontain("""<div class="branding">%s</div>""" % new_title)
+            response.mustcontain("""<span class="branding">%s</span>""" % new_title)