]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-8829 update the global navigation bar
authorStas Vilchik <stas.vilchik@sonarsource.com>
Wed, 29 Nov 2017 11:18:05 +0000 (12:18 +0100)
committerStas Vilchik <stas.vilchik@sonarsource.com>
Mon, 11 Dec 2017 17:00:33 +0000 (18:00 +0100)
server/sonar-web/config/webpack.config.js
server/sonar-web/package.json
server/sonar-web/src/main/js/app/components/SimpleContainer.tsx
server/sonar-web/src/main/js/app/components/nav/global/GlobalNav.css
server/sonar-web/src/main/js/app/components/nav/global/GlobalNav.js
server/sonar-web/src/main/js/app/components/nav/global/GlobalNavExplore.tsx
server/sonar-web/src/main/js/app/components/nav/global/GlobalNavUser.js
server/sonar-web/src/main/js/app/components/nav/global/__tests__/__snapshots__/GlobalNavUser-test.js.snap
server/sonar-web/src/main/js/app/components/search/Search.css
server/sonar-web/src/main/js/app/theme.js
server/sonar-web/yarn.lock

index 8cf804efdb2c667530937bf91d4792e3ee601175..f120681011fead8f404e8bcd7a71d5eecbaf6c98 100644 (file)
@@ -27,7 +27,8 @@ const postcssLoader = () => ({
       require('autoprefixer'),
       require('postcss-custom-properties')({
         variables: require('../src/main/js/app/theme')
-      })
+      }),
+      require('postcss-calc')
     ]
   }
 });
index 640c3f00eab62d8f30bb5d748d57cbab7bba9228..1ba78887fc81f51ee3543bf1a8e00da949c29bc3 100644 (file)
@@ -93,6 +93,7 @@
     "html-webpack-plugin": "2.30.1",
     "jest": "21.2.1",
     "lint-staged": "4.3.0",
+    "postcss-calc": "6.0.1",
     "postcss-custom-properties": "6.2.0",
     "postcss-loader": "2.0.8",
     "prettier": "1.7.4",
index 51c4336afde57e65d2bca4716ef69ff1a825b292..4e5e35b7cceb63211a7c6e262d8e0753fb0cc168 100644 (file)
@@ -19,6 +19,7 @@
  */
 import * as React from 'react';
 import GlobalFooterContainer from './GlobalFooterContainer';
