/*
 * Copyright 2014 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 Common styles that are shared by admin site pages including
 * Eric Meyer's reset. For each page in admin site, we include this general
 * CSS first then the page-specific CSS.
 *
 * @author xqyin@google.com (XiaoQian Yin)
 */

@charset "UTF-8";

/*------------------------------------------------------------------
  eric meyer's reset.  Note, this originally had a few items that were
  eliminated because they affected the admin navigation bar
  (html,body,div) or were unused, based on a chrome dev tools audit
  (blockquote,ol,ul,table,caption,tb,td).
  ------------------------------------------------------------------*/
span,applet,object,iframe,
h1,h2,h3,h4,h5,h6,p,
a,abbr,acronym,address,big,cite,code,
del,dfn,em,font,img,ins,kbd,q,s,samp,
small,strike,strong,sub,sup,tt,var,
dl,dt,dd,li,
fieldset,form,label,legend,
tbody,tfoot,thead,tr {
  margin: 0;
  padding: 0;
  border: 0;
  outline: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}
body {
  line-height: 1;
  color: black;
  background: white;
}
input::-moz-focus-inner {
  border: 0;
}
/*------------------------------------------------------------------
  This style fragment is copied from ../rewriter/console.css
  because it's kind of nice. However if we import the whole
  console.css into admin pages it looks terrible.

  TODO(jmarantz): Get UX help to style the whole admin site better.
------------------------------------------------------------------*/
a {
  color:#15c;
  cursor:pointer;
  text-decoration:none;
}
a:visited {
  color: #61c;
}
a:hover {
  text-decoration:underline;
}
a:active {
  color:#d14836;
  text-decoration:underline;
}
/*------------------------------------------------------------------
mod rules
------------------------------------------------------------------*/
.pagespeed-show-number {
  color: green;
  overflow: hidden;
  padding: 5px 0 0 10px;
}
.pagespeed-underline-link {
   color: darkblue;
   text-decoration: underline;
}
/*------------------------------------------------------------------
  We have to specify the size of the container elements explicitly
  when using AnnotatedTimeLine on graphs page. Since we cannot read
  the size of elements with 'display:none' when calling
  google.visualization.AnnotatedTimeLine() in graphs_js.js, we place
  the elements at -9999px to hide them off the screen as an
  alternative method of 'display:none' to switch tabs.
  To keep consistent, we use this on other pages as well.
------------------------------------------------------------------*/
.pagespeed-hidden-offscreen {
  left:-9999px;
  position:absolute;
}
.pagespeed-admin-body {
  font-family: sans-serif;
  font-size: 12px;
}
.pagespeed-admin-tabs {
  font-size: 16px;
}
.pagespeed-sub-tabs {
  font-size: 15px;
}
