/*
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.
*/
@import url('../../../../../node_modules/angular2-toaster/toaster.css');
/* @import url('../../measure.component.css'); */

label {
  font-weight: normal;
}

.container {
  max-height: 40vh;
  overflow-y: scroll;
}

.swMain > ul {
  display: table;
  list-style: none;
  margin: 0 0 20px;
  padding: 10px 0;
  position: relative;
  width: 100%;
  background: #f7f7f8;
  border-radius: 5px
}

.formStep {
  background-color: #000000;
  border-radius: 5px;
  padding: 10px;
  /*height:800px;*/
}

.swMain > ul li {
  display: table-cell;
  text-align: center;
  width: 1%
}

.swMain > ul li > a:before {
  border-top: 4px solid #c8c7cc;
  /* content: ""; */
  display: block;
  font-size: 0;
  height: 1px;
  overflow: hidden;
  position: relative;
  top: 21px;
  width: 100%;
  z-index: 1
}

.swMain > ul .stepNumber {
  background-color: #fff;
  border: 5px solid #c8c7cc;
  border-radius: 100%;
  color: #546474;
  display: inline-block;
  font-size: 15px;
  height: 40px;
  line-height: 30px;
  position: relative;
  text-align: center;
  width: 40px;
  z-index: 2
}

.swMain > ul li > a.selected .stepNumber {
  border-color: #007AFF
}

.swMain ul li > a.done .stepNumber {
  border-color: #007AFF;
  background-color: #007AFF;
  color: #fff;
  text-indent: -9999px
}

.swMain ul li > a.done .stepNumber:before {
  content: "\f00c";
  display: inline;
  float: right;
  font-family: FontAwesome;
  font-weight: 300;
  height: auto;
  text-shadow: none;
  margin-right: 7px;
  text-indent: 0
}

.swMain ul li > a.done.wait .stepNumber {
  background-color: #F6F6F6 !important;
  color: #CCC !important;
  text-indent: 0 !important
}

.swMain ul li > a.done.wait .stepNumber:before {
  content: "" !important
}

.swMain > ul li .stepDesc {
  color: #8e8e93;
  display: block;
  font-size: 14px;
  margin-top: 4px;
  max-width: 100%;
  table-layout: fixed;
  text-align: center;
  word-wrap: break-word;
  z-index: 104
}

.swMain li > a.done .stepDesc,
.swMain > ul li > a.selected .stepDesc {
  /*color: #2B3D53*/
  color: #007AFF
}

.swMain > ul li > a.disabled {
  cursor: default
}

.swMain .progress {
  margin-bottom: 30px
}

.swMain .stepContainer {
  height: auto !important
}

.swMain .y-scrollable {
  overflow-y: auto;
  overflow-x: hidden;
  max-height: 600px;
}

fieldset {
  border: 1px solid #e6e8e8;
  border-radius: 5px;
  margin: 20px 0;
  padding: 25px;
  position: relative;
  min-width: 0;
  display: block;
}

fieldset legend {
  background-color: #000000;
  left: 10px;
  padding: 0 10px;
  position: absolute;
  top: -12px;
  color: #fff;
  font-weight: 400;
  width: auto !important;
  border: none !important;
}

.btn-o {
  background: 0 0 !important;
}

.btn-wide {
  min-width: 120px;
}

.btn-container {
  height: 50px;
  /*position: absolute;
  bottom: 10;*/
}

.btn-flat {
  outline: none !important;
}

::-webkit-scrollbar {
  width: 6px;
}

::-webkit-scrollbar-track {
  background-color: #eaeaea;
  /*background-color: #0a0a0a;*/
  border-left: 1px solid #ccc;
}

::-webkit-scrollbar-thumb {
  background-color: #ccc;
}

::-webkit-scrollbar-thumb:hover {
  background-color: #aaa;
}

.disabled {
  pointer-events: none;
  cursor: default;
  opacity: 0.6;
}

a {
  color: white;
}

.code-viewport {
  background-color: #333333;
  border: 1px solid #1d1d1d;
  border-radius: 4px;
  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
  font-size: 13px;
  line-height: 1.5;
  color: #e4e4e4;
  word-break: break-all;
  word-wrap: break-word;
  white-space: pre;
  overflow: auto;
  resize: none;
  outline: none;
}

.fixed-textarea {
  height: 450px;
}
