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

*, *:before, *:after {
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}

html, body {
  height: 100%;
  width: 100%;
  margin: 0;
  padding: 0;
  -webkit-overflow-scrolling: touch;
}

#title {
  position: fixed;
  height: 30px;
  width: 100%;
  top: 0;
  z-index: 1000;

  background-color: #75B2F0;
  font-size: 25px;
  text-align: center;
  font-weight: bold;
  white-space: nowrap;
}

#middle {
  position: absolute;
  top: 30px;
  bottom: 20px;
  padding-bottom: 40%;
  width: 100%;
  overflow-y: auto;
  overflow-x: auto;
}

#log {
  position: fixed;
  height: 20px;
  width: 100%;
  bottom: 0;
  z-index: 1000;
  border-top: 2px solid #777;
  transition: 0.25s ease;
}

body.expanded-log #middle {
  margin-bottom: 40%;
}

body.expanded-log #log {
  height: 40%;
}

#log--title {
  position: absolute;
  top: 0;
  height: 20px;
  width: 100%;
  background-color: #93AAC2;
}

#log--content {
  position: absolute;
  top: 20px;
  bottom: 0;
  width: 100%;
  overflow-x: none;
  overflow-y: scroll;
  background-color: white;
}

.log--content--line {
  border-bottom: 1px solid #ccc;
  white-space: pre;
}

.log--content--line--log {
  background-color: white;
}

.log--content--line--warn {
  background-color: #FCFFA6;
}

.log--content--line--error {
  background-color: #FFA6A6;
}

#info{
  background:#ffa;
  border: 1px solid #ffd324;
  -webkit-border-radius: 5px;
  border-radius: 5px;
  clear:both;
  margin:15px 6px 0;
  min-width:295px;
  max-width:97%;
  padding:4px 0px 2px 10px;
  word-wrap:break-word;
  margin-bottom:10px;
  display:inline-block;
  min-height: 160px;
  max-height: 300px;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
}

#test-enablers-container {
  margin: 10px 5px;
}

#test-expander {
  text-decoration: underline;
}

#test-list {
  display: none;
}

#test-list.expanded {
  display: inherit;
}

#test-list label {
  display: block;
}
