/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

// TABS AND PILLS
// -------------
#login .nav {
	margin-bottom: 10px;
}
#login .tabbable {
  float: right;
}

#login .tab-content {
  .border-radius(0, 7px, 7px, 0);
  background-color: transparent;
}

#login .tab-pane.active {
	margin-right: 20px;
}

#login .nav-tabs > li {
  float: right;
  margin-right: 15px;
  background: transparent url(../../img/alu.gif) repeat left top;
  margin-top: 0px;
}

#login .nav-pills > li {
  float: right;
  margin: 5px 10px 0px 0px;
  background: transparent url(../../img/alu.gif) repeat left top;
}

#login .tabs-below > .nav-tabs > .active > a, #login .tabs-below > .nav-pills > .active > a {
  border-color: transparent;
}
#login .nav-tabs > .active > a, #login .nav-pills > .active > a {
  border: none;
  color: @textColor;
}
#login .tabs-below > .nav-tabs {
   border-top: 0px;
}
.nav > li > a {
  padding: 5px 10px 5px 10px;
}

#login .nav-tabs > li > a {
  .border-radius(0, 7px, 7px, 0);
  .plate-background;
  .plate-box-shadow;
  margin-right: 0px;
  padding: 0px 10px 5px 10px;
  
}

 #login .nav-pills > li > a  {
  .border-radius(7px);
  .plate-background;
  .plate-box-shadow;
  margin-right: 0px;
  padding: 5px 10px 5px 10px;
  
}

.nav {
	> li > a {
	      &:hover,
	      &:focus {
	        background-color: @selectedBackground;
	        border: 1px solid black;
	      }
	    border: 1px solid transparent;
		color: @textColor;
	}
  // Open dropdowns
  .open {
	text-shadow: none;
  }
  .dropdown-menu > li > a {
	      &:hover,
	      &:focus {
	        background-color: @textColor;
	      }
   }
}