+import * as theme from '../theme';
 import NavBar from '../../components/nav/NavBar';
 
 interface Props {
@@ -45,7 +46,7 @@ export default class SimpleContainer extends React.PureComponent<Props> {
     return (
       <div className="global-container">
         <div className="page-wrapper" id="container">
-          <NavBar className="navbar-global" height={30} />
+          <NavBar className="navbar-global" height={theme.globalNavHeightRaw} />
 
           <div id="bd" className="page-wrapper-simple">
             <div id="nonav" className="page-simple">
index c391bf819650fc941ec47dd9f05f2005b8450b21..ac02282d58528e58588d0e4b3fb326c1fbc241c7 100644 (file)
@@ -5,16 +5,15 @@
 }
 
 .navbar-brand {
-  display: block;
-  margin-left: -10px;
-  padding-left: 10px;
-  padding-right: 10px;
-  border: none;
-}
-
-.navbar-brand:hover,
-.navbar-brand:focus {
-  background-color: #000;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: var(--globalNavHeight);
+  margin-left: calc(-1 * (var(--globalNavHeight) - var(--globalNavContentHeight)) / 2);
+  padding-top: 4px;
+  padding-left: calc((var(--globalNavHeight) - var(--globalNavContentHeight)) / 2);
+  padding-right: calc((var(--globalNavHeight) - var(--globalNavContentHeight)) / 2);
+  border-bottom: 4px solid transparent;
 }
 
 .navbar-login {
 }
 
 .navbar-avatar {
-  margin-right: -3px !important;
-  padding: 3px !important;
+  margin-right: calc(-1 * (var(--globalNavHeight) - var(--globalNavContentHeight)) / 2);
+  padding: calc((var(--globalNavHeight) - var(--globalNavContentHeight)) / 2) !important;
+  border: none !important;
 }
 
 .navbar-help {
-  line-height: 16px !important;
-  padding: 7px !important;
+  height: var(--globalNavHeight);
+  padding: calc(var(--globalNavHeight) - var(--globalNavContentHeight)) 12px !important;
+  border-bottom: none !important;
   color: #fff !important;
 }
 
 .global-navbar-menu {
   display: flex;
   align-items: center;
+  height: var(--globalNavHeight);
 }
 
 .global-navbar-menu > li > a {
   display: block;
-  padding: 8px 10px;
-  line-height: 14px;
-  border: none;
+  height: var(--globalNavHeight);
+  padding: calc((var(--globalNavHeight) - var(--globalNavContentHeight)) / 2) 10px;
+  line-height: var(--globalNavContentHeight);
+  border-bottom: 4px solid transparent;
+  box-sizing: border-box;
   color: #ccc;
   font-size: var(--smallFontSize);
   letter-spacing: 0.05em;
-  transition: none;
 }
 
+.navbar-brand:hover,
+.navbar-brand:focus,
 .global-navbar-menu > li > a.active,
 .global-navbar-menu > li > a:hover,
 .global-navbar-menu > li > a:focus {
-  background-color: var(--blue);
-  color: #fff;
+  background-color: #020202;
+}
+
+.global-navbar-menu > li > a.active {
+  border-bottom-color: #646464;
 }
 
 @media print {
index 8823ecd05336bdaa23e3ac0d9f5c67dd972029b6..317077eb1af9170a75d4b8bdb24671cc884fc63d 100644 (file)
@@ -26,6 +26,7 @@ import GlobalNavExplore from './GlobalNavExplore';
 import GlobalNavUserContainer from './GlobalNavUserContainer';
 import Search from '../../search/Search';
 import GlobalHelp from '../../help/GlobalHelp';
+import * as theme from '../../../theme';
 import NavBar from '../../../../components/nav/NavBar';
 import Tooltip from '../../../../components/controls/Tooltip';
 import HelpIcon from '../../../../components/icons-components/HelpIcon';
@@ -107,13 +108,13 @@ class GlobalNav extends React.PureComponent {
 
   render() {
     return (
-      <NavBar className="navbar-global" id="global-navigation" height={30}>
+      <NavBar className="navbar-global" id="global-navigation" height={theme.globalNavHeightRaw}>
         <GlobalNavBranding />
 
         <GlobalNavMenu {...this.props} />
 
         <ul className="global-navbar-menu pull-right">
-          <Search appState={this.props.appState} currentUser={this.props.currentUser} />
+          <GlobalNavExplore location={this.props.location} onSonarCloud={this.props.onSonarCloud} />
           <li>
             <a className="navbar-help" onClick={this.handleHelpClick} href="#">
               {this.state.onboardingTutorialTooltip ? (
@@ -128,11 +129,10 @@ class GlobalNav extends React.PureComponent {
               )}
             </a>
           </li>
+          <Search appState={this.props.appState} currentUser={this.props.currentUser} />
           <GlobalNavUserContainer {...this.props} />
         </ul>
 
-        <GlobalNavExplore location={this.props.location} onSonarCloud={this.props.onSonarCloud} />
-
         {this.state.helpOpen && (
           <GlobalHelp
             currentUser={this.props.currentUser}
index ea1495c0e1c4a320960b251a34917bd2efaabc30..b20bd00ded631041c29c8222607dab4db88a43bb 100644 (file)
@@ -34,12 +34,10 @@ export default function GlobalNavExplore({ location, onSonarCloud }: Props) {
   const active = location.pathname.startsWith('explore');
 
   return (
-    <ul className="global-navbar-menu spacer-right pull-right">
-      <li>
-        <Link to="/explore/projects" className={active ? 'active' : undefined}>
-          {translate('explore')}
-        </Link>
-      </li>
-    </ul>
+    <li>
+      <Link to="/explore/projects" className={active ? 'active' : undefined}>
+        {translate('explore')}
+      </Link>
+    </li>
   );
 }
index cb70ab0570991113553ad6c7c2d7d1c2c4ee723d..3b577558541faad0bd4e43068188f0811905b1a9 100644 (file)
@@ -22,6 +22,7 @@ import React from 'react';
 import classNames from 'classnames';
 import { sortBy } from 'lodash';
 import { Link } from 'react-router';
+import * as theme from '../../../theme';
 import Avatar from '../../../../components/ui/Avatar';
 import OrganizationIcon from '../../../../components/icons-components/OrganizationIcon';
 import OrganizationLink from '../../../../components/ui/OrganizationLink';
@@ -124,7 +125,11 @@ export default class GlobalNavUser extends React.PureComponent {
         className={classNames('dropdown js-user-authenticated', { open: this.state.open })}
         ref={node => (this.node = node)}>
         <a className="dropdown-toggle navbar-avatar" href="#" onClick={this.toggleDropdown}>
-          <Avatar hash={currentUser.avatar} name={currentUser.name} size={24} />
+          <Avatar
+            hash={currentUser.avatar}
+            name={currentUser.name}
+            size={theme.globalNavContentHeightRaw}
+          />
         </a>
         {this.state.open && (
           <ul className="dropdown-menu dropdown-menu-right">
index fb7c3c4e59ea42bffc2502fddcd02b96d99360be..85ca26d59b296a8a2e2a12b7002e0f5227948ab5 100644 (file)
@@ -12,7 +12,7 @@ exports[`should not render the users organizations when they are not activated 1
     <Connect(Avatar)
       hash="abcd1234"
       name="foo"
-      size={24}
+      size={32}
     />
   </a>
   <ul
@@ -85,7 +85,7 @@ exports[`should render the right interface for logged in user 1`] = `
     <Connect(Avatar)
       hash="abcd1234"
       name="foo"
-      size={24}
+      size={32}
     />
   </a>
   <ul
@@ -146,7 +146,7 @@ exports[`should render the users organizations 1`] = `
     <Connect(Avatar)
       hash="abcd1234"
       name="foo"
-      size={24}
+      size={32}
     />
   </a>
   <ul
@@ -294,7 +294,7 @@ exports[`should update the component correctly when the user changes to anonymou
     <Connect(Avatar)
       hash="abcd1234"
       name="foo"
-      size={24}
+      size={32}
     />
   </a>
   <ul
index f3730f2b27643f02cf5a7362d2d3292b9222c51e..028707705cff7e90c0fe1d249e5fc54a13bfd86f 100644 (file)
@@ -1,12 +1,23 @@
 .navbar-search {
   position: relative;
-  padding-right: 3px;
+  padding: calc((var(--globalNavHeight) - var(--globalNavContentHeight)) / 2) 0;
 }
 
 .navbar-search .search-box,
 .navbar-search .search-box-input {
-  width: 310px;
-  max-width: none;
+  width: 26vw;
+  max-width: 310px;
+  min-width: 260px;
+  height: var(--globalNavContentHeight);
+}
+
+.navbar-search .search-box-input {
+  border-color: #fff;
+}
+
+.navbar-search .search-box-magnifier,
+.navbar-search .search-box-clear {
+  top: calc((var(--globalNavContentHeight) - 16px) / 2);
 }
 
 .navbar-search-input {
@@ -31,6 +42,7 @@
   z-index: var(--aboveNormalZIndex);
   vertical-align: middle;
   width: 16px;
+  margin-left: 4px;
   margin-right: -20px;
   background-color: #fff;
   color: var(--secondFontColor);
@@ -82,7 +94,7 @@
 }
 
 .global-navbar-search-dropdown {
-  top: calc(100% + 3px) !important;
+  top: 100% !important;
   max-height: 80vh;
   width: 440px;
   padding: 0 !important;
index 024f34c7d8043a3e780bc3d8165453c25701f45f..6e3f0fc5c51e4d90af645dcf85534736d897ac7e 100644 (file)
@@ -57,6 +57,11 @@ module.exports = {
   smallControlHeight: '20px',
   tinyControlHeight: '16px',
 
+  globalNavHeight: '48px',
+  globalNavHeightRaw: 48,
+  globalNavContentHeight: '32px',
+  globalNavContentHeightRaw: 32,
+
   // different
   defaultShadow: '0 6px 12px rgba(0, 0, 0, 0.175)',
 
index f441b8359667dc55f22d030a0f3bb6fe8d7cd4c5..ef3096db9fb8b44df368c259299d894203047568 100644 (file)
@@ -1931,6 +1931,10 @@ css-selector-tokenizer@^0.7.0:
     fastparse "^1.1.1"
     regexpu-core "^1.0.0"
 
+css-unit-converter@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
+
 css-what@2.1:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
@@ -5526,6 +5530,15 @@ posix-character-classes@^0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
 
+postcss-calc@6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-6.0.1.tgz#3d24171bbf6e7629d422a436ebfe6dd9511f4330"
+  dependencies:
+    css-unit-converter "^1.1.1"
+    postcss "^6.0.0"
+    postcss-selector-parser "^2.2.2"
+    reduce-css-calc "^2.0.0"
+
 postcss-calc@^5.2.0:
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
@@ -6263,6 +6276,13 @@ reduce-css-calc@^1.2.6:
     math-expression-evaluator "^1.2.14"
     reduce-function-call "^1.0.1"
 
+reduce-css-calc@^2.0.0:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.3.tgz#63c4c6325ffbbf4ea6c23f1d4deb47c3953f3b81"
+  dependencies:
+    css-unit-converter "^1.1.1"
+    postcss-value-parser "^3.3.0"
+
 reduce-function-call@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"