/* Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed 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.
 */

@external .gwt-Button;
@external .gwt-DialogBox .dialogMiddleCenter;
@external .gwt-TabBar;
@external .gwt-TabBarFirst;
@external .gwt-TabBarItem;
@external .gwt-TabBarItem-selected;
@external .gwt-TabBarRest;
@external .gwt-TabPanel;
@external .gwt-TabPanelBottom;

@eval backgroundColor com.google.gerrit.client.Gerrit.getTheme().backgroundColor;
@eval textColor com.google.gerrit.client.Gerrit.getTheme().textColor;
@eval trimColor com.google.gerrit.client.Gerrit.getTheme().trimColor;
@eval selectionColor com.google.gerrit.client.Gerrit.getTheme().selectionColor;

body {
  background: backgroundColor;
  color: textColor;
}

.gwt-DialogBox .dialogMiddleCenter {
  background: backgroundColor;
  color: textColor;
}

.gwt-Button {
  white-space: nowrap;
}

.gwt-TabBar .gwt-TabBarItem,
.gwt-TabBar .gwt-TabBarRest,
.gwt-TabPanelBottom {
  background: transparent;
}

.gwt-TabBar {
  border-bottom: 1px solid black;
}
.gwt-TabBar .gwt-TabBarFirst {
  display: none;
}
.gwt-TabBar .gwt-TabBarItem {
  color: #353535;
  margin: 0;
  background: trimColor;
  padding-top: 0.5em;
  padding-bottom: 1px;
  padding-left: 1em;
  padding-right: 1em;
  border-bottom: 3px solid transparent;
  border-right: 0;
}
.gwt-TabBar .gwt-TabBarItem-selected {
  color: #990000;
  background: selectionColor;
  border-bottom-color: #990000;
}
.gwt-TabBar .gwt-TabBarRest {
  background: trimColor;
  padding-top: 0.5em;
  padding-bottom: 1px;
}
.gwt-TabBar .gwt-TabPanelBottom {
  background: trimColor;
  border-top: 1px solid black;
  border-left: none;
  border-right: none;
  border-bottom: none;
  padding: 1px;
}
.gwt-TabPanel .gwt-TabPanelBottom {
  border: none;
}
