/*
 * 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.
 */

.toolbar-item.remote .toolbar-icon {
    background-image: url(../../images/weinre-icon-32x32.png);
}

.monospace {
     font-size:   12px !important;
     font-family: Monaco, Consolas, Lucida Console, dejavu sans mono, monospace;
}

.source-code {
     font-size:   12px !important;
     font-family: Monaco, Consolas, Lucida Console, dejavu sans mono, monospace;
}

.panel.resources .cookie-storage-tree-item {
    display: none;
}

.panel.resources .frame-storage-tree-item {
    display: none;
}

.panel.resources .application-cache-storage-tree-item {
    display: none;
}

.panel.timeline .resources-size-graph-sidebar-item {
    display: none;
}

#main-status-bar .timeline-category-rendering {
    display: none;
}

#search {
    display: none;
}

#search-toolbar-label {
    display: none;
}

.weinre-connector-item {
    font-size: 140%;
}

.weinre-connector-item.target {
    text-decoration: underline;
    color: blue;
}

.weinre-connector-item.target.connected {
    color: #0D0;
}

.weinre-connector-item.closed {
    color: #B00;
}

.weinre-connector-item.current {
    font-weight: bold;
}

.weinre-connector-item.connected {
    color: #0D0;
}

.weinre-connector-item.error {
    color: #A00;
    font-weight: bold;
    font-size: 200%
}

.weinreServerProperties {
    margin-left: 2em;
}

.weinre-normal-text-size {
    font-size: 140%;
}

.weinre-fadeable {
  opacity: 1;
  -webkit-transition: opacity 5s linear;
}

.weinre-fade {
  opacity: 0;
}

