/*
 * Copyright 2012 Google Inc.
 *
 * 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.
 */

/**
 * @fileoverview Styles for the mod_pagespeed console.
 *
 * @author sarahdw@google.com (Sarah Dapul-Weberman)
 * @author bvb@google.com (Ben VanBerkum)
 * @author joseantonio@google.com (Jose Antonio Martinez)
 */

/*------------------------------------------------------------------
@global Type
------------------------------------------------------------------*/
body,body input,body button,body td {
  font-family: sans-serif;
  color: #222;
  font-size:13px;
  -webkit-tap-highlight-color: rgba(0,0,0,0);
}
strong, b {
  font-weight:bold;
}

/*------------------------------------------------------------------
mod rules
------------------------------------------------------------------*/

.pagespeed-widgets {
  background-color: #FFFFFF;
  border: 1px solid #CCCCCC;
  box-shadow: 0 15px 10px -10px rgba(0, 0, 0, 0.5), 0 1px 4px rgba(0, 0, 0, 0.3), 0 0 40px rgba(0, 0, 0, 0.1) inset;
  float: left;
  margin: 20px 0 0 20px;
  min-width: 500px;
}
.pagespeed-widgets-topbar {
  background-color: #F2F2F2;
  border-bottom:1px solid #E5E5E5;
  height: 35px;
  width: 100%;
}
.pagespeed-widgets-topbar .pagespeed-title {
  font-weight: bold;
  padding: 10px 0 4px 20px;
  width: 85%;
  float: left;
}
