/*

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.

*/

#content #stream
{
}

#content #stream #form
{
  float: top;
}

#content #stream #form label
{
  cursor: pointer;
  display: inline;
  margin-top: 5px;
}

#content #stream #form input,
#content #stream #form select,
#content #stream #form textarea
{
  margin-bottom: 2px;
  width: 100%;
}

#content #stream #form textarea
{
  height: 125px;
}

#content #stream #form #start
{
  float: left;
  width: 45%;
}

#content #stream #form #rows
{
  float: right;
  width: 45%;
}

#content #stream #form input[type=checkbox]
{
  margin-bottom: 0;
  margin-left: 5px;
  margin-right: 0px;
  width: 10px;
  height: 10px;
  display: inline;
}

#content #stream #form fieldset
{
  border: 1px solid #fff;
  border-top: 1px solid #c0c0c0;
  margin-bottom: 5px;
}

#content #stream #form fieldset.common
{
  margin-top: 10px;
}

#content #stream #form fieldset legend
{
  display: block;
  margin-left: 10px;
  padding: 0px 5px;
}

#content #stream #form fieldset legend label
{
  margin-top: 0;
}

#content #stream #form button
{
  margin-right: 10px;
}

#content #stream #form fieldset .fieldset
{
  border-bottom: 1px solid #f0f0f0;
  margin-bottom: 5px;
  padding-bottom: 10px;
}

#content #stream #result
{
  float: bottom;
}

#content #stream #result #response
{
}

/************************/

#content #stream #result #explanation
{
  border-top: 1px solid #f0f0f0;
  border-bottom: 1px solid #f0f0f0;
  border-left: 1px solid #f0f0f0;
  border-right: 1px solid #f0f0f0;
}

#content #stream #result #explanation .loader
{
  background-position: 0 50%;
  padding-left: 21px;
}

#content #stream #result #explanation #error
{
  background-color: #f00;
  background-image: url( ../../img/ico/construction.png );
  background-position: 10px 12px;
  color: #fff;
  font-weight: bold;
  margin-bottom: 20px;
  padding: 10px;
  padding-left: 35px;
}

#content #stream #result #explanation #error .msg
{
  font-style: italic;
  font-weight: normal;
  margin-top: 10px;
}

#content #stream #result #explanation .content
{
  padding-left: 0;
  padding-right: 0;
}

#content #stream #result #explanation .content.show
{
  background-image: url( ../../img/div.gif );
  background-repeat: repeat-y;
  background-position: 31% 0;
}

#content #stream #result #explanation #legend
{
  border: 1px solid #f0f0f0;
  padding: 10px;
  /*position: absolute;
  right: 0;
  bottom: 0;*/
}

#content #stream #result #explanation #legend li
{
  padding-left: 15px;
  position: relative;
  -webkit-box-sizing: border-box;
}

#content #stream #result #explanation #legend li svg
{
  position: absolute;
  left: 0;
  top: 2px;
}

#content #stream #result #explanation #explanation-content
{
  min-height: 50px;
  width: 100%
}

#content #stream #result #explanation #explanation-content .node circle
{
  color: #c48f00;
  stroke: #c48f00;
  fill: #c48f00;
}

#content #stream #result #explanation #explanation-content .link
{
  fill: none;
  stroke: #e0e0e0;
  stroke-width: 1.5px;
}

#content #stream #result #explanation #legend .datastore circle,
#content #stream #result #explanation #explanation-content .node.datastore circle
{
  stroke: #3800c4;
  fill: #3800c4;
}

#content #stream #result #explanation #legend .stream-source circle,
#content #stream #result #explanation #explanation-content .node.stream-source circle
{
  stroke: #21a9ec;
  fill: #21a9ec;
}

#content #stream #result #explanation #legend .stream-decorator circle,
#content #stream #result #explanation #explanation-content .node.stream-decorator circle
{
  stroke: #cb21ec;
  fill: #cb21ec;
}

#content #stream #result #explanation #legend .graph-source circle,
#content #stream #result #explanation #explanation-content .node.graph-source circle
{
  stroke: #21eca9;
  fill: #21eca9;
}
